tgstation-server 6.19.0
The /tg/station 13 server suite
Loading...
Searching...
No Matches
RequirementsGated{TResult}.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Threading.Tasks;
5
6using Microsoft.AspNetCore.Authorization;
7
9
11{
16 public sealed class RequirementsGated<TResult>
17 {
21 readonly Func<ValueTask<IEnumerable<IAuthorizationRequirement>>> getRequirements;
22
26 readonly Func<Security.IAuthorizationService, ValueTask<TResult>> getResponse;
27
32
38#pragma warning disable CA1000 // Do not declare static members on generic types
39 public static RequirementsGated<TResult> FromResult(TResult result)
40#pragma warning restore CA1000 // Do not declare static members on generic types
41 => new(
42 () => (IAuthorizationRequirement?)null,
43 () => ValueTask.FromResult(result));
44
51 Func<ValueTask<IAuthorizationRequirement?>> getRequirement,
52 Func<ValueTask<TResult>> getResponse)
53 {
54 ArgumentNullException.ThrowIfNull(getRequirement);
55 ArgumentNullException.ThrowIfNull(getResponse);
56 getRequirements = async () =>
57 {
58 var requirement = await getRequirement();
59 if (requirement == null)
60 return Enumerable.Empty<IAuthorizationRequirement>();
61
62 return new List<IAuthorizationRequirement>
63 {
64 requirement,
65 };
66 };
67 this.getResponse = _ => getResponse();
68 }
69
76 Func<IEnumerable<IAuthorizationRequirement>> getRequirements,
77 Func<ValueTask<TResult>> getResponse)
78 {
79 ArgumentNullException.ThrowIfNull(getRequirements);
80 ArgumentNullException.ThrowIfNull(getResponse);
81 this.getRequirements = () => ValueTask.FromResult(getRequirements());
82 this.getResponse = _ => getResponse();
83 }
84
92 Func<IAuthorizationRequirement?> getRequirement,
93 Func<ValueTask<TResult>> getResponse,
95 {
96 ArgumentNullException.ThrowIfNull(getRequirement);
97 ArgumentNullException.ThrowIfNull(getResponse);
98 getRequirements = () =>
99 {
100 var requirement = getRequirement();
101 if (requirement == null)
102 return ValueTask.FromResult(Enumerable.Empty<IAuthorizationRequirement>());
103
104 return ValueTask.FromResult<IEnumerable<IAuthorizationRequirement>>(
105 new List<IAuthorizationRequirement>
106 {
107 requirement,
108 });
109 };
110
111 this.getResponse = _ => getResponse();
112
113 this.doNotAddUserSessionValidRequirement = doNotAddUserSessionValidRequirement;
114 }
115
122 Func<IAuthorizationRequirement?> getRequirement,
123 Func<Security.IAuthorizationService, ValueTask<TResult>> getResponse)
124 {
125 ArgumentNullException.ThrowIfNull(getRequirement);
126 getRequirements = () =>
127 {
128 var requirement = getRequirement();
129 if (requirement == null)
130 return ValueTask.FromResult(Enumerable.Empty<IAuthorizationRequirement>());
131
132 return ValueTask.FromResult<IEnumerable<IAuthorizationRequirement>>(
133 new List<IAuthorizationRequirement>
134 {
135 requirement,
136 });
137 };
138
139 this.getResponse = getResponse ?? throw new ArgumentNullException(nameof(getResponse));
140 }
141
146 public async ValueTask<IEnumerable<IAuthorizationRequirement>> GetRequirements()
147 {
148 var requirements = await getRequirements();
150 requirements = UserSessionValidRequirement.InstanceAsEnumerable.Concat(requirements);
151
152 return requirements;
153 }
154
160 public ValueTask<TResult> Execute(Security.IAuthorizationService authorizationService)
161 => getResponse(authorizationService);
162 }
163}
Evaluates a set of IAuthorizationRequirements to be checked before executing a response.
readonly Func< Security.IAuthorizationService, ValueTask< TResult > > getResponse
The response generation function.
RequirementsGated(Func< IAuthorizationRequirement?> getRequirement, Func< Security.IAuthorizationService, ValueTask< TResult > > getResponse)
Initializes a new instance of the RequirementsGated<TResult> class.
RequirementsGated(Func< ValueTask< IAuthorizationRequirement?> > getRequirement, Func< ValueTask< TResult > > getResponse)
Initializes a new instance of the RequirementsGated<TResult> class.
static RequirementsGated< TResult > FromResult(TResult result)
Convert a given result into a RequirementsGated<TResult>.
readonly Func< ValueTask< IEnumerable< IAuthorizationRequirement > > > getRequirements
The IAuthorizationRequirement retrieval function. UserSessionValidRequirement is included automatical...
RequirementsGated(Func< IEnumerable< IAuthorizationRequirement > > getRequirements, Func< ValueTask< TResult > > getResponse)
Initializes a new instance of the RequirementsGated<TResult> class.
RequirementsGated(Func< IAuthorizationRequirement?> getRequirement, Func< ValueTask< TResult > > getResponse, bool doNotAddUserSessionValidRequirement=false)
Initializes a new instance of the RequirementsGated<TResult> class.
async ValueTask< IEnumerable< IAuthorizationRequirement > > GetRequirements()
Evaluates the IAuthorizationRequirements of the request.
ValueTask< TResult > Execute(Security.IAuthorizationService authorizationService)
Executes the request.
readonly bool doNotAddUserSessionValidRequirement
If the UserSessionValidRequirement should not be added.
IAuthorizationRequirement for testing if a user is enabled and their session is valid.
static IEnumerable< UserSessionValidRequirement > InstanceAsEnumerable
The singleton instance of this class.