/docs/MercurialApp Gawel's repository

allow to add authorized_keys

authorGael Pasgrimaud <gael@gawel.org>
Thu Mar 11 11:28:43 2010 +0100 (4 months ago)
changeset 111cdf4b92a4ef0
parent 110 4bd43fb13690
child 112 56ce041dad79
allow to add authorized_keys
     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