1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package org.kuali.rice.devtools.pdle;
17  
18  import org.apache.commons.lang.StringUtils;
19  import org.apache.commons.logging.Log;
20  import org.apache.commons.logging.LogFactory;
21  import org.kuali.rice.krad.bo.PersistableBusinessObject;
22  import org.kuali.rice.krad.service.BusinessObjectService;
23  import org.kuali.rice.krad.service.KRADServiceLocator;
24  import org.kuali.rice.krad.service.KRADServiceLocatorInternal;
25  import org.springframework.core.io.FileSystemResource;
26  
27  import javax.servlet.ServletException;
28  import javax.servlet.ServletRequest;
29  import javax.servlet.ServletResponse;
30  import javax.servlet.http.HttpServlet;
31  import java.io.IOException;
32  import java.util.Arrays;
33  import java.util.Collection;
34  import java.util.HashSet;
35  import java.util.Map;
36  import java.util.Properties;
37  import java.util.Set;
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  public class PostDataLoadEncryptionServlet extends HttpServlet {
78  
79  	private static final Log LOG = LogFactory.getLog(PostDataLoadEncryptionServlet.class);
80  	
81  	private static final String ATTRIBUTES_TO_ENCRYPT_PROPERTIES = "attributesToEncryptProperties";
82  	private static final String CHECK_OJB_ENCRYPT_CONFIG = "checkOjbEncryptConfig";
83  	
84  	@Override
85  	public void service(ServletRequest request, ServletResponse response)
86  			throws ServletException, IOException {
87  		String attributesToEncryptPropertyFileName = request.getParameter(ATTRIBUTES_TO_ENCRYPT_PROPERTIES);
88  		if (StringUtils.isBlank(attributesToEncryptPropertyFileName)) {
89  			throw new IllegalArgumentException("No valid " + ATTRIBUTES_TO_ENCRYPT_PROPERTIES + " parameter was passed to this Servlet.");
90  		}
91  		boolean checkOjbEncryptConfig = true;
92  		String checkOjbEncryptConfigValue = request.getParameter(CHECK_OJB_ENCRYPT_CONFIG);
93  		if (!StringUtils.isBlank(checkOjbEncryptConfigValue)) {
94  			checkOjbEncryptConfig = Boolean.valueOf(checkOjbEncryptConfigValue).booleanValue();
95  		}
96  		execute(attributesToEncryptPropertyFileName, checkOjbEncryptConfig);
97  		response.getOutputStream().write(("<html><body><p>Successfully encrypted attributes as defined in: " + attributesToEncryptPropertyFileName + "</p></body></html>").getBytes());
98  	}
99  
100 	public void execute(String attributesToEncryptPropertyFileName, boolean checkOjbEncryptConfig) {
101 		PostDataLoadEncryptionService postDataLoadEncryptionService = KRADServiceLocatorInternal.getService(PostDataLoadEncryptionService.POST_DATA_LOAD_ENCRYPTION_SERVICE);
102         Properties attributesToEncryptProperties = new Properties();
103         try {
104             attributesToEncryptProperties.load(new FileSystemResource(attributesToEncryptPropertyFileName).getInputStream());
105         }
106         catch (Exception e) {
107             throw new IllegalArgumentException("PostDataLoadEncrypter requires the full, absolute path to a properties file where the keys are the names of the BusinessObject classes that should be processed and the values are the list of attributes on each that require encryption", e);
108         }
109         for (Map.Entry<Object, Object> entry : attributesToEncryptProperties.entrySet()) {
110             Class<? extends PersistableBusinessObject> businessObjectClass;
111             try {
112                 businessObjectClass = (Class<? extends PersistableBusinessObject>) Class.forName((String) entry.getKey());
113             }
114             catch (Exception e) {
115                 throw new IllegalArgumentException(new StringBuffer("Unable to load Class ").append((String) entry.getKey()).append(" specified by name in attributesToEncryptProperties file ").append(attributesToEncryptProperties).toString(), e);
116             }
117             final Set<String> attributeNames;
118             try {
119                 attributeNames = new HashSet<String>(Arrays.asList(StringUtils.split((String) entry.getValue(), ",")));
120             }
121             catch (Exception e) {
122                 throw new IllegalArgumentException(new StringBuffer("Unable to load attributeNames Set from comma-delimited list of attribute names specified as value for property with Class name ").append(entry.getKey()).append(" key in attributesToEncryptProperties file ").append(attributesToEncryptProperties).toString(), e);
123             }
124             postDataLoadEncryptionService.checkArguments(businessObjectClass, attributeNames, checkOjbEncryptConfig);
125             postDataLoadEncryptionService.createBackupTable(businessObjectClass);
126             BusinessObjectService businessObjectService = KRADServiceLocator.getBusinessObjectService();
127             try {
128                 postDataLoadEncryptionService.prepClassDescriptor(businessObjectClass, attributeNames);
129                 Collection<? extends PersistableBusinessObject> objectsToEncrypt = businessObjectService.findAll(businessObjectClass);
130                 for (Object businessObject : objectsToEncrypt) {
131                     postDataLoadEncryptionService.encrypt((PersistableBusinessObject) businessObject, attributeNames);
132                 }
133                 postDataLoadEncryptionService.restoreClassDescriptor(businessObjectClass, attributeNames);
134                 LOG.info(new StringBuffer("Encrypted ").append(entry.getValue()).append(" attributes of Class ").append(entry.getKey()));
135             }
136             catch (Exception e) {
137                 postDataLoadEncryptionService.restoreTableFromBackup(businessObjectClass);
138                 LOG.error(new StringBuffer("Caught exception, while encrypting ").append(entry.getValue()).append(" attributes of Class ").append(entry.getKey()).append(" and restored table from backup"), e);
139             }
140             postDataLoadEncryptionService.dropBackupTable(businessObjectClass);
141         }
142     }
143 	
144 }