2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / Microsoft.Web.Services / Test / Microsoft.Web.Services.Security / UsernameTokenTest.cs
1 //
2 // UsernameTokenTest.cs - NUnit Test Cases for UsernameToken
3 //
4 // Author:
5 //      Sebastien Pouliot (spouliot@motus.com)
6 //
7 // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
8 //
9
10 using NUnit.Framework;
11 using Microsoft.Web.Services.Security;
12 using System;
13 using System.Configuration;
14 using System.Security.Cryptography;
15 using System.Web.Services.Protocols;
16 using System.Xml;
17
18 namespace MonoTests.MS.Web.Services.Security {
19
20         [TestFixture]
21         public class UsernameTokenTest : Assertion {
22
23                 [Test]
24                 public void Constructor_UP () 
25                 {
26                         UsernameToken token = new UsernameToken ("me", "mine");
27                         AssertEquals ("Username", "me", token.Username);
28                         AssertEquals ("Password", "mine", token.Password);
29                         AssertEquals ("PasswordOption", PasswordOption.SendNone, token.PasswordOption);
30                         AssertNull ("Nonce", token.Nonce);
31                 }
32
33                 [Test]
34                 public void Constructor_UPO () 
35                 {
36                         UsernameToken token = new UsernameToken ("me", "mine", PasswordOption.SendNone);
37                         AssertEquals ("SendNone", PasswordOption.SendNone, token.PasswordOption);
38                         AssertNull ("Nonce", token.Nonce);
39
40                         token = new UsernameToken ("me", "mine", PasswordOption.SendPlainText);
41                         AssertEquals ("SendPlainText", PasswordOption.SendPlainText, token.PasswordOption);
42                         AssertNull ("Nonce", token.Nonce);
43
44                         token = new UsernameToken ("me", "mine", PasswordOption.SendHashed);
45                         AssertEquals ("SendHashed", PasswordOption.SendHashed, token.PasswordOption);
46                         AssertNull ("Nonce", token.Nonce); // strange - must be generated later...
47                 }
48
49                 [Test]
50                 [ExpectedException (typeof (ArgumentNullException))]
51                 public void Constructor_NullUsername () 
52                 {
53                         UsernameToken token = new UsernameToken (null, "mine");
54                 }
55
56                 [Test]
57                 [ExpectedException (typeof (ArgumentNullException))]
58                 public void Constructor_EmptyUsername () 
59                 {
60                         UsernameToken token = new UsernameToken ("", "mine");
61                 }
62
63                 [Test]
64                 [ExpectedException (typeof (ArgumentNullException))]
65                 public void Constructor_NullPassword () 
66                 {
67                         UsernameToken token = new UsernameToken ("me", null);
68                 }
69
70                 [Test]
71                 [ExpectedException (typeof (ArgumentNullException))]
72                 public void Constructor_EmptyPassword () 
73                 {
74                         UsernameToken token = new UsernameToken ("me", "");
75                 }
76
77                 [Test]
78                 [ExpectedException (typeof (ArgumentNullException))]
79                 public void Constructor_NullElement () 
80                 {
81                         UsernameToken token = new UsernameToken (null);
82                 }
83
84                 [Test]
85                 public void Created () 
86                 {
87                         UsernameToken token = new UsernameToken ("me", "mine");
88                         AssertEquals ("Created before GetXml", DateTime.MinValue, token.Created);
89
90                         XmlDocument doc = new XmlDocument ();
91                         XmlElement xel = token.GetXml (doc);
92                         Assert ("Created after GetXml", DateTime.MinValue < token.Created);
93                 }
94
95                 [Test]
96                 [ExpectedException (typeof (InvalidOperationException))]
97                 public void AuthenticationKey_BeforeGetXml () 
98                 {
99                         UsernameToken token = new UsernameToken ("me", "mine");
100                         AssertNotNull ("AuthenticationKey", token.AuthenticationKey);
101                 }
102
103                 [Test]
104                 [Ignore("this works on MS only when stepping in debugger")]
105                 public void AuthenticationKey_AfterGetXml () 
106                 {
107                         UsernameToken token = new UsernameToken ("me", "mine");
108                         XmlDocument doc = new XmlDocument ();
109                         XmlElement xel = token.GetXml (doc);
110                         AssertNotNull ("AuthenticationKey", token.AuthenticationKey);
111                 }
112
113                 [Test]
114                 [ExpectedException (typeof (NotSupportedException))]
115                 public void DecryptionKey () 
116                 {
117                         UsernameToken token = new UsernameToken ("me", "mine");
118                         AssertNotNull ("DecryptionKey", token.DecryptionKey);
119                 }
120
121                 [Test]
122                 [ExpectedException (typeof (NotSupportedException))]
123                 public void EncryptionKey () 
124                 {
125                         UsernameToken token = new UsernameToken ("me", "mine");
126                         AssertNotNull ("EncryptionKey", token.EncryptionKey);
127                 }
128
129                 [Test]
130                 public void SignatureKey () 
131                 {
132                         UsernameToken token = new UsernameToken ("me", "mine");
133                         AssertNotNull ("SignatureKey", token.SignatureKey);
134                         // TODO use signature key
135                 }
136
137                 [Test]
138                 public void Password () 
139                 {
140                         UsernameToken token = new UsernameToken ("me", "mine");
141                         AssertEquals ("mine", token.Password);
142                         AssertEquals ("SendNone(implicit)", PasswordOption.SendNone, token.PasswordOption);
143
144                         token = new UsernameToken ("me", "none", PasswordOption.SendNone);
145                         AssertEquals ("Password", "none", token.Password);
146                         AssertEquals ("SendNone(explicit)", PasswordOption.SendNone, token.PasswordOption);
147                 }
148
149                 [Test]
150                 public void Nonce () 
151                 {
152                         UsernameToken token = new UsernameToken ("me", "mine");
153                         AssertNull ("Nonce before GetXml", token.Nonce);
154
155                         XmlDocument doc = new XmlDocument ();
156                         XmlElement xel = token.GetXml (doc);
157                         AssertNotNull ("Nonce after GetXml", token.Nonce);
158                 }
159
160                 [Test]
161                 public void Supports () 
162                 {
163                         UsernameToken token = new UsernameToken ("me", "mine");
164                         Assert ("SupportsDataEncryption", !token.SupportsDataEncryption);
165                         Assert ("SupportsDigitalSignature", token.SupportsDigitalSignature);
166                 }
167
168                 [Test]
169                 [ExpectedException (typeof (ArgumentNullException))]
170                 public void GetXmlNull () 
171                 {
172                         UsernameToken token = new UsernameToken ("me", "mine");
173                         XmlElement xel = token.GetXml (null);
174                 }
175
176                 [Test]
177                 public void GetXml () 
178                 {
179                         UsernameToken token = new UsernameToken ("me", "mine");
180                         XmlDocument doc = new XmlDocument ();
181                         string xml = token.GetXml (doc).OuterXml;
182                         Assert ("Id", xml.IndexOf (" wsu:Id=\"SecurityToken-") > 0);
183                         Assert ("Username", xml.IndexOf ("<wsse:Username>me</wsse:Username>") > 0);
184                         Assert ("Password", xml.IndexOf ("<wsse:Password>mine</wsse:Password>") < 0);
185                         Assert ("Nonce", xml.IndexOf ("<wsse:Nonce>") > 0);
186                         Assert ("Created", xml.IndexOf ("<wsu:Created>") > 0);
187
188                         token = new UsernameToken ("me", "mine", PasswordOption.SendPlainText);
189                         xml = token.GetXml (doc).OuterXml;
190                         Assert ("Id", xml.IndexOf (" wsu:Id=\"SecurityToken-") > 0);
191                         Assert ("Username", xml.IndexOf ("<wsse:Username>me</wsse:Username>") > 0);
192                         Assert ("Password", xml.IndexOf ("<wsse:Password Type=\"wsse:PasswordText\">mine</wsse:Password>") > 0);
193                         Assert ("Nonce", xml.IndexOf ("<wsse:Nonce>") > 0);
194                         Assert ("Created", xml.IndexOf ("<wsu:Created>") > 0);
195
196                         token = new UsernameToken ("me", "mine", PasswordOption.SendHashed);
197                         xml = token.GetXml (doc).OuterXml;
198                         Assert ("Id", xml.IndexOf (" wsu:Id=\"SecurityToken-") > 0);
199                         Assert ("Username", xml.IndexOf ("<wsse:Username>me</wsse:Username>") > 0);
200                         Assert ("Password", xml.IndexOf ("<wsse:Password Type=\"wsse:PasswordDigest\">") > 0);
201                         Assert ("Nonce", xml.IndexOf ("<wsse:Nonce>") > 0);
202                         Assert ("Created", xml.IndexOf ("<wsu:Created>") > 0);
203                 }
204
205                 [Test]
206                 [ExpectedException (typeof (ArgumentNullException))]
207                 public void LoadXmlNull () 
208                 {
209                         UsernameToken token = new UsernameToken ("me", "mine");
210                         token.LoadXml (null);
211                 }
212
213                 [Test]
214                 [ExpectedException (typeof (ArgumentException))]
215                 public void LoadXml_BadElement () 
216                 {
217                         UsernameToken token = new UsernameToken ("me", "mine");
218                         XmlDocument doc = new XmlDocument ();
219                         // bad element (Timestamp case is invalid)
220                         doc.LoadXml ("<wsu:timeStamp xmlns:wsu=\"http://schemas.xmlsoap.org/ws/2002/07/utility\" />");
221                         token.LoadXml (doc.DocumentElement);
222                 }
223
224                 [Test]
225                 [ExpectedException (typeof (ConfigurationException))]
226                 public void LoadXml_WithoutPasswordProvider () 
227                 {
228                         string xml = "<wsse:UsernameToken xmlns:wsu=\"http://schemas.xmlsoap.org/ws/2002/07/utility\" wsu:Id=\"SecurityToken-a567950c-ceb7-4fb6-b78f-10aeb7078985\" xmlns:wsse=\"http://schemas.xmlsoap.org/ws/2002/07/secext\"><wsse:Username>me</wsse:Username><wsse:Nonce>U98BosqSRZFZAH9Izw4k7Q==</wsse:Nonce><wsu:Created>2003-09-10T01:33:13Z</wsu:Created></wsse:UsernameToken>";
229                         XmlDocument doc = new XmlDocument ();
230                         doc.LoadXml (xml);
231                         UsernameToken token = new UsernameToken (doc.DocumentElement);
232                 }
233
234
235                 [Test]
236                 [ExpectedException (typeof (ConfigurationException))]
237 //              [Ignore("requires setting up a PasswordProvider - strange because no password is sent !?!")]
238                 // sample taken from http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnglobspec/html/ws-security.asp
239                 public void LoadXml_PasswordNone () 
240                 {
241                         string xml = "<wsse:UsernameToken xmlns:wsu=\"http://schemas.xmlsoap.org/ws/2002/07/utility\" wsu:Id=\"SecurityToken-a567950c-ceb7-4fb6-b78f-10aeb7078985\" xmlns:wsse=\"http://schemas.xmlsoap.org/ws/2002/07/secext\"><wsse:Username>me</wsse:Username><wsse:Nonce>U98BosqSRZFZAH9Izw4k7Q==</wsse:Nonce><wsu:Created>2003-09-10T01:33:13Z</wsu:Created></wsse:UsernameToken>";
242                         XmlDocument doc = new XmlDocument ();
243                         doc.LoadXml (xml);
244                         UsernameToken token = new UsernameToken (doc.DocumentElement);
245                         XmlElement xel = token.GetXml (doc);
246                         // TODO - with a PasswordProvider
247                 }
248
249                 [Test]
250                 [ExpectedException (typeof (ConfigurationException))]
251 //              [Ignore("requires setting up a PasswordProvider")]
252                 // sample taken from http://msdn.microsoft.com/webservices/building/wse/default.aspx?pull=/library/en-us/dnwebsrv/html/wssecdrill.asp
253                 public void LoadXml_PasswordText () 
254                 {
255                         string xml = "<wsse:UsernameToken xmlns:wsu=\"http://schemas.xmlsoap.org/ws/2002/07/utility\" wsu:Id=\"SecurityToken-c7ef4231-4397-4b4b-ab8d-0ea3fad1f79e\" xmlns:wsse=\"http://schemas.xmlsoap.org/ws/2002/07/secext\"><wsse:Username>domain_name\\joeblow</wsse:Username><wsse:Password Type=\"wsse:PasswordText\">NoTelinNE1</wsse:Password><wsse:Nonce>QLSVRt9g3e19jJXJYhtBKA==</wsse:Nonce><wsu:Created>2003-07-05T22:37:52Z</wsu:Created></wsse:UsernameToken>";
256                         XmlDocument doc = new XmlDocument ();
257                         doc.LoadXml (xml);
258                         UsernameToken token = new UsernameToken (doc.DocumentElement);
259                         XmlElement xel = token.GetXml (doc);
260                         // TODO - with a PasswordProvider
261                 }
262
263                 [Test]
264                 [ExpectedException (typeof (ConfigurationException))]
265 //              [Ignore("requires setting up a PasswordProvider")]
266                 public void LoadXml_PasswordHashed () 
267                 {
268                         string xml = "<wsse:UsernameToken xmlns:wsu=\"http://schemas.xmlsoap.org/ws/2002/07/utility\" wsu:Id=\"SecurityToken-536806c1-ef07-4a46-9876-4cae214a7db7\" xmlns:wsse=\"http://schemas.xmlsoap.org/ws/2002/07/secext\"><wsse:Username>me</wsse:Username><wsse:Password Type=\"wsse:PasswordDigest\">mvFakbZuqOwWZ+ULU0CYy1YAYtM=</wsse:Password><wsse:Nonce>IHMGSS18kXhPqBqRZezDNg==</wsse:Nonce><wsu:Created>2003-09-13T17:51:54Z</wsu:Created></wsse:UsernameToken>";
269                         XmlDocument doc = new XmlDocument ();
270                         doc.LoadXml (xml);
271                         UsernameToken token = new UsernameToken (doc.DocumentElement);
272                         XmlElement xel = token.GetXml (doc);
273                         // TODO - with a PasswordProvider
274                 }
275         }
276 }