Browse Source

Validate maps

master
JustAnotherArchivist 4 years ago
parent
commit
383637ec05
1 changed files with 26 additions and 3 deletions
  1. +26
    -3
      http2irc.py

+ 26
- 3
http2irc.py View File

@@ -110,6 +110,7 @@ class Config(dict):
if 'port' in obj['web'] and (not isinstance(obj['web']['port'], int) or not 1 <= obj['web']['port'] <= 65535):
raise InvalidConfig('Invalid web port')
if 'maps' in obj:
seenWebPaths = {}
for key, map_ in obj['maps'].items():
if not isinstance(key, str) or not key:
raise InvalidConfig(f'Invalid map key {key!r}')
@@ -117,7 +118,30 @@ class Config(dict):
raise InvalidConfig(f'Invalid map for {key!r}')
if any(x not in ('webpath', 'ircchannel', 'auth', 'module', 'moduleargs') for x in map_):
raise InvalidConfig(f'Unknown key(s) found in map {key!r}')
#TODO: Check values

if 'webpath' not in map_:
map_['webpath'] = f'/{key}'
if not isinstance(map_['webpath'], str):
raise InvalidConfig(f'Invalid map {key!r} web path: not a string')
if not map_['webpath'].startswith('/'):
raise InvalidConfig(f'Invalid map {key!r} web path: does not start at the root')
if map_['webpath'] in seenWebPaths:
raise InvalidConfig(f'Invalid map {key!r} web path: collides with map {seenWebPaths[map_["webpath"]]!r}')
seenWebPaths[map_['webpath']] = key

if 'ircchannel' in map_:
if not isinstance(map_['ircchannel'], str):
raise InvalidConfig(f'Invalid map {key!r} IRC channel: not a string')
if not map_['ircchannel'].startswith('#') and not map_['ircchannel'].startswith('&'):
raise InvalidConfig(f'Invalid map {key!r} IRC channel: does not start with # or &')
#TODO Check if it's a valid name per IRC spec

if 'auth' in map_:
if map_['auth'] is not False and not isinstance(map_['auth'], str):
raise InvalidConfig(f'Invalid map {key!r} auth: must be false or a string')
if isinstance(map_['auth'], str) and ':' not in map_['auth']:
raise InvalidConfig(f'Invalid map {key!r} auth: must contain a colon')

if 'module' in map_ and not os.path.isfile(map_['module']):
raise InvalidConfig(f'Module {map_["module"]!r} in map {key!r} is not a file')
if 'moduleargs' in map_:
@@ -131,8 +155,7 @@ class Config(dict):

# Fill in default values for the maps
for key, map_ in obj['maps'].items():
if 'webpath' not in map_:
map_['webpath'] = f'/{key}'
# webpath is already set above for duplicate checking
if 'ircchannel' not in map_:
map_['ircchannel'] = f'#{key}'
if 'auth' not in map_:


Loading…
Cancel
Save