Coverage for gws-app/gws/base/auth/cli.py: 0%
49 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
1from typing import Optional, cast
3import gws
4import gws.config
5import gws.lib.datetimex as dtx
6import gws.lib.cli as cli
8from . import manager
10gws.ext.new.cli('auth')
13class RemoveParams(gws.CliParams):
14 older: Optional[int]
15 """Remove sessions older than N seconds."""
16 uid: Optional[list[str]]
17 """Remove specific sessions."""
18 all: Optional[bool]
19 """Remove all sessions."""
22class Object(gws.Node):
24 @gws.ext.command.cli('authSessions')
25 def sessions(self, p: gws.EmptyRequest):
26 """Show active authorization sessions"""
28 root = gws.config.load()
29 sm = root.app.authMgr.sessionMgr
31 rows = []
33 for s in sm.get_all():
34 dc = dtx.total_difference(s.created).seconds
35 du = dtx.total_difference(s.updated).seconds
36 rows.append((du, dict(
37 uid=s.uid,
38 user=s.user.loginName,
39 auth=s.method.extType,
40 started=dtx.to_iso_string(s.created, sep=' ') + f' ({dc} sec)',
41 updated=dtx.to_iso_string(s.updated, sep=' ') + f' ({du} sec)',
42 )))
44 # oldest first
45 rows.sort(key=lambda r: -r[0])
47 cli.info('')
48 cli.info(f'Active sessions: {len(rows)}')
49 cli.info(cli.text_table([r[1] for r in rows], header='auto'))
51 @gws.ext.command.cli('authSessrem')
52 def sessrem(self, p: RemoveParams):
53 """Remove authorization sessions."""
55 root = gws.config.load()
56 sm = root.app.authMgr.sessionMgr
58 n = 0
60 for s in sm.get_all():
61 du = dtx.total_difference(s.updated).seconds
62 if p.all:
63 sm.delete(s)
64 n += 1
65 continue
66 if p.older and du > p.older:
67 sm.delete(s)
68 n += 1
69 continue
70 if p.uid and s.uid in p.uid:
71 sm.delete(s)
72 n += 1
73 continue
75 cli.info('')
76 cli.info(f'Removed sessions: {n}')