[project @ Arch-1:robey@lag.net--2005-master-shake%paramiko--dev--1--patch-29]
a bunch of silly changes where i was trying to fix pychecker warnings before i decided it wasnt worth the effort
This commit is contained in:
parent
5ba8b47a45
commit
0ac7b0dcbd
|
@ -66,7 +66,7 @@ __license__ = "GNU Lesser General Public License (LGPL)"
|
||||||
|
|
||||||
import transport, auth_transport, channel, rsakey, dsskey, message
|
import transport, auth_transport, channel, rsakey, dsskey, message
|
||||||
import ssh_exception, file, packet, agent, server
|
import ssh_exception, file, packet, agent, server
|
||||||
import sftp, sftp_client, sftp_attr, sftp_file, sftp_handle, sftp_server, sftp_si
|
import sftp_client, sftp_attr, sftp_handle, sftp_server, sftp_si
|
||||||
|
|
||||||
randpool = transport.randpool
|
randpool = transport.randpool
|
||||||
Transport = auth_transport.Transport
|
Transport = auth_transport.Transport
|
||||||
|
@ -80,7 +80,7 @@ BadAuthenticationType = ssh_exception.BadAuthenticationType
|
||||||
SFTP = sftp_client.SFTP
|
SFTP = sftp_client.SFTP
|
||||||
SFTPClient = sftp_client.SFTPClient
|
SFTPClient = sftp_client.SFTPClient
|
||||||
SFTPServer = sftp_server.SFTPServer
|
SFTPServer = sftp_server.SFTPServer
|
||||||
SFTPError = sftp.SFTPError
|
from sftp import SFTPError
|
||||||
SFTPAttributes = sftp_attr.SFTPAttributes
|
SFTPAttributes = sftp_attr.SFTPAttributes
|
||||||
SFTPHandle = sftp_handle.SFTPHandle
|
SFTPHandle = sftp_handle.SFTPHandle
|
||||||
SFTPServerInterface = sftp_si.SFTPServerInterface
|
SFTPServerInterface = sftp_si.SFTPServerInterface
|
||||||
|
|
|
@ -46,6 +46,9 @@ class Transport (BaseTransport):
|
||||||
self.username = None
|
self.username = None
|
||||||
self.authenticated = False
|
self.authenticated = False
|
||||||
self.auth_event = None
|
self.auth_event = None
|
||||||
|
self.auth_method = ''
|
||||||
|
self.password = None
|
||||||
|
self.private_key = None
|
||||||
# for server mode:
|
# for server mode:
|
||||||
self.auth_username = None
|
self.auth_username = None
|
||||||
self.auth_fail_count = 0
|
self.auth_fail_count = 0
|
||||||
|
|
|
@ -45,15 +45,15 @@ class BER(object):
|
||||||
def decode_next(self):
|
def decode_next(self):
|
||||||
if self.idx >= len(self.content):
|
if self.idx >= len(self.content):
|
||||||
return None
|
return None
|
||||||
id = ord(self.content[self.idx])
|
ident = ord(self.content[self.idx])
|
||||||
self.idx += 1
|
self.idx += 1
|
||||||
if (id & 31) == 31:
|
if (ident & 31) == 31:
|
||||||
# identifier > 30
|
# identifier > 30
|
||||||
id = 0
|
ident = 0
|
||||||
while self.idx < len(self.content):
|
while self.idx < len(self.content):
|
||||||
t = ord(self.content[self.idx])
|
t = ord(self.content[self.idx])
|
||||||
self.idx += 1
|
self.idx += 1
|
||||||
id = (id << 7) | (t & 0x7f)
|
ident = (ident << 7) | (t & 0x7f)
|
||||||
if not (t & 0x80):
|
if not (t & 0x80):
|
||||||
break
|
break
|
||||||
if self.idx >= len(self.content):
|
if self.idx >= len(self.content):
|
||||||
|
@ -75,29 +75,29 @@ class BER(object):
|
||||||
data = self.content[self.idx : self.idx + size]
|
data = self.content[self.idx : self.idx + size]
|
||||||
self.idx += size
|
self.idx += size
|
||||||
# now switch on id
|
# now switch on id
|
||||||
if id == 0x30:
|
if ident == 0x30:
|
||||||
# sequence
|
# sequence
|
||||||
return self.decode_sequence(data)
|
return self.decode_sequence(data)
|
||||||
elif id == 2:
|
elif ident == 2:
|
||||||
# int
|
# int
|
||||||
return util.inflate_long(data)
|
return util.inflate_long(data)
|
||||||
else:
|
else:
|
||||||
# 1: boolean (00 false, otherwise true)
|
# 1: boolean (00 false, otherwise true)
|
||||||
raise BERException('Unknown ber encoding type %d (robey is lazy)' % id)
|
raise BERException('Unknown ber encoding type %d (robey is lazy)' % ident)
|
||||||
|
|
||||||
def decode_sequence(data):
|
def decode_sequence(data):
|
||||||
out = []
|
out = []
|
||||||
b = BER(data)
|
b = BER(data)
|
||||||
while 1:
|
while True:
|
||||||
x = b.decode_next()
|
x = b.decode_next()
|
||||||
if x == None:
|
if x is None:
|
||||||
return out
|
return out
|
||||||
out.append(x)
|
out.append(x)
|
||||||
decode_sequence = staticmethod(decode_sequence)
|
decode_sequence = staticmethod(decode_sequence)
|
||||||
|
|
||||||
def encode_tlv(self, id, val):
|
def encode_tlv(self, ident, val):
|
||||||
# FIXME: support id > 31 someday
|
# no need to support ident > 31 here
|
||||||
self.content += chr(id)
|
self.content += chr(ident)
|
||||||
if len(val) > 0x7f:
|
if len(val) > 0x7f:
|
||||||
lenstr = util.deflate_long(len(val))
|
lenstr = util.deflate_long(len(val))
|
||||||
self.content += chr(0x80 + len(lenstr)) + lenstr
|
self.content += chr(0x80 + len(lenstr)) + lenstr
|
||||||
|
|
|
@ -60,6 +60,7 @@ class Channel (object):
|
||||||
@type chanid: int
|
@type chanid: int
|
||||||
"""
|
"""
|
||||||
self.chanid = chanid
|
self.chanid = chanid
|
||||||
|
self.remote_chanid = 0
|
||||||
self.transport = None
|
self.transport = None
|
||||||
self.active = False
|
self.active = False
|
||||||
self.eof_received = 0
|
self.eof_received = 0
|
||||||
|
@ -73,6 +74,12 @@ class Channel (object):
|
||||||
self.in_buffer_cv = threading.Condition(self.lock)
|
self.in_buffer_cv = threading.Condition(self.lock)
|
||||||
self.in_stderr_buffer_cv = threading.Condition(self.lock)
|
self.in_stderr_buffer_cv = threading.Condition(self.lock)
|
||||||
self.out_buffer_cv = threading.Condition(self.lock)
|
self.out_buffer_cv = threading.Condition(self.lock)
|
||||||
|
self.in_window_size = 0
|
||||||
|
self.out_window_size = 0
|
||||||
|
self.in_max_packet_size = 0
|
||||||
|
self.out_max_packet_size = 0
|
||||||
|
self.in_window_threshold = 0
|
||||||
|
self.in_window_sofar = 0
|
||||||
self.status_event = threading.Event()
|
self.status_event = threading.Event()
|
||||||
self.name = str(chanid)
|
self.name = str(chanid)
|
||||||
self.logger = util.get_logger('paramiko.chan.' + str(chanid))
|
self.logger = util.get_logger('paramiko.chan.' + str(chanid))
|
||||||
|
@ -1115,6 +1122,8 @@ class ChannelFile (BufferedFile):
|
||||||
def _write(self, data):
|
def _write(self, data):
|
||||||
self.channel.sendall(data)
|
self.channel.sendall(data)
|
||||||
return len(data)
|
return len(data)
|
||||||
|
|
||||||
|
seek = BufferedFile.seek
|
||||||
|
|
||||||
|
|
||||||
class ChannelStderrFile (ChannelFile):
|
class ChannelStderrFile (ChannelFile):
|
||||||
|
|
|
@ -56,6 +56,7 @@ class DSSKey (PKey):
|
||||||
self.g = msg.get_mpint()
|
self.g = msg.get_mpint()
|
||||||
self.y = msg.get_mpint()
|
self.y = msg.get_mpint()
|
||||||
self.size = util.bit_length(self.p)
|
self.size = util.bit_length(self.p)
|
||||||
|
self.x = 0L
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
m = Message()
|
m = Message()
|
||||||
|
@ -84,16 +85,16 @@ class DSSKey (PKey):
|
||||||
def can_sign(self):
|
def can_sign(self):
|
||||||
return hasattr(self, 'x')
|
return hasattr(self, 'x')
|
||||||
|
|
||||||
def sign_ssh_data(self, randpool, data):
|
def sign_ssh_data(self, rpool, data):
|
||||||
hash = SHA.new(data).digest()
|
digest = SHA.new(data).digest()
|
||||||
dss = DSA.construct((long(self.y), long(self.g), long(self.p), long(self.q), long(self.x)))
|
dss = DSA.construct((long(self.y), long(self.g), long(self.p), long(self.q), long(self.x)))
|
||||||
# generate a suitable k
|
# generate a suitable k
|
||||||
qsize = len(util.deflate_long(self.q, 0))
|
qsize = len(util.deflate_long(self.q, 0))
|
||||||
while 1:
|
while 1:
|
||||||
k = util.inflate_long(randpool.get_bytes(qsize), 1)
|
k = util.inflate_long(rpool.get_bytes(qsize), 1)
|
||||||
if (k > 2) and (k < self.q):
|
if (k > 2) and (k < self.q):
|
||||||
break
|
break
|
||||||
r, s = dss.sign(util.inflate_long(hash, 1), k)
|
r, s = dss.sign(util.inflate_long(digest, 1), k)
|
||||||
m = Message()
|
m = Message()
|
||||||
m.add_string('ssh-dss')
|
m.add_string('ssh-dss')
|
||||||
m.add_string(util.deflate_long(r, 0) + util.deflate_long(s, 0))
|
m.add_string(util.deflate_long(r, 0) + util.deflate_long(s, 0))
|
||||||
|
|
|
@ -96,30 +96,30 @@ class KexGex (object):
|
||||||
self.x = x
|
self.x = x
|
||||||
|
|
||||||
def _parse_kexdh_gex_request(self, m):
|
def _parse_kexdh_gex_request(self, m):
|
||||||
min = m.get_int()
|
minbits = m.get_int()
|
||||||
preferred = m.get_int()
|
preferredbits = m.get_int()
|
||||||
max = m.get_int()
|
maxbits = m.get_int()
|
||||||
# smoosh the user's preferred size into our own limits
|
# smoosh the user's preferred size into our own limits
|
||||||
if preferred > self.max_bits:
|
if preferredbits > self.max_bits:
|
||||||
preferred = self.max_bits
|
preferredbits = self.max_bits
|
||||||
if preferred < self.min_bits:
|
if preferredbits < self.min_bits:
|
||||||
preferred = self.min_bits
|
preferredbits = self.min_bits
|
||||||
# fix min/max if they're inconsistent. technically, we could just pout
|
# fix min/max if they're inconsistent. technically, we could just pout
|
||||||
# and hang up, but there's no harm in giving them the benefit of the
|
# and hang up, but there's no harm in giving them the benefit of the
|
||||||
# doubt and just picking a bitsize for them.
|
# doubt and just picking a bitsize for them.
|
||||||
if min > preferred:
|
if minbits > preferredbits:
|
||||||
min = preferred
|
minbits = preferredbits
|
||||||
if max < preferred:
|
if maxbits < preferredbits:
|
||||||
max = preferred
|
maxbits = preferredbits
|
||||||
# now save a copy
|
# now save a copy
|
||||||
self.min_bits = min
|
self.min_bits = minbits
|
||||||
self.preferred_bits = preferred
|
self.preferred_bits = preferredbits
|
||||||
self.max_bits = max
|
self.max_bits = maxbits
|
||||||
# generate prime
|
# generate prime
|
||||||
pack = self.transport._get_modulus_pack()
|
pack = self.transport._get_modulus_pack()
|
||||||
if pack is None:
|
if pack is None:
|
||||||
raise SSHException('Can\'t do server-side gex with no modulus pack')
|
raise SSHException('Can\'t do server-side gex with no modulus pack')
|
||||||
self.g, self.p = pack.get_modulus(min, preferred, max)
|
self.g, self.p = pack.get_modulus(minbits, preferredbits, maxbits)
|
||||||
m = Message()
|
m = Message()
|
||||||
m.add_byte(chr(_MSG_KEXDH_GEX_GROUP))
|
m.add_byte(chr(_MSG_KEXDH_GEX_GROUP))
|
||||||
m.add_mpint(self.p)
|
m.add_mpint(self.p)
|
||||||
|
|
|
@ -41,6 +41,9 @@ class KexGroup1(object):
|
||||||
|
|
||||||
def __init__(self, transport):
|
def __init__(self, transport):
|
||||||
self.transport = transport
|
self.transport = transport
|
||||||
|
self.x = 0L
|
||||||
|
self.e = 0L
|
||||||
|
self.f = 0L
|
||||||
|
|
||||||
def start_kex(self):
|
def start_kex(self):
|
||||||
self._generate_x()
|
self._generate_x()
|
||||||
|
|
|
@ -194,7 +194,7 @@ class Packetizer (object):
|
||||||
n = 0
|
n = 0
|
||||||
if self.__closed:
|
if self.__closed:
|
||||||
n = -1
|
n = -1
|
||||||
except Exception, x:
|
except Exception:
|
||||||
# could be: (32, 'Broken pipe')
|
# could be: (32, 'Broken pipe')
|
||||||
n = -1
|
n = -1
|
||||||
if n < 0:
|
if n < 0:
|
||||||
|
@ -210,14 +210,14 @@ class Packetizer (object):
|
||||||
way, but is only used for initial banner negotiation so it's not worth
|
way, but is only used for initial banner negotiation so it's not worth
|
||||||
optimising.
|
optimising.
|
||||||
"""
|
"""
|
||||||
buffer = ''
|
buf = ''
|
||||||
while not '\n' in buffer:
|
while not '\n' in buf:
|
||||||
buffer += self._read_timeout(timeout)
|
buf += self._read_timeout(timeout)
|
||||||
buffer = buffer[:-1]
|
buf = buf[:-1]
|
||||||
if (len(buffer) > 0) and (buffer[-1] == '\r'):
|
if (len(buf) > 0) and (buf[-1] == '\r'):
|
||||||
buffer = buffer[:-1]
|
buf = buf[:-1]
|
||||||
return buffer
|
return buf
|
||||||
|
|
||||||
def send_message(self, data):
|
def send_message(self, data):
|
||||||
"""
|
"""
|
||||||
Write a block of data using the current cipher, as an SSH block.
|
Write a block of data using the current cipher, as an SSH block.
|
||||||
|
@ -275,9 +275,9 @@ class Packetizer (object):
|
||||||
leftover = header[4:]
|
leftover = header[4:]
|
||||||
if (packet_size - len(leftover)) % self.__block_size_in != 0:
|
if (packet_size - len(leftover)) % self.__block_size_in != 0:
|
||||||
raise SSHException('Invalid packet blocking')
|
raise SSHException('Invalid packet blocking')
|
||||||
buffer = self.read_all(packet_size + self.__mac_size_in - len(leftover))
|
buf = self.read_all(packet_size + self.__mac_size_in - len(leftover))
|
||||||
packet = buffer[:packet_size - len(leftover)]
|
packet = buf[:packet_size - len(leftover)]
|
||||||
post_packet = buffer[packet_size - len(leftover):]
|
post_packet = buf[packet_size - len(leftover):]
|
||||||
if self.__block_engine_in != None:
|
if self.__block_engine_in != None:
|
||||||
packet = self.__block_engine_in.decrypt(packet)
|
packet = self.__block_engine_in.decrypt(packet)
|
||||||
if self.__dump_packets:
|
if self.__dump_packets:
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
#!/usr/bin/python
|
|
||||||
|
|
||||||
# Copyright (C) 2003-2005 Robey Pointer <robey@lag.net>
|
# Copyright (C) 2003-2005 Robey Pointer <robey@lag.net>
|
||||||
#
|
#
|
||||||
# This file is part of paramiko.
|
# This file is part of paramiko.
|
||||||
|
@ -42,7 +40,7 @@ def _generate_prime(bits, randpool):
|
||||||
if util.bit_length(n) == bits:
|
if util.bit_length(n) == bits:
|
||||||
return n
|
return n
|
||||||
|
|
||||||
def _roll_random(randpool, n):
|
def _roll_random(rpool, n):
|
||||||
"returns a random # from 0 to N-1"
|
"returns a random # from 0 to N-1"
|
||||||
bits = util.bit_length(n-1)
|
bits = util.bit_length(n-1)
|
||||||
bytes = (bits + 7) // 8
|
bytes = (bits + 7) // 8
|
||||||
|
@ -55,7 +53,7 @@ def _roll_random(randpool, n):
|
||||||
# fits, so i can't guarantee that this loop will ever finish, but the odds
|
# fits, so i can't guarantee that this loop will ever finish, but the odds
|
||||||
# of it looping forever should be infinitesimal.
|
# of it looping forever should be infinitesimal.
|
||||||
while True:
|
while True:
|
||||||
x = randpool.get_bytes(bytes)
|
x = rpool.get_bytes(bytes)
|
||||||
if hbyte_mask > 0:
|
if hbyte_mask > 0:
|
||||||
x = chr(ord(x[0]) & hbyte_mask) + x[1:]
|
x = chr(ord(x[0]) & hbyte_mask) + x[1:]
|
||||||
num = util.inflate_long(x, 1)
|
num = util.inflate_long(x, 1)
|
||||||
|
@ -69,11 +67,11 @@ class ModulusPack (object):
|
||||||
on systems that have such a file.
|
on systems that have such a file.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, randpool):
|
def __init__(self, rpool):
|
||||||
# pack is a hash of: bits -> [ (generator, modulus) ... ]
|
# pack is a hash of: bits -> [ (generator, modulus) ... ]
|
||||||
self.pack = {}
|
self.pack = {}
|
||||||
self.discarded = []
|
self.discarded = []
|
||||||
self.randpool = randpool
|
self.randpool = rpool
|
||||||
|
|
||||||
def _parse_modulus(self, line):
|
def _parse_modulus(self, line):
|
||||||
timestamp, type, tests, tries, size, generator, modulus = line.split()
|
timestamp, type, tests, tries, size, generator, modulus = line.split()
|
||||||
|
|
|
@ -76,10 +76,10 @@ class RSAKey (PKey):
|
||||||
def can_sign(self):
|
def can_sign(self):
|
||||||
return hasattr(self, 'd')
|
return hasattr(self, 'd')
|
||||||
|
|
||||||
def sign_ssh_data(self, randpool, data):
|
def sign_ssh_data(self, rpool, data):
|
||||||
hash = SHA.new(data).digest()
|
digest = SHA.new(data).digest()
|
||||||
rsa = RSA.construct((long(self.n), long(self.e), long(self.d)))
|
rsa = RSA.construct((long(self.n), long(self.e), long(self.d)))
|
||||||
sig = util.deflate_long(rsa.sign(self._pkcs1imify(hash), '')[0], 0)
|
sig = util.deflate_long(rsa.sign(self._pkcs1imify(digest), '')[0], 0)
|
||||||
m = Message()
|
m = Message()
|
||||||
m.add_string('ssh-rsa')
|
m.add_string('ssh-rsa')
|
||||||
m.add_string(sig)
|
m.add_string(sig)
|
||||||
|
|
|
@ -92,6 +92,8 @@ class SFTPError (Exception):
|
||||||
class BaseSFTP (object):
|
class BaseSFTP (object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.logger = util.get_logger('paramiko.sftp')
|
self.logger = util.get_logger('paramiko.sftp')
|
||||||
|
self.sock = None
|
||||||
|
self.ultra_debug = False
|
||||||
|
|
||||||
|
|
||||||
### internals...
|
### internals...
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
#!/usr/bin/python
|
|
||||||
|
|
||||||
# Copyright (C) 2003-2005 Robey Pointer <robey@lag.net>
|
# Copyright (C) 2003-2005 Robey Pointer <robey@lag.net>
|
||||||
#
|
#
|
||||||
# This file is part of paramiko.
|
# This file is part of paramiko.
|
||||||
|
@ -54,10 +52,12 @@ class SFTPHandle (object):
|
||||||
using the default implementations of L{read} and L{write}, this
|
using the default implementations of L{read} and L{write}, this
|
||||||
method's default implementation should be fine also.
|
method's default implementation should be fine also.
|
||||||
"""
|
"""
|
||||||
if hasattr(self, 'readfile') and (self.readfile is not None):
|
readfile = getattr(self, 'readfile', None)
|
||||||
self.readfile.close()
|
if readfile is not None:
|
||||||
if hasattr(self, 'writefile') and (self.writefile is not None):
|
readfile.close()
|
||||||
self.writefile.close()
|
writefile = getattr(self, 'writefile', None)
|
||||||
|
if writefile is not None:
|
||||||
|
writefile.close()
|
||||||
|
|
||||||
def read(self, offset, length):
|
def read(self, offset, length):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue