Commit 09ad9902 by Mac Stephens

Add client version to mismatch errors, server logs, and connected clients

parent ca97cf69
......@@ -26,5 +26,8 @@ object ApiServerModule: TApiServerModule
object XDataServer1JWT: TSparkleJwtMiddleware
OnGetSecret = XDataServer1JWTGetSecret
end
object XDataServer1Forward: TSparkleForwardMiddleware
OnAcceptProxy = XDataServer1ForwardAcceptProxy
end
end
end
......@@ -13,7 +13,7 @@ uses
Sparkle.HttpServer.Module, Sparkle.HttpServer.Context,
Sparkle.Comp.CompressMiddleware, Sparkle.Comp.CorsMiddleware,
Sparkle.Comp.GenericMiddleware, Aurelius.Drivers.UniDac, UniProvider,
Data.DB, DBAccess, Uni;
Data.DB, DBAccess, Uni, Sparkle.Comp.ForwardMiddleware;
type
TApiServerModule = class(TDataModule)
......@@ -23,9 +23,12 @@ type
XDataServer1CORS: TSparkleCorsMiddleware;
XDataServer1Compress: TSparkleCompressMiddleware;
XDataServer1JWT: TSparkleJwtMiddleware;
XDataServer1Forward: TSparkleForwardMiddleware;
procedure XDataServer1LoggingMiddlewareCreate(Sender: TObject;
var Middleware: IHttpServerMiddleware);
procedure XDataServer1JWTGetSecret(Sender: TObject; var Secret: string);
procedure XDataServer1ForwardAcceptProxy(Sender: TObject;
const Value: string; var Accept: Boolean);
private
{ Private declarations }
public
......@@ -89,6 +92,12 @@ begin
Middleware := TLoggingMiddleware.Create(Logger);
end;
procedure TApiServerModule.XDataServer1ForwardAcceptProxy(Sender: TObject;
const Value: string; var Accept: Boolean);
begin
Accept := True;
end;
procedure TApiServerModule.XDataServer1JWTGetSecret(Sender: TObject;
var Secret: string);
begin
......
......@@ -168,7 +168,8 @@ var
iniFile: TIniFile;
webClientVersion: string;
begin
Logger.Log(3, 'AuthService.VerifyVersion called');
Logger.Log(1, Format(
'Client version check started: client="%s"', [ClientVersion]));
Result := TJSONObject.Create;
TXDataOperationContext.Current.Handler.ManagedObjects.Add(Result);
......@@ -180,20 +181,26 @@ begin
if webClientVersion = '' then
begin
Logger.Log(2, 'AuthService.VerifyVersion: webClientVersion not configured');
Logger.Log(2, Format(
'Client version check failed: client="%s", required version is not configured',
[ClientVersion]));
Result.AddPair('error', 'webClientVersion is not configured.');
Exit;
end;
if clientVersion <> webClientVersion then
begin
Logger.Log(2, 'AuthService.VerifyVersion: client version mismatch');
Logger.Log(2, Format(
'Client version check failed: client="%s", required="%s"',
[ClientVersion, webClientVersion]));
Result.AddPair('error',
'Your browser is running an old version of the app.' + sLineBreak +
'Please click below to reload.');
end
else
Logger.Log(3, 'AuthService.VerifyVersion: version check passed');
Logger.Log(1, Format(
'Client version check succeeded: client="%s", required="%s"',
[ClientVersion, webClientVersion]));
finally
iniFile.Free;
end;
......
......@@ -68,6 +68,13 @@ object FMain: TFMain
end
item
Expanded = False
FieldName = 'ClientVersion'
Title.Caption = 'Version'
Width = 80
Visible = True
end
item
Expanded = False
FieldName = 'ConnectedAt'
Width = 150
Visible = True
......@@ -162,6 +169,11 @@ object FMain: TFMain
Size = 30
end
item
Name = 'ClientVersion'
DataType = ftString
Size = 20
end
item
Name = 'ConnectedAt'
DataType = ftDateTime
end>
......
......@@ -241,6 +241,7 @@ begin
tblConnectedClients.Append;
tblConnectedClients.FieldByName('ConnectionId').AsString := client.ConnectionId;
tblConnectedClients.FieldByName('UserId').AsString := client.UserId;
tblConnectedClients.FieldByName('ClientVersion').AsString := client.ClientVersion;
tblConnectedClients.FieldByName('ConnectedAt').AsDateTime := client.ConnectedAt;
tblConnectedClients.Post;
end;
......
......@@ -20,6 +20,7 @@ type
TConnectedClientSnapshot = record
ConnectionId: string;
UserId: string;
ClientVersion: string;
ConnectedAt: TDateTime;
end;
......@@ -27,6 +28,7 @@ type
private
FConnectionId: string;
FUserId: string;
FClientVersion: string;
FConnectedAt: TDateTime;
FLastSeenAt: TDateTime;
FHeartbeatSeen: Boolean;
......@@ -35,6 +37,7 @@ type
public
property ConnectionId: string read FConnectionId write FConnectionId;
property UserId: string read FUserId write FUserId;
property ClientVersion: string read FClientVersion write FClientVersion;
property ConnectedAt: TDateTime read FConnectedAt write FConnectedAt;
property LastSeenAt: TDateTime read FLastSeenAt write FLastSeenAt;
property HeartbeatSeen: Boolean read FHeartbeatSeen write FHeartbeatSeen;
......@@ -330,6 +333,7 @@ var
json: TJSONValue;
messageType: string;
userId: string;
clientVersion: string;
connectionId: string;
client: TConnectedClient;
response: TJSONObject;
......@@ -350,6 +354,10 @@ begin
(not json.TryGetValue<string>('userId', userId)) then
Exit;
clientVersion := '';
if SameText(messageType, 'identify') then
json.TryGetValue<string>('clientVersion', clientVersion);
client := TConnectedClient(TTMSFNCWebSocketServerConnection(AConnection).UserData);
if not Assigned(client) then
......@@ -364,7 +372,10 @@ begin
connectionId := client.ConnectionId;
if SameText(messageType, 'identify') then
client.UserId := userId
begin
client.UserId := userId;
client.ClientVersion := clientVersion;
end
else
client.HeartbeatSeen := True;
finally
......@@ -373,7 +384,9 @@ begin
if SameText(messageType, 'identify') then
begin
Logger.Log(1, 'WebSocket client identified: ' + connectionId + ' - ' + userId);
Logger.Log(1, Format(
'WebSocket client identified: %s - %s - version %s',
[connectionId, userId, clientVersion]));
NotifyClientsChanged;
end
else
......@@ -443,6 +456,7 @@ begin
begin
Result[i].ConnectionId := FClients[i].ConnectionId;
Result[i].UserId := FClients[i].UserId;
Result[i].ClientVersion := FClients[i].ClientVersion;
Result[i].ConnectedAt := FClients[i].ConnectedAt;
end;
finally
......
......@@ -110,7 +110,9 @@ begin
error := '';
if error <> '' then
TFViewErrorPage.Display(error)
TFViewErrorPage.Display(
error + sLineBreak + sLineBreak +
'Current client version: v' + clientVersion)
else
SuccessProc;
end,
......
......@@ -120,6 +120,9 @@ var
implementation
uses
ConnectionModule;
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
......@@ -619,6 +622,7 @@ begin
msg := TJSObject.new;
msg['message'] := 'identify';
msg['userId'] := userId;
msg['clientVersion'] := TDMConnection.clientVersion;
EMiMobileWebSocketClient.Send(TJSJSON.stringify(msg));
except
on E: Exception do
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment