Good Day,
I got the source from common/jbossxb and that seems to have the change to fix the
attributes.
The problem is that when I add a handler for an element text then that xml node is
duplicated, once without the text element and once with.
| <?xml version="1.0" encoding="UTF-8"?>
| <!DOCTYPE policy PUBLIC "-//JBoss//DTD JBOSS Security Config 3.0//EN"
"http://www.jboss.org/j2ee/dtd/security_config.dtd">
|
| <policy>
| <application-policy name="other">
| <authentication>
| <login-module flag="required"
code="org.jboss.security.auth.spi.LdapExtLoginModule">
| <module-option
name="bindCredentials"></module-option>
| <module-option
name="java.naming.provider.url"></module-option>
| </login-module>
| </authentication>
| </application-policy>
| <application-policy name="test">
| <authentication>
| <login-module flag="required"
code="org.jboss.security.auth.spi.LdapExtLoginModule">
| <module-option
name="bindCredentials"></module-option>
| <module-option
name="java.naming.provider.url"></module-option>
| </login-module>
| </authentication>
| </application-policy>
| </policy>
|
I have written a testcase to help with the fixing of the issue. The testcase has a
dependancy on jbosssx.jar.
Here is my ObjectModelProvider
| package org.jboss.xb.test;
|
| import java.util.ArrayList;
| import java.util.Arrays;
| import java.util.HashMap;
| import java.util.List;
| import java.util.Map;
| import java.util.Set;
|
| import javax.security.auth.login.AppConfigurationEntry;
| import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
|
| import org.jboss.security.auth.login.AuthenticationInfo;
| import org.jboss.security.auth.login.PolicyConfig;
| import org.jboss.xb.binding.MarshallingContext;
| import org.jboss.xb.binding.ObjectModelProvider;
|
| /**
| * @author Mark Ashworth
| * @version 1.0.0
| */
| public class LoginConfigObjectModelProvider implements ObjectModelProvider {
| /**
| * Used to simulate the authentication node
| */
| static class Authentication {
| public List<AppConfigurationEntry> entries;
| public Authentication(List<AppConfigurationEntry> entries) {
| this.entries = entries;
| }
| }
| /**
| * ROOT: policy
| */
| public Object getRoot(
| Object o,
| MarshallingContext ctx,
| String namespaceURI,
| String localName) {
|
| return o;
| }
| /**
| * application-policy
| */
| public Object getChildren(
| PolicyConfig policyConfig,
| String namespaceUri,
| String localName) {
|
| List<AuthenticationInfo> infos = new ArrayList<AuthenticationInfo>();
| Set<String> keys = policyConfig.getConfigNames();
| for (String name : keys) {
| infos.add(policyConfig.get(name));
| }
| return infos;
| }
| /**
| * application-policy name
| */
| public Object getAttributeValue(
| AuthenticationInfo authInfo,
| String namespaceUri,
| String localName) {
|
| Object value = null;
| if ("name".equals(localName)) {
| value = authInfo.getName();
| }
|
| return value;
| }
| /**
| * authentication
| */
| public Object getChildren(
| AuthenticationInfo authInfo,
| String namespaceUri,
| String localName) {
|
| return new Authentication(Arrays.asList((authInfo.getAppConfigurationEntry())));
| }
| /**
| * login-module
| */
| public Object getChildren(
| Authentication authentication,
| String namespaceUri,
| String localName) {
|
| return authentication.entries;
| }
| /**
| * login-module code flag
| */
| public Object getAttributeValue(
| AppConfigurationEntry entry,
| String namespaceUri,
| String localName) {
|
| Object value = null;
| if ("code".equals(localName)) {
| value = entry.getLoginModuleName();
| } else if ("flag".equals(localName)) {
|
| if (entry.getControlFlag() == LoginModuleControlFlag.OPTIONAL) {
| value = "optional";
| } else if (entry.getControlFlag() == LoginModuleControlFlag.REQUIRED) {
| value = "required";
| } else if (entry.getControlFlag() == LoginModuleControlFlag.REQUISITE) {
| value = "requisite";
| } else if (entry.getControlFlag() == LoginModuleControlFlag.SUFFICIENT) {
| value = "sufficient";
| } else{
| value = "";
| }
| }
|
| return value;
| }
| /**
| * module-option
| */
| public Object getChildren(
| AppConfigurationEntry entry,
| String namespaceUri,
| String localName) {
|
| Map<String, ModuleOption> options = new HashMap<String,
ModuleOption>();
|
| Set<String> keys = entry.getOptions().keySet();
| for (String key : keys) {
| Object value = entry.getOptions().get(key);
| options.put(key, new ModuleOption(key, value));
| }
|
| return options.values();
| }
| /**
| * module-option name
| */
| public Object getAttributeValue(
| ModuleOption moduleOption,
| String namespaceUri,
| String localName) {
|
| Object value = null;
| if ("name".equals(localName)) {
| value = moduleOption.getName();
| }
|
| return value;
| }
| /**
| * module-option text
| */
| // public Object getElementValue(
| // ModuleOption moduleOption,
| // String namespaceUri,
| // String localName) {
| //
| // return moduleOption.getValue();
| // }
| }
|
| package org.jboss.xb.test;
|
| import java.io.Serializable;
|
| /**
| * @author Mark Ashworth
| * @version 1.0.0
| */
| public class ModuleOption implements Serializable {
| /** Serial version id*/
| private static final long serialVersionUID = 2105836972498754806L;
|
| private String name;
| private Object value = "";
| /**
| * Constructs an option with a null value
| * @param name The name of the option
| */
| public ModuleOption(String name) {
| this.name = name;
| }
| /**
| * Constructs an option with a null value
| * @param name The name of the option
| * @param value The value of the option
| */
| public ModuleOption(String name, Object value) {
| this.name = name;
| this.value = value;
| }
| /**
| * Returns the option name
| * @return The name of the option
| */
| public String getName() {
| return name;
| }
| /**
| * Returns the option value
| * @return The value of the option
| */
| public Object getValue() {
| return value;
| }
| /**
| * Sets the option value
| * @param value The value of the option
| */
| public void setValue(Object value) {
| this.value = value;
| }
| /**
| * Returns whether the option is a password / credential
| * @return boolean
| */
| public boolean isPassword() {
| if (getName() == null) {
| return false;
| }
| String value = getName().toUpperCase();
| if (value.indexOf("PASSWORD") >= 0) {
| return true;
| }
| if (value.indexOf("PWD") >= 0) {
| return true;
| }
| if (value.indexOf("CREDENTIAL") >= 0) {
| return true;
| }
| return false;
| }
| }
|
|
| package org.jboss.xb.test;
|
| import java.io.StringWriter;
| import java.util.HashMap;
| import java.util.Map;
|
| import javax.security.auth.login.AppConfigurationEntry;
| import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
|
| import junit.framework.TestCase;
|
| import org.jboss.security.auth.login.AuthenticationInfo;
| import org.jboss.security.auth.login.PolicyConfig;
| import org.jboss.security.auth.spi.LdapExtLoginModule;
| import org.jboss.xb.binding.AbstractMarshaller;
| import org.jboss.xb.binding.DtdMarshaller;
| import org.jboss.xb.binding.Marshaller;
|
| public class TestPolicyConfigMarshalling extends TestCase {
|
| public void testMarshal() throws Exception {
|
| /*
| * Create the PolicyConfig Object
| */
| Map<String, Object> options = new HashMap<String, Object>();
| options.put("bindCredentials", "password");
| options.put("java.naming.provider.url",
"ldap://localhost:389");
|
| AuthenticationInfo[] authInfos = new AuthenticationInfo[2];
| authInfos[0] = new AuthenticationInfo("other");
| authInfos[0].addAppConfigurationEntry(
| new AppConfigurationEntry(LdapExtLoginModule.class.getName(),
| LoginModuleControlFlag.REQUIRED, options));
|
| authInfos[1] = new AuthenticationInfo("test");
| authInfos[1].addAppConfigurationEntry(
| new AppConfigurationEntry(LdapExtLoginModule.class.getName(),
| LoginModuleControlFlag.REQUIRED, options));
|
|
| PolicyConfig config = new PolicyConfig();
| config.add(authInfos[0]);
| config.add(authInfos[1]);
|
| /*
| * Marshal the PolicyConfig to XML using the DTD
| */
| StringWriter xmlOutput = new StringWriter();
|
| System.setProperty(Marshaller.PROP_MARSHALLER, DtdMarshaller.class
| .getName());
|
| AbstractMarshaller marshaller = (AbstractMarshaller) Marshaller.FACTORY
| .getInstance();
|
| marshaller.mapPublicIdToSystemId(
| "-//JBoss//DTD JBOSS Security Config 3.0//EN",
| "http://www.jboss.org/j2ee/dtd/security_config.dtd");
| LoginConfigObjectModelProvider provider = new LoginConfigObjectModelProvider();
|
marshaller.marshal("http://www.jboss.org/j2ee/dtd/security_config.dt...;,
| provider, config, xmlOutput);
|
| System.out.println(xmlOutput.getBuffer());
| }
| }
|
|
I could probably attach the files to the Jira task once it is created.
Regards,
Mark P Ashworth
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3968544#...
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&a...