Skip to content

Commit 61aa782

Browse files
committed
Register stats on app initiated user logout
Signed-off-by: keliramu <[email protected]>
1 parent ad82bc3 commit 61aa782

File tree

7 files changed

+164
-49
lines changed

7 files changed

+164
-49
lines changed

auth/auth.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ type RenewingChecker struct {
6969
creds core.CredentialsAPI
7070
expChecker expirationChecker
7171
mfaPub events.Publisher[bool]
72+
logoutPub events.Publisher[events.DataAuthorization]
7273
errPub events.Publisher[error]
7374
mu sync.Mutex
7475
accountUpdateEvents *daemonevents.AccountUpdateEvents
@@ -78,6 +79,7 @@ type RenewingChecker struct {
7879
func NewRenewingChecker(cm config.Manager,
7980
creds core.CredentialsAPI,
8081
mfaPub events.Publisher[bool],
82+
logoutPub events.Publisher[events.DataAuthorization],
8183
errPub events.Publisher[error],
8284
accountUpdateEvents *daemonevents.AccountUpdateEvents,
8385
) *RenewingChecker {
@@ -86,6 +88,7 @@ func NewRenewingChecker(cm config.Manager,
8688
creds: creds,
8789
expChecker: systemTimeExpirationChecker{},
8890
mfaPub: mfaPub,
91+
logoutPub: logoutPub,
8992
errPub: errPub,
9093
accountUpdateEvents: accountUpdateEvents,
9194
}
@@ -204,7 +207,7 @@ func (r *RenewingChecker) renew(uid int64, data config.TokenData) error {
204207
if errors.Is(err, core.ErrUnauthorized) ||
205208
errors.Is(err, core.ErrNotFound) ||
206209
errors.Is(err, core.ErrBadRequest) {
207-
return r.cm.SaveWith(Logout(uid))
210+
return r.cm.SaveWith(Logout(uid, r.logoutPub))
208211
}
209212
return nil
210213
}
@@ -213,7 +216,7 @@ func (r *RenewingChecker) renew(uid int64, data config.TokenData) error {
213216
if errors.Is(err, core.ErrUnauthorized) ||
214217
errors.Is(err, core.ErrNotFound) ||
215218
errors.Is(err, core.ErrBadRequest) {
216-
return r.cm.SaveWith(Logout(uid))
219+
return r.cm.SaveWith(Logout(uid, r.logoutPub))
217220
}
218221
return nil
219222
}
@@ -222,7 +225,7 @@ func (r *RenewingChecker) renew(uid int64, data config.TokenData) error {
222225
if errors.Is(err, core.ErrUnauthorized) ||
223226
errors.Is(err, core.ErrNotFound) ||
224227
errors.Is(err, core.ErrBadRequest) {
225-
return r.cm.SaveWith(Logout(uid))
228+
return r.cm.SaveWith(Logout(uid, r.logoutPub))
226229
}
227230
}
228231
}
@@ -240,7 +243,7 @@ func (r *RenewingChecker) renew(uid int64, data config.TokenData) error {
240243
if errors.Is(err, core.ErrUnauthorized) ||
241244
errors.Is(err, core.ErrNotFound) ||
242245
errors.Is(err, core.ErrBadRequest) {
243-
return r.cm.SaveWith(Logout(uid))
246+
return r.cm.SaveWith(Logout(uid, r.logoutPub))
244247
}
245248
}
246249

@@ -401,8 +404,13 @@ func saveIdempotencyKey(userID int64, data config.TokenData) config.SaveFunc {
401404
}
402405

403406
// Logout the user.
404-
func Logout(user int64) config.SaveFunc {
407+
func Logout(user int64, logoutPub events.Publisher[events.DataAuthorization]) config.SaveFunc {
405408
return func(c config.Config) config.Config {
409+
if logoutPub != nil {
410+
// register stats instant logout with status success
411+
logoutPub.Publish(events.DataAuthorization{
412+
DurationMs: 0, EventTrigger: events.TriggerApp, EventStatus: events.StatusSuccess})
413+
}
406414
delete(c.TokensData, user)
407415
return c
408416
}

auth/auth_test.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@ func (p *mockBoolPublisher) Publish(b bool) {
110110
p.enabled = b
111111
}
112112

113+
type mockAuthPublisher struct {
114+
}
115+
116+
func (p *mockAuthPublisher) Publish(events.DataAuthorization) {
117+
}
118+
113119
type mockErrPublisher struct {
114120
err error
115121
}
@@ -128,6 +134,7 @@ func TestIsMFAEnabled(t *testing.T) {
128134
cm config.Manager
129135
api core.CredentialsAPI
130136
mfaPub events.Publisher[bool]
137+
loutPub events.Publisher[events.DataAuthorization]
131138
errPub events.Publisher[error]
132139
isEnabled bool
133140
err error
@@ -137,6 +144,7 @@ func TestIsMFAEnabled(t *testing.T) {
137144
cm: &authConfigManager{},
138145
api: &authAPI{mfaResp: core.MultifactorAuthStatusResponse{Status: internal.MFAEnabledStatusName}},
139146
mfaPub: &mockBoolPublisher{},
147+
loutPub: &mockAuthPublisher{},
140148
errPub: &mockErrPublisher{},
141149
isEnabled: true,
142150
err: nil,
@@ -146,6 +154,7 @@ func TestIsMFAEnabled(t *testing.T) {
146154
cm: &authConfigManager{},
147155
api: &authAPI{mfaResp: core.MultifactorAuthStatusResponse{Status: "not enabled"}},
148156
mfaPub: &mockBoolPublisher{},
157+
loutPub: &mockAuthPublisher{},
149158
errPub: &mockErrPublisher{},
150159
isEnabled: false,
151160
err: nil,
@@ -155,6 +164,7 @@ func TestIsMFAEnabled(t *testing.T) {
155164
cm: &authConfigManager{loadErr: configError},
156165
api: &authAPI{mfaResp: core.MultifactorAuthStatusResponse{Status: "not enabled"}},
157166
mfaPub: &mockBoolPublisher{},
167+
loutPub: &mockAuthPublisher{},
158168
errPub: &mockErrPublisher{},
159169
isEnabled: false,
160170
err: configError,
@@ -164,6 +174,7 @@ func TestIsMFAEnabled(t *testing.T) {
164174
cm: &authConfigManager{},
165175
api: &authAPI{mfaResp: core.MultifactorAuthStatusResponse{Status: "not enabled"}, err: apiError},
166176
mfaPub: &mockBoolPublisher{},
177+
loutPub: &mockAuthPublisher{},
167178
errPub: &mockErrPublisher{},
168179
isEnabled: false,
169180
err: apiError,
@@ -172,7 +183,7 @@ func TestIsMFAEnabled(t *testing.T) {
172183

173184
for _, test := range tests {
174185
t.Run(test.name, func(t *testing.T) {
175-
rc := NewRenewingChecker(test.cm, test.api, test.mfaPub, test.errPub, daemonevents.NewAccountUpdateEvents())
186+
rc := NewRenewingChecker(test.cm, test.api, test.mfaPub, test.loutPub, test.errPub, daemonevents.NewAccountUpdateEvents())
176187
enabled, err := rc.isMFAEnabled()
177188
assert.Equal(t, test.isEnabled, enabled)
178189

@@ -252,6 +263,7 @@ func TestIsVPNExpired(t *testing.T) {
252263
test.cm,
253264
test.api,
254265
&mockBoolPublisher{},
266+
&mockAuthPublisher{},
255267
&mockErrPublisher{},
256268
&daemonevents.AccountUpdateEvents{SubscriptionUpdate: test.accPub},
257269
)

cmd/daemon/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,7 @@ func main() {
421421
fsystem,
422422
defaultAPI,
423423
daemonEvents.User.MFA,
424+
daemonEvents.User.Logout,
424425
errSubject,
425426
accountUpdateEvents,
426427
)

daemon/rpc_account.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ func (r *RPC) AccountInfo(ctx context.Context, _ *pb.Empty) (*pb.AccountResponse
116116
log.Println(internal.ErrorPrefix, "retrieving user:", err)
117117
switch {
118118
case errors.Is(err, core.ErrUnauthorized):
119-
if err := r.cm.SaveWith(auth.Logout(cfg.AutoConnectData.ID)); err != nil {
119+
if err := r.cm.SaveWith(auth.Logout(cfg.AutoConnectData.ID, r.events.User.Logout)); err != nil {
120120
return &pb.AccountResponse{
121121
Type: internal.CodeConfigError,
122122
}, nil

daemon/servers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ func selectServer(r *RPC, insights *core.Insights, cfg config.Config, tag string
475475
log.Println(internal.ErrorPrefix, "picking servers:", err)
476476
switch {
477477
case errors.Is(err, core.ErrUnauthorized):
478-
if err := r.cm.SaveWith(auth.Logout(cfg.AutoConnectData.ID)); err != nil {
478+
if err := r.cm.SaveWith(auth.Logout(cfg.AutoConnectData.ID, r.events.User.Logout)); err != nil {
479479
return nil, false, err
480480
}
481481
return nil, false, internal.ErrNotLoggedIn

0 commit comments

Comments
 (0)