KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > sslexplorer > activedirectory > ActiveDirectoryPropertyManager


1 /*
2  * SSL-Explorer
3  *
4  * Copyright (C) 2003-2006 3SP LTD. All Rights Reserved
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2 of
9  * the License, or (at your option) any later version.
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public
16  * License along with this program; if not, write to the Free Software
17  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */

19             
20 package com.sslexplorer.activedirectory;
21
22 import java.io.BufferedReader JavaDoc;
23 import java.io.BufferedWriter JavaDoc;
24 import java.io.File JavaDoc;
25 import java.io.FileReader JavaDoc;
26 import java.io.FileWriter JavaDoc;
27 import java.io.IOException JavaDoc;
28 import java.util.Collections JavaDoc;
29 import java.util.HashMap JavaDoc;
30 import java.util.Map JavaDoc;
31
32 import org.apache.commons.logging.Log;
33 import org.apache.commons.logging.LogFactory;
34
35 import com.sslexplorer.boot.ContextHolder;
36 import com.sslexplorer.boot.PropertyList;
37 import com.sslexplorer.properties.Property;
38 import com.sslexplorer.properties.impl.realms.RealmKey;
39 import com.sslexplorer.realms.Realm;
40
41 final class ActiveDirectoryPropertyManager {
42
43     private static final Log log = LogFactory.getLog(ActiveDirectoryPropertyManager.class);
44     private static final String JavaDoc TEMPLATE_FILE = "krb5.template";
45     private static final String JavaDoc CONF_DIRECTORY = "activedirectory";
46     private static final String JavaDoc CONF_FILE = "krb5.conf";
47     
48     private static final String JavaDoc PORT_SEPARATOR = ":";
49     private static final String JavaDoc START_REPLACEMENT = "${";
50     private static final String JavaDoc END_REPLACEMENT = "}";
51
52     private static final String JavaDoc DOMAIN = "DOMAIN";
53     private static final String JavaDoc KDC_TIMEOUT = "KDC_TIMEOUT";
54     private static final String JavaDoc KDC_MAX_TRIES = "KDC_MAX_RETRIES";
55     private static final String JavaDoc HOST_REALMS = "HOST_REALMS";
56     private static final String JavaDoc HOST_NAME = "HOST_NAME";
57     private static final String JavaDoc HOST_REALM_REPLACEMENT = "kdc = " + START_REPLACEMENT + HOST_NAME + END_REPLACEMENT;
58     private static final String JavaDoc DOMAIN_REALMS = "DOMAIN_REALMS";
59     private static final String JavaDoc DOMAIN_REALM_REPLACEMENT = "." + START_REPLACEMENT + HOST_NAME + END_REPLACEMENT + " = " + START_REPLACEMENT + DOMAIN + END_REPLACEMENT;
60
61     private final Realm realm;
62
63     ActiveDirectoryPropertyManager(Realm realm) {
64         this.realm = realm;
65         System.setProperty("java.security.krb5.conf", getConfFile());
66     }
67
68     private static String JavaDoc getConfFile() {
69         File JavaDoc tempDirectory = ContextHolder.getContext().getTempDirectory();
70         File JavaDoc configurationFile = new File JavaDoc(tempDirectory, CONF_FILE);
71         return configurationFile.getAbsolutePath();
72     }
73     
74     void refresh() {
75         refresh(Collections.<String JavaDoc, String JavaDoc>emptyMap());
76     }
77     
78     void refresh(Map JavaDoc<String JavaDoc, String JavaDoc> alternativeValues) {
79         try {
80             doFileReplacement(alternativeValues);
81         } catch (IOException JavaDoc e) {
82             log.error("Failed to update Active Directory configuration " + CONF_FILE, e);
83         }
84     }
85
86     private void doFileReplacement(Map JavaDoc<String JavaDoc, String JavaDoc> alternativeValues) throws IOException JavaDoc {
87         File JavaDoc confDirectory = ContextHolder.getContext().getConfDirectory();
88         File JavaDoc templateFile = new File JavaDoc(confDirectory, CONF_DIRECTORY + getFileSeparator() + TEMPLATE_FILE);
89         String JavaDoc readFile = readFile(templateFile);
90
91         File JavaDoc tempDirectory = ContextHolder.getContext().getTempDirectory();
92         File JavaDoc configurationFile = new File JavaDoc(tempDirectory, CONF_FILE);
93         if (!configurationFile.exists() && !configurationFile.createNewFile()) {
94             log.error("Failed to create file " + CONF_FILE + ".");
95         } else {
96             String JavaDoc replacement = getReplacement(readFile, alternativeValues);
97             writeFile(configurationFile, replacement);
98         }
99     }
100     
101     private String JavaDoc getReplacement(String JavaDoc fileContents, Map JavaDoc<String JavaDoc, String JavaDoc> alternativeValues) {
102         Map JavaDoc<String JavaDoc, String JavaDoc> replacements = buildReplacements(alternativeValues);
103         for (Map.Entry JavaDoc<String JavaDoc, String JavaDoc> entry : replacements.entrySet()) {
104             fileContents = replaceValue(fileContents, entry.getKey(), entry.getValue());
105         }
106         return fileContents;
107     }
108
109     private Map JavaDoc<String JavaDoc, String JavaDoc> buildReplacements(Map JavaDoc<String JavaDoc, String JavaDoc> alternativeValues) {
110         Map JavaDoc<String JavaDoc, String JavaDoc> replacements = new HashMap JavaDoc<String JavaDoc, String JavaDoc>();
111         
112         String JavaDoc dbDomain = Property.getProperty(getRealmKey("activeDirectory.domain")).toUpperCase().trim();
113         String JavaDoc domain = getRealValue(alternativeValues, DOMAIN, dbDomain);
114         replacements.put(DOMAIN, domain);
115         
116         String JavaDoc dbControllerHost = Property.getProperty(getRealmKey("activeDirectory.controllerHost"));
117         String JavaDoc controllerHost = getRealValue(alternativeValues, "activeDirectory.controllerHost", dbControllerHost);
118         
119         String JavaDoc dbTimeout = String.valueOf(Property.getPropertyInt(getRealmKey("activeDirectory.kdcTimeout")) * 1000);
120         String JavaDoc timeout = getRealValue(alternativeValues, "activeDirectory.kdcTimeout", dbTimeout);
121         replacements.put(KDC_TIMEOUT, timeout);
122         
123         String JavaDoc dbMaxTries = String.valueOf(Property.getPropertyInt(getRealmKey("activeDirectory.kdcMaxTries")));
124         String JavaDoc maxTries = getRealValue(alternativeValues, "activeDirectory.kdcMaxTries", dbMaxTries);
125         replacements.put(KDC_MAX_TRIES, maxTries);
126         
127         PropertyList dbActiveDirectryUris = new PropertyList();
128         dbActiveDirectryUris.add(controllerHost);
129         dbActiveDirectryUris.addAll(Property.getPropertyList(getRealmKey("activeDirectory.backupControllerHosts")));
130         PropertyList activeDirectryUris = getRealValue(alternativeValues,"activeDirectory.backupControllerHosts", dbActiveDirectryUris);
131         replacements.put(HOST_REALMS, buildBackupHostRealms(activeDirectryUris));
132         replacements.put(DOMAIN_REALMS, buildBackupDomainRealms(domain, activeDirectryUris));
133         return replacements;
134     }
135     
136     private static String JavaDoc getRealValue(Map JavaDoc<String JavaDoc, String JavaDoc> alternativeValues, String JavaDoc key, String JavaDoc value) {
137         return alternativeValues.containsKey(key) ? alternativeValues.get(key): value;
138     }
139
140     private static PropertyList getRealValue(Map JavaDoc<String JavaDoc, String JavaDoc> alternativeValues, String JavaDoc key, PropertyList values) {
141         return alternativeValues.containsKey(key) ? new PropertyList (alternativeValues.get(key) ): values;
142     }
143
144     private static String JavaDoc replaceValue(String JavaDoc contents, String JavaDoc key, String JavaDoc value) {
145         key = START_REPLACEMENT + key + END_REPLACEMENT;
146         return contents.replace(key, value);
147     }
148
149     private static String JavaDoc buildBackupHostRealms(PropertyList activeDirectryUris) {
150         StringBuffer JavaDoc buffer = new StringBuffer JavaDoc();
151         for (String JavaDoc uri : activeDirectryUris) {
152             uri = uri.contains(PORT_SEPARATOR) ? uri.substring(0, uri.lastIndexOf(PORT_SEPARATOR)) : uri;
153             String JavaDoc replace = replaceValue(HOST_REALM_REPLACEMENT, HOST_NAME, uri);
154             buffer.append(replace).append(getLineSeparator());
155         }
156         return buffer.toString();
157     }
158
159     private static String JavaDoc buildBackupDomainRealms(String JavaDoc domain, PropertyList activeDirectryUris) {
160         StringBuffer JavaDoc buffer = new StringBuffer JavaDoc();
161         for (String JavaDoc uri : activeDirectryUris) {
162             uri = uri.contains(PORT_SEPARATOR) ? uri.substring(0, uri.lastIndexOf(PORT_SEPARATOR)) : uri;
163             String JavaDoc replace = replaceValue(DOMAIN_REALM_REPLACEMENT, HOST_NAME, uri);
164             replace = replaceValue(replace, DOMAIN, domain);
165             buffer.append(replace).append(getLineSeparator());
166         }
167         return buffer.toString();
168     }
169
170     private RealmKey getRealmKey(String JavaDoc name) {
171         return new RealmKey(name, realm);
172     }
173
174     private static void writeFile(File JavaDoc file, String JavaDoc contents) throws IOException JavaDoc {
175         BufferedWriter JavaDoc output = null;
176         try {
177             output = new BufferedWriter JavaDoc(new FileWriter JavaDoc(file));
178             output.write(contents);
179         } finally {
180             close(output);
181         }
182     }
183
184     private static void close(BufferedWriter JavaDoc writer) {
185         try {
186             if (writer != null) {
187                 writer.close();
188             }
189         } catch (IOException JavaDoc e) {
190             // ignore
191
}
192     }
193
194     private static String JavaDoc readFile(File JavaDoc file) throws IOException JavaDoc {
195         StringBuffer JavaDoc contents = new StringBuffer JavaDoc();
196         BufferedReader JavaDoc input = null;
197         try {
198             input = new BufferedReader JavaDoc(new FileReader JavaDoc(file));
199             String JavaDoc line = null;
200             while ((line = input.readLine()) != null) {
201                 contents.append(line);
202                 contents.append(getLineSeparator());
203             }
204         } finally {
205             close(input);
206         }
207         return contents.toString();
208     }
209
210     private static String JavaDoc getFileSeparator() {
211         return System.getProperty("file.separator");
212     }
213
214     private static String JavaDoc getLineSeparator() {
215         return System.getProperty("line.separator");
216     }
217
218     private static void close(BufferedReader JavaDoc reader) {
219         try {
220             if (reader != null) {
221                 reader.close();
222             }
223         } catch (IOException JavaDoc e) {
224             // ignore
225
}
226     }
227 }
Popular Tags