Changeset 92


Ignore:
Timestamp:
Jan 26, 2011, 12:11:20 PM (6 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 edited

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
Note: See TracChangeset for help on using the changeset viewer.