Skip to content

Commit e6c9ce5

Browse files
authored
feat: Add the option for header authentication to create users (Ombi-app#4841)
* feat: allow SSO to create new users automatically * feat: apply default user settings to SSO users * feat: add warnings to header auth toggles
1 parent a59455e commit e6c9ce5

File tree

6 files changed

+49
-3
lines changed

6 files changed

+49
-3
lines changed

src/Ombi.Settings/Settings/Models/AuthenticationSettings.cs

+1
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ public class AuthenticationSettings : Settings
1515
public bool EnableOAuth { get; set; } // Plex OAuth
1616
public bool EnableHeaderAuth { get; set; } // Header SSO
1717
public string HeaderAuthVariable { get; set; } // Header SSO
18+
public bool HeaderAuthCreateUser { get; set; } // Header SSO
1819
}
1920
}

src/Ombi/ClientApp/src/app/interfaces/ISettings.ts

+1
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ export interface IAuthenticationSettings extends ISettings {
247247
enableOAuth: boolean;
248248
enableHeaderAuth: boolean;
249249
headerAuthVariable: string;
250+
headerAuthCreateUser: boolean;
250251
}
251252

252253
export interface ICustomPage extends ISettings {

src/Ombi/ClientApp/src/app/settings/authentication/authentication.component.html

+12
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
<div class="checkbox">
2424
<mat-slide-toggle id="enableHeaderAuth" name="enableHeaderAuth" formControlName="enableHeaderAuth">Enable Authentication with Header Variable</mat-slide-toggle>
2525
</div>
26+
<div class="alert warning-box">
27+
Enabling Header Authentication will allow anyone to bypass authentication unless you are using a properly configured reverse proxy. Use with caution!
28+
</div>
2629
</div>
2730

2831
<div class="form-group" *ngIf="form.controls.enableHeaderAuth.value">
@@ -32,6 +35,15 @@
3235
</div>
3336
</div>
3437

38+
<div class="form-group" *ngIf="form.controls.enableHeaderAuth.value">
39+
<div class="checkbox">
40+
<mat-slide-toggle id="headerAuthCreateUser" name="headerAuthCreateUser" formControlName="headerAuthCreateUser">SSO creates new users automatically</mat-slide-toggle>
41+
</div>
42+
<div class="alert warning-box" *ngIf="form.controls.headerAuthCreateUser.value">
43+
If the user in the Header Authentication variable does not exist, a new user will be created. You can configure the default permissions for new users in the <a target="_blank" href="/Settings/UserManagement">User Management settings</a>.
44+
</div>
45+
</div>
46+
3547

3648
<div class="form-group">
3749
<div>

src/Ombi/ClientApp/src/app/settings/authentication/authentication.component.scss

+8-1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,11 @@
1212
::ng-deep .dark .btn:hover {
1313
box-shadow: 0 5px 11px 0 rgba(255, 255, 255, 0.18), 0 4px 15px 0 rgba(255, 255, 255, 0.15);
1414
color: inherit;
15-
}
15+
}
16+
17+
.warning-box {
18+
margin: 16px 0;
19+
color: white;
20+
background-color: $ombi-background-accent;
21+
border-color: $warn;
22+
}

src/Ombi/ClientApp/src/app/settings/authentication/authentication.component.ts

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export class AuthenticationComponent implements OnInit {
2828
enableOAuth: [x.enableOAuth],
2929
enableHeaderAuth: [x.enableHeaderAuth],
3030
headerAuthVariable: [x.headerAuthVariable],
31+
headerAuthCreateUser: [x.headerAuthCreateUser],
3132
});
3233
this.form.controls.enableHeaderAuth.valueChanges.subscribe(x => {
3334
if (x) {

src/Ombi/Controllers/V1/TokenController.cs

+26-2
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,23 @@ public class Token
3636
public class TokenController : ControllerBase
3737
{
3838
public TokenController(OmbiUserManager um, ITokenRepository token,
39-
IPlexOAuthManager oAuthManager, ILogger<TokenController> logger, ISettingsService<AuthenticationSettings> auth)
39+
IPlexOAuthManager oAuthManager, ILogger<TokenController> logger, ISettingsService<AuthenticationSettings> auth,
40+
ISettingsService<UserManagementSettings> userManagement)
4041
{
4142
_userManager = um;
4243
_token = token;
4344
_plexOAuthManager = oAuthManager;
4445
_log = logger;
4546
_authSettings = auth;
47+
_userManagementSettings = userManagement;
4648
}
4749

4850
private readonly ITokenRepository _token;
4951
private readonly OmbiUserManager _userManager;
5052
private readonly IPlexOAuthManager _plexOAuthManager;
5153
private readonly ILogger<TokenController> _log;
5254
private readonly ISettingsService<AuthenticationSettings> _authSettings;
55+
private readonly ISettingsService<UserManagementSettings> _userManagementSettings;
5356

5457
/// <summary>
5558
/// Gets the token.
@@ -305,7 +308,28 @@ public async Task<IActionResult> HeaderAuth()
305308
var user = await _userManager.FindByNameAsync(username);
306309
if (user == null)
307310
{
308-
return new UnauthorizedResult();
311+
if (authSettings.HeaderAuthCreateUser)
312+
{
313+
var defaultSettings = await _userManagementSettings.GetSettingsAsync();
314+
user = new OmbiUser {
315+
UserName = username,
316+
UserType = UserType.LocalUser,
317+
StreamingCountry = defaultSettings.DefaultStreamingCountry ?? "US",
318+
MovieRequestLimit = defaultSettings.MovieRequestLimit,
319+
MovieRequestLimitType = defaultSettings.MovieRequestLimitType,
320+
EpisodeRequestLimit = defaultSettings.EpisodeRequestLimit,
321+
EpisodeRequestLimitType = defaultSettings.EpisodeRequestLimitType,
322+
MusicRequestLimit = defaultSettings.MusicRequestLimit,
323+
MusicRequestLimitType = defaultSettings.MusicRequestLimitType,
324+
};
325+
326+
await _userManager.CreateAsync(user);
327+
await _userManager.AddToRolesAsync(user, defaultSettings.DefaultRoles);
328+
}
329+
else
330+
{
331+
return new UnauthorizedResult();
332+
}
309333
}
310334

311335
return await CreateToken(true, user);

0 commit comments

Comments
 (0)