Skip to content

Commit

Permalink
test case
Browse files Browse the repository at this point in the history
  • Loading branch information
glyph committed Feb 14, 2023
1 parent dfb3bdf commit 4d7f1b1
Showing 1 changed file with 43 additions and 25 deletions.
68 changes: 43 additions & 25 deletions src/twisted/conch/test/test_unix.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,16 @@

from zope.interface import implementer

from twisted.conch.interfaces import IConchUser
from twisted.conch.unix import UnixConchUser, UnixSSHRealm
from twisted.cred.checkers import InMemoryUsernamePasswordDatabaseDontUse
from twisted.cred.credentials import IUsernamePassword, UsernamePassword
from twisted.cred.portal import Portal
from twisted.internet.interfaces import IReactorProcess
from twisted.python.fakepwd import UserDatabase
from twisted.python.reflect import requireModule
from twisted.trial import unittest
from .test_session import StubClient, StubConnection

cryptography = requireModule("cryptography")
unix = requireModule("twisted.conch.unix")
Expand Down Expand Up @@ -52,46 +59,57 @@ def spawnProcess(
)


class StubUnixConchUser:
"""
Enough of UnixConchUser to exercise SSHSessionForUnixConchUser in the
tests below.
"""

def __init__(self, homeDirectory):
from .test_session import StubClient, StubConnection

self._homeDirectory = homeDirectory
self.conn = StubConnection(transport=StubClient())

def getUserGroupId(self):
return (None, None)

def getHomeDir(self):
return self._homeDirectory

def getShell(self):
pass


class TestSSHSessionForUnixConchUser(unittest.TestCase):

if cryptography is None:
skip = "Cannot run without cryptography"
elif unix is None:
skip = "Unix system required"

def testExecCommandEnvironment(self):
def testExecCommandEnvironment(self) -> None:
"""
C{execCommand} sets the C{HOME} environment variable to the avatar's home
directory.
"""
mockReactor = MockProcessSpawner()
userdb = UserDatabase()
homeDirectory = "/made/up/path/"
avatar = StubUnixConchUser(homeDirectory)
userName = "user"
userdb.addUser(userName, home=homeDirectory)
self.patch(unix, "pwd", userdb)
mockReactor = MockProcessSpawner()
avatar = UnixConchUser(userName)
avatar.conn = StubConnection(transport=StubClient())
session = unix.SSHSessionForUnixConchUser(avatar, reactor=mockReactor)
protocol = None
command = ["not-actually-executed"]
session.execCommand(protocol, command)
[call] = mockReactor._spawnProcessCalls
self.assertEqual(homeDirectory, call["env"]["HOME"])


class TestUnixSSHRealm(unittest.TestCase):
"""
Tests for L{UnixSSHRealm}.
"""

def test_unixSSHRealm(self) -> None:
"""
L{UnixSSHRealm} is an L{IRealm} whose C{.requestAvatar} method returns
a L{UnixConchUser}.
"""
userdb = UserDatabase()
home = "/testing/home/value"
userdb.addUser("user", home=home)
self.patch(unix, "pwd", userdb)
pwdb = InMemoryUsernamePasswordDatabaseDontUse(user=b"password")
p = Portal(UnixSSHRealm(), [pwdb])

# there seems to be a bug in mypy-zope where sometimes things don't
# implement their superinterfaces; 0.3.11, when we upgrade to 0.9.0
# this type declaration will be extraneous
creds: IUsernamePassword = UsernamePassword(b"user", b"password")
result = p.login(creds, None, IConchUser)
resultInterface, avatar, logout = self.successResultOf(result)
self.assertIsInstance(avatar, UnixConchUser)
assert isinstance(avatar, UnixConchUser) # legibility for mypy
self.assertEqual(avatar.getHomeDir(), home)

0 comments on commit 4d7f1b1

Please sign in to comment.