浏览代码

Added function to split the authorization header parts

Tommaso Stocchi 4 年之前
父节点
当前提交
c6eefaac09
共有 1 个文件被更改,包括 43 次插入2 次删除
  1. 43 2
      Emby.Server.Implementations/HttpServer/Security/AuthorizationContext.cs

+ 43 - 2
Emby.Server.Implementations/HttpServer/Security/AuthorizationContext.cs

@@ -265,7 +265,7 @@ namespace Emby.Server.Implementations.HttpServer.Security
 
             // Remove uptil the first space
             authorizationHeader = parts[1];
-            parts = authorizationHeader.Split("\",");
+            parts = GetParts(authorizationHeader);
 
             var result = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
 
@@ -274,7 +274,7 @@ namespace Emby.Server.Implementations.HttpServer.Security
                 var param = item.Trim().Split('=', 2);
 
                 var value =param[1].Trim('"');
-                result[param[0]] = value;
+                result[param[0]] = NormalizeValue(value);
             }
 
             return result;
@@ -284,5 +284,46 @@ namespace Emby.Server.Implementations.HttpServer.Security
         {
             return string.IsNullOrEmpty(value) ? value : WebUtility.UrlDecode(value);
         }
+
+        public static string[] GetParts(string authtorizationHeader)
+        {
+            var result = new List<string>();
+            var escapeChars = new[] {'"', ','};
+            var escaped = false;
+            var authtorizationHeaderChars = authtorizationHeader.ToCharArray();
+            var value = new List<char>();
+
+            for(var i = 0; i < authtorizationHeaderChars.Length; i++)
+            {
+                if(!escapeChars.Contains(authtorizationHeaderChars[i]))
+                {
+                    value = value.Append(authtorizationHeaderChars[i]).ToList();
+                }
+                else
+                {
+                    escaped = (!escaped) == (authtorizationHeaderChars[i] == '"');
+                    if(authtorizationHeaderChars[i] == ',')
+                    {
+                        if(escaped)
+                        {
+                            value = value.Append(authtorizationHeaderChars[i]).ToList();
+                        }
+                        else
+                        {
+                            result.Add(new string(value.ToArray()));
+                            value = new List<char>();
+                        }
+                    }
+                    else
+                    {
+                        value = value.Append(authtorizationHeaderChars[i]).ToList();
+                    }
+                }
+            }
+            // Add last value
+            result.Add(new string(value.ToArray()));
+
+            return result.ToArray();
+        }
     }
 }