aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api/UserService.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Api/UserService.cs')
-rw-r--r--MediaBrowser.Api/UserService.cs80
1 files changed, 74 insertions, 6 deletions
diff --git a/MediaBrowser.Api/UserService.cs b/MediaBrowser.Api/UserService.cs
index 54cf18396..87e1630aa 100644
--- a/MediaBrowser.Api/UserService.cs
+++ b/MediaBrowser.Api/UserService.cs
@@ -3,6 +3,7 @@ using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Serialization;
+using MediaBrowser.Model.Users;
using ServiceStack.ServiceHost;
using ServiceStack.Text.Controller;
using System;
@@ -19,6 +20,11 @@ namespace MediaBrowser.Api
[Api(Description = "Gets a list of users")]
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")]
+ public bool? IsHidden { get; set; }
+
+ [ApiMember(Name = "IsDisabled", Description = "Optional filter by IsDisabled=true or false", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
+ public bool? IsDisabled { get; set; }
}
/// <summary>
@@ -56,7 +62,7 @@ namespace MediaBrowser.Api
/// </summary>
[Route("/Users/{Id}/Authenticate", "POST")]
[Api(Description = "Authenticates a user")]
- public class AuthenticateUser : IReturnVoid
+ public class AuthenticateUser : IReturn<AuthenticationResult>
{
/// <summary>
/// Gets or sets the id.
@@ -74,6 +80,28 @@ namespace MediaBrowser.Api
}
/// <summary>
+ /// Class AuthenticateUser
+ /// </summary>
+ [Route("/Users/{Name}/AuthenticateByName", "POST")]
+ [Api(Description = "Authenticates a user")]
+ public class AuthenticateUserByName : IReturn<AuthenticationResult>
+ {
+ /// <summary>
+ /// Gets or sets the id.
+ /// </summary>
+ /// <value>The id.</value>
+ [ApiMember(Name = "Name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
+ public string Name { get; set; }
+
+ /// <summary>
+ /// Gets or sets the password.
+ /// </summary>
+ /// <value>The password.</value>
+ [ApiMember(Name = "Password", IsRequired = true, DataType = "string", ParameterType = "body", Verb = "POST")]
+ public string Password { get; set; }
+ }
+
+ /// <summary>
/// Class UpdateUserPassword
/// </summary>
[Route("/Users/{Id}/Password", "POST")]
@@ -168,11 +196,21 @@ namespace MediaBrowser.Api
{
var dtoBuilder = new UserDtoBuilder(Logger);
- var tasks = _userManager.Users.OrderBy(u => u.Name).Select(dtoBuilder.GetUserDto);
+ var users = _userManager.Users;
+
+ if (request.IsDisabled.HasValue)
+ {
+ users = users.Where(i => i.Configuration.IsDisabled == request.IsDisabled.Value);
+ }
+
+ if (request.IsHidden.HasValue)
+ {
+ users = users.Where(i => i.Configuration.IsHidden == request.IsHidden.Value);
+ }
- var users = tasks.Select(i => i.Result).ToList();
+ var tasks = users.OrderBy(u => u.Name).Select(dtoBuilder.GetUserDto).Select(i => i.Result);
- return ToOptimizedResult(users);
+ return ToOptimizedResult(tasks.ToList());
}
/// <summary>
@@ -218,7 +256,21 @@ namespace MediaBrowser.Api
/// Posts the specified request.
/// </summary>
/// <param name="request">The request.</param>
- public void Post(AuthenticateUser request)
+ public object Post(AuthenticateUser request)
+ {
+ var result = AuthenticateUser(request).Result;
+
+ return ToOptimizedResult(result);
+ }
+
+ public object Post(AuthenticateUserByName request)
+ {
+ var user = _userManager.Users.FirstOrDefault(i => string.Equals(request.Name, i.Name, StringComparison.OrdinalIgnoreCase));
+
+ return AuthenticateUser(new AuthenticateUser { Id = user.Id, Password = request.Password }).Result;
+ }
+
+ private async Task<object> AuthenticateUser(AuthenticateUser request)
{
var user = _userManager.GetUserById(request.Id);
@@ -227,13 +279,20 @@ namespace MediaBrowser.Api
throw new ResourceNotFoundException("User not found");
}
- var success = _userManager.AuthenticateUser(user, request.Password).Result;
+ var success = await _userManager.AuthenticateUser(user, request.Password).ConfigureAwait(false);
if (!success)
{
// Unauthorized
throw new UnauthorizedAccessException("Invalid user or password entered.");
}
+
+ var result = new AuthenticationResult
+ {
+ User = await new UserDtoBuilder(Logger).GetUserDto(user).ConfigureAwait(false)
+ };
+
+ return ToOptimizedResult(result);
}
/// <summary>
@@ -294,6 +353,15 @@ namespace MediaBrowser.Api
}
}
+ // If removing admin access
+ if (dtoUser.Configuration.IsDisabled && !user.Configuration.IsDisabled)
+ {
+ if (_userManager.Users.Count(i => !i.Configuration.IsDisabled) == 1)
+ {
+ throw new ArgumentException("There must be at least one enabled user in the system.");
+ }
+ }
+
var task = user.Name.Equals(dtoUser.Name, StringComparison.Ordinal) ? _userManager.UpdateUser(user) : _userManager.RenameUser(user, dtoUser.Name);
Task.WaitAll(task);