forked from tgstation/tgstation-server
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOAuthProviders.cs
102 lines (87 loc) · 3.59 KB
/
OAuthProviders.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Tgstation.Server.Api.Models;
using Tgstation.Server.Common.Http;
using Tgstation.Server.Host.Configuration;
using Tgstation.Server.Host.Utils.GitHub;
namespace Tgstation.Server.Host.Security.OAuth
{
/// <inheritdoc />
sealed class OAuthProviders : IOAuthProviders
{
/// <summary>
/// The <see cref="IReadOnlyCollection{T}"/> of <see cref="IOAuthValidator"/>s.
/// </summary>
readonly IReadOnlyCollection<IOAuthValidator> validators;
/// <summary>
/// Initializes a new instance of the <see cref="OAuthProviders"/> class.
/// </summary>
/// <param name="gitHubServiceFactory">The <see cref="IGitHubServiceFactory"/> to use.</param>
/// <param name="httpClientFactory">The <see cref="IAbstractHttpClientFactory"/> to use.</param>
/// <param name="loggerFactory">The <see cref="ILoggerFactory"/> to use.</param>
/// <param name="securityConfigurationOptions">The <see cref="IOptions{TOptions}"/> containing the <see cref="SecurityConfiguration"/> to use.</param>
public OAuthProviders(
IGitHubServiceFactory gitHubServiceFactory,
IAbstractHttpClientFactory httpClientFactory,
ILoggerFactory loggerFactory,
IOptions<SecurityConfiguration> securityConfigurationOptions)
{
ArgumentNullException.ThrowIfNull(loggerFactory);
var securityConfiguration = securityConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(securityConfigurationOptions));
var validatorsBuilder = new List<IOAuthValidator>();
validators = validatorsBuilder;
if (securityConfiguration.OAuth == null)
return;
if (securityConfiguration.OAuth.TryGetValue(OAuthProvider.GitHub, out var gitHubConfig))
validatorsBuilder.Add(
new GitHubOAuthValidator(
gitHubServiceFactory,
loggerFactory.CreateLogger<GitHubOAuthValidator>(),
gitHubConfig));
if (securityConfiguration.OAuth.TryGetValue(OAuthProvider.Discord, out var discordConfig))
validatorsBuilder.Add(
new DiscordOAuthValidator(
httpClientFactory,
loggerFactory.CreateLogger<DiscordOAuthValidator>(),
discordConfig));
if (securityConfiguration.OAuth.TryGetValue(OAuthProvider.TGForums, out var tgConfig))
validatorsBuilder.Add(
new TGForumsOAuthValidator(
httpClientFactory,
loggerFactory.CreateLogger<TGForumsOAuthValidator>(),
tgConfig));
if (securityConfiguration.OAuth.TryGetValue(OAuthProvider.Keycloak, out var keyCloakConfig))
validatorsBuilder.Add(
new KeycloakOAuthValidator(
httpClientFactory,
loggerFactory.CreateLogger<KeycloakOAuthValidator>(),
keyCloakConfig));
if (securityConfiguration.OAuth.TryGetValue(OAuthProvider.InvisionCommunity, out var invisionConfig))
validatorsBuilder.Add(
new InvisionCommunityOAuthValidator(
httpClientFactory,
loggerFactory.CreateLogger<InvisionCommunityOAuthValidator>(),
invisionConfig));
}
/// <inheritdoc />
public IOAuthValidator? GetValidator(OAuthProvider oAuthProvider, bool forLogin)
=> validators.FirstOrDefault(
x => x.Provider == oAuthProvider
&& ((forLogin && x.GatewayStatus != OAuthGatewayStatus.Only) || (!forLogin && x.GatewayStatus != OAuthGatewayStatus.Disabled)));
/// <inheritdoc />
public Dictionary<OAuthProvider, OAuthProviderInfo> ProviderInfos()
{
var providersAndTasks = validators.ToDictionary(
x => x.Provider,
x => x.GetProviderInfo());
return providersAndTasks
.Where(x => x.Value != null)
.ToDictionary(
x => x.Key,
x => x.Value);
}
}
}