5 // Atsushi Enomoto <atsushi@ximian.com>
7 // Copyright (C) 2007 Novell, Inc. http://www.novell.com
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 using System.Collections.ObjectModel;
30 using System.Security.Cryptography.Xml;
31 using System.ServiceModel;
32 using System.ServiceModel.Channels;
34 using System.Xml.Schema;
35 using System.Xml.Serialization;
37 namespace Mono.ServiceModel.IdentitySelectors
39 public class IdentityCard
41 public class ClaimTypeDefinition
43 public ClaimTypeDefinition (string uri, string tag, string description)
47 this.desc = description;
50 string uri, tag, desc;
56 public string DisplayTag {
60 public string Description {
65 public class ClaimValue
67 public ClaimValue (string uri, string value)
83 public class TokenService
85 EndpointAddress address;
86 UserCredential credential;
88 public EndpointAddress Address {
89 get { return address; }
90 set { address = value; }
93 public UserCredential Credential {
94 get { return credential; }
95 set { credential = value; }
98 public void ReadXml (XmlReader reader)
100 // FIXME: do we need different versions?
101 address = EndpointAddress.ReadFrom (AddressingVersion.WSAddressing10, reader);
102 reader.MoveToContent ();
103 // FIXME: create custom serializer
104 credential = new XmlSerializer (typeof (UserCredential)).Deserialize (reader) as UserCredential;
107 public void WriteXml (XmlWriter writer)
109 address.WriteTo (AddressingVersion.WSAddressing10, writer);
110 // FIXME: create custom serializer
111 new XmlSerializer (typeof (UserCredential)).Serialize (writer, credential);
115 [XmlRoot ("UserCredential", Namespace = Constants.WsidNamespace)]
116 public class UserCredential
119 UsernamePasswordCredential username;
120 X509V3Credential x509;
122 public string DisplayCredentialHint {
124 set { hint = value; }
127 public UsernamePasswordCredential Username {
128 get { return username; }
129 set { username = value; }
132 public X509V3Credential X509V3 {
134 set { x509 = value; }
138 public class UsernamePasswordCredential
142 public string Username {
143 get { return username; }
144 set { username = value; }
147 // password is not stored.
150 public class X509V3Credential : IXmlSerializable
152 KeyInfoX509Data data;
154 public KeyInfoX509Data X509Data {
156 set { data = value; }
159 public void WriteXml (XmlWriter w)
162 data.GetXml ().WriteTo (w);
165 public void ReadXml (XmlReader r)
168 XmlDocument doc = new XmlDocument ();
169 data = new KeyInfoX509Data ();
170 data.LoadXml (doc.ReadNode (r) as XmlElement);
173 XmlSchema IXmlSerializable.GetSchema ()
179 const string date_format = "yyyy-MM-dd'T'HH:mm:ss.FFFFFFFZ";
184 string lang, id, version, name;
186 DateTime issued, expires;
189 Collection<TokenService> token_services =
190 new Collection<TokenService> ();
191 Collection<Uri> supported_token_types = new Collection<Uri> ();
192 Collection<ClaimTypeDefinition> supported_claim_types =
193 new Collection<ClaimTypeDefinition> ();
196 DateTime last_updated;
197 string issuer_id, issuer_name;
201 Collection<ClaimValue> claim_values =
202 new Collection<ClaimValue> ();
208 public string Version {
209 get { return version; }
221 get { return issuer; }
224 public DateTime TimeIssued {
225 get { return issued; }
228 public DateTime TimeExpires {
229 get { return expires; }
232 public byte [] Certificate {
233 get { return certificate; }
236 public void Load (XmlReader xmlReader)
238 XmlDictionaryReader reader = XmlDictionaryReader.CreateDictionaryReader (xmlReader);
240 string ns = Constants.WsidNamespace;
241 reader.MoveToContent ();
242 reader.ReadStartElement ("RoamingStore", ns);
243 reader.MoveToContent ();
244 reader.ReadStartElement ("RoamingInformationCard", ns);
245 reader.MoveToContent ();
246 lang = reader.GetAttribute ("xml:lang");
248 reader.ReadStartElement ("InformationCardMetaData", ns);
249 reader.MoveToContent ();
250 reader.ReadStartElement ("InformationCardReference", ns);
251 reader.MoveToContent ();
252 id = reader.ReadElementContentAsString ("CardId", ns);
253 reader.MoveToContent ();
254 version = reader.ReadElementContentAsString ("CardVersion", ns);
255 reader.MoveToContent ();
256 reader.ReadEndElement ();
257 reader.MoveToContent ();
258 name = reader.ReadElementContentAsString ("CardName", ns);
259 reader.MoveToContent ();
260 image_mime = reader.GetAttribute ("MimeType");
261 image = Convert.FromBase64String (
262 reader.ReadElementContentAsString ("CardImage", ns));
263 reader.MoveToContent ();
265 reader.ReadElementContentAsString ("Issuer", ns));
266 reader.MoveToContent ();
267 issued = XmlConvert.ToDateTime (
268 reader.ReadElementContentAsString ("TimeIssued", ns), XmlDateTimeSerializationMode.Utc);
269 reader.MoveToContent ();
270 expires = XmlConvert.ToDateTime (
271 reader.ReadElementContentAsString ("TimeExpires", ns), XmlDateTimeSerializationMode.Utc);
272 reader.MoveToContent ();
273 if (reader.IsStartElement ("TokenServiceList", ns)) {
274 reader.ReadStartElement ("TokenServiceList", ns);
275 reader.MoveToContent ();
276 for (reader.MoveToContent ();
277 reader.NodeType == XmlNodeType.Element;
278 reader.MoveToContent ()) {
279 reader.ReadStartElement ("TokenService", ns);
280 reader.MoveToContent ();
281 TokenService ts = new TokenService ();
283 token_services.Add (ts);
284 reader.MoveToContent ();
285 reader.ReadEndElement ();
287 reader.ReadEndElement ();
290 reader.MoveToContent ();
291 reader.ReadStartElement ("SupportedTokenTypeList", ns);
292 for (reader.MoveToContent ();
293 reader.NodeType == XmlNodeType.Element;
294 reader.MoveToContent ())
295 supported_token_types.Add (new Uri (
296 reader.ReadElementContentAsString ("TokenType", Constants.WstNamespace)));
297 reader.ReadEndElement ();
299 reader.MoveToContent ();
300 reader.ReadStartElement ("SupportedClaimTypeList", ns);
301 for (reader.MoveToContent ();
302 reader.NodeType == XmlNodeType.Element;
303 reader.MoveToContent ()) {
304 string uri = reader.GetAttribute ("Uri");
305 reader.ReadStartElement ("SupportedClaimType", ns);
306 string tag = reader.ReadElementContentAsString ("DisplayTag", ns);
307 reader.MoveToContent ();
308 string desc = reader.ReadElementContentAsString ("Description", ns);
309 reader.MoveToContent ();
310 reader.ReadEndElement ();
311 supported_claim_types.Add (new ClaimTypeDefinition (uri, tag, desc));
313 reader.ReadEndElement ();
315 reader.MoveToContent ();
316 self_issued = reader.ReadElementContentAsBoolean ("IsSelfIssued", ns);
317 reader.MoveToContent ();
318 hash_salt = Convert.FromBase64String (
319 reader.ReadElementContentAsString ("HashSalt", ns));
320 reader.MoveToContent ();
321 last_updated = XmlConvert.ToDateTime (
322 reader.ReadElementContentAsString ("TimeLastUpdated", ns), XmlDateTimeSerializationMode.Utc);
323 reader.MoveToContent ();
324 issuer_id = reader.ReadElementContentAsString ("IssuerId", ns);
325 reader.MoveToContent ();
326 issuer_name = reader.ReadElementContentAsString ("IssuerName", ns);
327 reader.MoveToContent ();
328 back_color = reader.ReadElementContentAsInt ("BackgroundColor", ns);
330 reader.MoveToContent ();
331 reader.ReadEndElement (); // InformationCardMetaData
334 reader.MoveToContent ();
335 reader.ReadStartElement ("InformationCardPrivateData", ns);
336 reader.MoveToContent ();
337 master_key = Convert.FromBase64String (
338 reader.ReadElementContentAsString ("MasterKey", ns));
339 reader.MoveToContent ();
340 if (reader.IsStartElement ("ClaimValueList", ns)) {
341 reader.ReadStartElement ("ClaimValueList", ns);
343 reader.MoveToContent ();
344 for (reader.MoveToContent ();
345 reader.NodeType == XmlNodeType.Element;
346 reader.MoveToContent ()) {
347 string uri = reader.GetAttribute ("Uri");
348 reader.ReadStartElement ("ClaimValue", ns);
349 reader.MoveToContent ();
350 string value = reader.ReadElementContentAsString ("Value", ns);
351 reader.MoveToContent ();
352 reader.ReadEndElement ();
353 claim_values.Add (new ClaimValue (uri, value));
355 reader.ReadEndElement ();
356 reader.MoveToContent ();
359 reader.ReadEndElement (); // InformationCardPrivateData
361 reader.MoveToContent ();
362 reader.ReadEndElement ();
363 reader.MoveToContent ();
364 reader.ReadEndElement ();
367 public void Save (XmlWriter xmlWriter)
369 XmlDictionaryWriter writer = XmlDictionaryWriter.CreateDictionaryWriter (xmlWriter);
371 string ns = Constants.WsidNamespace;
372 writer.WriteStartElement ("RoamingStore", ns);
373 writer.WriteStartElement ("RoamingInformationCard", ns);
375 writer.WriteStartElement ("InformationCardMetaData", ns);
376 writer.WriteAttributeString ("xml:lang", lang);
377 writer.WriteStartElement ("InformationCardReference", ns);
378 writer.WriteElementString ("CardId", ns, id);
379 writer.WriteElementString ("CardVersion", ns, version);
380 writer.WriteEndElement ();
381 writer.WriteElementString ("CardName", ns, name);
382 writer.WriteStartElement ("CardImage", ns);
383 writer.WriteAttributeString ("MimeType", image_mime);
384 writer.WriteString (Convert.ToBase64String (image));
385 writer.WriteEndElement ();
386 writer.WriteElementString ("Issuer", ns, issuer.ToString ());
387 writer.WriteElementString ("TimeIssued", ns, XmlConvert.ToString (issued, date_format));
388 writer.WriteElementString ("TimeExpires", ns, XmlConvert.ToString (expires, date_format));
389 if (token_services.Count > 0) {
391 writer.WriteStartElement ("TokenServiceList", ns);
392 foreach (TokenService ts in token_services) {
393 writer.WriteStartElement ("TokenService", ns);
394 ts.WriteXml (writer);
395 writer.WriteEndElement ();
397 writer.WriteEndElement ();
400 writer.WriteStartElement ("SupportedTokenTypeList", ns);
401 foreach (Uri u in supported_token_types)
402 writer.WriteElementString ("TokenType", Constants.WstNamespace, u.ToString ());
403 writer.WriteEndElement ();
405 writer.WriteStartElement ("SupportedClaimTypeList", ns);
406 foreach (ClaimTypeDefinition cd in supported_claim_types) {
407 writer.WriteStartElement ("SupportedClaimType", ns);
408 writer.WriteAttributeString ("Uri", cd.Uri);
409 writer.WriteElementString ("DisplayTag", ns, cd.DisplayTag);
410 writer.WriteElementString ("Description", ns, cd.Description);
411 writer.WriteEndElement ();
413 writer.WriteEndElement ();
415 writer.WriteStartElement ("IsSelfIssued", ns);
416 writer.WriteString (XmlConvert.ToString (self_issued));
417 writer.WriteEndElement ();
418 writer.WriteStartElement ("HashSalt", ns);
419 writer.WriteString (Convert.ToBase64String (hash_salt));
420 writer.WriteEndElement ();
421 writer.WriteElementString ("TimeLastUpdated", ns, XmlConvert.ToString (last_updated, XmlDateTimeSerializationMode.Utc));
422 writer.WriteElementString ("IssuerId", ns, issuer_id);
423 writer.WriteElementString ("IssuerName", ns, issuer_name);
424 writer.WriteElementString ("BackgroundColor", ns, XmlConvert.ToString (back_color));
426 writer.WriteEndElement (); // InformationCardMetaData
429 writer.WriteStartElement ("InformationCardPrivateData", ns);
430 writer.WriteElementString ("MasterKey", ns, Convert.ToBase64String (master_key));
431 if (claim_values.Count > 0) {
432 writer.WriteStartElement ("ClaimValueList", ns);
433 foreach (ClaimValue cv in claim_values) {
434 writer.WriteStartElement ("ClaimValue", ns);
435 writer.WriteAttributeString ("Uri", cv.Uri);
436 writer.WriteElementString ("Value", ns, cv.Value);
437 writer.WriteEndElement ();
439 writer.WriteEndElement ();
442 writer.WriteEndElement (); // InformationCardPrivateData
444 writer.WriteEndElement ();
445 writer.WriteEndElement ();