using System.Collections.Generic; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Connectivity; using MediaBrowser.Model.Logging; using MediaBrowser.Server.Implementations.HttpServer; using ServiceStack.Common.Web; using ServiceStack.ServiceHost; using System; namespace MediaBrowser.Api { /// /// Class BaseApiService /// [RequestFilter] public class BaseApiService : BaseRestService { } /// /// Class RequestFilterAttribute /// public class RequestFilterAttribute : Attribute, IHasRequestFilter { //This property will be resolved by the IoC container /// /// Gets or sets the user manager. /// /// The user manager. public IUserManager UserManager { get; set; } /// /// Gets or sets the logger. /// /// The logger. public ILogger Logger { get; set; } /// /// The request filter is executed before the service. /// /// The http request wrapper /// The http response wrapper /// The request DTO public void RequestFilter(IHttpRequest request, IHttpResponse response, object requestDto) { //This code is executed before the service var auth = GetAuthorization(request); if (auth != null && auth.ContainsKey("UserId")) { var user = UserManager.GetUserById(new Guid(auth["UserId"])); ClientType clientType; Enum.TryParse(auth["Client"] ?? string.Empty, out clientType); UserManager.LogUserActivity(user, clientType, auth["DeviceId"], auth["Device"] ?? string.Empty); } } /// /// Gets the auth. /// /// The HTTP req. /// Dictionary{System.StringSystem.String}. public static Dictionary GetAuthorization(IHttpRequest httpReq) { var auth = httpReq.Headers[HttpHeaders.Authorization]; if (auth == null) return null; var parts = auth.Split(' '); // There should be at least to parts if (parts.Length < 2) return null; // It has to be a digest request if (!string.Equals(parts[0], "MediaBrowser", StringComparison.OrdinalIgnoreCase)) { return null; } // Remove uptil the first space auth = auth.Substring(auth.IndexOf(' ')); parts = auth.Split(','); var result = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var item in parts) { var param = item.Trim().Split(new[] { '=' }, 2); result.Add(param[0], param[1].Trim(new[] { '"' })); } return result; } /// /// A new shallow copy of this filter is used on every request. /// /// IHasRequestFilter. public IHasRequestFilter Copy() { return this; } /// /// Order in which Request Filters are executed. /// <0 Executed before global request filters /// >0 Executed after global request filters /// /// The priority. public int Priority { get { return 0; } } } }