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}