From c90fc15c1264446d594a702ddc0ccc26aa8c14ef Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 21:07:28 +0000 Subject: [PATCH 1/9] Tidying of role functions --- roles.py | 111 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 60 insertions(+), 51 deletions(-) diff --git a/roles.py b/roles.py index d0f05602d..dcdc549ba 100644 --- a/roles.py +++ b/roles.py @@ -18,30 +18,10 @@ from utils import loadJson from utils import saveJson -def clearModeratorStatus(baseDir: str) -> None: - """Removes moderator status from all accounts +def _clearRoleStatus(baseDir: str, role: str) -> None: + """Removes role status from all accounts This could be slow if there are many users, but only happens - rarely when moderators are appointed or removed - """ - directory = os.fsencode(baseDir + '/accounts/') - for f in os.scandir(directory): - f = f.name - filename = os.fsdecode(f) - if filename.endswith(".json") and '@' in filename: - filename = os.path.join(baseDir + '/accounts/', filename) - if '"moderator"' in open(filename).read(): - actorJson = loadJson(filename) - if actorJson: - if actorJson['roles'].get('instance'): - if 'moderator' in actorJson['roles']['instance']: - actorJson['roles']['instance'].remove('moderator') - saveJson(actorJson, filename) - - -def clearEditorStatus(baseDir: str) -> None: - """Removes editor status from all accounts - This could be slow if there are many users, but only happens - rarely when editors are appointed or removed + rarely when roles are appointed or removed """ directory = os.fsencode(baseDir + '/accounts/') for f in os.scandir(directory): @@ -52,59 +32,88 @@ def clearEditorStatus(baseDir: str) -> None: if not filename.endswith(".json"): continue filename = os.path.join(baseDir + '/accounts/', filename) - if '"editor"' not in open(filename).read(): + if '"' + role + '"' not in open(filename).read(): continue actorJson = loadJson(filename) if not actorJson: continue if actorJson['roles'].get('instance'): - if 'editor' in actorJson['roles']['instance']: - actorJson['roles']['instance'].remove('editor') + if role in actorJson['roles']['instance']: + actorJson['roles']['instance'].remove(role) saveJson(actorJson, filename) -def _addModerator(baseDir: str, nickname: str, domain: str) -> None: - """Adds a moderator nickname to the file +def clearEditorStatus(baseDir: str) -> None: + """Removes editor status from all accounts + This could be slow if there are many users, but only happens + rarely when editors are appointed or removed + """ + _clearRoleStatus(baseDir, 'editor') + + +def clearModeratorStatus(baseDir: str) -> None: + """Removes moderator status from all accounts + This could be slow if there are many users, but only happens + rarely when moderators are appointed or removed + """ + _clearRoleStatus(baseDir, 'moderator') + + +def _addRole(baseDir: str, nickname: str, domain: str, + roleFilename: str) -> None: + """Adds a role nickname to the file """ if ':' in domain: domain = domain.split(':')[0] - moderatorsFile = baseDir + '/accounts/moderators.txt' - if os.path.isfile(moderatorsFile): + roleFile = baseDir + '/accounts/' + roleFilename + if os.path.isfile(roleFile): # is this nickname already in the file? - with open(moderatorsFile, "r") as f: + with open(roleFile, "r") as f: lines = f.readlines() - for moderator in lines: - moderator = moderator.strip('\n').strip('\r') - if moderator == nickname: + for roleNickname in lines: + roleNickname = roleNickname.strip('\n').strip('\r') + if roleNickname == nickname: return lines.append(nickname) - with open(moderatorsFile, 'w+') as f: - for moderator in lines: - moderator = moderator.strip('\n').strip('\r') - if len(moderator) > 1: + with open(roleFile, 'w+') as f: + for roleNickname in lines: + roleNickname = roleNickname.strip('\n').strip('\r') + if len(roleNickname) > 1: if os.path.isdir(baseDir + '/accounts/' + - moderator + '@' + domain): - f.write(moderator + '\n') + roleNickname + '@' + domain): + f.write(roleNickname + '\n') else: - with open(moderatorsFile, "w+") as f: + with open(roleFile, "w+") as f: if os.path.isdir(baseDir + '/accounts/' + nickname + '@' + domain): f.write(nickname + '\n') -def _removeModerator(baseDir: str, nickname: str): - """Removes a moderator nickname from the file +def _addModerator(baseDir: str, nickname: str, domain: str) -> None: + """Adds a moderator nickname to the file """ - moderatorsFile = baseDir + '/accounts/moderators.txt' - if not os.path.isfile(moderatorsFile): + _addRole(baseDir, nickname, domain, 'moderators.txt') + + +def _removeRole(baseDir: str, nickname: str, roleFilename: str) -> None: + """Removes a role nickname from the file + """ + roleFile = baseDir + '/accounts/' + roleFilename + if not os.path.isfile(roleFile): return - with open(moderatorsFile, "r") as f: + with open(roleFile, "r") as f: lines = f.readlines() - with open(moderatorsFile, 'w+') as f: - for moderator in lines: - moderator = moderator.strip('\n').strip('\r') - if len(moderator) > 1 and moderator != nickname: - f.write(moderator + '\n') + with open(roleFile, 'w+') as f: + for roleNickname in lines: + roleNickname = roleNickname.strip('\n').strip('\r') + if len(roleNickname) > 1 and roleNickname != nickname: + f.write(roleNickname + '\n') + + +def _removeModerator(baseDir: str, nickname: str) -> None: + """Adds a moderator nickname to the file + """ + _removeRole(baseDir, nickname, 'moderators.txt') def setRole(baseDir: str, nickname: str, domain: str, From d463e62ee5fc7c811f1071bda94ced6692d1d22a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 21:18:20 +0000 Subject: [PATCH 2/9] Tidying --- roles.py | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/roles.py b/roles.py index dcdc549ba..51a43b624 100644 --- a/roles.py +++ b/roles.py @@ -89,12 +89,6 @@ def _addRole(baseDir: str, nickname: str, domain: str, f.write(nickname + '\n') -def _addModerator(baseDir: str, nickname: str, domain: str) -> None: - """Adds a moderator nickname to the file - """ - _addRole(baseDir, nickname, domain, 'moderators.txt') - - def _removeRole(baseDir: str, nickname: str, roleFilename: str) -> None: """Removes a role nickname from the file """ @@ -110,12 +104,6 @@ def _removeRole(baseDir: str, nickname: str, roleFilename: str) -> None: f.write(roleNickname + '\n') -def _removeModerator(baseDir: str, nickname: str) -> None: - """Adds a moderator nickname to the file - """ - _removeRole(baseDir, nickname, 'moderators.txt') - - def setRole(baseDir: str, nickname: str, domain: str, project: str, role: str) -> bool: """Set a person's role within a project @@ -129,12 +117,18 @@ def setRole(baseDir: str, nickname: str, domain: str, if not os.path.isfile(actorFilename): return False + roleFiles = { + "moderator": "moderators.txt", + "editor": "editors.txt" + } + actorJson = loadJson(actorFilename) if actorJson: if role: # add the role - if project == 'instance' and 'role' == 'moderator': - _addModerator(baseDir, nickname, domain) + if project == 'instance': + if roleFiles.get(role): + _addRole(baseDir, nickname, domain, roleFiles[role]) if actorJson['roles'].get(project): if role not in actorJson['roles'][project]: actorJson['roles'][project].append(role) @@ -143,7 +137,7 @@ def setRole(baseDir: str, nickname: str, domain: str, else: # remove the role if project == 'instance': - _removeModerator(baseDir, nickname) + _removeRole(baseDir, nickname, roleFiles[role]) if actorJson['roles'].get(project): actorJson['roles'][project].remove(role) # if the project contains no roles then remove it From 206a56414a6bf292bec3e470abc5d1977577d146 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 21:19:37 +0000 Subject: [PATCH 3/9] Check that role file exists --- roles.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/roles.py b/roles.py index 51a43b624..15d381648 100644 --- a/roles.py +++ b/roles.py @@ -137,7 +137,8 @@ def setRole(baseDir: str, nickname: str, domain: str, else: # remove the role if project == 'instance': - _removeRole(baseDir, nickname, roleFiles[role]) + if roleFiles.get(role): + _removeRole(baseDir, nickname, roleFiles[role]) if actorJson['roles'].get(project): actorJson['roles'][project].remove(role) # if the project contains no roles then remove it From 0825990ebaa798f223b21d0b780dbf17190ce96f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 21:29:41 +0000 Subject: [PATCH 4/9] Ensure that the domain is obtained when removing an account --- epicyon.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/epicyon.py b/epicyon.py index b6ce17bd4..6f5731532 100644 --- a/epicyon.py +++ b/epicyon.py @@ -1703,6 +1703,10 @@ if args.rmaccount: if not args.domain or not getConfigParam(baseDir, 'domain'): print('Use the --domain option to set the domain name') sys.exit() + if args.domain: + domain = args.domain + else: + domain = getConfigParam(baseDir, 'domain') configuredDomain = getConfigParam(baseDir, 'domain') if configuredDomain: From 8c809f6f20c014781e09929f689c2b598c274de1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 21:36:17 +0000 Subject: [PATCH 5/9] Extract nickname from login screen if full handle has been given --- webapp_login.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webapp_login.py b/webapp_login.py index b0e893d08..4ddb42601 100644 --- a/webapp_login.py +++ b/webapp_login.py @@ -37,6 +37,9 @@ def htmlGetLoginCredentials(loginParams: str, if '=' in arg: if arg.split('=', 1)[0] == 'username': nickname = arg.split('=', 1)[1] + if '@' in nickname: + # the full nickname@domain has been entered + nickname = nickname.split('@')[0] elif arg.split('=', 1)[0] == 'password': password = arg.split('=', 1)[1] elif arg.split('=', 1)[0] == 'register': From 93aec5d4d91677accca126be198883bdadf6bf18 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 21:44:44 +0000 Subject: [PATCH 6/9] If handle is given at login then check the domain --- daemon.py | 4 +++- webapp_login.py | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/daemon.py b/daemon.py index cfefb8300..d4d009d6c 100644 --- a/daemon.py +++ b/daemon.py @@ -1463,7 +1463,9 @@ class PubServer(BaseHTTPRequestHandler): return loginNickname, loginPassword, register = \ - htmlGetLoginCredentials(loginParams, self.server.lastLoginTime) + htmlGetLoginCredentials(loginParams, + self.server.lastLoginTime, + self.server.domain) if loginNickname: if isSystemAccount(loginNickname): print('Invalid username login: ' + loginNickname + diff --git a/webapp_login.py b/webapp_login.py index 4ddb42601..608bb27cb 100644 --- a/webapp_login.py +++ b/webapp_login.py @@ -18,7 +18,8 @@ from theme import getTextModeLogo def htmlGetLoginCredentials(loginParams: str, - lastLoginTime: int) -> (str, str, bool): + lastLoginTime: int, + domain: str) -> (str, str, bool): """Receives login credentials via HTTPServer POST """ if not loginParams.startswith('username='): @@ -39,7 +40,9 @@ def htmlGetLoginCredentials(loginParams: str, nickname = arg.split('=', 1)[1] if '@' in nickname: # the full nickname@domain has been entered - nickname = nickname.split('@')[0] + handleDomain = nickname.split('@')[1].strip() + if handleDomain == domain: + nickname = nickname.split('@')[0] elif arg.split('=', 1)[0] == 'password': password = arg.split('=', 1)[1] elif arg.split('=', 1)[0] == 'register': From a5903579bbd737b14a184df76dbd9373c7d3ee55 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 21:47:55 +0000 Subject: [PATCH 7/9] Remove any initial @ from the login nickname/handle --- webapp_login.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapp_login.py b/webapp_login.py index 608bb27cb..0b47a2f8c 100644 --- a/webapp_login.py +++ b/webapp_login.py @@ -38,6 +38,8 @@ def htmlGetLoginCredentials(loginParams: str, if '=' in arg: if arg.split('=', 1)[0] == 'username': nickname = arg.split('=', 1)[1] + if nickname.startswith('@'): + nickname = nickname[1:] if '@' in nickname: # the full nickname@domain has been entered handleDomain = nickname.split('@')[1].strip() From ed995be8f03266ca5242bfd45c7c1d9d9910d4cf Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 22:00:33 +0000 Subject: [PATCH 8/9] Pronounce javascript files --- speaker.py | 1 + 1 file changed, 1 insertion(+) diff --git a/speaker.py b/speaker.py index 45baf9d96..2cf4a4a46 100644 --- a/speaker.py +++ b/speaker.py @@ -81,6 +81,7 @@ def _speakerPronounce(baseDir: str, sayText: str, translate: {}) -> str: "XMPP": "X-M-P-P", "xmpp": "X-M-P-P", "sql": "S-Q-L", + ".js": ".J-S", "PSQL": "Postgres S-Q-L", "SQL": "S-Q-L", "coop": "co-op", From 72be5162cd8c0ee9cb8a486d5ffad22d7569925c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 22:02:54 +0000 Subject: [PATCH 9/9] Pronounce javascript files --- speaker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/speaker.py b/speaker.py index 2cf4a4a46..06360e5ce 100644 --- a/speaker.py +++ b/speaker.py @@ -81,7 +81,7 @@ def _speakerPronounce(baseDir: str, sayText: str, translate: {}) -> str: "XMPP": "X-M-P-P", "xmpp": "X-M-P-P", "sql": "S-Q-L", - ".js": ".J-S", + ".js": " dot J-S", "PSQL": "Postgres S-Q-L", "SQL": "S-Q-L", "coop": "co-op",