aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/ApplicationPlugins/Rest/Inventory/RequestData.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/ApplicationPlugins/Rest/Inventory/RequestData.cs')
-rw-r--r--OpenSim/ApplicationPlugins/Rest/Inventory/RequestData.cs147
1 files changed, 73 insertions, 74 deletions
diff --git a/OpenSim/ApplicationPlugins/Rest/Inventory/RequestData.cs b/OpenSim/ApplicationPlugins/Rest/Inventory/RequestData.cs
index 6742402..24e5ada 100644
--- a/OpenSim/ApplicationPlugins/Rest/Inventory/RequestData.cs
+++ b/OpenSim/ApplicationPlugins/Rest/Inventory/RequestData.cs
@@ -23,7 +23,6 @@
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 *
27 */ 26 */
28 27
29using System; 28using System;
@@ -44,14 +43,14 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
44 43
45 /// <summary> 44 /// <summary>
46 /// This class represents the current REST request. It 45 /// This class represents the current REST request. It
47 /// encapsulates the request/response state and takes care 46 /// encapsulates the request/response state and takes care
48 /// of response generation without exposing the REST handler 47 /// of response generation without exposing the REST handler
49 /// to the actual mechanisms involved. 48 /// to the actual mechanisms involved.
50 /// 49 ///
51 /// This structure is created on entry to the Handler 50 /// This structure is created on entry to the Handler
52 /// method and is disposed of upon return. It is part of 51 /// method and is disposed of upon return. It is part of
53 /// the plug-in infrastructure, rather than the functionally 52 /// the plug-in infrastructure, rather than the functionally
54 /// specific REST handler, and fundamental changes to 53 /// specific REST handler, and fundamental changes to
55 /// this should be reflected in the Rest HandlerVersion. The 54 /// this should be reflected in the Rest HandlerVersion. The
56 /// object is instantiated, and may be extended by, any 55 /// object is instantiated, and may be extended by, any
57 /// given handler. See the inventory handler for an example 56 /// given handler. See the inventory handler for an example
@@ -84,7 +83,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
84 // Storing information in body will suppress the return of 83 // Storing information in body will suppress the return of
85 // statusBody which is only intended to report status on 84 // statusBody which is only intended to report status on
86 // requests which do not themselves ordinarily generate 85 // requests which do not themselves ordinarily generate
87 // an informational response. All of this is handled in 86 // an informational response. All of this is handled in
88 // Respond(). 87 // Respond().
89 88
90 internal byte[] buffer = null; 89 internal byte[] buffer = null;
@@ -92,8 +91,8 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
92 internal string bodyType = "text/html"; 91 internal string bodyType = "text/html";
93 92
94 // The encoding in effect is set to a server default. It may 93 // The encoding in effect is set to a server default. It may
95 // subsequently be overridden by a Content header. This 94 // subsequently be overridden by a Content header. This
96 // value is established during construction and is used 95 // value is established during construction and is used
97 // wherever encoding services are needed. 96 // wherever encoding services are needed.
98 97
99 internal Encoding encoding = Rest.Encoding; 98 internal Encoding encoding = Rest.Encoding;
@@ -110,7 +109,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
110 109
111 // The path part of the URI is decomposed. pathNodes 110 // The path part of the URI is decomposed. pathNodes
112 // is an array of every element in the URI. Parameters 111 // is an array of every element in the URI. Parameters
113 // is an array that contains only those nodes that 112 // is an array that contains only those nodes that
114 // are not a part of the authority prefix 113 // are not a part of the authority prefix
115 114
116 private string[] pathNodes = null; 115 private string[] pathNodes = null;
@@ -118,7 +117,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
118 private static readonly string[] EmptyPath = { String.Empty }; 117 private static readonly string[] EmptyPath = { String.Empty };
119 118
120 // The status code gets set during the course of processing 119 // The status code gets set during the course of processing
121 // and is the HTTP completion code. The status body is 120 // and is the HTTP completion code. The status body is
122 // initialized during construction, is appended to during the 121 // initialized during construction, is appended to during the
123 // course of execution, and is finalized during Respond 122 // course of execution, and is finalized during Respond
124 // processing. 123 // processing.
@@ -166,7 +165,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
166 // force selection of a particular authentication model 165 // force selection of a particular authentication model
167 // (choosing from amongst those supported of course) 166 // (choosing from amongst those supported of course)
168 // 167 //
169 168
170 internal bool authenticated = false; 169 internal bool authenticated = false;
171 internal string scheme = null; 170 internal string scheme = null;
172 internal string realm = Rest.Realm; 171 internal string realm = Rest.Realm;
@@ -183,7 +182,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
183 internal string userPass = String.Empty; 182 internal string userPass = String.Empty;
184 183
185 // Session related tables. These are only needed if QOP is set to "auth-sess" 184 // Session related tables. These are only needed if QOP is set to "auth-sess"
186 // and for now at least, it is not. Session related authentication is of 185 // and for now at least, it is not. Session related authentication is of
187 // questionable merit in the context of REST anyway, but it is, arguably, more 186 // questionable merit in the context of REST anyway, but it is, arguably, more
188 // secure. 187 // secure.
189 188
@@ -199,23 +198,23 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
199 198
200 private static Regex schema = new Regex("^\\s*(?<scheme>\\w+)\\s*.*", 199 private static Regex schema = new Regex("^\\s*(?<scheme>\\w+)\\s*.*",
201 RegexOptions.Compiled | RegexOptions.IgnoreCase); 200 RegexOptions.Compiled | RegexOptions.IgnoreCase);
202 201
203 private static Regex basicParms = new Regex("^\\s*(?:\\w+)\\s+(?<pval>\\S+)\\s*", 202 private static Regex basicParms = new Regex("^\\s*(?:\\w+)\\s+(?<pval>\\S+)\\s*",
204 RegexOptions.Compiled | RegexOptions.IgnoreCase); 203 RegexOptions.Compiled | RegexOptions.IgnoreCase);
205 204
206 private static Regex digestParm1 = new Regex("\\s*(?<parm>\\w+)\\s*=\\s*\"(?<pval>[^\"]+)\"", 205 private static Regex digestParm1 = new Regex("\\s*(?<parm>\\w+)\\s*=\\s*\"(?<pval>[^\"]+)\"",
207 RegexOptions.Compiled | RegexOptions.IgnoreCase); 206 RegexOptions.Compiled | RegexOptions.IgnoreCase);
208 207
209 private static Regex digestParm2 = new Regex("\\s*(?<parm>\\w+)\\s*=\\s*(?<pval>[^\\p{P}\\s]+)", 208 private static Regex digestParm2 = new Regex("\\s*(?<parm>\\w+)\\s*=\\s*(?<pval>[^\\p{P}\\s]+)",
210 RegexOptions.Compiled | RegexOptions.IgnoreCase); 209 RegexOptions.Compiled | RegexOptions.IgnoreCase);
211 210
212 private static Regex reuserPass = new Regex("(?<user>[^:]+):(?<pass>[\\S\\s]*)", 211 private static Regex reuserPass = new Regex("(?<user>[^:]+):(?<pass>[\\S\\s]*)",
213 RegexOptions.Compiled | RegexOptions.IgnoreCase); 212 RegexOptions.Compiled | RegexOptions.IgnoreCase);
214 213
215 // For efficiency, we create static instances of these objects 214 // For efficiency, we create static instances of these objects
216 215
217 private static MD5 md5hash = MD5.Create(); 216 private static MD5 md5hash = MD5.Create();
218 217
219 private static StringComparer sc = StringComparer.OrdinalIgnoreCase; 218 private static StringComparer sc = StringComparer.OrdinalIgnoreCase;
220 219
221#region properties 220#region properties
@@ -228,15 +227,15 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
228 } 227 }
229 228
230 /// <summary> 229 /// <summary>
231 /// Return a boolean indication of whether or no an authenticated user is 230 /// Return a boolean indication of whether or no an authenticated user is
232 /// associated with this request. This could be wholly integrated, but 231 /// associated with this request. This could be wholly integrated, but
233 /// that would make authentication mandatory. 232 /// that would make authentication mandatory.
234 /// </summary> 233 /// </summary>
235 234
236 internal bool IsAuthenticated 235 internal bool IsAuthenticated
237 { 236 {
238 get 237 get
239 { 238 {
240 if (Rest.Authenticate) 239 if (Rest.Authenticate)
241 { 240 {
242 if (!authenticated) 241 if (!authenticated)
@@ -258,31 +257,31 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
258 internal string[] PathNodes 257 internal string[] PathNodes
259 { 258 {
260 get 259 get
261 { 260 {
262 return pathNodes; 261 return pathNodes;
263 } 262 }
264 } 263 }
265 264
266 /// <summary> 265 /// <summary>
267 /// Access to all non-prefix 'nodes' in the supplied URI as an 266 /// Access to all non-prefix 'nodes' in the supplied URI as an
268 /// array of strings. These identify a specific resource that 267 /// array of strings. These identify a specific resource that
269 /// is managed by the authority (the prefix). 268 /// is managed by the authority (the prefix).
270 /// </summary> 269 /// </summary>
271 270
272 internal string[] Parameters 271 internal string[] Parameters
273 { 272 {
274 get 273 get
275 { 274 {
276 return parameters; 275 return parameters;
277 } 276 }
278 } 277 }
279 278
280#endregion properties 279#endregion properties
281 280
282#region constructors 281#region constructors
283 282
284 // Constructor 283 // Constructor
285 284
286 internal RequestData(OSHttpRequest p_request, OSHttpResponse p_response, string p_qprefix) 285 internal RequestData(OSHttpRequest p_request, OSHttpResponse p_response, string p_qprefix)
287 { 286 {
288 287
@@ -315,7 +314,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
315 /// Realm, domain, etc. 314 /// Realm, domain, etc.
316 /// 315 ///
317 /// This method checks to see if the current request is already 316 /// This method checks to see if the current request is already
318 /// authenticated for this domain. If it is, then it returns 317 /// authenticated for this domain. If it is, then it returns
319 /// true. If it is not, then it issues a challenge to the client 318 /// true. If it is not, then it issues a challenge to the client
320 /// and responds negatively to the request. 319 /// and responds negatively to the request.
321 /// 320 ///
@@ -339,7 +338,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
339 Rest.Log.DebugFormat("{0} Challenge reason: No authorization data", MsgId); 338 Rest.Log.DebugFormat("{0} Challenge reason: No authorization data", MsgId);
340 DoChallenge(); 339 DoChallenge();
341 } 340 }
342 341
343 // So, we have authentication data, now we have to check to 342 // So, we have authentication data, now we have to check to
344 // see what we got and whether or not it is valid for the 343 // see what we got and whether or not it is valid for the
345 // current domain. To do this we need to interpret the data 344 // current domain. To do this we need to interpret the data
@@ -438,7 +437,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
438 437
439 // The service provider can force a particular scheme by 438 // The service provider can force a particular scheme by
440 // assigning a value to scheme. 439 // assigning a value to scheme.
441 440
442 // Basic authentication is pretty simple. 441 // Basic authentication is pretty simple.
443 // Just specify the realm in question. 442 // Just specify the realm in question.
444 443
@@ -468,8 +467,8 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
468 sbuilder.Append(" "); 467 sbuilder.Append(" ");
469 468
470 // Specify the effective realm. This should 469 // Specify the effective realm. This should
471 // never be null if we are uthenticating, as it is required for all 470 // never be null if we are uthenticating, as it is required for all
472 // authentication schemes. It defines, in conjunction with the 471 // authentication schemes. It defines, in conjunction with the
473 // absolute URI information, the domain to which the authentication 472 // absolute URI information, the domain to which the authentication
474 // applies. It is an arbitrary string. I *believe* this allows an 473 // applies. It is an arbitrary string. I *believe* this allows an
475 // authentication to apply to disjoint resources within the same 474 // authentication to apply to disjoint resources within the same
@@ -485,7 +484,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
485 } 484 }
486 485
487 // Share our nonce. This is *uniquely* generated each time a 401 is 486 // Share our nonce. This is *uniquely* generated each time a 401 is
488 // returned. We do not generate a very sophisticated nonce at the 487 // returned. We do not generate a very sophisticated nonce at the
489 // moment (it's simply a base64 encoded UUID). 488 // moment (it's simply a base64 encoded UUID).
490 489
491 if (nonce != null) 490 if (nonce != null)
@@ -532,7 +531,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
532 sbuilder.Append(Rest.CS_COMMA); 531 sbuilder.Append(Rest.CS_COMMA);
533 } 532 }
534 533
535 // Theoretically QOP is optional, but it is required by a compliant 534 // Theoretically QOP is optional, but it is required by a compliant
536 // with current versions of the scheme. In fact IE requires that QOP 535 // with current versions of the scheme. In fact IE requires that QOP
537 // be specified and will refuse to authenticate otherwise. 536 // be specified and will refuse to authenticate otherwise.
538 537
@@ -555,7 +554,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
555 } 554 }
556 555
557 // We don't know the userid that will be used 556 // We don't know the userid that will be used
558 // so we cannot make any authentication domain 557 // so we cannot make any authentication domain
559 // assumptions. So the prefix will determine 558 // assumptions. So the prefix will determine
560 // this. 559 // this.
561 560
@@ -582,7 +581,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
582 /// understand this and also expect it to be the first one 581 /// understand this and also expect it to be the first one
583 /// offered. So we do. 582 /// offered. So we do.
584 /// OpenSim also needs this, as it is the only scheme that allows 583 /// OpenSim also needs this, as it is the only scheme that allows
585 /// authentication using the hashed passwords stored in the 584 /// authentication using the hashed passwords stored in the
586 /// user database. 585 /// user database.
587 /// </summary> 586 /// </summary>
588 587
@@ -599,7 +598,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
599 foreach (Match m in matches) 598 foreach (Match m in matches)
600 { 599 {
601 authparms.Add("response",m.Groups["pval"].Value); 600 authparms.Add("response",m.Groups["pval"].Value);
602 Rest.Log.DebugFormat("{0} Parameter matched : {1} = {2}", 601 Rest.Log.DebugFormat("{0} Parameter matched : {1} = {2}",
603 MsgId, "response", m.Groups["pval"].Value); 602 MsgId, "response", m.Groups["pval"].Value);
604 } 603 }
605 604
@@ -623,7 +622,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
623 } 622 }
624 623
625 /// <summary> 624 /// <summary>
626 /// This method provides validation in support of the BASIC 625 /// This method provides validation in support of the BASIC
627 /// authentication method. This is not normaly expected to be 626 /// authentication method. This is not normaly expected to be
628 /// used, but is included for completeness (and because I tried 627 /// used, but is included for completeness (and because I tried
629 /// it first). 628 /// it first).
@@ -664,12 +663,12 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
664 string last; 663 string last;
665 664
666 // Distinguish the parts, if necessary 665 // Distinguish the parts, if necessary
667 666
668 if ((x=user.IndexOf(Rest.C_SPACE)) != -1) 667 if ((x=user.IndexOf(Rest.C_SPACE)) != -1)
669 { 668 {
670 first = user.Substring(0,x); 669 first = user.Substring(0,x);
671 last = user.Substring(x+1); 670 last = user.Substring(x+1);
672 } 671 }
673 else 672 else
674 { 673 {
675 first = user; 674 first = user;
@@ -685,9 +684,9 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
685 684
686 HA1 = HashToString(pass); 685 HA1 = HashToString(pass);
687 HA1 = HashToString(String.Format("{0}:{1}",HA1,udata.PasswordSalt)); 686 HA1 = HashToString(String.Format("{0}:{1}",HA1,udata.PasswordSalt));
688 687
689 return (0 == sc.Compare(HA1, udata.PasswordHash)); 688 return (0 == sc.Compare(HA1, udata.PasswordHash));
690 689
691 } 690 }
692 691
693#endregion authentication_basic 692#endregion authentication_basic
@@ -712,7 +711,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
712 foreach (Match m in matches) 711 foreach (Match m in matches)
713 { 712 {
714 authparms.Add(m.Groups["parm"].Value,m.Groups["pval"].Value); 713 authparms.Add(m.Groups["parm"].Value,m.Groups["pval"].Value);
715 Rest.Log.DebugFormat("{0} String Parameter matched : {1} = {2}", 714 Rest.Log.DebugFormat("{0} String Parameter matched : {1} = {2}",
716 MsgId, m.Groups["parm"].Value,m.Groups["pval"].Value); 715 MsgId, m.Groups["parm"].Value,m.Groups["pval"].Value);
717 } 716 }
718 717
@@ -723,7 +722,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
723 foreach (Match m in matches) 722 foreach (Match m in matches)
724 { 723 {
725 authparms.Add(m.Groups["parm"].Value,m.Groups["pval"].Value); 724 authparms.Add(m.Groups["parm"].Value,m.Groups["pval"].Value);
726 Rest.Log.DebugFormat("{0} Tokenized Parameter matched : {1} = {2}", 725 Rest.Log.DebugFormat("{0} Tokenized Parameter matched : {1} = {2}",
727 MsgId, m.Groups["parm"].Value,m.Groups["pval"].Value); 726 MsgId, m.Groups["parm"].Value,m.Groups["pval"].Value);
728 } 727 }
729 728
@@ -760,7 +759,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
760 759
761 if (!authparms.TryGetValue("nonce", out nonce) || nonce == null) 760 if (!authparms.TryGetValue("nonce", out nonce) || nonce == null)
762 { 761 {
763 Rest.Log.WarnFormat("{0} Authentication failed: nonce missing", MsgId); 762 Rest.Log.WarnFormat("{0} Authentication failed: nonce missing", MsgId);
764 break; 763 break;
765 } 764 }
766 765
@@ -771,7 +770,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
771 { 770 {
772 if (temp != opaque) 771 if (temp != opaque)
773 { 772 {
774 Rest.Log.WarnFormat("{0} Authentication failed: bad opaque value", MsgId); 773 Rest.Log.WarnFormat("{0} Authentication failed: bad opaque value", MsgId);
775 break; 774 break;
776 } 775 }
777 } 776 }
@@ -783,7 +782,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
783 { 782 {
784 if (temp != algorithm) 783 if (temp != algorithm)
785 { 784 {
786 Rest.Log.WarnFormat("{0} Authentication failed: bad algorithm value", MsgId); 785 Rest.Log.WarnFormat("{0} Authentication failed: bad algorithm value", MsgId);
787 break; 786 break;
788 } 787 }
789 } 788 }
@@ -800,7 +799,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
800 799
801 if (!authparms.ContainsKey("cnonce")) 800 if (!authparms.ContainsKey("cnonce"))
802 { 801 {
803 Rest.Log.WarnFormat("{0} Authentication failed: cnonce missing", MsgId); 802 Rest.Log.WarnFormat("{0} Authentication failed: cnonce missing", MsgId);
804 break; 803 break;
805 } 804 }
806 805
@@ -808,7 +807,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
808 807
809 if (!authparms.TryGetValue("nc", out nck) || nck == null) 808 if (!authparms.TryGetValue("nc", out nck) || nck == null)
810 { 809 {
811 Rest.Log.WarnFormat("{0} Authentication failed: cnonce counter missing", MsgId); 810 Rest.Log.WarnFormat("{0} Authentication failed: cnonce counter missing", MsgId);
812 break; 811 break;
813 } 812 }
814 813
@@ -820,7 +819,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
820 819
821 if (Rest.Hex2Int(ncl) >= Rest.Hex2Int(nck)) 820 if (Rest.Hex2Int(ncl) >= Rest.Hex2Int(nck))
822 { 821 {
823 Rest.Log.WarnFormat("{0} Authentication failed: bad cnonce counter", MsgId); 822 Rest.Log.WarnFormat("{0} Authentication failed: bad cnonce counter", MsgId);
824 break; 823 break;
825 } 824 }
826 cntable[nonce] = nck; 825 cntable[nonce] = nck;
@@ -840,12 +839,12 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
840 // these MUST NOT be present. 839 // these MUST NOT be present.
841 if (authparms.ContainsKey("cnonce")) 840 if (authparms.ContainsKey("cnonce"))
842 { 841 {
843 Rest.Log.WarnFormat("{0} Authentication failed: invalid cnonce", MsgId); 842 Rest.Log.WarnFormat("{0} Authentication failed: invalid cnonce", MsgId);
844 break; 843 break;
845 } 844 }
846 if (authparms.ContainsKey("nc")) 845 if (authparms.ContainsKey("nc"))
847 { 846 {
848 Rest.Log.WarnFormat("{0} Authentication failed: invalid cnonce counter[2]", MsgId); 847 Rest.Log.WarnFormat("{0} Authentication failed: invalid cnonce counter[2]", MsgId);
849 break; 848 break;
850 } 849 }
851 } 850 }
@@ -854,7 +853,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
854 853
855 authenticated = ValidateDigest(userName, nonce, cnonce, nck, authPrefix, response); 854 authenticated = ValidateDigest(userName, nonce, cnonce, nck, authPrefix, response);
856 855
857 } 856 }
858 while (false); 857 while (false);
859 858
860 } 859 }
@@ -864,10 +863,10 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
864 /// <summary> 863 /// <summary>
865 /// This mechanism is used by the digest authentication mechanism 864 /// This mechanism is used by the digest authentication mechanism
866 /// to return the user's password. In fact, because the OpenSim 865 /// to return the user's password. In fact, because the OpenSim
867 /// user's passwords are already hashed, and the HTTP mechanism 866 /// user's passwords are already hashed, and the HTTP mechanism
868 /// does not supply an open password, the hashed passwords cannot 867 /// does not supply an open password, the hashed passwords cannot
869 /// be used unless the client has used the same salting mechanism 868 /// be used unless the client has used the same salting mechanism
870 /// to has the password before using it in the authentication 869 /// to has the password before using it in the authentication
871 /// algorithn. This is not inconceivable... 870 /// algorithn. This is not inconceivable...
872 /// </summary> 871 /// </summary>
873 872
@@ -879,12 +878,12 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
879 string last; 878 string last;
880 879
881 // Distinguish the parts, if necessary 880 // Distinguish the parts, if necessary
882 881
883 if ((x=user.IndexOf(Rest.C_SPACE)) != -1) 882 if ((x=user.IndexOf(Rest.C_SPACE)) != -1)
884 { 883 {
885 first = user.Substring(0,x); 884 first = user.Substring(0,x);
886 last = user.Substring(x+1); 885 last = user.Substring(x+1);
887 } 886 }
888 else 887 else
889 { 888 {
890 first = user; 889 first = user;
@@ -955,7 +954,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
955 HA2 = HashToString(patt); 954 HA2 = HashToString(patt);
956 955
957 // Generate Digest 956 // Generate Digest
958 957
959 if (qop != String.Empty) 958 if (qop != String.Empty)
960 { 959 {
961 patt = String.Format("{0}:{1}:{2}:{3}:{4}:{5}", HA1, nonce, nck, cnonce, qop, HA2); 960 patt = String.Format("{0}:{1}:{2}:{3}:{4}:{5}", HA1, nonce, nck, cnonce, qop, HA2);
@@ -1011,7 +1010,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
1011 } 1010 }
1012 1011
1013 /// <summary> 1012 /// <summary>
1014 /// Indicate a functionally-dependent conclusion to the 1013 /// Indicate a functionally-dependent conclusion to the
1015 /// request. See Rest.cs for a list of possible values. 1014 /// request. See Rest.cs for a list of possible values.
1016 /// </summary> 1015 /// </summary>
1017 1016
@@ -1023,7 +1022,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
1023 /// <summary> 1022 /// <summary>
1024 /// Indicate that a request should be redirected, using 1023 /// Indicate that a request should be redirected, using
1025 /// the HTTP completion codes. Permanent and temporary 1024 /// the HTTP completion codes. Permanent and temporary
1026 /// redirections may be indicated. The supplied URL is 1025 /// redirections may be indicated. The supplied URL is
1027 /// the new location of the resource. 1026 /// the new location of the resource.
1028 /// </summary> 1027 /// </summary>
1029 1028
@@ -1057,7 +1056,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
1057 } 1056 }
1058 1057
1059 /// <summary> 1058 /// <summary>
1060 /// For the more adventurous. This failure also includes a 1059 /// For the more adventurous. This failure also includes a
1061 /// specified entity to be appended to the code-related 1060 /// specified entity to be appended to the code-related
1062 /// status string. 1061 /// status string.
1063 /// </summary> 1062 /// </summary>
@@ -1101,12 +1100,12 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
1101 1100
1102 fail = true; 1101 fail = true;
1103 1102
1104 // Respond to the client's request, tag the response (for the 1103 // Respond to the client's request, tag the response (for the
1105 // benefit of trace) to indicate the reason. 1104 // benefit of trace) to indicate the reason.
1106 1105
1107 Respond(String.Format("Failure response: ({0}) : {1}", 1106 Respond(String.Format("Failure response: ({0}) : {1}",
1108 code, Rest.HttpStatusDesc[code])); 1107 code, Rest.HttpStatusDesc[code]));
1109 1108
1110 // Finally initialize and the throw a RestException. All of the 1109 // Finally initialize and the throw a RestException. All of the
1111 // handler's infrastructure knows that this is a "normal" 1110 // handler's infrastructure knows that this is a "normal"
1112 // completion from a code point-of-view. 1111 // completion from a code point-of-view.
@@ -1129,7 +1128,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
1129 Fail(Rest.HttpStatusCodeNotImplemented, "request rejected (not implemented)"); 1128 Fail(Rest.HttpStatusCodeNotImplemented, "request rejected (not implemented)");
1130 } 1129 }
1131 1130
1132 // This MUST be called by an agent handler before it returns 1131 // This MUST be called by an agent handler before it returns
1133 // control to Handle, otherwise the request will be ignored. 1132 // control to Handle, otherwise the request will be ignored.
1134 // This is called implciitly for the REST stream handlers and 1133 // This is called implciitly for the REST stream handlers and
1135 // is harmless if it is called twice. 1134 // is harmless if it is called twice.
@@ -1222,7 +1221,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
1222 1221
1223 } 1222 }
1224 1223
1225 // Set the status code & description. If nothing has been stored, 1224 // Set the status code & description. If nothing has been stored,
1226 // we consider that a success. 1225 // we consider that a success.
1227 1226
1228 if (statusCode == 0) 1227 if (statusCode == 0)
@@ -1236,7 +1235,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
1236 1235
1237 // For a redirect we need to set the relocation header accordingly 1236 // For a redirect we need to set the relocation header accordingly
1238 1237
1239 if (response.StatusCode == (int) Rest.HttpStatusCodeTemporaryRedirect || 1238 if (response.StatusCode == (int) Rest.HttpStatusCodeTemporaryRedirect ||
1240 response.StatusCode == (int) Rest.HttpStatusCodePermanentRedirect) 1239 response.StatusCode == (int) Rest.HttpStatusCodePermanentRedirect)
1241 { 1240 {
1242 Rest.Log.DebugFormat("{0} Re-direct location is {1}", MsgId, redirectLocation); 1241 Rest.Log.DebugFormat("{0} Re-direct location is {1}", MsgId, redirectLocation);
@@ -1252,7 +1251,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
1252 // We've left the setting of handled' until the 1251 // We've left the setting of handled' until the
1253 // last minute because the header settings included 1252 // last minute because the header settings included
1254 // above are pretty harmless. But everything from 1253 // above are pretty harmless. But everything from
1255 // here on down probably leaves the response 1254 // here on down probably leaves the response
1256 // element unusable by anyone else. 1255 // element unusable by anyone else.
1257 1256
1258 handled = true; 1257 handled = true;
@@ -1267,7 +1266,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
1267 1266
1268 if (buffer != null && buffer.Length != 0) 1267 if (buffer != null && buffer.Length != 0)
1269 { 1268 {
1270 Rest.Log.DebugFormat("{0} Entity buffer, length = {1} : <{2}>", 1269 Rest.Log.DebugFormat("{0} Entity buffer, length = {1} : <{2}>",
1271 MsgId, buffer.Length, encoding.GetString(buffer)); 1270 MsgId, buffer.Length, encoding.GetString(buffer));
1272 response.OutputStream.Write(buffer, 0, buffer.Length); 1271 response.OutputStream.Write(buffer, 0, buffer.Length);
1273 } 1272 }
@@ -1295,11 +1294,11 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
1295 { 1294 {
1296 if (Rest.DEBUG) 1295 if (Rest.DEBUG)
1297 { 1296 {
1298 Rest.Log.DebugFormat("{0} Adding header: <{1}: {2}>", 1297 Rest.Log.DebugFormat("{0} Adding header: <{1}: {2}>",
1299 MsgId, hdr, data); 1298 MsgId, hdr, data);
1300 if (response.Headers.Get(hdr) != null) 1299 if (response.Headers.Get(hdr) != null)
1301 { 1300 {
1302 Rest.Log.DebugFormat("{0} Multipe {1} headers will be generated>", 1301 Rest.Log.DebugFormat("{0} Multipe {1} headers will be generated>",
1303 MsgId, hdr); 1302 MsgId, hdr);
1304 } 1303 }
1305 } 1304 }
@@ -1313,7 +1312,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
1313 Rest.Log.DebugFormat("{0} Removing header: <{1}>", MsgId, hdr); 1312 Rest.Log.DebugFormat("{0} Removing header: <{1}>", MsgId, hdr);
1314 if (response.Headers.Get(hdr) == null) 1313 if (response.Headers.Get(hdr) == null)
1315 { 1314 {
1316 Rest.Log.DebugFormat("{0} No such header existed", 1315 Rest.Log.DebugFormat("{0} No such header existed",
1317 MsgId, hdr); 1316 MsgId, hdr);
1318 } 1317 }
1319 } 1318 }
@@ -1326,7 +1325,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
1326 { 1325 {
1327 for (int i=0;i<response.Headers.Count;i++) 1326 for (int i=0;i<response.Headers.Count;i++)
1328 { 1327 {
1329 Rest.Log.DebugFormat("{0} Header[{1}] : {2}", MsgId, i, 1328 Rest.Log.DebugFormat("{0} Header[{1}] : {2}", MsgId, i,
1330 response.Headers.Get(i)); 1329 response.Headers.Get(i));
1331 } 1330 }
1332 } 1331 }
@@ -1404,7 +1403,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
1404 // If we succeeded in getting a path, perform any 1403 // If we succeeded in getting a path, perform any
1405 // additional pre-processing required. 1404 // additional pre-processing required.
1406 1405
1407 if (path != null) 1406 if (path != null)
1408 { 1407 {
1409 if (Rest.ExtendedEscape) 1408 if (Rest.ExtendedEscape)
1410 { 1409 {
@@ -1442,14 +1441,14 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
1442 { 1441 {
1443 parameters = new string[0]; 1442 parameters = new string[0];
1444 } 1443 }
1445 1444
1446 // Generate a debug list of the decoded parameters 1445 // Generate a debug list of the decoded parameters
1447 1446
1448 if (Rest.DEBUG && prfxlen < path.Length-1) 1447 if (Rest.DEBUG && prfxlen < path.Length-1)
1449 { 1448 {
1450 Rest.Log.DebugFormat("{0} URI: Parameters: {1}", MsgId, path.Substring(prfxlen)); 1449 Rest.Log.DebugFormat("{0} URI: Parameters: {1}", MsgId, path.Substring(prfxlen));
1451 for (int i = 0; i < parameters.Length; i++) 1450 for (int i = 0; i < parameters.Length; i++)
1452 { 1451 {
1453 Rest.Log.DebugFormat("{0} Parameter[{1}]: {2}", MsgId, i, parameters[i]); 1452 Rest.Log.DebugFormat("{0} Parameter[{1}]: {2}", MsgId, i, parameters[i]);
1454 } 1453 }
1455 } 1454 }