001package org.kuali.common.util.enc;
002
003import java.util.List;
004import java.util.Properties;
005import java.util.SortedSet;
006
007import org.jasypt.util.text.TextEncryptor;
008import org.kuali.common.util.Assert;
009import org.kuali.common.util.PropertyUtils;
010
011import com.google.common.collect.Sets;
012
013public final class DefaultEncryptionService implements EncryptionService {
014
015        private final TextEncryptor encryptor;
016
017        public DefaultEncryptionService(TextEncryptor encryptor) {
018                Assert.noNulls(encryptor);
019                this.encryptor = encryptor;
020        }
021
022        @Override
023        public String encrypt(String text) {
024                if (EncUtils.isEncrypted(text)) {
025                        return text; // It's already encrypted, just return it
026                }
027                Assert.notEncrypted(text);
028                String encryptedText = encryptor.encrypt(text);
029                return EncUtils.wrap(encryptedText);
030        }
031
032        @Override
033        public String decrypt(String text) {
034                if (!EncUtils.isEncrypted(text)) {
035                        return text; // It's not encrypted, just return it
036                }
037                Assert.encrypted(text);
038                String unwrapped = EncUtils.unwrap(text);
039                return encryptor.decrypt(unwrapped);
040        }
041
042        /**
043         * Decrypt any encrypted property values.
044         */
045        @Override
046        public void decrypt(Properties properties) {
047                List<String> keys = PropertyUtils.getEncryptedKeys(properties);
048                for (String key : keys) {
049                        String encrypted = properties.getProperty(key);
050                        String decrypted = decrypt(encrypted);
051                        properties.setProperty(key, decrypted);
052                }
053        }
054
055        /**
056         * Encrypt any property values that are not already encrypted.
057         */
058        @Override
059        public void encrypt(Properties properties) {
060                SortedSet<String> allKeys = Sets.newTreeSet(properties.stringPropertyNames());
061                SortedSet<String> encKeys = Sets.newTreeSet(PropertyUtils.getEncryptedKeys(properties));
062                SortedSet<String> keys = Sets.newTreeSet(Sets.difference(allKeys, encKeys));
063                for (String key : keys) {
064                        String plaintext = properties.getProperty(key);
065                        String encrypted = encrypt(plaintext);
066                        properties.setProperty(key, encrypted);
067                }
068        }
069
070        public TextEncryptor getEncryptor() {
071                return encryptor;
072        }
073
074}