~ntt-pf-lab/nova/monkey_patch_notification

« back to all changes in this revision

Viewing changes to vendor/Twisted-10.0.0/twisted/conch/test/test_openssh_compat.py

  • Committer: Jesse Andrews
  • Date: 2010-05-28 06:05:26 UTC
  • Revision ID: git-v1:bf6e6e718cdc7488e2da87b21e258ccc065fe499
initial commit

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (c) 2001-2008 Twisted Matrix Laboratories.
 
2
# See LICENSE for details.
 
3
 
 
4
"""
 
5
Tests for L{twisted.conch.openssh_compat}.
 
6
"""
 
7
 
 
8
import os
 
9
 
 
10
from twisted.trial.unittest import TestCase
 
11
from twisted.python.filepath import FilePath
 
12
from twisted.python.compat import set
 
13
 
 
14
try:
 
15
    import Crypto.Cipher.DES3
 
16
    import pyasn1
 
17
except ImportError:
 
18
    OpenSSHFactory = None
 
19
else:
 
20
    from twisted.conch.openssh_compat.factory import OpenSSHFactory
 
21
 
 
22
from twisted.conch.test import keydata
 
23
from twisted.test.test_process import MockOS
 
24
 
 
25
 
 
26
class OpenSSHFactoryTests(TestCase):
 
27
    """
 
28
    Tests for L{OpenSSHFactory}.
 
29
    """
 
30
    if getattr(os, "geteuid", None) is None:
 
31
        skip = "geteuid/seteuid not available"
 
32
    elif OpenSSHFactory is None:
 
33
        skip = "Cannot run without PyCrypto or PyASN1"
 
34
 
 
35
    def setUp(self):
 
36
        self.factory = OpenSSHFactory()
 
37
        self.keysDir = FilePath(self.mktemp())
 
38
        self.keysDir.makedirs()
 
39
        self.factory.dataRoot = self.keysDir.path
 
40
 
 
41
        self.keysDir.child("ssh_host_foo").setContent("foo")
 
42
        self.keysDir.child("bar_key").setContent("foo")
 
43
        self.keysDir.child("ssh_host_one_key").setContent(
 
44
            keydata.privateRSA_openssh)
 
45
        self.keysDir.child("ssh_host_two_key").setContent(
 
46
            keydata.privateDSA_openssh)
 
47
        self.keysDir.child("ssh_host_three_key").setContent(
 
48
            "not a key content")
 
49
 
 
50
        self.keysDir.child("ssh_host_one_key.pub").setContent(
 
51
            keydata.publicRSA_openssh)
 
52
 
 
53
        self.mockos = MockOS()
 
54
        self.patch(os, "seteuid", self.mockos.seteuid)
 
55
        self.patch(os, "setegid", self.mockos.setegid)
 
56
 
 
57
 
 
58
    def test_getPublicKeys(self):
 
59
        """
 
60
        L{OpenSSHFactory.getPublicKeys} should return the available public keys
 
61
        in the data directory
 
62
        """
 
63
        keys = self.factory.getPublicKeys()
 
64
        self.assertEquals(len(keys), 1)
 
65
        keyTypes = keys.keys()
 
66
        self.assertEqual(keyTypes, ['ssh-rsa'])
 
67
 
 
68
 
 
69
    def test_getPrivateKeys(self):
 
70
        """
 
71
        L{OpenSSHFactory.getPrivateKeys} should return the available private
 
72
        keys in the data directory.
 
73
        """
 
74
        keys = self.factory.getPrivateKeys()
 
75
        self.assertEquals(len(keys), 2)
 
76
        keyTypes = keys.keys()
 
77
        self.assertEqual(set(keyTypes), set(['ssh-rsa', 'ssh-dss']))
 
78
        self.assertEquals(self.mockos.seteuidCalls, [])
 
79
        self.assertEquals(self.mockos.setegidCalls, [])
 
80
 
 
81
 
 
82
    def test_getPrivateKeysAsRoot(self):
 
83
        """
 
84
        L{OpenSSHFactory.getPrivateKeys} should switch to root if the keys
 
85
        aren't readable by the current user.
 
86
        """
 
87
        keyFile = self.keysDir.child("ssh_host_two_key")
 
88
        # Fake permission error by changing the mode
 
89
        keyFile.chmod(0000)
 
90
        self.addCleanup(keyFile.chmod, 0777)
 
91
        # And restore the right mode when seteuid is called
 
92
        savedSeteuid = os.seteuid
 
93
        def seteuid(euid):
 
94
            keyFile.chmod(0777)
 
95
            return savedSeteuid(euid)
 
96
        self.patch(os, "seteuid", seteuid)
 
97
        keys = self.factory.getPrivateKeys()
 
98
        self.assertEquals(len(keys), 2)
 
99
        keyTypes = keys.keys()
 
100
        self.assertEqual(set(keyTypes), set(['ssh-rsa', 'ssh-dss']))
 
101
        self.assertEquals(self.mockos.seteuidCalls, [0, os.geteuid()])
 
102
        self.assertEquals(self.mockos.setegidCalls, [0, os.getegid()])