mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-08-19 21:03:17 -07:00
Added the ability to get the apikey from the api if you provide a correct username and password.
Added more unit tests Added the ability to change a users password using the api refactored the Usermapper and made it unit testsable. Also api documentation for the new endpoints too. #222 #205
This commit is contained in:
parent
84dc4515fd
commit
cbfe88cd6d
14 changed files with 424 additions and 44 deletions
|
@ -69,6 +69,7 @@ namespace PlexRequests.UI
|
|||
protected override void ConfigureRequestContainer(TinyIoCContainer container, NancyContext context)
|
||||
{
|
||||
container.Register<IUserMapper, UserMapper>();
|
||||
container.Register<ICustomUserMapper, UserMapper>();
|
||||
container.Register<ISqliteConfiguration, DbConfiguration>(new DbConfiguration(new SqliteFactory()));
|
||||
container.Register<ICacheProvider, MemoryCacheProvider>().AsSingleton();
|
||||
|
||||
|
@ -87,6 +88,7 @@ namespace PlexRequests.UI
|
|||
|
||||
// Repo's
|
||||
container.Register<IRepository<LogEntity>, GenericRepository<LogEntity>>();
|
||||
container.Register<IRepository<UsersModel>, UserRepository<UsersModel>>();
|
||||
container.Register<IRepository<ScheduledJobs>, GenericRepository<ScheduledJobs>>();
|
||||
container.Register<IRequestService, JsonRequestService>();
|
||||
container.Register<ISettingsRepository, SettingsJsonRepository>();
|
||||
|
|
55
PlexRequests.UI/ModelDataProviders/UserUpdateViewModel.cs
Normal file
55
PlexRequests.UI/ModelDataProviders/UserUpdateViewModel.cs
Normal file
|
@ -0,0 +1,55 @@
|
|||
#region Copyright
|
||||
// /************************************************************************
|
||||
// Copyright (c) 2016 Jamie Rees
|
||||
// File: RequestedModelDataProvider.cs
|
||||
// Created By: Jamie Rees
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
// ************************************************************************/
|
||||
#endregion
|
||||
using System;
|
||||
using Nancy.Swagger;
|
||||
using Nancy.Swagger.Services;
|
||||
|
||||
using PlexRequests.Store;
|
||||
|
||||
namespace PlexRequests.UI.ModelDataProviders
|
||||
{
|
||||
public class UserUpdateViewModel : ISwaggerModelDataProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the model data for the api documentation.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public SwaggerModelData GetModelData()
|
||||
{
|
||||
return SwaggerModelData.ForType<Models.UserUpdateViewModel>(with =>
|
||||
{
|
||||
with.Property(x => x.CurrentPassword)
|
||||
.Description("The users current password")
|
||||
.Required(true);
|
||||
|
||||
with.Property(x => x.NewPassword)
|
||||
.Description("The users new password that we will change it to")
|
||||
.Required(true);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
34
PlexRequests.UI/Models/UserUpdateViewModel.cs
Normal file
34
PlexRequests.UI/Models/UserUpdateViewModel.cs
Normal file
|
@ -0,0 +1,34 @@
|
|||
#region Copyright
|
||||
// /************************************************************************
|
||||
// Copyright (c) 2016 Jamie Rees
|
||||
// File: UserUpdateViewModel.cs
|
||||
// Created By: Jamie Rees
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
// ************************************************************************/
|
||||
#endregion
|
||||
namespace PlexRequests.UI.Models
|
||||
{
|
||||
public class UserUpdateViewModel
|
||||
{
|
||||
public string CurrentPassword { get; set; }
|
||||
public string NewPassword { get; set; }
|
||||
}
|
||||
}
|
|
@ -709,17 +709,14 @@ namespace PlexRequests.UI.Modules
|
|||
|
||||
private Response CreateApiKey()
|
||||
{
|
||||
this.RequiresClaims (UserClaims.Admin);
|
||||
|
||||
var apiKey = Guid.NewGuid ().ToString ("N");
|
||||
|
||||
var settings = PrService.GetSettings ();
|
||||
this.RequiresClaims(UserClaims.Admin);
|
||||
var apiKey = Guid.NewGuid().ToString("N");
|
||||
var settings = PrService.GetSettings();
|
||||
|
||||
settings.ApiKey = apiKey;
|
||||
PrService.SaveSettings(settings);
|
||||
|
||||
PrService.SaveSettings (settings);
|
||||
|
||||
return Response.AsJson (apiKey);
|
||||
return Response.AsJson(apiKey);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -30,6 +30,7 @@ using Nancy.Metadata.Modules;
|
|||
using Nancy.Swagger;
|
||||
|
||||
using PlexRequests.Store;
|
||||
using PlexRequests.UI.Models;
|
||||
|
||||
namespace PlexRequests.UI.Modules
|
||||
{
|
||||
|
@ -83,11 +84,32 @@ namespace PlexRequests.UI.Modules
|
|||
with.ResourcePath("/requests/{id}");
|
||||
with.Summary("Deletes an existing request");
|
||||
with.Model<ApiModel<bool>>();
|
||||
with.PathParam<int>("id");
|
||||
with.PathParam<int>("id", required:true);
|
||||
with.QueryParam<string>("apikey", "The Api Key found in the settings", true);
|
||||
with.Notes("Deletes an existing request. If the request doesn't exist we will return an error.");
|
||||
});
|
||||
|
||||
Describe["GetApiKey"] = description => description.AsSwagger(with =>
|
||||
{
|
||||
with.ResourcePath("/apikey");
|
||||
with.Summary("Gets the Api Key for Plex Requests");
|
||||
with.Model<ApiModel<string>>();
|
||||
with.QueryParam<string>("username", required:true );
|
||||
with.QueryParam<string>("password", required: true );
|
||||
with.Notes("Get's the current api key for the application");
|
||||
});
|
||||
|
||||
Describe["PutCredentials"] = description => description.AsSwagger(with =>
|
||||
{
|
||||
with.ResourcePath("/credentials/{username}");
|
||||
with.Summary("Sets a new password for the user");
|
||||
with.Model<ApiModel<string>>();
|
||||
with.PathParam<int>("username", required:true);
|
||||
with.QueryParam<string>("apikey", "The Api Key found in the settings", true);
|
||||
with.BodyParam<UserUpdateViewModel>("User update view model", true);
|
||||
with.Notes("Sets a new password for the user");
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -26,7 +26,6 @@
|
|||
#endregion
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
|
||||
using Nancy;
|
||||
using Nancy.ModelBinding;
|
||||
|
@ -34,12 +33,13 @@ using Nancy.ModelBinding;
|
|||
using PlexRequests.Core;
|
||||
using PlexRequests.Core.SettingModels;
|
||||
using PlexRequests.Store;
|
||||
using PlexRequests.UI.Models;
|
||||
|
||||
namespace PlexRequests.UI.Modules
|
||||
{
|
||||
public class ApiModule : BaseApiModule
|
||||
{
|
||||
public ApiModule(IRequestService service, ISettingsService<PlexRequestSettings> pr) : base("api", pr)
|
||||
public ApiModule(IRequestService service, ISettingsService<PlexRequestSettings> pr, ICustomUserMapper m) : base("api", pr)
|
||||
{
|
||||
Get["GetRequests","/requests"] = x => GetRequests();
|
||||
Get["GetRequest","/requests/{id}"] = x => GetSingleRequests(x);
|
||||
|
@ -47,10 +47,18 @@ namespace PlexRequests.UI.Modules
|
|||
Put["PutRequests", "/requests"] = x => UpdateRequest();
|
||||
Delete["DeleteRequests", "/requests/{id}"] = x => DeleteRequest(x);
|
||||
|
||||
Get["GetApiKey", "/apikey"] = x => GetApiKey();
|
||||
|
||||
Put["PutCredentials", "/credentials/{username}"] = x => ChangePassword(x);
|
||||
|
||||
RequestService = service;
|
||||
SettingsService = pr;
|
||||
UserMapper = m;
|
||||
}
|
||||
|
||||
private IRequestService RequestService { get; }
|
||||
private ISettingsService<PlexRequestSettings> SettingsService { get; }
|
||||
private ICustomUserMapper UserMapper { get; }
|
||||
|
||||
public Response GetRequests()
|
||||
{
|
||||
|
@ -156,6 +164,54 @@ namespace PlexRequests.UI.Modules
|
|||
}
|
||||
}
|
||||
|
||||
public Response GetApiKey()
|
||||
{
|
||||
var user = Request.Query["username"];
|
||||
var password = Request.Query["password"];
|
||||
var result = UserMapper.ValidateUser(user, password);
|
||||
var model = new ApiModel<string>();
|
||||
if (result == null)
|
||||
{
|
||||
model.Error = true;
|
||||
model.ErrorMessage = "Incorrect username or password";
|
||||
return ReturnReponse(model);
|
||||
}
|
||||
|
||||
var settings = SettingsService.GetSettings();
|
||||
model.Data = settings.ApiKey;
|
||||
|
||||
return ReturnReponse(model);
|
||||
}
|
||||
|
||||
public Response ChangePassword(dynamic x)
|
||||
{
|
||||
var username = (string)x.username;
|
||||
var userModel = this.BindAndValidate<UserUpdateViewModel>();
|
||||
|
||||
if (!ModelValidationResult.IsValid)
|
||||
{
|
||||
return ReturnValidationReponse(ModelValidationResult);
|
||||
}
|
||||
|
||||
var valid = UserMapper.ValidateUser(username, userModel.CurrentPassword);
|
||||
if (valid == null)
|
||||
{
|
||||
var errorModel = new ApiModel<string> { Error = true, ErrorMessage = "Incorrect username or password" };
|
||||
return ReturnReponse(errorModel);
|
||||
}
|
||||
var result = UserMapper.UpdatePassword(username, userModel.CurrentPassword, userModel.NewPassword);
|
||||
|
||||
if (!result)
|
||||
{
|
||||
var errorModel = new ApiModel<string> { Error = true, ErrorMessage = "Could not update the password. " };
|
||||
return ReturnReponse(errorModel);
|
||||
}
|
||||
|
||||
|
||||
var model = new ApiModel<string> { Data = "Successfully updated the password"};
|
||||
return ReturnReponse(model);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -86,6 +86,10 @@ namespace PlexRequests.UI.Modules
|
|||
|
||||
private Response CheckAuth()
|
||||
{
|
||||
if (Request.Path.Contains("api/apikey")) // We do not need the apikey for this call
|
||||
{
|
||||
return null;
|
||||
}
|
||||
var settings = Settings.GetSettings();
|
||||
var apiModel = new ApiModel<List<RequestedModel>> { Data = new List<RequestedModel>() };
|
||||
if (!Authenticated(settings))
|
||||
|
|
|
@ -41,8 +41,9 @@ namespace PlexRequests.UI.Modules
|
|||
{
|
||||
public class LoginModule : BaseModule
|
||||
{
|
||||
public LoginModule(ISettingsService<PlexRequestSettings> pr) : base(pr)
|
||||
public LoginModule(ISettingsService<PlexRequestSettings> pr, ICustomUserMapper m) : base(pr)
|
||||
{
|
||||
UserMapper = m;
|
||||
Get["/login"] = _ =>
|
||||
{
|
||||
{
|
||||
|
@ -110,6 +111,7 @@ namespace PlexRequests.UI.Modules
|
|||
Get["/changepassword"] = _ => ChangePassword();
|
||||
Post["/changepassword"] = _ => ChangePasswordPost();
|
||||
}
|
||||
private ICustomUserMapper UserMapper { get; }
|
||||
|
||||
private Negotiator ChangePassword()
|
||||
{
|
||||
|
|
|
@ -13,13 +13,15 @@ namespace PlexRequests.UI.Modules
|
|||
{
|
||||
public class UserManagementModule : BaseModule
|
||||
{
|
||||
public UserManagementModule(ISettingsService<PlexRequestSettings> pr) : base("usermanagement",pr)
|
||||
public UserManagementModule(ISettingsService<PlexRequestSettings> pr, ICustomUserMapper m) : base("usermanagement",pr)
|
||||
{
|
||||
this.RequiresClaims(UserClaims.Admin);
|
||||
Get["/"] = x => Load();
|
||||
|
||||
Get["/users"] = x => LoadUsers();
|
||||
UserMapper = m;
|
||||
}
|
||||
private ICustomUserMapper UserMapper { get; }
|
||||
|
||||
private Negotiator Load()
|
||||
{
|
||||
|
|
|
@ -164,6 +164,7 @@
|
|||
<Compile Include="Helpers\ValidationHelper.cs" />
|
||||
<Compile Include="Jobs\CustomJobFactory.cs" />
|
||||
<Compile Include="Jobs\Scheduler.cs" />
|
||||
<Compile Include="ModelDataProviders\UserUpdateViewModel.cs" />
|
||||
<Compile Include="ModelDataProviders\RequestedModelDataProvider.cs" />
|
||||
<Compile Include="Models\DatatablesModel.cs" />
|
||||
<Compile Include="Models\JsonUpdateAvailableModel.cs" />
|
||||
|
@ -172,6 +173,7 @@
|
|||
<Compile Include="Models\SearchViewModel.cs" />
|
||||
<Compile Include="Models\SearchMusicViewModel.cs" />
|
||||
<Compile Include="Models\SearchMovieViewModel.cs" />
|
||||
<Compile Include="Models\UserUpdateViewModel.cs" />
|
||||
<Compile Include="Modules\ApiDocsModule.cs" />
|
||||
<Compile Include="Modules\ApiMetadataModule.cs" />
|
||||
<Compile Include="Modules\BaseApiModule.cs" />
|
||||
|
@ -179,6 +181,7 @@
|
|||
<Compile Include="Modules\UpdateCheckerModule.cs" />
|
||||
<Compile Include="Start\StartupOptions.cs" />
|
||||
<Compile Include="Start\UpdateValue.cs" />
|
||||
<Compile Include="Validators\UserViewModelValidator.cs" />
|
||||
<Compile Include="Validators\HeadphonesValidator.cs" />
|
||||
<Compile Include="Validators\PushoverSettingsValidator.cs" />
|
||||
<Compile Include="Validators\PushbulletSettingsValidator.cs" />
|
||||
|
|
41
PlexRequests.UI/Validators/UserViewModelValidator.cs
Normal file
41
PlexRequests.UI/Validators/UserViewModelValidator.cs
Normal file
|
@ -0,0 +1,41 @@
|
|||
#region Copyright
|
||||
// /************************************************************************
|
||||
// Copyright (c) 2016 Jamie Rees
|
||||
// File: SonarrValidator.cs
|
||||
// Created By: Jamie Rees
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
// ************************************************************************/
|
||||
#endregion
|
||||
using FluentValidation;
|
||||
|
||||
using PlexRequests.UI.Models;
|
||||
|
||||
namespace PlexRequests.UI.Validators
|
||||
{
|
||||
public class UserViewModelValidator : AbstractValidator<UserUpdateViewModel>
|
||||
{
|
||||
public UserViewModelValidator()
|
||||
{
|
||||
RuleFor(request => request.CurrentPassword).NotEmpty().NotNull();
|
||||
RuleFor(request => request.NewPassword).NotEmpty().NotNull();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue