2 * Copyright 2001-2006 Internet2
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 * Base class for SAML 1.x and 2.0 artifacts
24 #include "SAMLArtifact.h"
26 #include <xercesc/util/Base64.hpp>
28 using namespace opensaml;
29 using namespace xmltooling;
34 SAML_DLLLOCAL PluginManager<SAMLArtifact,const char*>::Factory SAMLArtifactType0001Factory;
35 SAML_DLLLOCAL PluginManager<SAMLArtifact,const char*>::Factory SAMLArtifactType0002Factory;
39 SAML_DLLLOCAL PluginManager<SAMLArtifact,const char*>::Factory SAML2ArtifactType0004Factory;
43 void SAML_API opensaml::registerSAMLArtifacts()
45 SAMLConfig& conf=SAMLConfig::getConfig();
50 conf.SAMLArtifactManager.registerFactory(typecode, saml1p::SAMLArtifactType0001Factory);
51 typecode[1]=(char)0x2;
52 conf.SAMLArtifactManager.registerFactory(typecode, saml1p::SAMLArtifactType0002Factory);
53 typecode[1]=(char)0x4;
54 conf.SAMLArtifactManager.registerFactory(typecode, saml2p::SAML2ArtifactType0004Factory);
57 const unsigned int SAMLArtifact::TYPECODE_LENGTH = 2;
59 // Basic constructor just decodes the string and saves it off.
60 // Subclasses will handle pulling it apart.
62 SAMLArtifact::SAMLArtifact(const char* s)
65 XMLByte* decoded=Base64::decode(reinterpret_cast<const XMLByte*>(s),&len);
67 throw ArtifactException("Unable to decode base64 artifact.");
71 XMLString::release(&decoded);
74 string SAMLArtifact::encode() const
77 XMLByte* out=Base64::encode(reinterpret_cast<const XMLByte*>(m_raw.data()),m_raw.size(),&len);
79 string ret(reinterpret_cast<char*>(out),len);
80 XMLString::release(&out);
86 SAMLArtifact* SAMLArtifact::parse(const char* s)
88 // Decode and extract the type code first.
90 XMLByte* decoded=Base64::decode(reinterpret_cast<const XMLByte*>(s),&len);
92 throw ArtifactException("Artifact parser unable to decode base64-encoded artifact.");
97 XMLString::release(&decoded);
99 return SAMLConfig::getConfig().SAMLArtifactManager.newPlugin(type,s);
102 string SAMLArtifact::toHex(const string& s)
104 static char DIGITS[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
105 string::size_type len = s.length();
108 // two characters form the hex value.
109 for (string::size_type i=0; i < len; i++) {
110 ret+=(DIGITS[((unsigned char)(0xF0 & s[i])) >> 4 ]);
111 ret+=(DIGITS[0x0F & s[i]]);