Exemplo n.º 1
0
        /// <summary>
        /// Parse a header
        /// </summary>
        /// <param name="name">Name of header.</param>
        /// <param name="reader">Reader containing value.</param>
        /// <returns>HTTP Header</returns>
        /// <exception cref="FormatException">Header value is not of the expected format.</exception>
        public IHeader Parse(string name, ITextReader reader)
        {
            string typeStr = reader.ReadToEnd(",;");

            if (reader.Current == ',') // to get rid of the TE header.
            {
                reader.ReadToEnd(';');
            }

            ConnectionType type;

            try
            {
                type = (ConnectionType)Enum.Parse(typeof(ConnectionType), typeStr.Replace("-", string.Empty), true);
            }
            catch (ArgumentException err)
            {
                throw new FormatException("Unknown connection type '" + typeStr + "'.", err);
            }

            // got parameters
            if (reader.Current == ';')
            {
                HeaderParameterCollection parameters = HeaderParameterCollection.Parse(reader);
                return(new ConnectionHeader(type, parameters));
            }

            return(new ConnectionHeader(type));
        }
        /// <summary>
        /// An authentication response have been received from the web browser.
        /// Check if it's correct
        /// </summary>
        /// <param name="header">Contents from the Authorization header</param>
        /// <param name="realm">Realm that should be authenticated</param>
        /// <param name="httpVerb">GET/POST/PUT/DELETE etc.</param>
        /// <param name="options">First option: true if username/password is correct but not cnonce</param>
        /// <returns>
        /// Authentication object that is stored for the request. A user class or something like that.
        /// </returns>
        /// <exception cref="ArgumentException">if authenticationHeader is invalid</exception>
        /// <exception cref="ArgumentNullException">If any of the parameters is empty or null.</exception>
        public bool Authenticate(AuthorizationHeader header, string realm, string httpVerb, object[] options)
        {
            if (header == null)
            {
                throw new ArgumentNullException("header");
            }

            lock (_nonces)
            {
                if (_timer == null)
                {
                    _timer = new Timer(ManageNonces, null, 15000, 15000);
                }
            }

            if (!header.Scheme.Equals("digest", StringComparison.OrdinalIgnoreCase))
            {
                return(false);
            }

            var parameters = HeaderParameterCollection.Parse(new StringReader(header.Data));

            if (!IsValidNonce(parameters["nonce"]) && !DisableNonceCheck)
            {
                return(false);
            }

            // request authentication information
            string        username = parameters["username"];
            DigestContext context  = new DigestContext(realm, username);

            if (!_authenticator(context))
            {
                return(false);
            }


            // Encode authentication info
            string HA1;

            if (string.IsNullOrEmpty(context.HA1))
            {
                string A1 = String.Format("{0}:{1}:{2}", username, realm, context.Password);
                HA1 = GetMD5HashBinHex2(A1);
            }
            else
            {
                HA1 = context.HA1;
            }

            // encode challenge info
            string A2           = String.Format("{0}:{1}", httpVerb, parameters["uri"]);
            string HA2          = GetMD5HashBinHex2(A2);
            string hashedDigest = Encrypt(HA1, HA2, parameters["qop"],
                                          parameters["nonce"], parameters["nc"], parameters["cnonce"]);

            //validate
            return(parameters["response"] == hashedDigest);
        }
Exemplo n.º 3
0
        public void it_should_add_parameter()
        {
            var parameters = new HeaderParameterCollection();

            parameters.Add("test");

            parameters["test"].Should().NotBeNull();
        }
        public void it_should_add_parameter()
        {
            var parameters = new HeaderParameterCollection();

            parameters.Add("test");

            parameters["test"].Should().NotBeNull();
        }
Exemplo n.º 5
0
        public void it_should_set_parameter_by_name()
        {
            var parameters = new HeaderParameterCollection();

            parameters["some"] = new HeaderParameter("some", "test");

            parameters["some"].Should().NotBeNull();
            parameters["some"].Value.Should().Be("test");
        }
Exemplo n.º 6
0
        public void it_should_override_old_parameter_when_setting_by_name()
        {
            var parameters = new HeaderParameterCollection();

            parameters["some"] = new HeaderParameter("some", "test");
            parameters["some"] = new HeaderParameter("some", "other");

            parameters["some"].Value.Should().Be("other");
        }
        public void it_should_set_parameter_by_name()
        {
            var parameters = new HeaderParameterCollection();
            
            parameters["some"] = new HeaderParameter("some", "test");

            parameters["some"].Should().NotBeNull();
            parameters["some"].Value.Should().Be("test");
        }
        public void it_should_override_old_parameter_when_setting_by_name()
        {
            var parameters = new HeaderParameterCollection();

            parameters["some"] = new HeaderParameter("some", "test");
            parameters["some"] = new HeaderParameter("some", "other");

            parameters["some"].Value.Should().Be("other");
        }
        public void it_should_remove_parameter()
        {
            var parameters = new HeaderParameterCollection();
            parameters.Add("test", 1);

            parameters.Remove(new HeaderParameter("test", 1));

            parameters["test"].Should().BeNull();
        }
Exemplo n.º 10
0
        public void it_should_remove_parameter()
        {
            var parameters = new HeaderParameterCollection();

            parameters.Add("test", 1);

            parameters.Remove(new HeaderParameter("test", 1));

            parameters["test"].Should().BeNull();
        }
Exemplo n.º 11
0
        public HeaderValue(string value, HeaderParameterCollection parameters)
        {
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }

            Value = value;
            Parameters = parameters ?? new HeaderParameterCollection();
        }
Exemplo n.º 12
0
        /// <summary>
        /// An authentication response have been received from the web browser.
        /// Check if it's correct
        /// </summary>
        /// <param name="header">Contents from the Authorization header</param>
        /// <param name="realm">Realm that should be authenticated</param>
        /// <param name="httpVerb">GET/POST/PUT/DELETE etc.</param>
        /// <returns>
        /// Authentication object that is stored for the request. A user class or something like that.
        /// </returns>
        /// <exception cref="ArgumentException">if authenticationHeader is invalid</exception>
        /// <exception cref="ArgumentNullException">If any of the parameters is empty or null.</exception>
        public IAuthenticationUser Authenticate(AuthorizationHeader header, string realm, string httpVerb)
        {
            if (header == null)
            {
                throw new ArgumentNullException("header");
            }

            lock (_nonces)
            {
                if (_timer == null)
                {
                    _timer = new Timer(ManageNonces, null, 15000, 15000);
                }
            }

            if (!header.Scheme.Equals("digest", StringComparison.OrdinalIgnoreCase))
            {
                return(null);
            }

            var parameters = HeaderParameterCollection.Parse(new StringReader(header.Data), ',');

            if (!IsValidNonce(parameters["nonce"]) && !DisableNonceCheck)
            {
                return(null);
            }

            // request authentication information
            string username = parameters["username"];
            var    user     = _userProvider.Lookup(username, realm);

            if (user == null)
            {
                return(null);
            }



            // Encode authentication info
            string HA1 = string.IsNullOrEmpty(user.HA1) ? GetHA1(realm, username, user.Password) : user.HA1;

            // encode challenge info
            string A2           = String.Format("{0}:{1}", httpVerb, parameters["uri"]);
            string HA2          = GetMD5HashBinHex2(A2);
            string hashedDigest = Encrypt(HA1, HA2, parameters["qop"],
                                          parameters["nonce"], parameters["nc"], parameters["cnonce"]);

            //validate
            if (parameters["response"] == hashedDigest)
            {
                return(user);
            }

            return(null);
        }
Exemplo n.º 13
0
        public HeaderValue(string value, params HeaderParameter[] parameters)
        {
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }

            Value = value;
            Parameters = new HeaderParameterCollection();
            parameters.ForEach(parameter => Parameters.Add(parameter));
        }
Exemplo n.º 14
0
        /// <summary>
        /// Parse a header
        /// </summary>
        /// <param name="name">Name of header.</param>
        /// <param name="reader">Reader containing value.</param>
        /// <returns>HTTP Header</returns>
        /// <exception cref="FormatException">Header value is not of the expected format.</exception>
        public IHeader Parse(string name, ITextReader reader)
        {
            string contentType = reader.ReadToEnd(';');

            // got parameters
            if (reader.Current == ';')
            {
                HeaderParameterCollection parameters = HeaderParameterCollection.Parse(reader);
                return(new ContentTypeHeader(contentType, parameters));
            }

            return(new ContentTypeHeader(contentType));
        }
Exemplo n.º 15
0
        /// <summary>Initializes a new instance of the <see cref="AsMediaTypeAttribute" /> class.</summary>
        /// <param name="mediaType">Target media type.</param>
        /// <param name="parameters">Optional parameters of the media type.</param>
        public AsMediaTypeAttribute(string mediaType, params string[] parameters)
        {
            if (mediaType == null)
            {
                throw new ArgumentNullException("mediaType");
            }

            if (mediaType.Length == 0)
            {
                throw new ArgumentOutOfRangeException("mediaType");
            }

            MediaType = mediaType;
            var headerParameters = new HeaderParameterCollection();
            parameters.ForEach(parameter => headerParameters.Add(HeaderParameter.Parse(parameter)));
            Parameters = headerParameters;
        }
Exemplo n.º 16
0
        /// <summary>Initializes a new instance of the <see cref="AsMediaTypeAttribute" /> class.</summary>
        /// <param name="mediaType">Target media type.</param>
        /// <param name="parameters">Optional parameters of the media type.</param>
        public AsMediaTypeAttribute(string mediaType, params string[] parameters)
        {
            if (mediaType == null)
            {
                throw new ArgumentNullException("mediaType");
            }

            if (mediaType.Length == 0)
            {
                throw new ArgumentOutOfRangeException("mediaType");
            }

            MediaType = mediaType;
            var headerParameters = new HeaderParameterCollection();

            parameters.ForEach(parameter => headerParameters.Add(HeaderParameter.Parse(parameter)));
            Parameters = headerParameters;
        }
Exemplo n.º 17
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ContentTypeHeader"/> class.
 /// </summary>
 /// <param name="contentType">Type of the content.</param>
 /// <param name="parameterCollection">Value parameters.</param>
 public ContentTypeHeader(string contentType, HeaderParameterCollection parameterCollection)
 {
     Value = contentType;
     _parameters = parameterCollection;
 }
Exemplo n.º 18
0
 private static HeaderValue CreateInstance(string header, string value, HeaderParameterCollection parameters)
 {
     switch (header)
     {
         case Header.ContentLength:
             return new HeaderValue<int>((value.Length > 0 ? Int32.Parse(value) : 0), parameters);
         default:
             return new HeaderValue(value, parameters);
     }
 }
Exemplo n.º 19
0
 private static void ParseSeparatorChar(char chr, ref StringBuilder currentTarget, ref bool isInString, ref bool isEscape, StringBuilder currentValue, StringBuilder currentParameter, HeaderParameterCollection parameters)
 {
     if (isEscape)
     {
         isEscape = false;
         currentTarget.Append("\\" + chr);
     }
     else if (isInString)
     {
         currentTarget.Append(chr);
     }
     else
     {
         if (currentTarget == currentValue)
         {
             currentTarget = currentParameter;
         }
         else
         {
             parameters.Add(HeaderParameter.Parse(currentParameter.ToString().Trim()));
             currentParameter.Clear();
         }
     }
 }
Exemplo n.º 20
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ConnectionHeader"/> class.
 /// </summary>
 /// <param name="type">Connection type.</param>
 /// <param name="parameters">The parameters.</param>
 public ConnectionHeader(ConnectionType type, HeaderParameterCollection parameters)
 {
     Parameters = parameters;
     Type       = type;
 }
Exemplo n.º 21
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ConnectionHeader"/> class.
 /// </summary>
 /// <param name="type">The type.</param>
 public ConnectionHeader(ConnectionType type)
 {
     Type       = type;
     Parameters = new HeaderParameterCollection();
 }
Exemplo n.º 22
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ConnectionHeader"/> class.
 /// </summary>
 /// <param name="type">Connection type.</param>
 /// <param name="parameters">The parameters.</param>
 public ConnectionHeader(ConnectionType type, HeaderParameterCollection parameters)
 {
     Parameters = parameters;
     Type = type;
 }
Exemplo n.º 23
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ConnectionHeader"/> class.
 /// </summary>
 /// <param name="type">The type.</param>
 public ConnectionHeader(ConnectionType type)
 {
     Type = type;
     Parameters = new HeaderParameterCollection();
 }
Exemplo n.º 24
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ContentTypeHeader"/> class.
 /// </summary>
 /// <param name="contentType">Type of the content.</param>
 /// <param name="parameterCollection">Value parameters.</param>
 public ContentTypeHeader(string contentType, HeaderParameterCollection parameterCollection)
 {
     Value       = contentType;
     _parameters = parameterCollection;
 }
Exemplo n.º 25
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ContentTypeHeader"/> class.
 /// </summary>
 /// <param name="contentType">Type of the content.</param>
 public ContentTypeHeader(string contentType)
 {
     Value       = contentType;
     _parameters = new HeaderParameterCollection();
 }
Exemplo n.º 26
0
        internal static HeaderValue ParseInternal(string header, string value)
        {
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }

            HeaderParameterCollection parameters = new HeaderParameterCollection();
            StringBuilder currentValue = new StringBuilder(64);
            StringBuilder currentParameter = new StringBuilder(128);
            StringBuilder currentTarget = currentValue;
            bool isInString = false;
            bool isEscape = false;
            foreach (char letter in value)
            {
                switch (letter)
                {
                    default:
                        ParseOtherChars(letter, currentTarget, ref isInString, ref isEscape);
                        break;
                    case '\\':
                        ParseEscapeChar(letter, currentTarget, ref isInString, ref isEscape);
                        break;
                    case '"':
                        ParseStringChar(letter, currentTarget, ref isInString, ref isEscape);
                        break;
                    case ';':
                        ParseSeparatorChar(letter, ref currentTarget, ref isInString, ref isEscape, currentValue, currentParameter, parameters);
                        break;
                }
            }

            if (currentParameter.Length > 0)
            {
                parameters.Add(HeaderParameter.Parse(currentParameter.ToString().Trim()));
            }

            return CreateInstance(header, currentValue.ToString(), parameters);
        }
Exemplo n.º 27
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ContentTypeHeader"/> class.
 /// </summary>
 /// <param name="contentType">Type of the content.</param>
 public ContentTypeHeader(string contentType)
 {
     Value = contentType;
     _parameters = new HeaderParameterCollection();
 }