Răsfoiți Sursa

stub out pin login service

Luke Pulverenti 9 ani în urmă
părinte
comite
d8c654f329
2 a modificat fișierele cu 147 adăugiri și 0 ștergeri
  1. 1 0
      MediaBrowser.Api/MediaBrowser.Api.csproj
  2. 146 0
      MediaBrowser.Api/PinLoginService.cs

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

@@ -80,6 +80,7 @@
     <Compile Include="FilterService.cs" />
     <Compile Include="FilterService.cs" />
     <Compile Include="IHasDtoOptions.cs" />
     <Compile Include="IHasDtoOptions.cs" />
     <Compile Include="Library\ChapterService.cs" />
     <Compile Include="Library\ChapterService.cs" />
+    <Compile Include="PinLoginService.cs" />
     <Compile Include="Playback\Dash\ManifestBuilder.cs" />
     <Compile Include="Playback\Dash\ManifestBuilder.cs" />
     <Compile Include="Playback\Dash\MpegDashService.cs" />
     <Compile Include="Playback\Dash\MpegDashService.cs" />
     <Compile Include="Playback\MediaInfoService.cs" />
     <Compile Include="Playback\MediaInfoService.cs" />

+ 146 - 0
MediaBrowser.Api/PinLoginService.cs

@@ -0,0 +1,146 @@
+using System;
+using System.Collections.Concurrent;
+using System.Globalization;
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Controller.Net;
+using MediaBrowser.Model.Connect;
+using ServiceStack;
+
+namespace MediaBrowser.Api
+{
+    [Route("/Auth/Pin", "POST", Summary = "Creates a pin request")]
+    public class CreatePinRequest : IReturn<PinCreationResult>
+    {
+        public string DeviceId { get; set; }
+    }
+
+    [Route("/Auth/Pin", "GET", Summary = "Gets pin status")]
+    public class GetPinStatusRequest : IReturn<PinStatusResult>
+    {
+        public string DeviceId { get; set; }
+        public string Pin { get; set; }
+    }
+
+    [Route("/Auth/Pin/Exchange", "POST", Summary = "Exchanges a pin")]
+    public class ExchangePinRequest : IReturn<PinExchangeResult>
+    {
+        public string DeviceId { get; set; }
+        public string Pin { get; set; }
+    }
+
+    [Route("/Auth/Pin/Validate", "POST", Summary = "Validates a pin")]
+    [Authenticated]
+    public class ValidatePinRequest : IReturnVoid
+    {
+        public string Pin { get; set; }
+    }
+
+    public class PinLoginService : BaseApiService
+    {
+        private readonly ConcurrentDictionary<string, MyPinStatus> _activeRequests = new ConcurrentDictionary<string, MyPinStatus>(StringComparer.OrdinalIgnoreCase);
+
+        public object Post(CreatePinRequest request)
+        {
+            var pin = GetNewPin(5);
+            var key = GetKey(request.DeviceId, pin);
+
+            var value = new MyPinStatus
+            {
+                CreationTimeUtc = DateTime.UtcNow,
+                IsConfirmed = false,
+                IsExpired = false,
+                Pin = pin
+            };
+
+            _activeRequests.AddOrUpdate(key, value, (k, v) => value);
+
+            return ToOptimizedResult(new PinCreationResult
+            {
+                DeviceId = request.DeviceId,
+                IsConfirmed = false,
+                IsExpired = false,
+                Pin = pin
+            });
+        }
+
+        public object Get(GetPinStatusRequest request)
+        {
+            MyPinStatus status;
+
+            if (!_activeRequests.TryGetValue(GetKey(request.DeviceId, request.Pin), out status))
+            {
+                throw new ResourceNotFoundException();
+            }
+
+            CheckExpired(status);
+
+            if (status.IsExpired)
+            {
+                throw new ResourceNotFoundException();
+            }
+
+            return ToOptimizedResult(new PinStatusResult
+            {
+                Pin = status.Pin,
+                IsConfirmed = status.IsConfirmed,
+                IsExpired = status.IsExpired
+            });
+        }
+
+        public object Post(ExchangePinRequest request)
+        {
+            MyPinStatus status;
+
+            if (!_activeRequests.TryGetValue(GetKey(request.DeviceId, request.Pin), out status))
+            {
+                throw new ResourceNotFoundException();
+            }
+
+            CheckExpired(status);
+
+            if (status.IsExpired)
+            {
+                throw new ResourceNotFoundException();
+            }
+
+            return ToOptimizedResult(new PinExchangeResult
+            {
+            });
+        }
+
+        public void Post(ValidatePinRequest request)
+        {
+        }
+
+        private void CheckExpired(MyPinStatus status)
+        {
+            if ((DateTime.UtcNow - status.CreationTimeUtc).TotalMinutes > 10)
+            {
+                status.IsExpired = true;
+            }
+        }
+
+        private string GetNewPin(int length)
+        {
+            var pin = string.Empty;
+
+            while (pin.Length < length)
+            {
+                var digit = new Random().Next(0, 9);
+                pin += digit.ToString(CultureInfo.InvariantCulture);
+            }
+
+            return pin;
+        }
+
+        private string GetKey(string deviceId, string pin)
+        {
+            return deviceId + pin;
+        }
+
+        public class MyPinStatus : PinStatusResult
+        {
+            public DateTime CreationTimeUtc { get; set; }
+        }
+    }
+}