diff --git a/global.json b/global.json deleted file mode 100644 index 56fc9d4cc..000000000 --- a/global.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "sdk": { - "version": "2.0.0" - } -} \ No newline at end of file diff --git a/src/Ombi.Core/Models/UI/UserViewModel.cs b/src/Ombi.Core/Models/UI/UserViewModel.cs index 6bb36d548..705332e4a 100644 --- a/src/Ombi.Core/Models/UI/UserViewModel.cs +++ b/src/Ombi.Core/Models/UI/UserViewModel.cs @@ -10,6 +10,7 @@ namespace Ombi.Core.Models.UI public List Claims { get; set; } public string EmailAddress { get; set; } public string Password { get; set; } + public bool IsSetup { get; set; } public UserType UserType { get; set; } } diff --git a/src/Ombi.DependencyInjection/IocExtensions.cs b/src/Ombi.DependencyInjection/IocExtensions.cs index 1a99c83d7..ee7e4c444 100644 --- a/src/Ombi.DependencyInjection/IocExtensions.cs +++ b/src/Ombi.DependencyInjection/IocExtensions.cs @@ -135,6 +135,7 @@ namespace Ombi.DependencyInjection services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); } } } diff --git a/src/Ombi.Schedule/JobSetup.cs b/src/Ombi.Schedule/JobSetup.cs index 14806e312..904f59c0e 100644 --- a/src/Ombi.Schedule/JobSetup.cs +++ b/src/Ombi.Schedule/JobSetup.cs @@ -1,6 +1,7 @@ using Hangfire; using Ombi.Schedule.Jobs; using Ombi.Schedule.Jobs.Emby; +using Ombi.Schedule.Jobs.Plex; using Ombi.Schedule.Jobs.Radarr; using Ombi.Schedule.Ombi; @@ -9,17 +10,19 @@ namespace Ombi.Schedule public class JobSetup : IJobSetup { public JobSetup(IPlexContentCacher plexContentCacher, IRadarrCacher radarrCacher, - IOmbiAutomaticUpdater updater, IEmbyContentCacher embyCacher) + IOmbiAutomaticUpdater updater, IEmbyContentCacher embyCacher, IPlexUserImporter userImporter) { PlexContentCacher = plexContentCacher; RadarrCacher = radarrCacher; Updater = updater; EmbyContentCacher = embyCacher; + PlexUserImporter = userImporter; } private IPlexContentCacher PlexContentCacher { get; } private IRadarrCacher RadarrCacher { get; } private IOmbiAutomaticUpdater Updater { get; } + private IPlexUserImporter PlexUserImporter { get; } private IEmbyContentCacher EmbyContentCacher { get; } public void Setup() @@ -27,9 +30,10 @@ namespace Ombi.Schedule RecurringJob.AddOrUpdate(() => PlexContentCacher.CacheContent(), Cron.Hourly); RecurringJob.AddOrUpdate(() => EmbyContentCacher.Start(), Cron.Hourly); RecurringJob.AddOrUpdate(() => RadarrCacher.CacheContent(), Cron.Hourly); - //RecurringJob.AddOrUpdate(() => Updater.Update(), Cron.Daily); + RecurringJob.AddOrUpdate(() => PlexUserImporter.Start(), Cron.Daily); + RecurringJob.AddOrUpdate(() => Updater.Update(), Cron.Daily); - BackgroundJob.Enqueue(() => Updater.Update()); + //BackgroundJob.Enqueue(() => PlexUserImporter.Start()); } } } diff --git a/src/Ombi.Schedule/Jobs/Plex/IPlexUserImporter.cs b/src/Ombi.Schedule/Jobs/Plex/IPlexUserImporter.cs new file mode 100644 index 000000000..b3ec7ad10 --- /dev/null +++ b/src/Ombi.Schedule/Jobs/Plex/IPlexUserImporter.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Ombi.Schedule.Jobs.Plex +{ + public interface IPlexUserImporter + { + Task Start(); + } +} \ No newline at end of file diff --git a/src/Ombi.Schedule/Jobs/Plex/PlexUserImporter.cs b/src/Ombi.Schedule/Jobs/Plex/PlexUserImporter.cs index 0dfaf58a1..f7eb32ded 100644 --- a/src/Ombi.Schedule/Jobs/Plex/PlexUserImporter.cs +++ b/src/Ombi.Schedule/Jobs/Plex/PlexUserImporter.cs @@ -7,29 +7,37 @@ using Ombi.Api.Plex; using Ombi.Core.Settings; using Ombi.Core.Settings.Models.External; using Ombi.Helpers; +using Ombi.Settings.Settings.Models; using Ombi.Store.Entities; namespace Ombi.Schedule.Jobs.Plex { - public class PlexUserImporter + public class PlexUserImporter : IPlexUserImporter { public PlexUserImporter(IPlexApi api, UserManager um, ILogger log, - ISettingsService plexSettings) + ISettingsService plexSettings, ISettingsService ums) { _api = api; _userManager = um; _log = log; _plexSettings = plexSettings; + _userManagementSettings = ums; } private readonly IPlexApi _api; private readonly UserManager _userManager; private readonly ILogger _log; private readonly ISettingsService _plexSettings; + private readonly ISettingsService _userManagementSettings; public async Task Start() { + var userManagementSettings = await _userManagementSettings.GetSettingsAsync(); + if (!userManagementSettings.ImportMediaServerUsers) + { + return; + } var settings = await _plexSettings.GetSettingsAsync(); if (!settings.Enable) { @@ -72,7 +80,13 @@ namespace Ombi.Schedule.Jobs.Plex continue; } // TODO Set default permissions/roles - + if (userManagementSettings.DefaultRoles.Any()) + { + foreach (var defaultRole in userManagementSettings.DefaultRoles) + { + await _userManager.AddToRoleAsync(newUser, defaultRole); + } + } } else { diff --git a/src/Ombi.Settings/Settings/Models/UserManagementSettings.cs b/src/Ombi.Settings/Settings/Models/UserManagementSettings.cs new file mode 100644 index 000000000..1428801c2 --- /dev/null +++ b/src/Ombi.Settings/Settings/Models/UserManagementSettings.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace Ombi.Settings.Settings.Models +{ + public class UserManagementSettings : Settings + { + public bool ImportMediaServerUsers { get; set; } + public List DefaultRoles { get; set; } + } +} \ No newline at end of file diff --git a/src/Ombi/ClientApp/app/app.module.ts b/src/Ombi/ClientApp/app/app.module.ts index 898d2eb0a..ddd873731 100644 --- a/src/Ombi/ClientApp/app/app.module.ts +++ b/src/Ombi/ClientApp/app/app.module.ts @@ -7,9 +7,8 @@ import { RouterModule, Routes } from '@angular/router'; import { HttpModule } from '@angular/http'; // Third Party -import { ButtonModule, DialogModule, CaptchaModule } from 'primeng/primeng'; +import { ButtonModule, DialogModule, CaptchaModule,DataTableModule, SharedModule } from 'primeng/primeng'; import { GrowlModule } from 'primeng/components/growl/growl'; -import { DataTableModule, SharedModule } from 'primeng/primeng'; //import { DragulaModule, DragulaService } from 'ng2-dragula/ng2-dragula'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; @@ -41,6 +40,7 @@ import { WizardModule } from './wizard/wizard.module'; import { SearchModule } from './search/search.module'; import { UserManagementModule } from './usermanagement/usermanagement.module'; import { RequestsModule } from './requests/requests.module'; +//import { PipeModule } from './pipes/pipe.module'; const routes: Routes = [ { path: '*', component: PageNotFoundComponent }, @@ -79,7 +79,7 @@ const routes: Routes = [ ReactiveFormsModule, UserManagementModule, RequestsModule, - CaptchaModule + CaptchaModule, ], declarations: [ AppComponent, @@ -87,7 +87,7 @@ const routes: Routes = [ LoginComponent, LandingPageComponent, ResetPasswordComponent, - TokenResetPasswordComponent + TokenResetPasswordComponent, ], providers: [ RequestService, diff --git a/src/Ombi/ClientApp/app/auth/IUserLogin.ts b/src/Ombi/ClientApp/app/auth/IUserLogin.ts index 3c4cae860..86296bc66 100644 --- a/src/Ombi/ClientApp/app/auth/IUserLogin.ts +++ b/src/Ombi/ClientApp/app/auth/IUserLogin.ts @@ -1,6 +1,7 @@ export interface IUserLogin { username: string, - password:string + password: string, + rememberMe:boolean, } export interface ILocalUser { diff --git a/src/Ombi/ClientApp/app/interfaces/IRequestEngineResult.ts b/src/Ombi/ClientApp/app/interfaces/IRequestEngineResult.ts index b29f3509d..0ed7e7b6d 100644 --- a/src/Ombi/ClientApp/app/interfaces/IRequestEngineResult.ts +++ b/src/Ombi/ClientApp/app/interfaces/IRequestEngineResult.ts @@ -1,4 +1,5 @@ export interface IRequestEngineResult { requestAdded: boolean, - message: string + message: string, + errorMessage: string, } \ No newline at end of file diff --git a/src/Ombi/ClientApp/app/interfaces/IUser.ts b/src/Ombi/ClientApp/app/interfaces/IUser.ts index b2f318600..dcb9898d0 100644 --- a/src/Ombi/ClientApp/app/interfaces/IUser.ts +++ b/src/Ombi/ClientApp/app/interfaces/IUser.ts @@ -6,8 +6,7 @@ emailAddress: string, password: string, userType: UserType, - - + isSetup:boolean, // FOR UI checked: boolean, } diff --git a/src/Ombi/ClientApp/app/login/login.component.html b/src/Ombi/ClientApp/app/login/login.component.html index 38500883d..1e621e1aa 100644 --- a/src/Ombi/ClientApp/app/login/login.component.html +++ b/src/Ombi/ClientApp/app/login/login.component.html @@ -19,7 +19,10 @@ include the remember me checkbox
- Remember Me + + + +
diff --git a/src/Ombi/ClientApp/app/login/login.component.ts b/src/Ombi/ClientApp/app/login/login.component.ts index cae2e18b7..dca609978 100644 --- a/src/Ombi/ClientApp/app/login/login.component.ts +++ b/src/Ombi/ClientApp/app/login/login.component.ts @@ -47,7 +47,6 @@ export class LoginComponent implements OnInit { ngOnInit(): void { this.settingsService.getLandingPage().subscribe(x => { - debugger; if (x.enabled && !this.landingFlag) { this.router.navigate(['landingpage']); } @@ -62,10 +61,10 @@ export class LoginComponent implements OnInit { onSubmit(form: FormGroup): void { if (form.invalid) { this.notify.error("Validation", "Please check your entered values"); - return + return; } var value = form.value; - this.authService.login({ password: value.password, username: value.username }) + this.authService.login({ password: value.password, username: value.username, rememberMe:value.rememberMe }) .subscribe(x => { localStorage.setItem("id_token", x.access_token); diff --git a/src/Ombi/ClientApp/app/pipes/pipe.module.ts b/src/Ombi/ClientApp/app/pipes/pipe.module.ts new file mode 100644 index 000000000..291d1e8e5 --- /dev/null +++ b/src/Ombi/ClientApp/app/pipes/pipe.module.ts @@ -0,0 +1,17 @@ +import { NgModule, ModuleWithProviders } from '@angular/core'; +import { HumanizePipe } from './HumanizePipe'; + +@NgModule({ + imports: [], + declarations: [HumanizePipe], + exports: [HumanizePipe], +}) +export class PipeModule { + + static forRoot() : ModuleWithProviders { + return { + ngModule: PipeModule, + providers: [], + }; + } +} \ No newline at end of file diff --git a/src/Ombi/ClientApp/app/requests/movierequests.component.ts b/src/Ombi/ClientApp/app/requests/movierequests.component.ts index 9032bafda..d83767233 100644 --- a/src/Ombi/ClientApp/app/requests/movierequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/movierequests.component.ts @@ -11,7 +11,7 @@ import 'rxjs/add/operator/distinctUntilChanged'; import 'rxjs/add/operator/map'; import { RequestService } from '../services/request.service'; -import { IdentityService } from '../services/identity.service'; +import { AuthService } from '../auth/auth.service'; import { IMovieRequests } from '../interfaces/IRequestModel'; @@ -20,7 +20,8 @@ import { IMovieRequests } from '../interfaces/IRequestModel'; templateUrl: './movierequests.component.html' }) export class MovieRequestsComponent implements OnInit, OnDestroy { - constructor(private requestService: RequestService, private identityService: IdentityService) { + constructor(private requestService: RequestService, + private auth:AuthService) { this.searchChanged .debounceTime(600) // Wait Xms afterthe last event before emitting last event .distinctUntilChanged() // only emit if value is different from previous value @@ -54,6 +55,7 @@ export class MovieRequestsComponent implements OnInit, OnDestroy { this.amountToLoad = 5; this.currentlyLoaded = 5; this.loadInit(); + this.isAdmin = this.auth.hasRole("admin"); } @@ -109,7 +111,6 @@ export class MovieRequestsComponent implements OnInit, OnDestroy { this.requestService.getMovieRequests(this.amountToLoad, 0) .takeUntil(this.subscriptions) .subscribe(x => this.movieRequests = x); - this.isAdmin = this.identityService.hasRole("Admin"); } private resetSearch() { diff --git a/src/Ombi/ClientApp/app/requests/tvrequest-children.component.html b/src/Ombi/ClientApp/app/requests/tvrequest-children.component.html index fc6b4ad43..38db185f3 100644 --- a/src/Ombi/ClientApp/app/requests/tvrequest-children.component.html +++ b/src/Ombi/ClientApp/app/requests/tvrequest-children.component.html @@ -8,8 +8,7 @@ -
- +
@@ -69,14 +68,7 @@ Available Processing Request
-
- - Pending Approval - - - - Not Yet Requested - +
Pending Approval
diff --git a/src/Ombi/ClientApp/app/requests/tvrequest-children.component.ts b/src/Ombi/ClientApp/app/requests/tvrequest-children.component.ts index d3f83eaa6..067ac56c1 100644 --- a/src/Ombi/ClientApp/app/requests/tvrequest-children.component.ts +++ b/src/Ombi/ClientApp/app/requests/tvrequest-children.component.ts @@ -7,7 +7,7 @@ import { IChildRequests, IEpisodesRequests } from '../interfaces/IRequestModel'; templateUrl: './tvrequest-children.component.html' }) export class TvRequestChildrenComponent { - constructor(private requestService: RequestService) { + constructor(private requestService: RequestService ) { } @Input() childRequests: IChildRequests[]; diff --git a/src/Ombi/ClientApp/app/requests/tvrequests.component.ts b/src/Ombi/ClientApp/app/requests/tvrequests.component.ts index e30248c24..4e5cba295 100644 --- a/src/Ombi/ClientApp/app/requests/tvrequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/tvrequests.component.ts @@ -10,7 +10,7 @@ import 'rxjs/add/operator/distinctUntilChanged'; import 'rxjs/add/operator/map'; import { RequestService } from '../services/request.service'; -import { IdentityService } from '../services/identity.service'; +import { AuthService } from '../auth/auth.service'; import { ITvRequests, IChildRequests, INewSeasonRequests, IEpisodesRequests } from '../interfaces/IRequestModel'; import { TreeNode, } from "primeng/primeng"; @@ -25,7 +25,8 @@ import { TreeNode, } from "primeng/primeng"; encapsulation: ViewEncapsulation.None }) export class TvRequestsComponent implements OnInit, OnDestroy { - constructor(private requestService: RequestService, private identityService: IdentityService) { + constructor(private requestService: RequestService, + private auth:AuthService) { this.searchChanged .debounceTime(600) // Wait Xms afterthe last event before emitting last event .distinctUntilChanged() // only emit if value is different from previous value @@ -111,6 +112,7 @@ export class TvRequestsComponent implements OnInit, OnDestroy { this.currentlyLoaded = 5; this.tvRequests = []; this.loadInit(); + this.isAdmin = this.auth.hasRole("admin"); } public loadMore() { @@ -208,7 +210,6 @@ export class TvRequestsComponent implements OnInit, OnDestroy { .subscribe(x => { this.tvRequests = this.transformData(x); }); - this.isAdmin = this.identityService.hasRole("Admin"); } private resetSearch() { diff --git a/src/Ombi/ClientApp/app/search/moviesearch.component.ts b/src/Ombi/ClientApp/app/search/moviesearch.component.ts index e9559ad0a..b3eb40e91 100644 --- a/src/Ombi/ClientApp/app/search/moviesearch.component.ts +++ b/src/Ombi/ClientApp/app/search/moviesearch.component.ts @@ -56,7 +56,8 @@ export class MovieSearchComponent implements OnInit, OnDestroy { this.movieResults = []; this.result = { message: "", - requestAdded: false + requestAdded: false, + errorMessage: "" } } @@ -79,7 +80,9 @@ export class MovieSearchComponent implements OnInit, OnDestroy { this.notificationService.success("Request Added", `Request for ${searchResult.title} has been added successfully`); } else { - this.notificationService.warning("Request Added", this.result.message); + this.notificationService.warning("Request Added", this.result.message ? this.result.message : this.result.errorMessage); + searchResult.requested = false; + searchResult.approved = false; } }); } diff --git a/src/Ombi/ClientApp/app/settings/ombi/ombi.component.html b/src/Ombi/ClientApp/app/settings/ombi/ombi.component.html index 8c9fd0fb1..f3a8d5053 100644 --- a/src/Ombi/ClientApp/app/settings/ombi/ombi.component.html +++ b/src/Ombi/ClientApp/app/settings/ombi/ombi.component.html @@ -32,14 +32,14 @@
- +
-
+
-
+
diff --git a/src/Ombi/ClientApp/app/settings/ombi/ombi.component.ts b/src/Ombi/ClientApp/app/settings/ombi/ombi.component.ts index 17636d044..ebf2d59a2 100644 --- a/src/Ombi/ClientApp/app/settings/ombi/ombi.component.ts +++ b/src/Ombi/ClientApp/app/settings/ombi/ombi.component.ts @@ -20,7 +20,7 @@ export class OmbiComponent implements OnInit { this.form = this.fb.group({ port: [x.port], collectAnalyticData: [x.collectAnalyticData], - apiKey: [{ value: x.apiKey, disabled: true }], + apiKey: [x.apiKey], externalUrl: [x.externalUrl], allowExternalUsersToAuthenticate: [x.allowExternalUsersToAuthenticate] }); @@ -49,4 +49,8 @@ export class OmbiComponent implements OnInit { } }); } + + successfullyCopied() { + this.notificationService.success("Copied", "Copied the Api Key to the clipboard!"); + } } \ No newline at end of file diff --git a/src/Ombi/ClientApp/app/settings/settings.module.ts b/src/Ombi/ClientApp/app/settings/settings.module.ts index d03822c9b..ba751c052 100644 --- a/src/Ombi/ClientApp/app/settings/settings.module.ts +++ b/src/Ombi/ClientApp/app/settings/settings.module.ts @@ -3,6 +3,7 @@ import { CommonModule } from '@angular/common'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { RouterModule, Routes } from '@angular/router'; import { NgbModule, NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; +import { ClipboardModule } from 'ngx-clipboard/dist'; import { AuthService } from '../auth/auth.service'; import { AuthGuard } from '../auth/auth.guard'; @@ -27,9 +28,9 @@ import { PushoverComponent } from './notifications/pushover.component'; import { PushbulletComponent } from './notifications/pushbullet.component'; import { MattermostComponent } from './notifications/mattermost.component'; import { NotificationTemplate } from './notifications/notificationtemplate.component'; +import { PipeModule } from '../pipes/pipe.module'; import { SettingsMenuComponent } from './settingsmenu.component'; -import { HumanizePipe } from '../pipes/HumanizePipe'; import { MenuModule, InputSwitchModule, InputTextModule, TooltipModule, AutoCompleteModule, CalendarModule } from 'primeng/primeng'; @@ -65,6 +66,8 @@ const routes: Routes = [ NgbAccordionModule, AutoCompleteModule, CalendarModule, + ClipboardModule, + PipeModule, ], declarations: [ SettingsMenuComponent, @@ -78,7 +81,6 @@ const routes: Routes = [ SlackComponent, RadarrComponent, EmailNotificationComponent, - HumanizePipe, NotificationTemplate, PushoverComponent, MattermostComponent, diff --git a/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.html b/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.html index 2f47365d4..bc23a6141 100644 --- a/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.html +++ b/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.html @@ -2,52 +2,65 @@

Create User

- -