Changeset 92

Show
Ignore:
Timestamp:
26-01-11 12:11:20 (3 years ago)
Author:
work@…
Message:

- crypto secret is now randomly generated in the GdtService?
- GdtService? now caches secret and template entities to reduce load

Location:
gdt/trunk/grails-app
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • gdt/trunk/grails-app/conf/Config.groovy

    r78 r92  
    11// configuration for plugin testing - will not be included in the plugin zip 
    2   
    32log4j = { 
    43    // Example of changing the log pattern for the default console 
  • gdt/trunk/grails-app/services/nl/grails/plugins/gdt/GdtService.groovy

    r91 r92  
    2020 */ 
    2121package nl.grails.plugins.gdt 
     22 
    2223import org.codehaus.groovy.grails.commons.ApplicationHolder 
     24import org.apache.commons.lang.RandomStringUtils 
    2325import cr.co.arquetipos.crypto.Blowfish 
    2426 
     
    2830    static transactional = false 
    2931 
    30 //      def grailsApplication 
    31 //      def setting 
     32        // cached crypto secret 
     33        static cachedSecret 
    3234 
    33 /* 
    34         void afterPropertiesSet() { 
    35                 this.setting = grailsApplication.config.setting 
    36         } 
    37 */ 
     35        // cached template entities 
     36        static cachedEntities 
     37 
    3838        /** 
    3939         * get all domain classes that use the domain templates 
     
    4141         */ 
    4242        def getTemplateEntities() { 
     43                // return cached entities if present 
     44                if (cachedEntities) return cachedEntities 
     45 
     46                // fetch entities and cache them 
    4347                def grailsApplication = ApplicationHolder.application 
    4448                def entities = [] 
     
    6064                } 
    6165 
    62                 return entities 
     66                // cache entities 
     67                cachedEntities = entities 
     68 
     69                return cachedEntities 
     70        } 
     71 
     72        /** 
     73         * return the crypto secret 
     74         * 
     75         * fetches the pre-configured secret, or generates 
     76         * a random secret on the fly 
     77         * 
     78         * For a static secret (works perhaps better in multi 
     79         * server/ loadbalanced environments) add the following 
     80         * to your Config.groovy: 
     81         * 
     82         * crypto { 
     83         *      shared.secret = "yourSecretCanBeInHere" 
     84         * } 
     85         * 
     86         * @return String 
     87         */ 
     88        private getSecret() { 
     89                // do we have a static secret? 
     90                if (cachedSecret) return cachedSecret 
     91 
     92                // is the secret in the configuration? 
     93                def grailsApplication = ApplicationHolder.application 
     94                if (!grailsApplication.config.crypto) { 
     95                        // we have not secret, generate a random secret 
     96                        grailsApplication.config.crypto.shared.secret = RandomStringUtils.random(32, true, true) 
     97                } 
     98 
     99                // set static secret 
     100                cachedSecret = grailsApplication.config.crypto.shared.secret 
     101 
     102                // and return the static secret 
     103                return cachedSecret 
    63104        } 
    64105 
     
    69110         */ 
    70111        def String encryptEntity(String entityName) { 
    71                 def grailsApplication = ApplicationHolder.application 
    72  
    73                 if (grailsApplication.config.crypto) { 
    74                         // generate a Blowfish encrypted and Base64 encoded string 
    75                         return URLEncoder.encode( 
    76                                 Blowfish.encryptBase64( 
    77                                         entityName.replaceAll(/^class /, ''), 
    78                                         grailsApplication.config.crypto.shared.secret 
    79                                 ) 
     112                // generate a Blowfish encrypted and Base64 encoded string 
     113                return URLEncoder.encode( 
     114                        Blowfish.encryptBase64( 
     115                                entityName.replaceAll(/^class /, ''), 
     116                                getSecret() 
    80117                        ) 
    81                 } else { 
    82                         // base64 only; this is INSECURE! Even though it is not 
    83                         // very likely, it is possible to exploit this and have 
    84                         // Grails dynamically instantiate whatever class you like. 
    85                         // If that constructor does something harmfull this could 
    86                         // be dangerous. Hence, use encryption (above) instead... 
    87                         return URLEncoder.encode(entityName.replaceAll(/^class /, '').bytes.encodeBase64()) 
    88                 } 
     118                ) 
    89119        } 
    90120 
     
    95125         */ 
    96126        def String decryptEntity(String entity) { 
    97                 def grailsApplication = ApplicationHolder.application 
    98                 def entityName 
    99  
    100                 if (grailsApplication.config.crypto) { 
    101                         // generate a Blowfish decrypted and Base64 decoded string. 
    102                         entityName = Blowfish.decryptBase64( 
    103                                 entity, 
    104                                 grailsApplication.config.crypto.shared.secret 
    105                         ) 
    106                 } else { 
    107                         entityName = new String(entity.toString().decodeBase64()) 
    108                 } 
    109  
    110                 return entityName 
     127                // generate a Blowfish decrypted and Base64 decoded string. 
     128                return Blowfish.decryptBase64(entity, getSecret()) 
    111129        } 
    112130