source: trunk/grails-app/conf/Config.groovy @ 887

Last change on this file since 887 was 887, checked in by gav, 13 years ago

Security fix for "Annotation based security is easy to bypass by adding ".html' to the URL", closes ticket #98.

File size: 24.4 KB
Line 
1// locations to search for config files that get merged into the main config
2// config files can either be Java properties files or ConfigSlurper scripts
3
4// grails.config.locations = [ "classpath:${appName}-config.properties",
5//                             "classpath:${appName}-config.groovy",
6//                             "file:${userHome}/.grails/${appName}-config.properties",
7//                             "file:${userHome}/.grails/${appName}-config.groovy"]
8
9// if(System.properties["${appName}.config.location"]) {
10//    grails.config.locations << "file:" + System.properties["${appName}.config.location"]
11// }
12
13// Set false due to acegi security issue.
14// See: http://jira.grails.org/browse/GPACEGI-41
15// See: http://www.gnumims.org/trac/ticket/98
16grails.mime.file.extensions = false // enables the parsing of file extensions from URLs into the request format
17
18grails.mime.types = [ html: ['text/html','application/xhtml+xml'],
19                      xml: ['text/xml', 'application/xml'],
20                      text: 'text-plain',
21                      js: 'text/javascript',
22                      rss: 'application/rss+xml',
23                      atom: 'application/atom+xml',
24                      css: 'text/css',
25                      csv: 'text/csv',
26                      pdf: 'application/pdf',
27                      rtf: 'application/rtf',
28                      excel: 'application/vnd.ms-excel',
29                      ods: 'application/vnd.oasis.opendocument.spreadsheet',
30                      all: '*/*',
31                      json: ['application/json','text/json'],
32                      form: 'application/x-www-form-urlencoded',
33                      multipartForm: 'multipart/form-data'
34                    ]
35// The default codec used to encode data with ${}
36grails.views.default.codec="none" // none, html, base64
37grails.views.gsp.encoding="UTF-8"
38grails.converters.encoding="UTF-8"
39
40// enable Sitemesh preprocessing of GSP pages
41grails.views.gsp.sitemesh.preprocess = true
42// scaffolding templates configuration
43grails.scaffolding.templates.domainSuffix = 'Instance'
44
45// Set to false to use the new Grails 1.2 JSONBuilder in the render method
46grails.json.legacy.builder=false
47
48// enabled native2ascii conversion of i18n properties files
49grails.enable.native2ascii = true
50
51// whether to install the java.util.logging bridge for sl4j. Disable fo AppEngine!
52grails.logging.jul.usebridge = true
53// packages to include in Spring bean scanning
54grails.spring.bean.packages = []
55
56/**
57* Internal searchable index config.
58*/
59// Is set true by createDataService.startSearchableIndex() once bootstrap completes.
60appSearchable.cascadeOnUpdate = false
61
62/**
63* Directory configuration.
64* Pickup the Tomcat/Catalina directory else use the target or current dir.
65*/
66def fs = File.separator // Local variable.
67globalDirs.targetDir = new File("target${fs}").isDirectory() ? "target${fs}" : ''
68globalDirs.catalinaBase = System.properties.getProperty('catalina.base')
69globalDirs.logDirectory = globalDirs.catalinaBase ? "${globalDirs.catalinaBase}${fs}logs${fs}" : globalDirs.targetDir
70globalDirs.workDirectory = globalDirs.catalinaBase ? "${globalDirs.catalinaBase}${fs}work${fs}" : globalDirs.targetDir
71globalDirs.tempDirectory = globalDirs.catalinaBase ? "${globalDirs.catalinaBase}${fs}temp${fs}${appName}${fs}" : globalDirs.targetDir
72globalDirs.searchableIndexDirectory = "${globalDirs.workDirectory}SearchableIndex${fs}${appName}${fs}"
73globalDirs.tempInventoryItemPicturesDirectory = "${globalDirs.tempDirectory}InventoryItemPictures${fs}"
74
75/**
76 * Log4j configuration.
77 * Causing this file to reload (e.g. edit+save) may break the appLog destination
78 * and further logs will be written to files or directories like "[:]".
79 * For more info see http://logging.apache.org/log4j/1.2/manual.html
80 * For log levels see http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Level.html
81 * Basic log levels are ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
82 */
83
84log4j = {
85    appenders {
86        // Use if we want to prevent creation of a stacktrace.log file.
87        'null' name:'stacktrace'
88
89        // Use this if we want to modify the default appender called 'stdout'.
90        console name:'stdout', layout:pattern(conversionPattern: '[%t] %-5p %c{2} %x - %m%n')
91
92        // Custom log file.
93        rollingFile name:"appLog",
94                        file:"${globalDirs.logDirectory}${appName}.log".toString(),
95                        maxFileSize:'300kB',
96                        maxBackupIndex:1,
97                        layout:pattern(conversionPattern: '%d{[EEE, dd-MMM-yyyy @ HH:mm:ss.SSS]} [%t] %-5p %c %x - %m%n')
98    }
99
100    // This is for the built-in stuff and from the default Grails-1.2.1 config.
101    error 'org.codehaus.groovy.grails.web.servlet',  //  controllers
102            'org.codehaus.groovy.grails.web.pages', //  GSP
103            'org.codehaus.groovy.grails.web.sitemesh', //  layouts
104            'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping
105            'org.codehaus.groovy.grails.web.mapping', // URL mapping
106            'org.codehaus.groovy.grails.commons', // core / classloading
107            'org.codehaus.groovy.grails.plugins', // plugins
108            'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration
109            'org.springframework',
110            'org.hibernate',
111            'net.sf.ehcache.hibernate'
112
113    warn   'org.mortbay.log' // Jetty
114
115    error 'grails.app' // Set the default log level for our app code.
116    info 'grails.app.bootstrap' // Set the log level per type and per type.class
117    error 'grails.app.service.AuthService'
118    error 'grails.app.service.NavigationService'
119    error 'grails.app.service.com.zeddware.grails.plugins.filterpane.FilterService'
120    info 'org.codehaus.groovy.grails.plugins.searchable'
121    //info 'org.compass'
122    error 'grails.app.task' // Quartz jobs.
123    info 'grails.app.task.InventoryIndexJob'
124
125    // Move anything that should behave differently into this section.
126    switch(environment) {
127        case 'development':
128            // Configure the root logger to output to stdout and appLog appenders.
129            root {
130                error 'stdout','appLog'
131                additivity = true
132            }
133            //debug "org.hibernate.SQL"
134            debug 'grails.app.service'
135            debug 'grails.app.controller'
136            break
137        case 'test':
138            // Configure the root logger to only output to appLog appender.
139            root {
140                error 'stdout','appLog'
141                additivity = true
142            }
143            debug 'grails.app.service'
144            debug 'grails.app.controller'
145            break
146        case 'production':
147            // Configure the root logger to only output to appLog appender.
148            root {
149                error 'appLog'
150                additivity = true
151            }
152            warn 'grails.app.service'
153            warn 'grails.app.controller'
154            debug 'grails.app.service.AssetCsvService'
155            debug 'grails.app.service.PersonCsvService'
156            debug 'grails.app.service.InventoryCsvService'
157            info 'grails.app.service.InventoryItemService'
158            debug 'grails.app.service.AssetTreeService' /// @todo: remove after testing.
159            break
160    }
161}
162
163/**
164 * Environment specific configuration.
165 */
166environments {
167
168    production {
169        grails.serverURL = "http://www.changeme.com" // Set serverURL stem for creating absolute links.
170    }
171
172    development {
173        grails.serverURL = "http://localhost:8080/${appName}" // Set serverURL stem for creating absolute links.
174    }
175
176    test {
177        grails.serverURL = "http://localhost:8080/${appName}" // Set serverURL stem for creating absolute links.
178    }
179
180} // end environments
181
182/**
183 * Navigation plugin menu.
184 * The top level titles are taken from i18n message bundles.
185 * Subitems i18n message bundles are not currently resolving with this plugin.
186 */
187navigation.nav = [
188    [order:10, controller:'appCore', title:'home', action:'start',
189        subItems: [
190            [order:10, controller:'appCore', title:'Start', action:'start', isVisible: { true }],
191            [order:20, controller:'appCore', title:'Manager', action:'manager', isVisible: {
192                    authenticateService.ifAnyGranted('ROLE_AppAdmin,ROLE_Manager,ROLE_TaskManager,ROLE_InventoryManager,ROLE_AssetManager,ROLE_ProductionManager')
193                }
194            ],
195            [order:30, controller:'appCore', title:'Admin', action:'appAdmin', isVisible: { authenticateService.ifAllGranted('ROLE_AppAdmin') }],
196            [order:90, controller:'appCore', title:'Timeout', action:'changeSessionTimeout', isVisible: { params.action == 'changeSessionTimeout' }],
197            [order:91, controller:'appCore', title:'Password', action:'changePassword', isVisible: { params.action == 'changePassword' }],
198        ]
199    ],
200    [order:20, controller:'taskDetailed', title:'tasks', action:'search',
201        subItems: [
202            [order:10, controller:'taskDetailed', title:'Search', action:'search', isVisible: { true }],
203            [order:11, controller:'taskDetailed', title:'Calendar', action:'searchCalendar', isVisible: { true }],
204            [order:20, controller:'taskDetailed', title:'+Scheduled', action:'create', isVisible: { true }],
205            [order:30, controller:'taskDetailed', title:'+Unsheduled', action:'createUnscheduled', isVisible: { true }],
206            [order:40, controller:'taskDetailed', title:'+Callout', action:'createImmediateCallout', isVisible: { true }],
207            [order:90, controller:'taskDetailed', title:'Show', action:'show', id:'nav', isVisible: { params.action == 'show' }],
208            [order:91, controller:'taskDetailed', title:'Edit', action:'edit', id:'nav', isVisible: { params.action == 'edit' }]
209        ]
210    ],
211    [order:30, controller:'inventoryItemDetailed', title:'inventory', action:'search',
212        subItems: [
213            [order:10, controller:'inventoryItemDetailed', title:'Search', action:'search', isVisible: { true }],
214            [order:20, controller:'inventoryItemDetailed', title:'Create', action:'create', isVisible: { true }],
215            [order:90, controller:'inventoryItemDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
216            [order:91, controller:'inventoryItemDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }],
217            [order:91, controller:'inventoryItemDetailed', title:'Reorder', action:'reorder', isVisible: { params.action == 'reorder' }]
218        ]
219    ],
220    [order:40, controller:'assetDetailed', title:'assets', action:'search',
221        subItems: [
222            [order:10, controller:'assetDetailed', title:'Search', action:'search', isVisible: { true }],
223            [order:20, controller:'assetDetailed', title:'Create', action:'create', isVisible: { true }],
224            [order:90, controller:'assetDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
225            [order:91, controller:'assetDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }],
226            [order:99, controller:'assetSubItemDetailed', title:'Sub Items', action:'search', isVisible: { true }]
227        ]
228    ]
229]
230
231/**
232 * Navigation plugin alternate menu.
233 * The alternate menu top level titles are not displayed anywhere.
234 * Subitems i18n message bundles are not currently resolving with this plugin.
235 */
236navigation.navAlt = [
237    [order:10, controller:'person', title:'person', action:'list',
238        subItems: [
239            [order:10, controller:'person', title:'Person List', action:'list', isVisible: { true }],
240            [order:20, controller:'person', title:'Create', action:'create', isVisible: { true }],
241            [order:90, controller:'person', title:'Show', action:'show', isVisible: { params.action == 'show' }],
242            [order:91, controller:'person', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
243        ]
244    ],
245    [order:20, controller:'taskProcedureDetailed', title:'taskProcedure', action:'list',
246        subItems: [
247            [order:10, controller:'taskProcedureDetailed', title:'Task Procedure List', action:'list', isVisible: { true }],
248            [order:20, controller:'taskProcedureDetailed', title:'Create', action:'create', isVisible: { true }],
249            [order:90, controller:'taskProcedureDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
250            [order:91, controller:'taskProcedureDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
251        ]
252    ],
253    [order:30, controller:'assetSubItemDetailed', title:'assetSubItem', action:'search',
254        subItems: [
255            [order:10, controller:'assetSubItemDetailed', title:'Sub Item Search', action:'search', isVisible: { true }],
256            [order:20, controller:'assetSubItemDetailed', title:'Create', action:'create', isVisible: { true }],
257            [order:90, controller:'assetSubItemDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
258            [order:91, controller:'assetSubItemDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
259        ]
260    ],
261    [order:40, controller:'maintenancePolicyDetailed', title:'maintenancePolicy', action:'list',
262        subItems: [
263            [order:10, controller:'maintenancePolicyDetailed', title:'Maintenance Policy List', action:'list', isVisible: { true }],
264            [order:20, controller:'maintenancePolicyDetailed', title:'Create', action:'create', isVisible: { true }],
265            [order:90, controller:'maintenancePolicyDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
266            [order:91, controller:'maintenancePolicyDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
267        ]
268    ],
269    [order:50, controller:'supplierDetailed', title:'supplier', action:'list',
270        subItems: [
271            [order:10, controller:'supplierDetailed', title:'Supplier List', action:'list', isVisible: { true }],
272            [order:20, controller:'supplierDetailed', title:'Create', action:'create', isVisible: { true }],
273            [order:90, controller:'supplierDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
274            [order:91, controller:'supplierDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
275        ]
276    ],
277    [order:70, controller:'inventoryStoreDetailed', title:'inventoryStore', action:'list',
278        subItems: [
279            [order:10, controller:'inventoryStoreDetailed', title:'Inventory Store List', action:'list', isVisible: { true }],
280            [order:20, controller:'inventoryStoreDetailed', title:'Create', action:'create', isVisible: { true }],
281            [order:90, controller:'inventoryStoreDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
282            [order:91, controller:'inventoryStoreDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
283        ]
284    ],
285    [order:80, controller:'inventoryLocationDetailed', title:'inventoryLocation', action:'list',
286        subItems: [
287            [order:10, controller:'inventoryLocationDetailed', title:'Inventory Location List', action:'list', isVisible: { true }],
288            [order:20, controller:'inventoryLocationDetailed', title:'Create', action:'create', isVisible: { true }],
289            [order:90, controller:'inventoryLocationDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
290            [order:91, controller:'inventoryLocationDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
291        ]
292    ],
293    [order:90, controller:'inventoryGroupDetailed', title:'inventoryGroup', action:'list',
294        subItems: [
295            [order:10, controller:'inventoryGroupDetailed', title:'Inventory Group List', action:'list', isVisible: { true }],
296            [order:20, controller:'inventoryGroupDetailed', title:'Create', action:'create', isVisible: { true }],
297            [order:90, controller:'inventoryGroupDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
298            [order:91, controller:'inventoryGroupDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
299        ]
300    ],
301    [order:110, controller:'supplierTypeDetailed', title:'supplierType', action:'list',
302        subItems: [
303            [order:10, controller:'supplierTypeDetailed', title:'Supplier Type List', action:'list', isVisible: { true }],
304            [order:20, controller:'supplierTypeDetailed', title:'Create', action:'create', isVisible: { true }],
305            [order:90, controller:'supplierTypeDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
306            [order:91, controller:'supplierTypeDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
307        ]
308    ],
309    [order:120, controller:'siteDetailed', title:'site', action:'list',
310        subItems: [
311            [order:10, controller:'siteDetailed', title:'Site List', action:'list', isVisible: { true }],
312            [order:20, controller:'siteDetailed', title:'Create', action:'create', isVisible: { true }],
313            [order:90, controller:'siteDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
314            [order:91, controller:'siteDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
315        ]
316    ],
317    [order:130, controller:'sectionDetailed', title:'section', action:'list',
318        subItems: [
319            [order:10, controller:'sectionDetailed', title:'Section List', action:'list', isVisible: { true }],
320            [order:20, controller:'sectionDetailed', title:'Create', action:'create', isVisible: { true }],
321            [order:90, controller:'sectionDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
322            [order:91, controller:'sectionDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
323        ]
324    ],
325    [order:140, controller:'extendedAttributeTypeDetailed', title:'extendedAttributeType', action:'list',
326        subItems: [
327            [order:10, controller:'extendedAttributeTypeDetailed', title:'Attribute Type List', action:'list', isVisible: { true }],
328            [order:20, controller:'extendedAttributeTypeDetailed', title:'Create', action:'create', isVisible: { true }],
329            [order:90, controller:'extendedAttributeTypeDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
330            [order:91, controller:'extendedAttributeTypeDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
331        ]
332    ],
333    [order:150, controller:'departmentDetailed', title:'department', action:'list',
334        subItems: [
335            [order:10, controller:'departmentDetailed', title:'Department List', action:'list', isVisible: { true }],
336            [order:20, controller:'departmentDetailed', title:'Create', action:'create', isVisible: { true }],
337            [order:90, controller:'departmentDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
338            [order:91, controller:'departmentDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
339        ]
340    ],
341    [order:160, controller:'productionReferenceDetailed', title:'productionReference', action:'list',
342        subItems: [
343            [order:10, controller:'productionReferenceDetailed', title:'Production Reference List', action:'list', isVisible: { true }],
344            [order:20, controller:'productionReferenceDetailed', title:'Create', action:'create', isVisible: { true }],
345            [order:90, controller:'productionReferenceDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
346            [order:91, controller:'productionReferenceDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
347        ]
348    ],
349    [order:170, controller:'costCodeDetailed', title:'costCode', action:'list',
350        subItems: [
351            [order:10, controller:'costCodeDetailed', title:'Cost Code List', action:'list', isVisible: { true }],
352            [order:20, controller:'costCodeDetailed', title:'Create', action:'create', isVisible: { true }],
353            [order:90, controller:'costCodeDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
354            [order:91, controller:'costCodeDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
355        ]
356    ],
357    [order:180, controller:'personGroupDetailed', title:'personGroup', action:'list',
358        subItems: [
359            [order:10, controller:'personGroupDetailed', title:'Person Group List', action:'list', isVisible: { true }],
360            [order:20, controller:'personGroupDetailed', title:'Create', action:'create', isVisible: { true }],
361            [order:90, controller:'personGroupDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
362            [order:91, controller:'personGroupDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
363        ]
364    ],
365    [order:190, controller:'personGroupTypeDetailed', title:'personGroupType', action:'list',
366        subItems: [
367            [order:10, controller:'personGroupTypeDetailed', title:'Person Group Type List', action:'list', isVisible: { true }],
368            [order:20, controller:'personGroupTypeDetailed', title:'Create', action:'create', isVisible: { true }],
369            [order:90, controller:'personGroupTypeDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
370            [order:91, controller:'personGroupTypeDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
371        ]
372    ],
373    [order:200, controller:'taskGroupDetailed', title:'taskProcedure', action:'list',
374        subItems: [
375            [order:10, controller:'taskGroupDetailed', title:'Task Group List', action:'list', isVisible: { true }],
376            [order:20, controller:'taskGroupDetailed', title:'Create', action:'create', isVisible: { true }],
377            [order:90, controller:'taskGroupDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
378            [order:91, controller:'taskGroupDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
379        ]
380    ],
381    [order:210, controller:'unitOfMeasureDetailed', title:'unitOfMeasure', action:'list',
382        subItems: [
383            [order:10, controller:'unitOfMeasureDetailed', title:'Unit Of Measure List', action:'list', isVisible: { true }],
384            [order:20, controller:'unitOfMeasureDetailed', title:'Create', action:'create', isVisible: { true }],
385            [order:90, controller:'unitOfMeasureDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
386            [order:91, controller:'unitOfMeasureDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
387        ]
388    ],
389    [order:220, controller:'inventoryItemPurchaseDetailed', title:'inventoryItemPurchase', action:'search',
390        subItems: [
391            [order:10, controller:'inventoryItemPurchaseDetailed', title:'Purchase Search', action:'search', isVisible: { true }],
392            [order:20, controller:'inventoryItemPurchaseDetailed', title:'Order', action:'create', isVisible: { true }],
393            [order:90, controller:'inventoryItemPurchaseDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
394            [order:91, controller:'inventoryItemPurchaseDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
395        ]
396    ],
397    [order:230, controller:'purchasingGroupDetailed', title:'purchasingGroup', action:'list',
398        subItems: [
399            [order:10, controller:'purchasingGroupDetailed', title:'Purchasing Group List', action:'list', isVisible: { true }],
400            [order:20, controller:'purchasingGroupDetailed', title:'Create', action:'create', isVisible: { true }],
401            [order:90, controller:'purchasingGroupDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
402            [order:91, controller:'purchasingGroupDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
403        ]
404    ]
405]
406
407/**
408 * Custom application global settings.
409 * @todo: externalise these settings to a config file (along with the database settings) or have them configurable via the web interface+database.
410 */
411taskRecurringScheduleJob.repeatInterval=10
412// It is recommended to limit the currencyList to the one that the site uses e.g: currencyList = ['AUD']
413currencyList = ['EUR', 'XCD', 'USD', 'XOF', 'NOK', 'AUD', 'XAF', 'NZD', 'MAD', 'DKK', 'GBP', 'CHF', 'XPF', 'ILS', 'ROL', 'TRL']
414
Note: See TracBrowser for help on using the repository browser.