1 17 package org.apache.geronimo.security.deployment; 18 19 import java.util.ArrayList ; 20 import java.util.Collection ; 21 import java.util.HashSet ; 22 import java.util.Iterator ; 23 import java.util.List ; 24 import java.util.Properties ; 25 import java.util.Set ; 26 27 import org.apache.geronimo.common.DeploymentException; 28 import org.apache.geronimo.deployment.DeploymentContext; 29 import org.apache.geronimo.deployment.service.SingleGBeanBuilder; 30 import org.apache.geronimo.deployment.service.XmlReferenceBuilder; 31 import org.apache.geronimo.deployment.xbeans.PatternType; 32 import org.apache.geronimo.gbean.AbstractName; 33 import org.apache.geronimo.gbean.AbstractNameQuery; 34 import org.apache.geronimo.gbean.GBeanData; 35 import org.apache.geronimo.gbean.GBeanInfo; 36 import org.apache.geronimo.gbean.GBeanInfoBuilder; 37 import org.apache.geronimo.gbean.GReferenceInfo; 38 import org.apache.geronimo.gbean.ReferencePatterns; 39 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory; 40 import org.apache.geronimo.kernel.GBeanAlreadyExistsException; 41 import org.apache.geronimo.kernel.Naming; 42 import org.apache.geronimo.kernel.Kernel; 43 import org.apache.geronimo.security.jaas.JaasLoginModuleUse; 44 import org.apache.geronimo.security.jaas.LoginModuleGBean; 45 import org.apache.geronimo.xbeans.geronimo.loginconfig.GerAbstractLoginModuleType; 46 import org.apache.geronimo.xbeans.geronimo.loginconfig.GerLoginConfigType; 47 import org.apache.geronimo.xbeans.geronimo.loginconfig.GerLoginModuleRefType; 48 import org.apache.geronimo.xbeans.geronimo.loginconfig.GerLoginModuleType; 49 import org.apache.geronimo.xbeans.geronimo.loginconfig.GerOptionType; 50 import org.apache.geronimo.xbeans.geronimo.loginconfig.GerLoginConfigDocument; 51 import org.apache.xmlbeans.XmlCursor; 52 import org.apache.xmlbeans.XmlObject; 53 import org.apache.xmlbeans.XmlOptions; 54 55 56 59 public class LoginConfigBuilder implements XmlReferenceBuilder { 60 public static final String LOGIN_CONFIG_NAMESPACE = GerLoginConfigDocument.type.getDocumentElementName().getNamespaceURI(); 61 62 private final Naming naming; 63 64 public LoginConfigBuilder(Kernel kernel) { 65 this.naming = kernel.getNaming(); 66 } 67 68 public LoginConfigBuilder(Naming naming) { 69 this.naming = naming; 70 } 71 72 public String getNamespace() { 73 return LOGIN_CONFIG_NAMESPACE; 74 } 75 76 public ReferencePatterns getReferences(XmlObject xmlObject, DeploymentContext context, AbstractName parentName, ClassLoader classLoader) throws DeploymentException { 77 GerLoginConfigType loginConfig = (GerLoginConfigType) xmlObject.copy().changeType(GerLoginConfigType.type); 78 XmlOptions xmlOptions = new XmlOptions(); 79 xmlOptions.setLoadLineNumbers(); 80 Collection errors = new ArrayList (); 81 xmlOptions.setErrorListener(errors); 82 if (!loginConfig.validate(xmlOptions)) { 83 throw new DeploymentException("Invalid login configuration:\n" + errors + "\nDescriptor: " + loginConfig.toString()); 84 } 85 XmlCursor xmlCursor = loginConfig.newCursor(); 86 List uses = new ArrayList (); 87 Set loginModuleNames = new HashSet (); 88 try { 89 boolean atStart = true; 90 while ((atStart && xmlCursor.toFirstChild()) || (!atStart && xmlCursor.toNextSibling())) { 91 atStart = false; 92 XmlObject child = xmlCursor.getObject(); 93 GerAbstractLoginModuleType abstractLoginModule = (GerAbstractLoginModuleType) child; 94 String controlFlag = abstractLoginModule.getControlFlag().toString(); 95 boolean wrapPrincipals = (abstractLoginModule.isSetWrapPrincipals() && abstractLoginModule.getWrapPrincipals()); 96 ReferencePatterns loginModuleReferencePatterns; 97 String name; 98 if (abstractLoginModule instanceof GerLoginModuleRefType) { 99 GerLoginModuleRefType loginModuleRef = (GerLoginModuleRefType) abstractLoginModule; 100 PatternType patternType = loginModuleRef.getPattern(); 101 AbstractNameQuery loginModuleNameQuery = SingleGBeanBuilder.buildAbstractNameQuery(patternType, USE_REFERENCE_INFO); 102 loginModuleReferencePatterns = new ReferencePatterns(loginModuleNameQuery); 103 name = (String ) loginModuleNameQuery.getName().get("name"); 104 if (name == null) { 105 throw new DeploymentException("You must specify the name of the login module in the login module ref " + patternType); 106 } 107 } else if (abstractLoginModule instanceof GerLoginModuleType) { 125 AbstractName loginModuleName; 127 128 GerLoginModuleType loginModule = (GerLoginModuleType) abstractLoginModule; 129 name = trim(loginModule.getLoginDomainName()); 130 if (!loginModuleNames.add(name)) { 131 throw new DeploymentException("Security realm contains two login domains called '" + name + "'"); 132 } 133 String className = trim(loginModule.getLoginModuleClass()); 134 boolean serverSide = loginModule.getServerSide(); 135 Properties options = new Properties (); 136 GerOptionType[] optionArray = loginModule.getOptionArray(); 137 for (int j = 0; j < optionArray.length; j++) { 138 GerOptionType gerOptionType = optionArray[j]; 139 String key = gerOptionType.getName(); 140 String value = trim(gerOptionType.getStringValue()); 141 options.setProperty(key, value); 142 } 143 loginModuleName = naming.createChildName(parentName, name, NameFactory.LOGIN_MODULE); 144 loginModuleReferencePatterns = new ReferencePatterns(loginModuleName); 145 GBeanData loginModuleGBeanData = new GBeanData(loginModuleName, LoginModuleGBean.GBEAN_INFO); 146 loginModuleGBeanData.setAttribute("loginDomainName", name); 147 loginModuleGBeanData.setAttribute("loginModuleClass", className); 148 loginModuleGBeanData.setAttribute("options", options); 149 loginModuleGBeanData.setAttribute("serverSide", Boolean.valueOf(serverSide)); 150 loginModuleGBeanData.setAttribute("wrapPrincipals", Boolean.valueOf(wrapPrincipals)); 151 152 context.addGBean(loginModuleGBeanData); 153 } else { 154 throw new DeploymentException("Unknown abstract login module type: " + abstractLoginModule.getClass()); 155 } 156 AbstractName thisName; 157 thisName = naming.createChildName(parentName, name, "LoginModuleUse"); 158 GBeanData loginModuleUseGBeanData = new GBeanData(thisName, JaasLoginModuleUse.GBEAN_INFO); 159 loginModuleUseGBeanData.setAttribute("controlFlag", controlFlag); 160 loginModuleUseGBeanData.setReferencePatterns("LoginModule", loginModuleReferencePatterns); 161 uses.add(loginModuleUseGBeanData); 162 } 163 for (int i = uses.size() - 1; i >= 0; i--) { 164 GBeanData data = (GBeanData) uses.get(i); 165 if (i > 0) { 166 ((GBeanData) uses.get(i - 1)).setReferencePattern("Next", data.getAbstractName()); 167 } 168 context.addGBean(data); 169 } 170 } 171 catch (GBeanAlreadyExistsException e) { 172 throw new DeploymentException(e); 173 } finally { 174 xmlCursor.dispose(); 175 } 176 return uses.size() == 0 ? null : new ReferencePatterns(((GBeanData) uses.get(0)).getAbstractName()); 177 } 178 179 private String trim(String string) { 180 return string == null ? null : string.trim(); 181 } 182 183 public static final GBeanInfo GBEAN_INFO; 184 185 private static final GReferenceInfo USE_REFERENCE_INFO; 186 187 static { 188 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(LoginConfigBuilder.class, "XmlReferenceBuilder"); 189 infoBuilder.addAttribute("kernel", Kernel.class, false, false); 190 infoBuilder.setConstructor(new String [] {"kernel"}); 191 infoBuilder.addInterface(XmlReferenceBuilder.class); 192 GBEAN_INFO = infoBuilder.getBeanInfo(); 193 194 Set referenceInfos = JaasLoginModuleUse.GBEAN_INFO.getReferences(); 195 GReferenceInfo found = null; 196 for (Iterator iterator = referenceInfos.iterator(); iterator.hasNext();) { 197 GReferenceInfo testReferenceInfo = (GReferenceInfo) iterator.next(); 198 String testRefName = testReferenceInfo.getName(); 199 if (testRefName.equals("LoginModule")) { 200 found = testReferenceInfo; 201 break; 202 } 203 } 204 if (found == null) { 205 throw new RuntimeException ("Someone changed the gbeaninfo on JaasLoginModuleUse"); 206 } 207 USE_REFERENCE_INFO = found; 208 209 } 210 211 public static GBeanInfo getGBeanInfo() { 212 return GBEAN_INFO; 213 } 214 } 215 | Popular Tags |