1
- __version__ = '0.1 '
1
+ __version__ = '0.2 '
2
2
3
3
# install_twisted_rector must be called before importing and using the reactor
4
4
from kivy .support import install_twisted_reactor
10
10
from twisted .internet import reactor
11
11
from twisted .cred import portal , checkers
12
12
from twisted .conch import manhole , manhole_ssh
13
+ from twisted .conch .ssh import keys
13
14
from kivy .lang import Builder
14
15
from kivy .uix .floatlayout import FloatLayout
15
16
from kivy .properties import StringProperty
19
20
from kivy .uix .screenmanager import Screen
20
21
app = None
21
22
23
+ #+---[RSA 3072]----+
24
+ #|E .o o=.o.=.. |
25
+ #|o...=**=o= = |
26
+ #|o.o.+*++= + . . |
27
+ #|o+ . ....+ . o +.|
28
+ #| o ..S. . . +|
29
+ #| o .. |
30
+ #| . . |
31
+ #| . . |
32
+ #| .. |
33
+ #+----[SHA256]-----+
34
+ private_rsa = """-----BEGIN OPENSSH PRIVATE KEY-----
35
+ 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
71
+ -----END OPENSSH PRIVATE KEY-----
72
+ """
22
73
23
- def getManholeFactory (namespace , ** passwords ):
74
+ public_rsa = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCu2YF61scgIo8RABiwTvhZLmb0k2cdWaSKMn6yGdVbpAYtwbqZ6i9ZxOISrROLz+vtiPmg2DuCF42MoRyTlAlAkQs0iJVBDyIwM5mvACDCkvEqdCJhb5fgSgiqSVE9C+eDdIv24nZHPlD1OLfncivUIEPkn0SmwhSRjQt+IBeMB0yAzM4waci96m364SdJBHQ6YxjF2lFVMtWfqYFu80JZeklM+bmSwGAZ+QvLIt0sg4hcGci4voWu1EIf2SFbbxzHyjFyyzPl4Q4QRjZZXoJG5P6GmKdME9DPOpANtyRN80ZWpQs+VzjR4X1LBref1isolEvfY/1srfVlQZZYm7PLpdJnQP9Z2tkQb4NPMd7hB7yWLY5/sMrR1Fi8+PnrhAlYtG9AjOlSCMD/CRsCMmrWTILNlJ3ZZjFDPXvlQ1nNPuwdFcYeriSHs6hrnuj15tl/TESt6nXvyU6Dgwhys6UrkBmncclXweR8VDk/RQtVQA1zXnSmMKQ1fQCcbNYqTQM="
75
+
76
+ class PythonManhole (manhole .ColoredManhole ):
77
+ def __init__ (self ):
78
+ glob = {
79
+ '__name__' :'__main__' ,
80
+ '__doc__' :None ,
81
+ '__package__' :None ,
82
+ '__spec__' :None ,
83
+ '__annotations__' :{},
84
+ '__builtins__' :__builtins__
85
+ }
86
+
87
+ super ().__init__ (glob )
88
+
89
+ def makeConnection (self , cxt ):
90
+ self .transport = cxt .transport
91
+ return super ().makeConnection (cxt )
92
+
93
+ def lineReceived (self , * args ):
94
+ # Catch exit()
95
+ try :
96
+ return super ().lineReceived (* args )
97
+ except SystemExit :
98
+ self .transport .loseConnection ()
99
+
100
+
101
+ def getManholeFactory (** users ):
102
+ # Create a terminal
24
103
realm = manhole_ssh .TerminalRealm ()
25
- def getManhole (_ ):
26
- return manhole .ColoredManhole (namespace )
27
- realm .chainedProtocolFactory .protocolFactory = getManhole
104
+ realm .chainedProtocolFactory .protocolFactory = PythonManhole
105
+ users = {key : value .encode () for key , value in users .items ()}
28
106
p = portal .Portal (realm )
29
107
p .registerChecker (
30
- checkers .InMemoryUsernamePasswordDatabaseDontUse (** passwords ))
108
+ checkers .InMemoryUsernamePasswordDatabaseDontUse (** users ))
109
+
110
+ # Create a factory
31
111
f = manhole_ssh .ConchFactory (p )
112
+ f .publicKeys [b'ssh-rsa' ] = keys .Key .fromString (public_rsa )
113
+ f .privateKeys [b'ssh-rsa' ] = keys .Key .fromString (private_rsa )
32
114
return f
33
115
34
116
@@ -55,7 +137,7 @@ def get_interface_ip(self, ifname):
55
137
return socket .inet_ntoa (fcntl .ioctl (
56
138
s .fileno (),
57
139
0x8915 , # SIOCGIFADDR
58
- struct .pack ('256s' , ifname [:15 ])
140
+ struct .pack ('256s' , ifname [:15 ]. encode ( 'utf-8' ) )
59
141
)[20 :24 ])
60
142
61
143
@@ -64,7 +146,7 @@ def build(self):
64
146
global app
65
147
app = self
66
148
self .connection = reactor .listenTCP (8000 ,
67
- getManholeFactory (globals (), admin = 'kivy' ))
149
+ getManholeFactory (admin = 'kivy' ))
68
150
69
151
def on_pause (self ):
70
152
return True
0 commit comments