1 # -*- test-case-name: twisted.conch.test.test_openssh_compat -*-
2 # Copyright (c) Twisted Matrix Laboratories.
3 # See LICENSE for details.
6 Factory for reading openssh configuration files: public keys, private keys, and
12 from twisted.python import log
13 from twisted.python.util import runAsEffectiveUser
15 from twisted.conch.ssh import keys, factory, common
16 from twisted.conch.openssh_compat import primes
20 class OpenSSHFactory(factory.SSHFactory):
21 dataRoot = '/usr/local/etc'
22 moduliRoot = '/usr/local/etc' # for openbsd which puts moduli in a different
26 def getPublicKeys(self):
28 Return the server public keys.
31 for filename in os.listdir(self.dataRoot):
32 if filename[:9] == 'ssh_host_' and filename[-8:]=='_key.pub':
34 k = keys.Key.fromFile(
35 os.path.join(self.dataRoot, filename))
36 t = common.getNS(k.blob())[0]
39 log.msg('bad public key file %s: %s' % (filename, e))
43 def getPrivateKeys(self):
45 Return the server private keys.
48 for filename in os.listdir(self.dataRoot):
49 if filename[:9] == 'ssh_host_' and filename[-4:]=='_key':
50 fullPath = os.path.join(self.dataRoot, filename)
52 key = keys.Key.fromFile(fullPath)
54 if e.errno == errno.EACCES:
55 # Not allowed, let's switch to root
56 key = runAsEffectiveUser(0, 0, keys.Key.fromFile, fullPath)
57 keyType = keys.objectType(key.keyObject)
58 privateKeys[keyType] = key
62 log.msg('bad private key file %s: %s' % (filename, e))
64 keyType = keys.objectType(key.keyObject)
65 privateKeys[keyType] = key
71 return primes.parseModuliFile(self.moduliRoot+'/moduli')