Ver Fonte

Added User authentication

LukePulverenti Luke Pulverenti luke pulverenti há 12 anos atrás
pai
commit
3538789e46

+ 2 - 1
MediaBrowser.Api/ApiService.cs

@@ -292,7 +292,8 @@ namespace MediaBrowser.Api
             {
                 Id = user.Id,
                 Name = user.Name,
-                HasImage = !string.IsNullOrEmpty(user.PrimaryImagePath)
+                HasImage = !string.IsNullOrEmpty(user.PrimaryImagePath),
+                HasPassword = !string.IsNullOrEmpty(user.Password)
             };
         }
     }

+ 28 - 0
MediaBrowser.Api/HttpHandlers/UserAuthenticationHandler.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Linq;
+using System.Threading.Tasks;
+using MediaBrowser.Common.Net.Handlers;
+using MediaBrowser.Controller;
+using MediaBrowser.Model.DTO;
+using MediaBrowser.Model.Entities;
+
+namespace MediaBrowser.Api.HttpHandlers
+{
+    class UserAuthenticationHandler : BaseSerializationHandler<AuthenticationResult>
+    {
+        protected override async Task<AuthenticationResult> GetObjectToSerialize()
+        {
+            Guid userId = Guid.Parse(QueryString["userid"]);
+            User user = Kernel.Instance.Users.First(u => u.Id == userId);
+
+            string password = await GetFormValue("password").ConfigureAwait(false);
+
+            AuthenticationResult result = new AuthenticationResult()
+            {
+                Success = true
+            };
+
+            return result;
+        }
+    }
+}

+ 1 - 0
MediaBrowser.Api/MediaBrowser.Api.csproj

@@ -73,6 +73,7 @@
     <Compile Include="HttpHandlers\ServerConfigurationHandler.cs" />
     <Compile Include="HttpHandlers\StudioHandler.cs" />
     <Compile Include="HttpHandlers\StudiosHandler.cs" />
+    <Compile Include="HttpHandlers\UserAuthenticationHandler.cs" />
     <Compile Include="HttpHandlers\UsersHandler.cs" />
     <Compile Include="HttpHandlers\VideoHandler.cs" />
     <Compile Include="HttpHandlers\WeatherHandler.cs" />

+ 4 - 0
MediaBrowser.Api/Plugin.cs

@@ -117,6 +117,10 @@ namespace MediaBrowser.Api
             {
                 return new PluginAssemblyHandler();
             }
+            else if (IsUrlMatch("/api/UserAuthentication", localPath))
+            {
+                return new UserAuthenticationHandler();
+            }
 
             return null;
         }

+ 18 - 10
MediaBrowser.ApiInteraction.Metro/DataSerializer.cs

@@ -13,18 +13,22 @@ namespace MediaBrowser.ApiInteraction
             {
                 return Serializer.Deserialize<T>(stream);
             }
-            if (format == ApiInteraction.SerializationFormats.Jsv)
+            else if (format == ApiInteraction.SerializationFormats.Jsv)
             {
                 throw new NotImplementedException();
             }
-
-            using (StreamReader streamReader = new StreamReader(stream))
+            else if (format == ApiInteraction.SerializationFormats.Json)
             {
-                using (JsonReader jsonReader = new JsonTextReader(streamReader))
+                using (StreamReader streamReader = new StreamReader(stream))
                 {
-                    return JsonSerializer.Create(new JsonSerializerSettings()).Deserialize<T>(jsonReader);
+                    using (JsonReader jsonReader = new JsonTextReader(streamReader))
+                    {
+                        return JsonSerializer.Create(new JsonSerializerSettings()).Deserialize<T>(jsonReader);
+                    }
                 }
             }
+
+            throw new NotImplementedException();
         }
 
         public static object DeserializeFromStream(Stream stream, SerializationFormats format, Type type)
@@ -33,18 +37,22 @@ namespace MediaBrowser.ApiInteraction
             {
                 throw new NotImplementedException();
             }
-            if (format == ApiInteraction.SerializationFormats.Jsv)
+            else if (format == ApiInteraction.SerializationFormats.Jsv)
             {
                 throw new NotImplementedException();
             }
-
-            using (StreamReader streamReader = new StreamReader(stream))
+            else if (format == ApiInteraction.SerializationFormats.Json)
             {
-                using (JsonReader jsonReader = new JsonTextReader(streamReader))
+                using (StreamReader streamReader = new StreamReader(stream))
                 {
-                    return JsonSerializer.Create(new JsonSerializerSettings()).Deserialize(jsonReader, type);
+                    using (JsonReader jsonReader = new JsonTextReader(streamReader))
+                    {
+                        return JsonSerializer.Create(new JsonSerializerSettings()).Deserialize(jsonReader, type);
+                    }
                 }
             }
+
+            throw new NotImplementedException();
         }
 
         public static void Configure()

+ 21 - 2
MediaBrowser.ApiInteraction/ApiClient.cs

@@ -7,6 +7,7 @@ using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.DTO;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Weather;
+using System.Text;
 
 namespace MediaBrowser.ApiInteraction
 {
@@ -648,6 +649,24 @@ namespace MediaBrowser.ApiInteraction
             }
         }
 
+        /// <summary>
+        /// Authenticates a user and returns the result
+        /// </summary>
+        public async Task<AuthenticationResult> AuthenticateUser(Guid userId, string password)
+        {
+            string url = ApiUrl + "/UserAuthentication?userId=" + userId;
+            url += "&dataformat=" + SerializationFormat.ToString();
+
+            HttpContent content = new StringContent("password=" + password, Encoding.UTF8, "application/x-www-form-urlencoded");
+
+            HttpResponseMessage msg = await HttpClient.PostAsync(url, content).ConfigureAwait(false);
+
+            using (Stream stream = await msg.Content.ReadAsStreamAsync().ConfigureAwait(false))
+            {
+                return DeserializeFromStream<AuthenticationResult>(stream);
+            }
+        }
+
         /// <summary>
         /// This is a helper around getting a stream from the server that contains serialized data
         /// </summary>
@@ -663,11 +682,11 @@ namespace MediaBrowser.ApiInteraction
         {
             if (url.IndexOf('?') == -1)
             {
-                url += "?dataformat=" + serializationFormat.ToString().ToLower();
+                url += "?dataformat=" + serializationFormat.ToString();
             }
             else
             {
-                url += "&dataformat=" + serializationFormat.ToString().ToLower();
+                url += "&dataformat=" + serializationFormat.ToString();
             }
 
             return GetStreamAsync(url);

+ 12 - 4
MediaBrowser.ApiInteraction/DataSerializer.cs

@@ -13,12 +13,16 @@ namespace MediaBrowser.ApiInteraction
             {
                 return Serializer.Deserialize<T>(stream);
             }
-            if (format == ApiInteraction.SerializationFormats.Jsv)
+            else if (format == ApiInteraction.SerializationFormats.Jsv)
             {
                 return TypeSerializer.DeserializeFromStream<T>(stream);
             }
+            else if (format == ApiInteraction.SerializationFormats.Json)
+            {
+                return JsonSerializer.DeserializeFromStream<T>(stream);
+            }
 
-            return JsonSerializer.DeserializeFromStream<T>(stream);
+            throw new NotImplementedException();
         }
 
         public static object DeserializeFromStream(Stream stream, SerializationFormats format, Type type)
@@ -27,12 +31,16 @@ namespace MediaBrowser.ApiInteraction
             {
                 throw new NotImplementedException();
             }
-            if (format == ApiInteraction.SerializationFormats.Jsv)
+            else if (format == ApiInteraction.SerializationFormats.Jsv)
             {
                 return TypeSerializer.DeserializeFromStream(type, stream);
             }
+            else if (format == ApiInteraction.SerializationFormats.Json)
+            {
+                return JsonSerializer.DeserializeFromStream(type, stream);
+            }
 
-            return JsonSerializer.DeserializeFromStream(type, stream);
+            throw new NotImplementedException();
         }
 
         public static void Configure()

+ 1 - 0
MediaBrowser.Common/MediaBrowser.Common.csproj

@@ -65,6 +65,7 @@
     </Reference>
     <Reference Include="System.Runtime.Remoting" />
     <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Web" />
     <Reference Include="System.Windows.Interactivity">
       <HintPath>..\packages\MahApps.Metro.0.9.0.0\lib\net40\System.Windows.Interactivity.dll</HintPath>
     </Reference>

+ 63 - 0
MediaBrowser.Common/Net/Handlers/BaseHandler.cs

@@ -1,11 +1,14 @@
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Collections.Specialized;
 using System.IO;
 using System.IO.Compression;
 using System.Linq;
 using System.Net;
+using System.Text;
 using System.Threading.Tasks;
+using System.Web;
 using MediaBrowser.Common.Logging;
 
 namespace MediaBrowser.Common.Net.Handlers
@@ -374,5 +377,65 @@ namespace MediaBrowser.Common.Net.Handlers
                 return StatusCode == 200 || StatusCode == 206;
             }
         }
+
+        private Hashtable _FormValues = null;
+
+        /// <summary>
+        /// Gets a value from form POST data
+        /// </summary>
+        protected async Task<string> GetFormValue(string name)
+        {
+            if (_FormValues == null)
+            {
+                _FormValues = await GetFormValues(HttpListenerContext.Request).ConfigureAwait(false);
+            }
+
+            if (_FormValues.ContainsKey(name))
+            {
+                return _FormValues[name].ToString();
+            }
+
+            return null;
+        }
+
+        /// <summary>
+        /// Extracts form POST data from a request
+        /// </summary>
+        private async Task<Hashtable> GetFormValues(HttpListenerRequest request)
+        {
+            Hashtable formVars = new Hashtable();
+
+            if (request.HasEntityBody)
+            {
+                if (request.ContentType.Equals("application/x-www-form-urlencoded", StringComparison.OrdinalIgnoreCase))
+                {
+                    using (Stream requestBody = request.InputStream)
+                    {
+                        using (StreamReader reader = new StreamReader(requestBody, request.ContentEncoding))
+                        {
+                            string s = await reader.ReadToEndAsync().ConfigureAwait(false);
+
+                            string[] pairs = s.Split('&');
+
+                            for (int x = 0; x < pairs.Length; x++)
+                            {
+                                string pair = pairs[x];
+
+                                int index = pair.IndexOf('=');
+
+                                if (index != -1)
+                                {
+                                    string name = pair.Substring(0, index);
+                                    string value = pair.Substring(index + 1);
+                                    formVars.Add(name, value);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            return formVars;
+        }
     }
 }

+ 12 - 0
MediaBrowser.Model/DTO/AuthenticationResult.cs

@@ -0,0 +1,12 @@
+using System;
+using ProtoBuf;
+
+namespace MediaBrowser.Model.DTO
+{
+    [ProtoContract]
+    public class AuthenticationResult
+    {
+        [ProtoMember(1)]
+        public bool Success { get; set; }
+    }
+}

+ 3 - 0
MediaBrowser.Model/DTO/DTOUser.cs

@@ -14,5 +14,8 @@ namespace MediaBrowser.Model.DTO
 
         [ProtoMember(3)]
         public bool HasImage { get; set; }
+
+        [ProtoMember(4)]
+        public bool HasPassword { get; set; }
     }
 }

+ 2 - 0
MediaBrowser.Model/Entities/User.cs

@@ -3,6 +3,8 @@ namespace MediaBrowser.Model.Entities
 {
     public class User : BaseEntity
     {
+        public string Password { get; set; }
+        
         public string MaxParentalRating { get; set; }
 
         public int RecentItemDays { get; set; }

+ 1 - 0
MediaBrowser.Model/MediaBrowser.Model.csproj

@@ -35,6 +35,7 @@
     <Compile Include="Configuration\BaseApplicationConfiguration.cs" />
     <Compile Include="Configuration\ServerConfiguration.cs" />
     <Compile Include="DTO\AudioInfo.cs" />
+    <Compile Include="DTO\AuthenticationResult.cs" />
     <Compile Include="DTO\DTOBaseItem.cs" />
     <Compile Include="DTO\DTOUser.cs" />
     <Compile Include="DTO\VideoInfo.cs" />