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 public long? InstanceId { get; }
22
26 readonly Func<ValueTask<IEnumerable<IAuthorizationRequirement>>> getRequirements;
27
31 readonly Func<Security.IAuthorizationService, ValueTask<TResult>> getResponse;
32
37
43 public static RequirementsGated<TResult> FromResult(TResult result)
44 => new(
45 () => (IAuthorizationRequirement?)null,
46 () => ValueTask.FromResult(result));
47
54 Func<ValueTask<IAuthorizationRequirement?>> getRequirement,
55 Func<ValueTask<TResult>> getResponse)
56 {
57 ArgumentNullException.ThrowIfNull(getRequirement);
58 ArgumentNullException.ThrowIfNull(getResponse);
59 getRequirements = async () =>
60 {
61 var requirement = await getRequirement();
62 if (requirement == null)
63 return Enumerable.Empty<IAuthorizationRequirement>();
64
65 return new List<IAuthorizationRequirement>
66 {
67 requirement,
68 };
69 };
70 this.getResponse = _ => getResponse();
71 }
72
79 Func<IEnumerable<IAuthorizationRequirement>> getRequirements,
80 Func<ValueTask<TResult>> getResponse)
81 {
82 ArgumentNullException.ThrowIfNull(getRequirements);
83 ArgumentNullException.ThrowIfNull(getResponse);
84 this.getRequirements = () => ValueTask.FromResult(getRequirements());
85 this.getResponse = _ => getResponse();
86 }
87
96 Func<IAuthorizationRequirement?> getRequirement,
97 Func<ValueTask<TResult>> getResponse,
98 long? instanceId = null,
100 {
101 ArgumentNullException.ThrowIfNull(getRequirement);
102 ArgumentNullException.ThrowIfNull(getResponse);
103 getRequirements = () =>
104 {
105 var requirement = getRequirement();
106 if (requirement == null)
107 return ValueTask.FromResult(Enumerable.Empty<IAuthorizationRequirement>());
108
109 return ValueTask.FromResult<IEnumerable<IAuthorizationRequirement>>(
110 new List<IAuthorizationRequirement>
111 {
112 requirement,
113 });
114 };
115
116 this.getResponse = _ => getResponse();
117
118 this.doNotAddUserSessionValidRequirement = doNotAddUserSessionValidRequirement;
119 InstanceId = instanceId;
120 }
121
128 Func<IAuthorizationRequirement?> getRequirement,
129 Func<Security.IAuthorizationService, ValueTask<TResult>> getResponse)
130 {
131 ArgumentNullException.ThrowIfNull(getRequirement);
132 getRequirements = () =>
133 {
134 var requirement = getRequirement();
135 if (requirement == null)
136 return ValueTask.FromResult(Enumerable.Empty<IAuthorizationRequirement>());
137
138 return ValueTask.FromResult<IEnumerable<IAuthorizationRequirement>>(
139 new List<IAuthorizationRequirement>
140 {
141 requirement,
142 });
143 };
144
145 this.getResponse = getResponse ?? throw new ArgumentNullException(nameof(getResponse));
146 }
147
152 public async ValueTask<IEnumerable<IAuthorizationRequirement>> GetRequirements()
153 {
154 var requirements = await getRequirements();
156 requirements = UserSessionValidRequirement.InstanceAsEnumerable.Concat(requirements);
157
158 return requirements;
159 }
160
166 public ValueTask<TResult> Execute(Security.IAuthorizationService authorizationService)
167 => getResponse(authorizationService);
168 }
169}
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, long? instanceId=null, bool doNotAddUserSessionValidRequirement=false)
Initializes a new instance of the RequirementsGated<TResult> class.
long? InstanceId
Api.Models.EntityId.Id of the relevant instance.
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.