1
0
mirror of https://github.com/bitwarden/server.git synced 2025-06-26 21:58:48 -05:00

fix: update stored procedure

This commit is contained in:
Ike Kottlowski 2025-06-25 17:18:31 -04:00
parent 943b0024bb
commit 853551d9bd
No known key found for this signature in database
GPG Key ID: C86308E3DCA6D76F
3 changed files with 79 additions and 42 deletions

View File

@ -40,40 +40,35 @@ public class PendingAuthRequestDetails : AuthRequest
/** /**
* Constructor for dapper response. * Constructor for dapper response.
* Note: if the DeviceId is null it comes back as an empty guid That could change if the stored
* procedure runs on a different database provider.
* In order to maintain the flexibility of the wildcard (*) in SQL, the constructor accepts a"row number" rn of type long
* parameter. 'rn' was used to order the results in the SQL query. Also, SQL complains about the constructor not
* having the same parameters as the SELECT statement and since the SELECT uses the wildcard we need to include everything.
* Order matters when mapping from the Stored Procedure, so the columns are in the order they come back from the query.
*/ */
public PendingAuthRequestDetails( public PendingAuthRequestDetails(
Guid id, Guid id,
Guid userId, Guid userId,
Guid organizationId,
short type, short type,
string requestDeviceIdentifier, string requestDeviceIdentifier,
short requestDeviceType, short requestDeviceType,
string requestIpAddress, string requestIpAddress,
string requestCountryName,
Guid? responseDeviceId, Guid? responseDeviceId,
string accessCode, string accessCode,
string publicKey, string publicKey,
string key, string key,
string masterPasswordHash, string masterPasswordHash,
bool? approved,
DateTime creationDate, DateTime creationDate,
DateTime? responseDate, DateTime? responseDate,
DateTime? authenticationDate, DateTime? authenticationDate,
bool? approved, Guid deviceId)
Guid organizationId,
string requestCountryName,
Guid deviceId,
long rn) // see comment above about rn parameter
{ {
Id = id; Id = id;
UserId = userId; UserId = userId;
OrganizationId = organizationId;
Type = (AuthRequestType)type; Type = (AuthRequestType)type;
RequestDeviceIdentifier = requestDeviceIdentifier; RequestDeviceIdentifier = requestDeviceIdentifier;
RequestDeviceType = (DeviceType)requestDeviceType; RequestDeviceType = (DeviceType)requestDeviceType;
RequestIpAddress = requestIpAddress; RequestIpAddress = requestIpAddress;
RequestCountryName = requestCountryName;
ResponseDeviceId = responseDeviceId; ResponseDeviceId = responseDeviceId;
AccessCode = accessCode; AccessCode = accessCode;
PublicKey = publicKey; PublicKey = publicKey;
@ -83,8 +78,6 @@ public class PendingAuthRequestDetails : AuthRequest
CreationDate = creationDate; CreationDate = creationDate;
ResponseDate = responseDate; ResponseDate = responseDate;
AuthenticationDate = authenticationDate; AuthenticationDate = authenticationDate;
OrganizationId = organizationId;
RequestCountryName = requestCountryName;
RequestDeviceId = deviceId; RequestDeviceId = deviceId;
} }
} }

View File

@ -1,24 +1,46 @@
CREATE PROCEDURE [dbo].[AuthRequest_ReadPendingByUserId] CREATE PROCEDURE [dbo].[AuthRequest_ReadPendingByUserId]
@UserId UNIQUEIDENTIFIER, @UserId UNIQUEIDENTIFIER,
@ExpirationMinutes INT @ExpirationMinutes INT
AS AS
BEGIN BEGIN
SET NOCOUNT ON; SET NOCOUNT ON;
;WITH PendingRequests AS ( ;
SELECT WITH
AR.*, PendingRequests
D.Id AS DeviceId, AS
ROW_NUMBER() OVER (PARTITION BY AR.RequestDeviceIdentifier ORDER BY AR.CreationDate DESC) AS rn (
FROM dbo.AuthRequestView AR SELECT
LEFT JOIN AR.*,
Device D ON AR.RequestDeviceIdentifier = D.Identifier D.Id AS DeviceId,
WHERE AR.Type IN (0, 1) -- 0 = AuthenticateAndUnlock, 1 = Unlock ROW_NUMBER() OVER (PARTITION BY AR.RequestDeviceIdentifier ORDER BY AR.CreationDate DESC) AS rn
AND AR.CreationDate >= DATEADD(MINUTE, -@ExpirationMinutes, GETUTCDATE()) FROM dbo.AuthRequestView AR
AND AR.UserId = @UserId LEFT JOIN Device D ON AR.RequestDeviceIdentifier = D.Identifier
) AND D.UserId = AR.UserId
SELECT PR.* WHERE AR.Type IN (0, 1) -- 0 = AuthenticateAndUnlock, 1 = Unlock
AND AR.CreationDate >= DATEADD(MINUTE, -@ExpirationMinutes, GETUTCDATE())
AND AR.UserId = @UserId
)
SELECT
PR.Id,
PR.UserId,
PR.OrganizationId,
PR.Type,
PR.RequestDeviceIdentifier,
PR.RequestDeviceType,
PR.RequestIpAddress,
PR.RequestCountryName,
PR.ResponseDeviceId,
PR.AccessCode,
PR.PublicKey,
PR.[Key],
PR.MasterPasswordHash,
PR.Approved,
PR.CreationDate,
PR.ResponseDate,
PR.AuthenticationDate,
PR.DeviceId
FROM PendingRequests PR FROM PendingRequests PR
WHERE rn = 1 WHERE rn = 1
AND PR.Approved IS NULL; AND PR.Approved IS NULL;
END; END;

View File

@ -6,20 +6,42 @@ AS
BEGIN BEGIN
SET NOCOUNT ON; SET NOCOUNT ON;
;WITH PendingRequests AS ( ;
SELECT WITH
AR.*, PendingRequests
D.Id AS DeviceId, AS
ROW_NUMBER() OVER (PARTITION BY AR.RequestDeviceIdentifier ORDER BY AR.CreationDate DESC) AS rn (
FROM dbo.AuthRequestView AR SELECT
LEFT JOIN AR.*,
Device D ON AR.RequestDeviceIdentifier = D.Identifier D.Id AS DeviceId,
WHERE AR.Type IN (0, 1) -- 0 = AuthenticateAndUnlock, 1 = Unlock ROW_NUMBER() OVER (PARTITION BY AR.RequestDeviceIdentifier ORDER BY AR.CreationDate DESC) AS rn
AND AR.CreationDate >= DATEADD(MINUTE, -@ExpirationMinutes, GETUTCDATE()) FROM dbo.AuthRequestView AR
AND AR.UserId = @UserId LEFT JOIN Device D ON AR.RequestDeviceIdentifier = D.Identifier
) AND D.UserId = AR.UserId
SELECT PR.* WHERE AR.Type IN (0, 1) -- 0 = AuthenticateAndUnlock, 1 = Unlock
AND AR.CreationDate >= DATEADD(MINUTE, -@ExpirationMinutes, GETUTCDATE())
AND AR.UserId = @UserId
)
SELECT
PR.Id,
PR.UserId,
PR.OrganizationId,
PR.Type,
PR.RequestDeviceIdentifier,
PR.RequestDeviceType,
PR.RequestIpAddress,
PR.RequestCountryName,
PR.ResponseDeviceId,
PR.AccessCode,
PR.PublicKey,
PR.[Key],
PR.MasterPasswordHash,
PR.Approved,
PR.CreationDate,
PR.ResponseDate,
PR.AuthenticationDate,
PR.DeviceId
FROM PendingRequests PR FROM PendingRequests PR
WHERE rn = 1 WHERE rn = 1
AND PR.Approved IS NULL; AND PR.Approved IS NULL;
END; END;