1.1 --- a/hgapp/hooks.py Sat Mar 06 20:09:34 2010 +0100
1.2 +++ b/hgapp/hooks.py Thu Mar 11 11:28:43 2010 +0100
1.3 @@ -12,7 +12,7 @@
1.4 return False
1.5
1.6 if not os.getenv('SSH_ORIGINAL_COMMAND'):
1.7 - if 'http' not in config['hg:config'].allow_docs or 'admin' not in kwargs:
1.8 + if 'http' not in config['hg:config'].allow_docs and 'admin' not in kwargs:
1.9 return False
1.10
1.11 dirname = repo.root
2.1 --- a/hgapp/ssh/keys.py Sat Mar 06 20:09:34 2010 +0100
2.2 +++ b/hgapp/ssh/keys.py Thu Mar 11 11:28:43 2010 +0100
2.3 @@ -2,6 +2,7 @@
2.4 import os
2.5 import stat
2.6 import shutil
2.7 +import logging as log
2.8 from glob import glob
2.9 from cStringIO import StringIO
2.10 from os.path import join, isdir, isfile
2.11 @@ -70,7 +71,6 @@
2.12 '''no-port-forwarding,no-agent-forwarding,no-X11-forwarding %(key)s %(name)s
2.13 '''
2.14
2.15 -
2.16 def chmod(*args):
2.17 path = join(*args)
2.18 if isdir(path):
2.19 @@ -96,27 +96,52 @@
2.20 chmod(userdir)
2.21 return userdir
2.22
2.23 +def normalize_name(name):
2.24 + if not name:
2.25 + return name
2.26 + for c in '~_./\\':
2.27 + name = name.replace(c, '_')
2.28 + name = name.strip(c)
2.29 + name = name.replace('__', '_')
2.30 + name = name.strip('_')
2.31 + return name
2.32 +
2.33 def add_key(user, name=None, key=None):
2.34 if not hasattr(key, 'read'):
2.35 if isfile(key):
2.36 key = open(key, 'rb')
2.37 else:
2.38 raise IOError('No such file %s' % key)
2.39 - data = key.read().strip()
2.40 - if ' ' in data:
2.41 - splited = data.split(' ')
2.42 - data = ' '.join(splited[:2])
2.43 - if len(splited) == 3 and not name:
2.44 - name = splited[2]
2.45 - if not name:
2.46 - raise RuntimeError('No name found in key. Use -n')
2.47 - if '\n' not in data and data.startswith('ssh-'):
2.48 - filename = join(user_dir(user), '%s.pub' % name)
2.49 - fd = open(filename, 'wb')
2.50 - fd.write(data)
2.51 - fd.close()
2.52 - return filename
2.53 - return False
2.54 + names = []
2.55 + filenames = []
2.56 + name = normalize_name(name)
2.57 + keys = key.readlines()
2.58 + log.info('%i key(s) found', len(keys))
2.59 + for data in keys:
2.60 + data = data.strip()
2.61 + if ' ' in data:
2.62 + splited = data.split(' ')
2.63 + data = ' '.join(splited[:2])
2.64 + if len(splited) == 3 and not name:
2.65 + name = splited[2]
2.66 + name = normalize_name(name)
2.67 + if not name:
2.68 + raise RuntimeError('No name found in key. Use -n')
2.69 + if name in names:
2.70 + for i in range(50):
2.71 + name_ = '%s_%i' % (name, i)
2.72 + if name_ not in names:
2.73 + name = name_
2.74 + break
2.75 + names.append(name)
2.76 + if '\n' not in data and data.startswith('ssh-'):
2.77 + filename = join(user_dir(user), '%s.pub' % name)
2.78 + fd = open(filename, 'wb')
2.79 + fd.write(data)
2.80 + fd.close()
2.81 + filenames.append(filename)
2.82 + name = None
2.83 + return filenames
2.84
2.85 def gen_keys(fd):
2.86 from hgapp import utils