package edu.internet2.middleware.shibboleth.common;
import java.net.URI;
+import java.security.Principal;
import org.opensaml.SAMLNameIdentifier;
/**
- * Defines a mechanism for converting back and forth between SAML Name Identifiers and local {@link AuthNPrincipal}
+ * Defines a mechanism for converting back and forth between SAML Name Identifiers and local {@link LocalPrincipal}
* objects.
*
* @author Walter Hoehn
* @throws InvalidNameIdentifierException
* If the {@link SAMLNameIdentifier}contains invalid data
*/
- public AuthNPrincipal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
+ public Principal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
throws NameIdentifierMappingException, InvalidNameIdentifierException;
/**
* @throws NameIdentifierMappingException
* If the {@link NameMapper}encounters an internal error
*/
- public SAMLNameIdentifier getNameIdentifier(AuthNPrincipal principal, ServiceProvider sProv,
- IdentityProvider idProv) throws NameIdentifierMappingException;
+ public SAMLNameIdentifier getNameIdentifier(LocalPrincipal principal, ServiceProvider sProv, IdentityProvider idProv)
+ throws NameIdentifierMappingException;
/**
* Cleanup resources that won't be released when this object is garbage-collected
import java.lang.reflect.Constructor;
import java.net.URI;
import java.net.URISyntaxException;
+import java.security.Principal;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import edu.internet2.middleware.shibboleth.xml.Parser;
/**
- * Facility for managing mappings from SAML Name Identifiers to local {@link AuthNPrincipal}objects. Mappings are
+ * Facility for managing mappings from SAML Name Identifiers to local {@link LocalPrincipal}objects. Mappings are
* registered by Name Identifier format and can be associated with a <code>String</code> id and recovered based on the
* same.
*
/** Mapping to use if no other mappings have been added */
protected SharedMemoryShibHandle defaultMapping;
- //Preload aliases for bundled mappings
+ // Preload aliases for bundled mappings
static {
try {
registeredMappingTypes.put("CryptoHandleGenerator", Class
public NameMapper() {
try {
- //Load the default mapping
+ // Load the default mapping
String rawConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
- + "<NameMapping xmlns=\"urn:mace:shibboleth:namemapper:1.0\" format=\"urn:mace:shibboleth:1.0:nameIdentifier\"" + " handleTTL=\"1800\"/>";
+ + "<NameMapping xmlns=\"urn:mace:shibboleth:namemapper:1.0\" format=\"urn:mace:shibboleth:1.0:nameIdentifier\""
+ + " handleTTL=\"1800\"/>";
Parser.DOMParser parser = new Parser.DOMParser(false);
- parser.parse(new InputSource(new StringReader(rawConfig)));
+ parser.parse(new InputSource(new StringReader(rawConfig)));
defaultMapping = new SharedMemoryShibHandle(parser.getDocument().getDocumentElement());
} catch (Exception e) {
* @throws InvalidNameIdentifierException
* If the {@link SAMLNameIdentifier}contains invalid data
*/
- public AuthNPrincipal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
+ public Principal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
throws NameIdentifierMappingException, InvalidNameIdentifierException {
NameIdentifierMapping mapping = null;
* @throws NameIdentifierMappingException
* If the <code>NameMapper</code> encounters an internal error
*/
- public SAMLNameIdentifier getNameIdentifierName(String id, AuthNPrincipal principal, ServiceProvider sProv,
+ public SAMLNameIdentifier getNameIdentifierName(String id, LocalPrincipal principal, ServiceProvider sProv,
IdentityProvider idProv) throws NameIdentifierMappingException {
NameIdentifierMapping mapping = getNameIdentifierMappingById(id);
private TestNameIdentifierMapping() {
- //Constructor to prevent others from creating this class
+ // Constructor to prevent others from creating this class
}
/*
* edu.internet2.middleware.shibboleth.common.ServiceProvider,
* edu.internet2.middleware.shibboleth.common.IdentityProvider)
*/
- public AuthNPrincipal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
+ public Principal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
throws NameIdentifierMappingException, InvalidNameIdentifierException {
log.info("Request references built-in test principal.");
+ ") for the referenced subject is not valid for this identity provider.");
}
- return new AuthNPrincipal("test-handle");
+ return new LocalPrincipal("test-handle");
}
/*
*/
public void destroy() {
- //Nothing to do
+ // Nothing to do
}
/*
/*
* (non-Javadoc)
*
- * @see edu.internet2.middleware.shibboleth.common.NameIdentifierMapping#getNameIdentifierName(edu.internet2.middleware.shibboleth.common.AuthNPrincipal,
+ * @see edu.internet2.middleware.shibboleth.common.NameIdentifierMapping#getNameIdentifierName(edu.internet2.middleware.shibboleth.common.LocalPrincipal,
* edu.internet2.middleware.shibboleth.common.ServiceProvider,
* edu.internet2.middleware.shibboleth.common.IdentityProvider)
*/
- public SAMLNameIdentifier getNameIdentifier(AuthNPrincipal principal, ServiceProvider sProv,
+ public SAMLNameIdentifier getNameIdentifier(LocalPrincipal principal, ServiceProvider sProv,
IdentityProvider idProv) throws NameIdentifierMappingException {
try {
import org.opensaml.SAMLException;
import org.w3c.dom.Element;
-import edu.internet2.middleware.shibboleth.common.AuthNPrincipal;
+import edu.internet2.middleware.shibboleth.common.LocalPrincipal;
import edu.internet2.middleware.shibboleth.common.NameIdentifierMappingException;
/**
}
}
- protected HandleEntry createHandleEntry(AuthNPrincipal principal) {
+ protected HandleEntry createHandleEntry(LocalPrincipal principal) {
return new HandleEntry(principal, handleTTL);
}
class HandleEntry implements Serializable {
static final long serialVersionUID = 1L;
- protected AuthNPrincipal principal;
+ protected LocalPrincipal principal;
protected long expirationTime;
/**
* @param TTL
* the time, in seconds, for which the handle should be valid.
*/
- protected HandleEntry(AuthNPrincipal principal, long TTL) {
+ protected HandleEntry(LocalPrincipal principal, long TTL) {
this.principal = principal;
expirationTime = System.currentTimeMillis() + (TTL * 1000);
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
+import java.security.Principal;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
-import edu.internet2.middleware.shibboleth.common.AuthNPrincipal;
import edu.internet2.middleware.shibboleth.common.IdentityProvider;
import edu.internet2.middleware.shibboleth.common.InvalidNameIdentifierException;
+import edu.internet2.middleware.shibboleth.common.LocalPrincipal;
import edu.internet2.middleware.shibboleth.common.NameIdentifierMapping;
import edu.internet2.middleware.shibboleth.common.NameIdentifierMappingException;
import edu.internet2.middleware.shibboleth.common.ServiceProvider;
/**
* Decode an encrypted handle back into a principal
*/
- public AuthNPrincipal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
+ public Principal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
throws NameIdentifierMappingException, InvalidNameIdentifierException {
verifyQualifier(nameId, idProv);
long decodedExpirationTime = dataStream.readLong();
String decodedPrincipal = dataStream.readUTF();
- HMACHandleEntry macHandleEntry = createHMACHandleEntry(new AuthNPrincipal(decodedPrincipal));
+ HMACHandleEntry macHandleEntry = createHMACHandleEntry(new LocalPrincipal(decodedPrincipal));
macHandleEntry.setExpirationTime(decodedExpirationTime);
byte[] generatedMac = macHandleEntry.getMAC(mac);
* to encode the IV or MAC's lengths. They can be obtained from Cipher.getBlockSize() and Mac.getMacLength(),
* respectively.
*/
- public SAMLNameIdentifier getNameIdentifier(AuthNPrincipal principal, ServiceProvider sProv, IdentityProvider idProv)
+ public SAMLNameIdentifier getNameIdentifier(LocalPrincipal principal, ServiceProvider sProv, IdentityProvider idProv)
throws NameIdentifierMappingException {
if (principal == null) {
return Arrays.equals(defaultKey, encodedKey);
}
- protected HMACHandleEntry createHMACHandleEntry(AuthNPrincipal principal) {
+ protected HMACHandleEntry createHMACHandleEntry(LocalPrincipal principal) {
return new HMACHandleEntry(principal, handleTTL);
}
class HMACHandleEntry extends HandleEntry {
- protected HMACHandleEntry(AuthNPrincipal principal, long TTL) {
+ protected HMACHandleEntry(LocalPrincipal principal, long TTL) {
super(principal, TTL);
}
package edu.internet2.middleware.shibboleth.common.provider;
+import java.security.Principal;
+
import org.apache.log4j.Logger;
import org.opensaml.SAMLException;
import org.opensaml.SAMLNameIdentifier;
import org.w3c.dom.Element;
-import edu.internet2.middleware.shibboleth.common.AuthNPrincipal;
import edu.internet2.middleware.shibboleth.common.IdentityProvider;
import edu.internet2.middleware.shibboleth.common.InvalidNameIdentifierException;
+import edu.internet2.middleware.shibboleth.common.LocalPrincipal;
import edu.internet2.middleware.shibboleth.common.NameIdentifierMapping;
import edu.internet2.middleware.shibboleth.common.NameIdentifierMappingException;
import edu.internet2.middleware.shibboleth.common.ServiceProvider;
super(config);
}
- public AuthNPrincipal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
+ public Principal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
throws NameIdentifierMappingException, InvalidNameIdentifierException {
verifyQualifier(nameId, idProv);
- return new AuthNPrincipal(nameId.getName());
+ return new LocalPrincipal(nameId.getName());
}
- public SAMLNameIdentifier getNameIdentifier(AuthNPrincipal principal, ServiceProvider sProv,
- IdentityProvider idProv) throws NameIdentifierMappingException {
+ public SAMLNameIdentifier getNameIdentifier(LocalPrincipal principal, ServiceProvider sProv, IdentityProvider idProv)
+ throws NameIdentifierMappingException {
if (principal == null) {
log.error("A principal must be supplied for Name Identifier creation.");
package edu.internet2.middleware.shibboleth.common.provider;
+import java.security.Principal;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import org.opensaml.SAMLNameIdentifier;
import org.w3c.dom.Element;
-import edu.internet2.middleware.shibboleth.common.AuthNPrincipal;
import edu.internet2.middleware.shibboleth.common.IdentityProvider;
import edu.internet2.middleware.shibboleth.common.InvalidNameIdentifierException;
+import edu.internet2.middleware.shibboleth.common.LocalPrincipal;
import edu.internet2.middleware.shibboleth.common.NameIdentifierMapping;
import edu.internet2.middleware.shibboleth.common.NameIdentifierMappingException;
import edu.internet2.middleware.shibboleth.common.ServiceProvider;
/*
* (non-Javadoc)
*
- * @see edu.internet2.middleware.shibboleth.common.NameIdentifierMapping#getNameIdentifier(edu.internet2.middleware.shibboleth.common.AuthNPrincipal,
+ * @see edu.internet2.middleware.shibboleth.common.NameIdentifierMapping#getNameIdentifier(edu.internet2.middleware.shibboleth.common.LocalPrincipal,
* edu.internet2.middleware.shibboleth.common.ServiceProvider,
* edu.internet2.middleware.shibboleth.common.IdentityProvider)
*/
- public SAMLNameIdentifier getNameIdentifier(AuthNPrincipal principal, ServiceProvider sProv, IdentityProvider idProv)
+ public SAMLNameIdentifier getNameIdentifier(LocalPrincipal principal, ServiceProvider sProv, IdentityProvider idProv)
throws NameIdentifierMappingException {
if (principal == null) {
* edu.internet2.middleware.shibboleth.common.ServiceProvider,
* edu.internet2.middleware.shibboleth.common.IdentityProvider)
*/
- public AuthNPrincipal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
+ public Principal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
throws NameIdentifierMappingException, InvalidNameIdentifierException {
verifyQualifier(nameId, idProv);
package edu.internet2.middleware.shibboleth.common.provider;
+import java.security.Principal;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
-import org.apache.log4j.Logger;
import javax.xml.namespace.QName;
+
+import org.apache.log4j.Logger;
import org.opensaml.SAMLException;
import org.opensaml.SAMLNameIdentifier;
import org.w3c.dom.Element;
-import edu.internet2.middleware.shibboleth.common.AuthNPrincipal;
import edu.internet2.middleware.shibboleth.common.IdentityProvider;
import edu.internet2.middleware.shibboleth.common.InvalidNameIdentifierException;
+import edu.internet2.middleware.shibboleth.common.LocalPrincipal;
import edu.internet2.middleware.shibboleth.common.NameIdentifierMapping;
import edu.internet2.middleware.shibboleth.common.NameIdentifierMappingException;
import edu.internet2.middleware.shibboleth.common.ServiceProvider;
* edu.internet2.middleware.shibboleth.common.ServiceProvider,
* edu.internet2.middleware.shibboleth.common.IdentityProvider)
*/
- public AuthNPrincipal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
+ public Principal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
throws NameIdentifierMappingException, InvalidNameIdentifierException {
if (!nameId.getNameQualifier().equals(qualifier)) {
String principal = matcher.group(1);
if (principal == null) { throw new InvalidNameIdentifierException("Unable to map X509SubjectName ("
+ nameId.getName() + ") to a local principal.", errorCodes); }
- return new AuthNPrincipal(principal);
+ return new LocalPrincipal(principal);
}
/*
* (non-Javadoc)
*
- * @see edu.internet2.middleware.shibboleth.common.NameIdentifierMapping#getNameIdentifier(edu.internet2.middleware.shibboleth.common.AuthNPrincipal,
+ * @see edu.internet2.middleware.shibboleth.common.NameIdentifierMapping#getNameIdentifier(edu.internet2.middleware.shibboleth.common.LocalPrincipal,
* edu.internet2.middleware.shibboleth.common.ServiceProvider,
* edu.internet2.middleware.shibboleth.common.IdentityProvider)
*/
- public SAMLNameIdentifier getNameIdentifier(AuthNPrincipal principal, ServiceProvider sProv, IdentityProvider idProv)
+ public SAMLNameIdentifier getNameIdentifier(LocalPrincipal principal, ServiceProvider sProv, IdentityProvider idProv)
throws NameIdentifierMappingException {
try {
import java.io.File;
import java.io.StringReader;
import java.net.MalformedURLException;
+import java.security.Principal;
import junit.framework.TestCase;
import org.opensaml.SAMLNameIdentifier;
import org.xml.sax.InputSource;
-import edu.internet2.middleware.shibboleth.common.AuthNPrincipal;
import edu.internet2.middleware.shibboleth.common.Credential;
import edu.internet2.middleware.shibboleth.common.IdentityProvider;
import edu.internet2.middleware.shibboleth.common.InvalidNameIdentifierException;
+import edu.internet2.middleware.shibboleth.common.LocalPrincipal;
import edu.internet2.middleware.shibboleth.common.NameIdentifierMapping;
import edu.internet2.middleware.shibboleth.common.NameIdentifierMappingException;
import edu.internet2.middleware.shibboleth.common.NameMapper;
import edu.internet2.middleware.shibboleth.common.ServiceProvider;
-import edu.internet2.middleware.shibboleth.common.provider.CryptoShibHandle;
import edu.internet2.middleware.shibboleth.xml.Parser;
/**
parser.parse(new InputSource(new StringReader(rawConfig)));
nameMapper.addNameMapping(parser.getDocument().getDocumentElement());
- SAMLNameIdentifier nameId = nameMapper.getNameIdentifierName("cryptotest", new AuthNPrincipal(
+ SAMLNameIdentifier nameId = nameMapper.getNameIdentifierName("cryptotest", new LocalPrincipal(
"testprincipal"), new BasicServiceProvider(), new BasicIdentityProvider("urn-x:testid"));
- AuthNPrincipal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
+ Principal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
new BasicIdentityProvider("urn-x:testid"));
assertEquals("Round-trip handle validation failed.", principal.getName(), "testprincipal");
parser.parse(new InputSource(new StringReader(rawConfig)));
nameMapper.addNameMapping(parser.getDocument().getDocumentElement());
- SAMLNameIdentifier nameId = nameMapper.getNameIdentifierName("cryptotest", new AuthNPrincipal(
+ SAMLNameIdentifier nameId = nameMapper.getNameIdentifierName("cryptotest", new LocalPrincipal(
"testprincipal"), new BasicServiceProvider(), new BasicIdentityProvider("urn-x:testid"));
log.debug("Waiting 11 seconds for the handle to expire.");
Thread.sleep(11000);
- AuthNPrincipal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
+ Principal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
new BasicIdentityProvider("urn-x:testid"));
fail("Error: crypto handle should have expired but appears to work.");
parser.parse(new InputSource(new StringReader(rawConfig)));
nameMapper.addNameMapping(parser.getDocument().getDocumentElement());
- SAMLNameIdentifier nameId = nameMapper.getNameIdentifierName("cryptotest", new AuthNPrincipal(
+ SAMLNameIdentifier nameId = nameMapper.getNameIdentifierName("cryptotest", new LocalPrincipal(
"testprincipal"), new BasicServiceProvider(), new BasicIdentityProvider("urn-x:testid"));
- AuthNPrincipal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
+ Principal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
new BasicIdentityProvider("urn-x:testid"));
assertEquals("Round-trip handle validation failed.", principal.getName(), "testprincipal");
parser.parse(new InputSource(new StringReader(rawConfig)));
nameMapper.addNameMapping(parser.getDocument().getDocumentElement());
- SAMLNameIdentifier nameId = nameMapper.getNameIdentifierName("cryptotest", new AuthNPrincipal(
+ SAMLNameIdentifier nameId = nameMapper.getNameIdentifierName("cryptotest", new LocalPrincipal(
"testprincipal"), new BasicServiceProvider(), new BasicIdentityProvider("urn-x:good"));
- AuthNPrincipal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
+ Principal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
new BasicIdentityProvider("urn-x:bad"));
fail("Expected failure for bad name qualifier.");
NameMapper nameMapper = new NameMapper();
- SAMLNameIdentifier nameId = nameMapper.getNameIdentifierName(null, new AuthNPrincipal("testprincipal"),
+ SAMLNameIdentifier nameId = nameMapper.getNameIdentifierName(null, new LocalPrincipal("testprincipal"),
new BasicServiceProvider(), new BasicIdentityProvider("urn-x:testid"));
- AuthNPrincipal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
+ Principal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
new BasicIdentityProvider("urn-x:testid"));
assertEquals("Round-trip handle validation failed.", principal.getName(), "testprincipal");
parser.parse(new InputSource(new StringReader(rawConfig)));
nameMapper.addNameMapping(parser.getDocument().getDocumentElement());
- SAMLNameIdentifier nameId = nameMapper.getNameIdentifierName(null, new AuthNPrincipal("testprincipal"),
+ SAMLNameIdentifier nameId = nameMapper.getNameIdentifierName(null, new LocalPrincipal("testprincipal"),
new BasicServiceProvider(), new BasicIdentityProvider("urn-x:testid"));
- AuthNPrincipal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
+ Principal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
new BasicIdentityProvider("urn-x:testid"));
assertEquals("Round-trip handle validation failed.", principal.getName(), "testprincipal");
nameMapper.addNameMapping(parser.getDocument().getDocumentElement());
- nameMapper.getNameIdentifierName(null, new AuthNPrincipal("testprincipal"), new BasicServiceProvider(),
+ nameMapper.getNameIdentifierName(null, new LocalPrincipal("testprincipal"), new BasicServiceProvider(),
new BasicIdentityProvider("urn-x:testid"));
fail("HSNameMapper defaulted to incorrect name mapping.");
parser.parse(new InputSource(new StringReader(rawConfig)));
nameMapper.addNameMapping(parser.getDocument().getDocumentElement());
- SAMLNameIdentifier nameId = nameMapper.getNameIdentifierName("memorytest", new AuthNPrincipal(
+ SAMLNameIdentifier nameId = nameMapper.getNameIdentifierName("memorytest", new LocalPrincipal(
"testprincipal"), new BasicServiceProvider(), new BasicIdentityProvider("urn-x:testid"));
- AuthNPrincipal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
+ Principal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
new BasicIdentityProvider("urn-x:testid"));
assertEquals("Round-trip handle validation failed.", principal.getName(), "testprincipal");
parser.parse(new InputSource(new StringReader(rawConfig)));
nameMapper.addNameMapping(parser.getDocument().getDocumentElement());
- SAMLNameIdentifier nameId = nameMapper.getNameIdentifierName("memory", new AuthNPrincipal("testprincipal"),
+ SAMLNameIdentifier nameId = nameMapper.getNameIdentifierName("memory", new LocalPrincipal("testprincipal"),
new BasicServiceProvider(), new BasicIdentityProvider("urn-x:good"));
- AuthNPrincipal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
+ Principal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
new BasicIdentityProvider("urn-x:bad"));
fail("Expected failure for bad name qualifier.");
nameMapper.addNameMapping(parser.getDocument().getDocumentElement());
SAMLNameIdentifier nameId = new SAMLNameIdentifier("testprincipal", "urn-x:testid", format);
- AuthNPrincipal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
+ Principal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
new BasicIdentityProvider("urn-x:testid"));
assertEquals("Round-trip handle validation failed.", principal.getName(), "testprincipal");
SAMLNameIdentifier nameId = new SAMLNameIdentifier("testprincipal", "urn-x:good", format);
- AuthNPrincipal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
+ Principal principal = nameMapper.getPrincipal(nameId, new BasicServiceProvider(),
new BasicIdentityProvider("urn-x:bad"));
fail("Expected failure for bad name qualifier.");