diff options
| author | 7illusions <z@7illusions.com> | 2014-08-30 19:06:58 +0200 |
|---|---|---|
| committer | 7illusions <z@7illusions.com> | 2014-08-30 19:06:58 +0200 |
| commit | 66ad1699e22029b605e17735e8d9450285d8748a (patch) | |
| tree | ffc92c88d24850b2f82b6b3a8bdd904a2ccc77a5 /MediaBrowser.Api/UserService.cs | |
| parent | 34bc54263e886aae777a3537dc50a6535b51330a (diff) | |
| parent | 9d36f518182bc075c19d78084870f5115fa62d1e (diff) | |
Merge pull request #1 from MediaBrowser/master
Update to latest
Diffstat (limited to 'MediaBrowser.Api/UserService.cs')
| -rw-r--r-- | MediaBrowser.Api/UserService.cs | 190 |
1 files changed, 112 insertions, 78 deletions
diff --git a/MediaBrowser.Api/UserService.cs b/MediaBrowser.Api/UserService.cs index 1932c8f93..2c504bee1 100644 --- a/MediaBrowser.Api/UserService.cs +++ b/MediaBrowser.Api/UserService.cs @@ -1,9 +1,11 @@ using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Net; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Session; using MediaBrowser.Model.Dto; -using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Users; using ServiceStack; using ServiceStack.Text.Controller; @@ -18,6 +20,7 @@ namespace MediaBrowser.Api /// Class GetUsers /// </summary> [Route("/Users", "GET", Summary = "Gets a list of users")] + [Authenticated] public class GetUsers : IReturn<List<UserDto>> { [ApiMember(Name = "IsHidden", Description = "Optional filter by IsHidden=true or false", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] @@ -36,6 +39,7 @@ namespace MediaBrowser.Api /// Class GetUser /// </summary> [Route("/Users/{Id}", "GET", Summary = "Gets a user by Id")] + [Authenticated] public class GetUser : IReturn<UserDto> { /// <summary> @@ -50,6 +54,7 @@ namespace MediaBrowser.Api /// Class DeleteUser /// </summary> [Route("/Users/{Id}", "DELETE", Summary = "Deletes a user")] + [Authenticated] public class DeleteUser : IReturnVoid { /// <summary> @@ -106,6 +111,7 @@ namespace MediaBrowser.Api /// Class UpdateUserPassword /// </summary> [Route("/Users/{Id}/Password", "POST", Summary = "Updates a user's password")] + [Authenticated] public class UpdateUserPassword : IReturnVoid { /// <summary> @@ -137,6 +143,7 @@ namespace MediaBrowser.Api /// Class UpdateUser /// </summary> [Route("/Users/{Id}", "POST", Summary = "Updates a user")] + [Authenticated] public class UpdateUser : UserDto, IReturnVoid { } @@ -145,6 +152,7 @@ namespace MediaBrowser.Api /// Class CreateUser /// </summary> [Route("/Users", "POST", Summary = "Creates a user")] + [Authenticated] public class CreateUser : UserDto, IReturn<UserDto> { } @@ -152,48 +160,68 @@ namespace MediaBrowser.Api /// <summary> /// Class UsersService /// </summary> - public class UserService : BaseApiService + public class UserService : BaseApiService, IHasAuthorization { /// <summary> - /// The _XML serializer - /// </summary> - private readonly IXmlSerializer _xmlSerializer; - - /// <summary> /// The _user manager /// </summary> private readonly IUserManager _userManager; private readonly IDtoService _dtoService; private readonly ISessionManager _sessionMananger; + private readonly IServerConfigurationManager _config; + private readonly INetworkManager _networkManager; + + public IAuthorizationContext AuthorizationContext { get; set; } /// <summary> /// Initializes a new instance of the <see cref="UserService" /> class. /// </summary> - /// <param name="xmlSerializer">The XML serializer.</param> /// <param name="userManager">The user manager.</param> /// <param name="dtoService">The dto service.</param> + /// <param name="sessionMananger">The session mananger.</param> /// <exception cref="System.ArgumentNullException">xmlSerializer</exception> - public UserService(IXmlSerializer xmlSerializer, IUserManager userManager, IDtoService dtoService, ISessionManager sessionMananger) - : base() + public UserService(IUserManager userManager, IDtoService dtoService, ISessionManager sessionMananger, IServerConfigurationManager config, INetworkManager networkManager) { - if (xmlSerializer == null) - { - throw new ArgumentNullException("xmlSerializer"); - } - - _xmlSerializer = xmlSerializer; _userManager = userManager; _dtoService = dtoService; _sessionMananger = sessionMananger; + _config = config; + _networkManager = networkManager; } public object Get(GetPublicUsers request) { + var authInfo = AuthorizationContext.GetAuthorizationInfo(Request); + var isDashboard = string.Equals(authInfo.Client, "Dashboard", StringComparison.OrdinalIgnoreCase); + + if ((Request.IsLocal && isDashboard) || + !_config.Configuration.IsStartupWizardCompleted) + { + return Get(new GetUsers + { + IsDisabled = false + }); + } + + // TODO: Uncomment this once all clients can handle an empty user list. return Get(new GetUsers { IsHidden = false, IsDisabled = false }); + + //// TODO: Add or is authenticated + //if (Request.IsLocal || IsInLocalNetwork(Request.RemoteIp)) + //{ + // return Get(new GetUsers + // { + // IsHidden = false, + // IsDisabled = false + // }); + //} + + //// Return empty when external + //return ToOptimizedResult(new List<UserDto>()); } /// <summary> @@ -217,7 +245,7 @@ namespace MediaBrowser.Api var result = users .OrderBy(u => u.Name) - .Select(_dtoService.GetUserDto) + .Select(i => _userManager.GetUserDto(i, Request.RemoteIp)) .ToList(); return ToOptimizedSerializedResultUsingCache(result); @@ -237,7 +265,7 @@ namespace MediaBrowser.Api throw new ResourceNotFoundException("User not found"); } - var result = _dtoService.GetUserDto(user); + var result = _userManager.GetUserDto(user, Request.RemoteIp); return ToOptimizedSerializedResultUsingCache(result); } @@ -248,6 +276,13 @@ namespace MediaBrowser.Api /// <param name="request">The request.</param> public void Delete(DeleteUser request) { + var task = DeleteAsync(request); + + Task.WaitAll(task); + } + + public async Task DeleteAsync(DeleteUser request) + { var user = _userManager.GetUserById(request.Id); if (user == null) @@ -255,9 +290,8 @@ namespace MediaBrowser.Api throw new ResourceNotFoundException("User not found"); } - var task = _userManager.DeleteUser(user); - - Task.WaitAll(task); + await _sessionMananger.RevokeUserTokens(user.Id.ToString("N")).ConfigureAwait(false); + await _userManager.DeleteUser(user).ConfigureAwait(false); } /// <summary> @@ -266,67 +300,54 @@ namespace MediaBrowser.Api /// <param name="request">The request.</param> public object Post(AuthenticateUser request) { - // No response needed. Will throw an exception on failure. - var result = AuthenticateUser(request).Result; - - return result; - } - - public object Post(AuthenticateUserByName request) - { - var user = _userManager.Users.FirstOrDefault(i => string.Equals(request.Username, i.Name, StringComparison.OrdinalIgnoreCase)); + var user = _userManager.GetUserById(request.Id); if (user == null) { - throw new ArgumentException(string.Format("User {0} not found.", request.Username)); + throw new ResourceNotFoundException("User not found"); } - var result = AuthenticateUser(new AuthenticateUser { Id = user.Id, Password = request.Password }).Result; - - return ToOptimizedResult(result); + return Post(new AuthenticateUserByName + { + Username = user.Name, + Password = request.Password + }); } - private async Task<AuthenticationResult> AuthenticateUser(AuthenticateUser request) + public async Task<object> Post(AuthenticateUserByName request) { - var user = _userManager.GetUserById(request.Id); + var auth = AuthorizationContext.GetAuthorizationInfo(Request); - if (user == null) + if (string.IsNullOrWhiteSpace(auth.Client)) { - throw new ResourceNotFoundException("User not found"); + auth.Client = "Unknown app"; } - - var auth = AuthorizationRequestFilterAttribute.GetAuthorization(Request); - - // Login in the old way if the header is missing - if (string.IsNullOrEmpty(auth.Client) || - string.IsNullOrEmpty(auth.Device) || - string.IsNullOrEmpty(auth.DeviceId) || - string.IsNullOrEmpty(auth.Version)) + if (string.IsNullOrWhiteSpace(auth.Device)) { - var success = await _userManager.AuthenticateUser(user, request.Password).ConfigureAwait(false); - - if (!success) - { - // Unauthorized - throw new UnauthorizedAccessException("Invalid user or password entered."); - } - - return new AuthenticationResult - { - User = _dtoService.GetUserDto(user) - }; + auth.Device = "Unknown device"; + } + if (string.IsNullOrWhiteSpace(auth.Version)) + { + auth.Version = "Unknown version"; + } + if (string.IsNullOrWhiteSpace(auth.DeviceId)) + { + auth.DeviceId = "Unknown device id"; } - var session = await _sessionMananger.AuthenticateNewSession(user, request.Password, auth.Client, auth.Version, - auth.DeviceId, auth.Device, Request.RemoteIp).ConfigureAwait(false); - - var result = new AuthenticationResult + var result = await _sessionMananger.AuthenticateNewSession(new AuthenticationRequest { - User = _dtoService.GetUserDto(user), - SessionInfo = _sessionMananger.GetSessionInfoDto(session) - }; + App = auth.Client, + AppVersion = auth.Version, + DeviceId = auth.DeviceId, + DeviceName = auth.Device, + Password = request.Password, + RemoteEndPoint = Request.RemoteIp, + Username = request.Username + + }, Request.IsLocal).ConfigureAwait(false); - return result; + return ToOptimizedResult(result); } /// <summary> @@ -335,6 +356,12 @@ namespace MediaBrowser.Api /// <param name="request">The request.</param> public void Post(UpdateUserPassword request) { + var task = PostAsync(request); + Task.WaitAll(task); + } + + public async Task PostAsync(UpdateUserPassword request) + { var user = _userManager.GetUserById(request.Id); if (user == null) @@ -344,31 +371,34 @@ namespace MediaBrowser.Api if (request.ResetPassword) { - var task = _userManager.ResetPassword(user); - - Task.WaitAll(task); + await _userManager.ResetPassword(user).ConfigureAwait(false); } else { - var success = _userManager.AuthenticateUser(user, request.CurrentPassword).Result; + var success = await _userManager.AuthenticateUser(user.Name, request.CurrentPassword, Request.RemoteIp).ConfigureAwait(false); if (!success) { - throw new UnauthorizedAccessException("Invalid user or password entered."); + throw new ArgumentException("Invalid user or password entered."); } - var task = _userManager.ChangePassword(user, request.NewPassword); - - Task.WaitAll(task); + await _userManager.ChangePassword(user, request.NewPassword).ConfigureAwait(false); } } - + /// <summary> /// Posts the specified request. /// </summary> /// <param name="request">The request.</param> public void Post(UpdateUser request) { + var task = PostAsync(request); + + Task.WaitAll(task); + } + + public async Task PostAsync(UpdateUser request) + { // We need to parse this manually because we told service stack not to with IRequiresRequestStream // https://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.Text/ServiceStack.Text/Controller/PathInfo.cs var pathInfo = PathInfo.Parse(Request.PathInfo); @@ -400,11 +430,15 @@ namespace MediaBrowser.Api { throw new ArgumentException("There must be at least one enabled user in the system."); } + + await _sessionMananger.RevokeUserTokens(user.Id.ToString("N")).ConfigureAwait(false); } - var task = user.Name.Equals(dtoUser.Name, StringComparison.Ordinal) ? _userManager.UpdateUser(user) : _userManager.RenameUser(user, dtoUser.Name); + var task = user.Name.Equals(dtoUser.Name, StringComparison.Ordinal) ? + _userManager.UpdateUser(user) : + _userManager.RenameUser(user, dtoUser.Name); - Task.WaitAll(task); + await task.ConfigureAwait(false); user.UpdateConfiguration(dtoUser.Configuration); } @@ -422,7 +456,7 @@ namespace MediaBrowser.Api newUser.UpdateConfiguration(dtoUser.Configuration); - var result = _dtoService.GetUserDto(newUser); + var result = _userManager.GetUserDto(newUser, Request.RemoteIp); return ToOptimizedResult(result); } |
