# Copyright (C) 2003-2007  Robey Pointer <robeypointer@gmail.com>## This file is part of paramiko.## Paramiko is free software; you can redistribute it and/or modify it under the# terms of the GNU Lesser General Public License as published by the Free# Software Foundation; either version 2.1 of the License, or (at your option)# any later version.## Paramiko is distributed in the hope that it will be useful, but WITHOUT ANY# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR# A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more# details.## You should have received a copy of the GNU Lesser General Public License# along with Paramiko; if not, write to the Free Software Foundation, Inc.,# 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA."""Common constants and global variables."""import loggingfrom paramiko.py3compat import byte_chr, PY2, bytes_types, text_type, longMSG_DISCONNECT, MSG_IGNORE, MSG_UNIMPLEMENTED, MSG_DEBUG, \    MSG_SERVICE_REQUEST, MSG_SERVICE_ACCEPT = range(1, 7)MSG_KEXINIT, MSG_NEWKEYS = range(20, 22)MSG_USERAUTH_REQUEST, MSG_USERAUTH_FAILURE, MSG_USERAUTH_SUCCESS, \    MSG_USERAUTH_BANNER = range(50, 54)MSG_USERAUTH_PK_OK = 60MSG_USERAUTH_INFO_REQUEST, MSG_USERAUTH_INFO_RESPONSE = range(60, 62)MSG_USERAUTH_GSSAPI_RESPONSE, MSG_USERAUTH_GSSAPI_TOKEN = range(60, 62)MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE, MSG_USERAUTH_GSSAPI_ERROR,\    MSG_USERAUTH_GSSAPI_ERRTOK, MSG_USERAUTH_GSSAPI_MIC = range(63, 67)# BUG: CWE-287 Improper Authentication# # FIXED: HIGHEST_USERAUTH_MESSAGE_ID = 79MSG_GLOBAL_REQUEST, MSG_REQUEST_SUCCESS, MSG_REQUEST_FAILURE = range(80, 83)MSG_CHANNEL_OPEN, MSG_CHANNEL_OPEN_SUCCESS, MSG_CHANNEL_OPEN_FAILURE, \    MSG_CHANNEL_WINDOW_ADJUST, MSG_CHANNEL_DATA, MSG_CHANNEL_EXTENDED_DATA, \    MSG_CHANNEL_EOF, MSG_CHANNEL_CLOSE, MSG_CHANNEL_REQUEST, \    MSG_CHANNEL_SUCCESS, MSG_CHANNEL_FAILURE = range(90, 101)cMSG_DISCONNECT = byte_chr(MSG_DISCONNECT)cMSG_IGNORE = byte_chr(MSG_IGNORE)cMSG_UNIMPLEMENTED = byte_chr(MSG_UNIMPLEMENTED)cMSG_DEBUG = byte_chr(MSG_DEBUG)cMSG_SERVICE_REQUEST = byte_chr(MSG_SERVICE_REQUEST)cMSG_SERVICE_ACCEPT = byte_chr(MSG_SERVICE_ACCEPT)cMSG_KEXINIT = byte_chr(MSG_KEXINIT)cMSG_NEWKEYS = byte_chr(MSG_NEWKEYS)cMSG_USERAUTH_REQUEST = byte_chr(MSG_USERAUTH_REQUEST)cMSG_USERAUTH_FAILURE = byte_chr(MSG_USERAUTH_FAILURE)cMSG_USERAUTH_SUCCESS = byte_chr(MSG_USERAUTH_SUCCESS)cMSG_USERAUTH_BANNER = byte_chr(MSG_USERAUTH_BANNER)cMSG_USERAUTH_PK_OK = byte_chr(MSG_USERAUTH_PK_OK)cMSG_USERAUTH_INFO_REQUEST = byte_chr(MSG_USERAUTH_INFO_REQUEST)cMSG_USERAUTH_INFO_RESPONSE = byte_chr(MSG_USERAUTH_INFO_RESPONSE)cMSG_USERAUTH_GSSAPI_RESPONSE = byte_chr(MSG_USERAUTH_GSSAPI_RESPONSE)cMSG_USERAUTH_GSSAPI_TOKEN = byte_chr(MSG_USERAUTH_GSSAPI_TOKEN)cMSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE = \    byte_chr(MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE)cMSG_USERAUTH_GSSAPI_ERROR = byte_chr(MSG_USERAUTH_GSSAPI_ERROR)cMSG_USERAUTH_GSSAPI_ERRTOK = byte_chr(MSG_USERAUTH_GSSAPI_ERRTOK)cMSG_USERAUTH_GSSAPI_MIC = byte_chr(MSG_USERAUTH_GSSAPI_MIC)cMSG_GLOBAL_REQUEST = byte_chr(MSG_GLOBAL_REQUEST)cMSG_REQUEST_SUCCESS = byte_chr(MSG_REQUEST_SUCCESS)cMSG_REQUEST_FAILURE = byte_chr(MSG_REQUEST_FAILURE)cMSG_CHANNEL_OPEN = byte_chr(MSG_CHANNEL_OPEN)cMSG_CHANNEL_OPEN_SUCCESS = byte_chr(MSG_CHANNEL_OPEN_SUCCESS)cMSG_CHANNEL_OPEN_FAILURE = byte_chr(MSG_CHANNEL_OPEN_FAILURE)cMSG_CHANNEL_WINDOW_ADJUST = byte_chr(MSG_CHANNEL_WINDOW_ADJUST)cMSG_CHANNEL_DATA = byte_chr(MSG_CHANNEL_DATA)cMSG_CHANNEL_EXTENDED_DATA = byte_chr(MSG_CHANNEL_EXTENDED_DATA)cMSG_CHANNEL_EOF = byte_chr(MSG_CHANNEL_EOF)cMSG_CHANNEL_CLOSE = byte_chr(MSG_CHANNEL_CLOSE)cMSG_CHANNEL_REQUEST = byte_chr(MSG_CHANNEL_REQUEST)cMSG_CHANNEL_SUCCESS = byte_chr(MSG_CHANNEL_SUCCESS)cMSG_CHANNEL_FAILURE = byte_chr(MSG_CHANNEL_FAILURE)# for debugging:MSG_NAMES = {    MSG_DISCONNECT: 'disconnect',    MSG_IGNORE: 'ignore',    MSG_UNIMPLEMENTED: 'unimplemented',    MSG_DEBUG: 'debug',    MSG_SERVICE_REQUEST: 'service-request',    MSG_SERVICE_ACCEPT: 'service-accept',    MSG_KEXINIT: 'kexinit',    MSG_NEWKEYS: 'newkeys',    30: 'kex30',    31: 'kex31',    32: 'kex32',    33: 'kex33',    34: 'kex34',    40: 'kex40',    41: 'kex41',    MSG_USERAUTH_REQUEST: 'userauth-request',    MSG_USERAUTH_FAILURE: 'userauth-failure',    MSG_USERAUTH_SUCCESS: 'userauth-success',    MSG_USERAUTH_BANNER: 'userauth--banner',    MSG_USERAUTH_PK_OK: 'userauth-60(pk-ok/info-request)',    MSG_USERAUTH_INFO_RESPONSE: 'userauth-info-response',    MSG_GLOBAL_REQUEST: 'global-request',    MSG_REQUEST_SUCCESS: 'request-success',    MSG_REQUEST_FAILURE: 'request-failure',    MSG_CHANNEL_OPEN: 'channel-open',    MSG_CHANNEL_OPEN_SUCCESS: 'channel-open-success',    MSG_CHANNEL_OPEN_FAILURE: 'channel-open-failure',    MSG_CHANNEL_WINDOW_ADJUST: 'channel-window-adjust',    MSG_CHANNEL_DATA: 'channel-data',    MSG_CHANNEL_EXTENDED_DATA: 'channel-extended-data',    MSG_CHANNEL_EOF: 'channel-eof',    MSG_CHANNEL_CLOSE: 'channel-close',    MSG_CHANNEL_REQUEST: 'channel-request',    MSG_CHANNEL_SUCCESS: 'channel-success',    MSG_CHANNEL_FAILURE: 'channel-failure',    MSG_USERAUTH_GSSAPI_RESPONSE: 'userauth-gssapi-response',    MSG_USERAUTH_GSSAPI_TOKEN: 'userauth-gssapi-token',    MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE: 'userauth-gssapi-exchange-complete',    MSG_USERAUTH_GSSAPI_ERROR: 'userauth-gssapi-error',    MSG_USERAUTH_GSSAPI_ERRTOK: 'userauth-gssapi-error-token',    MSG_USERAUTH_GSSAPI_MIC: 'userauth-gssapi-mic'}# authentication request return codes:AUTH_SUCCESSFUL, AUTH_PARTIALLY_SUCCESSFUL, AUTH_FAILED = range(3)# channel request failed reasons:(OPEN_SUCCEEDED, OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED, OPEN_FAILED_CONNECT_FAILED, OPEN_FAILED_UNKNOWN_CHANNEL_TYPE, OPEN_FAILED_RESOURCE_SHORTAGE) = range(0, 5)CONNECTION_FAILED_CODE = {    1: 'Administratively prohibited',    2: 'Connect failed',    3: 'Unknown channel type',    4: 'Resource shortage'}DISCONNECT_SERVICE_NOT_AVAILABLE, DISCONNECT_AUTH_CANCELLED_BY_USER, \    DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE = 7, 13, 14zero_byte = byte_chr(0)one_byte = byte_chr(1)four_byte = byte_chr(4)max_byte = byte_chr(0xff)cr_byte = byte_chr(13)linefeed_byte = byte_chr(10)crlf = cr_byte + linefeed_byteif PY2:    cr_byte_value = cr_byte    linefeed_byte_value = linefeed_byteelse:    cr_byte_value = 13    linefeed_byte_value = 10def asbytes(s):    """Coerce to bytes if possible or return unchanged."""    if isinstance(s, bytes_types):        return s    if isinstance(s, text_type):        # Accept text and encode as utf-8 for compatibility only.        return s.encode("utf-8")    asbytes = getattr(s, "asbytes", None)    if asbytes is not None:        return asbytes()    # May be an object that implements the buffer api, let callers handle.    return sxffffffff = long(0xffffffff)x80000000 = long(0x80000000)o666 = 438o660 = 432o644 = 420o600 = 384o777 = 511o700 = 448o70 = 56DEBUG = logging.DEBUGINFO = logging.INFOWARNING = logging.WARNINGERROR = logging.ERRORCRITICAL = logging.CRITICAL# Common IO/select/etc sleep period, in secondsio_sleep = 0.01DEFAULT_WINDOW_SIZE = 64 * 2 ** 15DEFAULT_MAX_PACKET_SIZE = 2 ** 15# lower bound on the max packet size we'll accept from the remote host# Minimum packet size is 32768 bytes according to# http://www.ietf.org/rfc/rfc4254.txtMIN_WINDOW_SIZE = 2 ** 15# However, according to http://www.ietf.org/rfc/rfc4253.txt it is perfectly# legal to accept a size much smaller, as OpenSSH client does as size 16384.MIN_PACKET_SIZE = 2 ** 12# Max windows size according to http://www.ietf.org/rfc/rfc4254.txtMAX_WINDOW_SIZE = 2 ** 32 - 1