diff --git a/code/pymqi/CMQC.py b/code/pymqi/CMQC.py index 3d78f749cb97d695d738454fd94a5493b90e2f1b_Y29kZS9weW1xaS9DTVFDLnB5..36d627ad6427d8c48d55eda5dbd69a482a0ab2a2_Y29kZS9weW1xaS9DTVFDLnB5 100644 --- a/code/pymqi/CMQC.py +++ b/code/pymqi/CMQC.py @@ -804,6 +804,7 @@ MQCA_BASE_OBJECT_NAME = 2002 MQCA_BASE_Q_NAME = 2002 MQCA_BATCH_INTERFACE_ID = 2068 +MQCA_CERT_LABEL = 2121 MQCA_CF_STRUC_DESC = 2052 MQCA_CF_STRUC_NAME = 2039 MQCA_CHANNEL_AUTO_DEF_EXIT = 2026 @@ -886,6 +887,7 @@ MQCA_TRIGGER_TRANS_ID = 2061 MQCA_USER_DATA = 2021 MQCA_USER_LIST = 4000 +MQCA_VERSION = 2120 MQCA_XCF_GROUP_NAME = 2043 MQCA_XCF_MEMBER_NAME = 2044 MQCA_XMIT_Q_NAME = 2024 @@ -913,6 +915,7 @@ MQIA_CHANNEL_AUTO_DEF = 55 MQIA_CHANNEL_AUTO_DEF_EVENT = 56 MQIA_CHANNEL_EVENT = 73 +MQIA_CHECK_CLIENT_BINDING = 258 MQIA_CHINIT_ADAPTERS = 101 MQIA_CHINIT_CONTROL = 119 MQIA_CHINIT_DISPATCHERS = 105 @@ -2079,6 +2082,13 @@ MQWS_TOPIC = 2 MQRR_DEFAULT = MQCC_OK, MQRC_NONE +MQUSRC_MAP = 0 +MQUSRC_NOACCESS = 1 +MQUSRC_CHANNEL = 2 + +MQWARN_YES = 1 +MQWARN_NO = 0 + # Manually added MQGS_NOT_IN_GROUP = ord(' ') diff --git a/code/pymqi/CMQCFC.py b/code/pymqi/CMQCFC.py index 3d78f749cb97d695d738454fd94a5493b90e2f1b_Y29kZS9weW1xaS9DTVFDRkMucHk=..36d627ad6427d8c48d55eda5dbd69a482a0ab2a2_Y29kZS9weW1xaS9DTVFDRkMucHk= 100644 --- a/code/pymqi/CMQCFC.py +++ b/code/pymqi/CMQCFC.py @@ -169,6 +169,37 @@ MQCMD_INQUIRE_TOPIC_STATUS = 183 MQCMD_CLEAR_TOPIC_STRING = 184 MQCMD_INQUIRE_PUBSUB_STATUS = 185 +MQCMD_INQUIRE_SMDS = 186 +MQCMD_CHANGE_SMDS = 187 +MQCMD_RESET_SMDS = 188 +MQCMD_CREATE_COMM_INFO = 190 +MQCMD_INQUIRE_COMM_INFO = 191 +MQCMD_CHANGE_COMM_INFO = 192 +MQCMD_COPY_COMM_INFO = 193 +MQCMD_DELETE_COMM_INFO = 194 +MQCMD_PURGE_CHANNEL = 195 +MQCMD_MQXR_DIAGNOSTICS = 196 +MQCMD_START_SMDSCONN = 197 +MQCMD_STOP_SMDSCONN = 198 +MQCMD_INQUIRE_SMDSCONN = 199 +MQCMD_INQUIRE_MQXR_STATUS = 200 +MQCMD_START_CLIENT_TRACE = 201 +MQCMD_STOP_CLIENT_TRACE = 202 +MQCMD_SET_CHLAUTH_REC = 203 +MQCMD_INQUIRE_CHLAUTH_RECS = 204 +MQCMD_INQUIRE_PROT_POLICY = 205 +MQCMD_CREATE_PROT_POLICY = 206 +MQCMD_DELETE_PROT_POLICY = 207 +MQCMD_CHANGE_PROT_POLICY = 208 +MQCMD_SET_PROT_POLICY = 208 +MQCMD_ACTIVITY_TRACE = 209 +MQCMD_RESET_CF_STRUC = 213 +MQCMD_INQUIRE_XR_CAPABILITY = 214 +MQCMD_INQUIRE_AMQP_CAPABILITY = 216 +MQCMD_AMQP_DIAGNOSTICS = 217 +MQCMD_INTER_Q_MGR_STATUS = 218 +MQCMD_INTER_Q_MGR_BALANCE = 219 +MQCMD_INQUIRE_APPL_STATUS = 220 MQCFC_LAST = 1 MQCFC_NOT_LAST = 0 MQRCCF_CFH_TYPE_ERROR = 3001 @@ -370,6 +401,72 @@ MQRCCF_DEST_NAME_ERROR = 3316 MQRCCF_INVALID_DESTINATION = 3317 MQRCCF_PUBSUB_INHIBITED = 3318 +MQRCCF_GROUPUR_CHECKS_FAILED = 3319 +MQRCCF_COMM_INFO_TYPE_ERROR = 3320 +MQRCCF_USE_CLIENT_ID_ERROR = 3321 +MQRCCF_CLIENT_ID_NOT_FOUND = 3322 +MQRCCF_CLIENT_ID_ERROR = 3323 +MQRCCF_PORT_IN_USE = 3324 +MQRCCF_SSL_ALT_PROVIDER_REQD = 3325 +MQRCCF_CHLAUTH_TYPE_ERROR = 3326 +MQRCCF_CHLAUTH_ACTION_ERROR = 3327 +MQRCCF_POLICY_NOT_FOUND = 3328 +MQRCCF_ENCRYPTION_ALG_ERROR = 3329 +MQRCCF_SIGNATURE_ALG_ERROR = 3330 +MQRCCF_TOLERATION_POL_ERROR = 3331 +MQRCCF_POLICY_VERSION_ERROR = 3332 +MQRCCF_RECIPIENT_DN_MISSING = 3333 +MQRCCF_POLICY_NAME_MISSING = 3334 +MQRCCF_CHLAUTH_USERSRC_ERROR = 3335 +MQRCCF_WRONG_CHLAUTH_TYPE = 3336 +MQRCCF_CHLAUTH_ALREADY_EXISTS = 3337 +MQRCCF_CHLAUTH_NOT_FOUND = 3338 +MQRCCF_WRONG_CHLAUTH_ACTION = 3339 +MQRCCF_WRONG_CHLAUTH_USERSRC = 3340 +MQRCCF_CHLAUTH_WARN_ERROR = 3341 +MQRCCF_WRONG_CHLAUTH_MATCH = 3342 +MQRCCF_IPADDR_RANGE_CONFLICT = 3343 +MQRCCF_CHLAUTH_MAX_EXCEEDED = 3344 +MQRCCF_IPADDR_ERROR = 3345 +MQRCCF_ADDRESS_ERROR = 3345 +MQRCCF_IPADDR_RANGE_ERROR = 3346 +MQRCCF_PROFILE_NAME_MISSING = 3347 +MQRCCF_CHLAUTH_CLNTUSER_ERROR = 3348 +MQRCCF_CHLAUTH_NAME_ERROR = 3349 +MQRCCF_CHLAUTH_RUNCHECK_ERROR = 3350 +MQRCCF_CF_STRUC_ALREADY_FAILED = 3351 +MQRCCF_CFCONLOS_CHECKS_FAILED = 3352 +MQRCCF_SUITE_B_ERROR = 3353 +MQRCCF_CHANNEL_NOT_STARTED = 3354 +MQRCCF_CUSTOM_ERROR = 3355 +MQRCCF_BACKLOG_OUT_OF_RANGE = 3356 +MQRCCF_CHLAUTH_DISABLED = 3357 +MQRCCF_SMDS_REQUIRES_DSGROUP = 3358 +MQRCCF_PSCLUS_DISABLED_TOPDEF = 3359 +MQRCCF_PSCLUS_TOPIC_EXISTS = 3360 +MQRCCF_SSL_CIPHER_SUITE_ERROR = 3361 +MQRCCF_SOCKET_ERROR = 3362 +MQRCCF_CLUS_XMIT_Q_USAGE_ERROR = 3363 +MQRCCF_CERT_VAL_POLICY_ERROR = 3364 +MQRCCF_INVALID_PROTOCOL = 3365 +MQRCCF_REVDNS_DISABLED = 3366 +MQRCCF_CLROUTE_NOT_ALTERABLE = 3367 +MQRCCF_CLUSTER_TOPIC_CONFLICT = 3368 +MQRCCF_DEFCLXQ_MODEL_Q_ERROR = 3369 +MQRCCF_CHLAUTH_CHKCLI_ERROR = 3370 +MQRCCF_CERT_LABEL_NOT_ALLOWED = 3371 +MQRCCF_Q_MGR_ATTR_CONFLICT = 3372 +MQRCCF_ENTITY_TYPE_MISSING = 3373 +MQRCCF_CLWL_EXIT_NAME_ERROR = 3374 +MQRCCF_SERVICE_NAME_ERROR = 3375 +MQRCCF_REMOTE_CHL_TYPE_ERROR = 3376 +MQRCCF_TOPIC_RESTRICTED = 3377 +MQRCCF_CURRENT_LOG_EXTENT = 3378 +MQRCCF_LOG_EXTENT_NOT_FOUND = 3379 +MQRCCF_LOG_NOT_REDUCED = 3380 +MQRCCF_LOG_EXTENT_ERROR = 3381 +MQRCCF_ACCESS_BLOCKED = 3382 +MQRCCF_PS_REQUIRED_MQUC = 3383 MQRCCF_OBJECT_ALREADY_EXISTS = 4001 MQRCCF_OBJECT_WRONG_TYPE = 4002 MQRCCF_LIKE_OBJECT_WRONG_TYPE = 4003 @@ -907,7 +1004,121 @@ MQIACF_PUBSUB_STATUS = 1311 MQIACF_PS_STATUS_TYPE = 1314 MQIACF_PUBSUB_STATUS_ATTRS = 1318 -MQIACF_LAST_USED = 1318 +MQIACF_SELECTOR_TYPE = 1321 +MQIACF_LOG_COMPRESSION = 1322 +MQIACF_GROUPUR_CHECK_ID = 1323 +MQIACF_MULC_CAPTURE = 1324 +MQIACF_PERMIT_STANDBY = 1325 +MQIACF_OPERATION_MODE = 1326 +MQIACF_COMM_INFO_ATTRS = 1327 +MQIACF_CF_SMDS_BLOCK_SIZE = 1328 +MQIACF_CF_SMDS_EXPAND = 1329 +MQIACF_USAGE_FREE_BUFF = 1330 +MQIACF_USAGE_FREE_BUFF_PERC = 1331 +MQIACF_CF_STRUC_ACCESS = 1332 +MQIACF_CF_STATUS_SMDS = 1333 +MQIACF_SMDS_ATTRS = 1334 +MQIACF_USAGE_SMDS = 1335 +MQIACF_USAGE_BLOCK_SIZE = 1336 +MQIACF_USAGE_DATA_BLOCKS = 1337 +MQIACF_USAGE_EMPTY_BUFFERS = 1338 +MQIACF_USAGE_INUSE_BUFFERS = 1339 +MQIACF_USAGE_LOWEST_FREE = 1340 +MQIACF_USAGE_OFFLOAD_MSGS = 1341 +MQIACF_USAGE_READS_SAVED = 1342 +MQIACF_USAGE_SAVED_BUFFERS = 1343 +MQIACF_USAGE_TOTAL_BLOCKS = 1344 +MQIACF_USAGE_USED_BLOCKS = 1345 +MQIACF_USAGE_USED_RATE = 1346 +MQIACF_USAGE_WAIT_RATE = 1347 +MQIACF_SMDS_OPENMODE = 1348 +MQIACF_SMDS_STATUS = 1349 +MQIACF_SMDS_AVAIL = 1350 +MQIACF_MCAST_REL_INDICATOR = 1351 +MQIACF_CHLAUTH_TYPE = 1352 +MQIACF_MQXR_DIAGNOSTICS_TYPE = 1354 +MQIACF_CHLAUTH_ATTRS = 1355 +MQIACF_OPERATION_ID = 1356 +MQIACF_API_CALLER_TYPE = 1357 +MQIACF_API_ENVIRONMENT = 1358 +MQIACF_TRACE_DETAIL = 1359 +MQIACF_HOBJ = 1360 +MQIACF_CALL_TYPE = 1361 +MQIACF_MQCB_OPERATION = 1362 +MQIACF_MQCB_TYPE = 1363 +MQIACF_MQCB_OPTIONS = 1364 +MQIACF_CLOSE_OPTIONS = 1365 +MQIACF_CTL_OPERATION = 1366 +MQIACF_GET_OPTIONS = 1367 +MQIACF_RECS_PRESENT = 1368 +MQIACF_KNOWN_DEST_COUNT = 1369 +MQIACF_UNKNOWN_DEST_COUNT = 1370 +MQIACF_INVALID_DEST_COUNT = 1371 +MQIACF_RESOLVED_TYPE = 1372 +MQIACF_PUT_OPTIONS = 1373 +MQIACF_BUFFER_LENGTH = 1374 +MQIACF_TRACE_DATA_LENGTH = 1375 +MQIACF_SMDS_EXPANDST = 1376 +MQIACF_STRUC_LENGTH = 1377 +MQIACF_ITEM_COUNT = 1378 +MQIACF_EXPIRY_TIME = 1379 +MQIACF_CONNECT_TIME = 1380 +MQIACF_DISCONNECT_TIME = 1381 +MQIACF_HSUB = 1382 +MQIACF_SUBRQ_OPTIONS = 1383 +MQIACF_XA_RMID = 1384 +MQIACF_XA_FLAGS = 1385 +MQIACF_XA_RETCODE = 1386 +MQIACF_XA_HANDLE = 1387 +MQIACF_XA_RETVAL = 1388 +MQIACF_STATUS_TYPE = 1389 +MQIACF_XA_COUNT = 1390 +MQIACF_SELECTOR_COUNT = 1391 +MQIACF_SELECTORS = 1392 +MQIACF_INTATTR_COUNT = 1393 +MQIACF_INT_ATTRS = 1394 +MQIACF_SUBRQ_ACTION = 1395 +MQIACF_NUM_PUBS = 1396 +MQIACF_POINTER_SIZE = 1397 +MQIACF_REMOVE_AUTHREC = 1398 +MQIACF_XR_ATTRS = 1399 +MQIACF_APPL_FUNCTION_TYPE = 1400 +MQIACF_AMQP_ATTRS = 1401 +MQIACF_EXPORT_TYPE = 1402 +MQIACF_EXPORT_ATTRS = 1403 +MQIACF_SYSTEM_OBJECTS = 1404 +MQIACF_CONNECTION_SWAP = 1405 +MQIACF_AMQP_DIAGNOSTICS_TYPE = 1406 +MQIACF_BUFFER_POOL_LOCATION = 1408 +MQIACF_LDAP_CONNECTION_STATUS = 1409 +MQIACF_SYSP_MAX_ACE_POOL = 1410 +MQIACF_PAGECLAS = 1411 +MQIACF_AUTH_REC_TYPE = 1412 +MQIACF_SYSP_MAX_CONC_OFFLOADS = 1413 +MQIACF_SYSP_ZHYPERWRITE = 1414 +MQIACF_Q_MGR_STATUS_LOG = 1415 +MQIACF_ARCHIVE_LOG_SIZE = 1416 +MQIACF_MEDIA_LOG_SIZE = 1417 +MQIACF_RESTART_LOG_SIZE = 1418 +MQIACF_REUSABLE_LOG_SIZE = 1419 +MQIACF_LOG_IN_USE = 1420 +MQIACF_LOG_UTILIZATION = 1421 +MQIACF_LOG_REDUCTION = 1422 +MQIACF_IGNORE_STATE = 1423 +MQIACF_MOVABLE_APPL_COUNT = 1424 +MQIACF_APPL_INFO_ATTRS = 1425 +MQIACF_APPL_MOVABLE = 1426 +MQIACF_REMOTE_QMGR_ACTIVE = 1427 +MQIACF_APPL_INFO_TYPE = 1428 +MQIACF_APPL_INFO_APPL = 1429 +MQIACF_APPL_INFO_QMGR = 1430 +MQIACF_APPL_INFO_LOCAL = 1431 +MQIACF_APPL_IMMOVABLE_COUNT = 1432 +MQIACF_BALANCED = 1433 +MQIACF_BALSTATE = 1434 +MQIACF_APPL_IMMOVABLE_REASON = 1435 +MQIACF_DS_ENCRYPTED = 1436 +MQIACF_LAST_USED = 1436 MQIACH_FIRST = 1501 MQIACH_XMIT_PROTOCOL_TYPE = 1501 MQIACH_BATCH_SIZE = 1502 @@ -1015,7 +1226,31 @@ MQIACH_MAX_INSTS_PER_CLIENT = 1619 MQIACH_CLIENT_CHANNEL_WEIGHT = 1620 MQIACH_CONNECTION_AFFINITY = 1621 -MQIACH_LAST_USED = 1621 +MQIACH_RESET_REQUESTED = 1623 +MQIACH_BATCH_DATA_LIMIT = 1624 +MQIACH_MSG_HISTORY = 1625 +MQIACH_MULTICAST_PROPERTIES = 1626 +MQIACH_NEW_SUBSCRIBER_HISTORY = 1627 +MQIACH_MC_HB_INTERVAL = 1628 +MQIACH_USE_CLIENT_ID = 1629 +MQIACH_MQTT_KEEP_ALIVE = 1630 +MQIACH_IN_DOUBT_IN = 1631 +MQIACH_IN_DOUBT_OUT = 1632 +MQIACH_MSGS_SENT = 1633 +MQIACH_MSGS_RECEIVED = 1634 +MQIACH_MSGS_RCVD = 1634 +MQIACH_PENDING_OUT = 1635 +MQIACH_AVAILABLE_CIPHERSPECS = 1636 +MQIACH_MATCH = 1637 +MQIACH_USER_SOURCE = 1638 +MQIACH_WARNING = 1639 +MQIACH_DEF_RECONNECT = 1640 +MQIACH_CHANNEL_SUMMARY_ATTRS = 1642 +MQIACH_PROTOCOL = 1643 +MQIACH_AMQP_KEEP_ALIVE = 1644 +MQIACH_SECURITY_PROTOCOL = 1645 +MQIACH_SPL_PROTECTION = 1646 +MQIACH_LAST_USED = 1646 MQCAMO_FIRST = 2701 MQCAMO_CLOSE_DATE = 2701 MQCAMO_CLOSE_TIME = 2702 @@ -1244,7 +1479,26 @@ MQCACH_LISTENER_START_TIME = 3557 MQCACH_SSL_KEY_RESET_DATE = 3558 MQCACH_SSL_KEY_RESET_TIME = 3559 -MQCACH_LAST_USED = 3559 +MQCACH_REMOTE_VERSION = 3560 +MQCACH_REMOTE_PRODUCT = 3561 +MQCACH_GROUP_ADDRESS = 3562 +MQCACH_JAAS_CONFIG = 3563 +MQCACH_CLIENT_ID = 3564 +MQCACH_SSL_KEY_PASSPHRASE = 3565 +MQCACH_CONNECTION_NAME_LIST = 3566 +MQCACH_CLIENT_USER_ID = 3567 +MQCACH_MCA_USER_ID_LIST = 3568 +MQCACH_SSL_CIPHER_SUITE = 3569 +MQCACH_WEBCONTENT_PATH = 3570 +MQCACH_TOPIC_ROOT = 3571 +MQCACH_LAST_USED = 3571 +MQCAUT_ALL = 0 +MQCAUT_BLOCKUSER = 1 +MQCAUT_BLOCKADDR = 2 +MQCAUT_SSLPEERMAP = 3 +MQCAUT_ADDRESSMAP = 4 +MQCAUT_USERMAP = 5 +MQCAUT_QMGRMAP = 6 MQGACF_FIRST = 8001 MQGACF_COMMAND_CONTEXT = 8001 MQGACF_COMMAND_DATA = 8002 @@ -1263,6 +1517,13 @@ MQACT_ADVANCE_LOG = 2 MQACT_COLLECT_STATISTICS = 3 MQACT_PUBSUB = 4 +MQACT_ADD = 5 +MQACT_REPLACE = 6 +MQACT_REMOVE = 7 +MQACT_REMOVEALL = 8 +MQACT_FAIL = 9 +MQACT_REDUCE_LOG = 10 +MQACT_ARCHIVE_LOG = 11 MQAS_NONE = 0 MQAS_STARTED = 1 MQAS_START_WAIT = 2 @@ -1513,6 +1774,12 @@ MQSECTYPE_AUTHSERV = 1 MQSECTYPE_SSL = 2 MQSECTYPE_CLASSES = 3 +MQSECTYPE_CONNAUTH = 4 +MQCHK_OPTIONAL = 0 +MQCHK_NONE = 1 +MQCHK_REQUIRED_ADMIN = 2 +MQCHK_REQUIRED = 3 +MQCHK_AS_Q_MGR = 4 MQSUS_YES = 1 MQSUS_NO = 0 MQSYNCPOINT_YES = 0 diff --git a/code/pymqi/__init__.py b/code/pymqi/__init__.py index 3d78f749cb97d695d738454fd94a5493b90e2f1b_Y29kZS9weW1xaS9fX2luaXRfXy5weQ==..36d627ad6427d8c48d55eda5dbd69a482a0ab2a2_Y29kZS9weW1xaS9fX2luaXRfXy5weQ== 100644 --- a/code/pymqi/__init__.py +++ b/code/pymqi/__init__.py @@ -976,8 +976,8 @@ ['FipsRequired', py23long(0), MQLONG_TYPE]] if '7.0' in pymqe.__mqlevels__: - opts += [['EncryptionPolicySuiteB', [0, 0, 0, 0], '4' + MQLONG_TYPE]] + opts += [['EncryptionPolicySuiteB', [1, 0, 0, 0], '4' + MQLONG_TYPE]] if '7.1' in pymqe.__mqlevels__: opts += [['CertificateValPolicy', py23long(0), MQLONG_TYPE]] @@ -980,9 +980,7 @@ if '7.1' in pymqe.__mqlevels__: opts += [['CertificateValPolicy', py23long(0), MQLONG_TYPE]] - if MQLONG_TYPE == 'i': - opts += [['pad', b'', '4s']] if '8.0.0' in pymqe.__mqlevels__: opts += [['CertificateLabel', b'', '64s']] @@ -1353,8 +1351,9 @@ connectWithOptions = connect_with_options def connect_tcp_client(self, name, cd, channel, conn_name, user, password): + # type: (str, CD, str, str, str, str) """ Connect immediately to the remote Queue Manager 'name', using a TCP Client connection, with channnel 'channel' and the TCP connection string 'conn_name'. All other connection optons come from 'cd'. """ @@ -1356,9 +1355,8 @@ """ Connect immediately to the remote Queue Manager 'name', using a TCP Client connection, with channnel 'channel' and the TCP connection string 'conn_name'. All other connection optons come from 'cd'. """ - # type: (str, CD, str, str, str, str) cd.ChannelName = ensure_bytes(channel) cd.ConnectionName = ensure_bytes(conn_name) diff --git a/code/pymqi/pymqe.c b/code/pymqi/pymqe.c index 3d78f749cb97d695d738454fd94a5493b90e2f1b_Y29kZS9weW1xaS9weW1xZS5j..36d627ad6427d8c48d55eda5dbd69a482a0ab2a2_Y29kZS9weW1xaS9weW1xZS5j 100644 --- a/code/pymqi/pymqe.c +++ b/code/pymqi/pymqe.c @@ -316,7 +316,7 @@ char* name = NULL; MQHCONN handle; MQLONG comp_code, comp_reason; - char* mqcd = NULL; + PMQCD mqcd = NULL; Py_ssize_t mqcd_buf_len = 0; MQCNO cno = {MQCNO_DEFAULT}; PyObject* user_password = NULL; @@ -329,7 +329,7 @@ long options = MQCNO_NONE; #ifdef PYMQI_FEATURE_SSL - char *sco = NULL; + MQSCO *sco = NULL; Py_ssize_t sco_len = 0; #if PY_MAJOR_VERSION==2 if (!PyArg_ParseTuple(args, "slz#O|s#", &name, &options, &mqcd, &mqcd_buf_len, &user_password, &sco, &sco_len)) { @@ -338,9 +338,6 @@ #endif return 0; } - if (sco && checkArgSize(sco_len, PYMQI_MQSCO_SIZEOF, "MQSCO")) { - return NULL; - } #else #if PY_MAJOR_VERSION==2 if (!PyArg_ParseTuple(args, "sls#", &name, &options, &mqcd, &mqcd_buf_len)) { @@ -357,7 +354,7 @@ */ #ifdef PYMQI_FEATURE_SSL cno.Version = MQCNO_VERSION_5; - cno.SSLConfigPtr = (MQSCO *)sco; + cno.SSLConfigPtr = sco; #else cno.Version = MQCNO_VERSION_2; #endif @@ -812,7 +809,7 @@ * look like there's anything bigger than this in cmqc.h. I'm sure * someone will tell me if I'm wrong. */ -#define MAX_CHARATTR_LENGTH 129 +#define MAX_CHARATTR_LENGTH 257 static PyObject *pymqe_MQINQ(PyObject *self, PyObject *args) { MQLONG compCode, compReason; diff --git a/code/tests/test_setup.py b/code/tests/test_setup.py index 3d78f749cb97d695d738454fd94a5493b90e2f1b_Y29kZS90ZXN0cy90ZXN0X3NldHVwLnB5..36d627ad6427d8c48d55eda5dbd69a482a0ab2a2_Y29kZS90ZXN0cy90ZXN0X3NldHVwLnB5 100644 --- a/code/tests/test_setup.py +++ b/code/tests/test_setup.py @@ -1,2 +1,3 @@ """Setup tests environment.""" +import os.path import unittest @@ -2,5 +3,6 @@ import unittest +import pymqi import config import utils @@ -3,9 +5,7 @@ import config import utils -import pymqi - class Tests(unittest.TestCase): """Setup and tearsdown tests environment.""" @@ -9,9 +9,48 @@ class Tests(unittest.TestCase): """Setup and tearsdown tests environment.""" + version = '0000000' + + queue_name = '' + queue_manager = '' + channel = '' + host = '' + port = '' + user = '' + password = '' + + qmgr = None + + + @classmethod + def setUpClass(cls): + """Initialize test environment.""" + cls.prefix = os.environ.get('PYMQI_TEST_OBJECT_PREFIX', '') + + # max length of queue names is 48 characters + cls.queue_name = "{prefix}MSG.QUEUE".format(prefix=config.MQ.QUEUE.PREFIX) + cls.queue_manager = config.MQ.QM.NAME + cls.channel = config.MQ.QM.CHANNEL + cls.host = config.MQ.QM.HOST + cls.port = config.MQ.QM.PORT + cls.user = config.MQ.QM.USER + cls.password = config.MQ.QM.PASSWORD + + cls.conn_info = "{0}({1})".format(cls.host, cls.port) + + cls.qmgr = pymqi.QueueManager(None) + cls.qmgr.connectTCPClient(cls.queue_manager, pymqi.CD(), cls.channel, cls.conn_info, cls.user, cls.password) + + cls.version = cls.inquire_qmgr_version().decode() + + @classmethod + def tearDownClass(cls): + """Clear test environment.""" + cls.qmgr.disconnect() + def setUp(self): """Setup tests environmet. Configuration for setup provided by config.py Creates connection `self.qmgr` to Queue Manager `self.queue_manager` and creates queue `self.queue_name` """ @@ -12,22 +51,9 @@ def setUp(self): """Setup tests environmet. Configuration for setup provided by config.py Creates connection `self.qmgr` to Queue Manager `self.queue_manager` and creates queue `self.queue_name` """ - # max length of queue names is 48 characters - self.queue_name = "{prefix}MSG.QUEUE".format(prefix=config.MQ.QUEUE.PREFIX) - self.queue_manager = config.MQ.QM.NAME - self.channel = config.MQ.QM.CHANNEL - self.host = config.MQ.QM.HOST - self.port = config.MQ.QM.PORT - self.user = config.MQ.QM.USER - self.password = config.MQ.QM.PASSWORD - - self.conn_info = "{0}({1})".format(self.host, self.port) - - self.qmgr = pymqi.QueueManager(None) - self.qmgr.connectTCPClient(self.queue_manager, pymqi.CD(), self.channel, self.conn_info, self.user, self.password) def tearDown(self): """Clear test environment.""" @@ -31,8 +57,8 @@ def tearDown(self): """Clear test environment.""" - self.qmgr.disconnect() - - def create_queue(self, queue_name, max_depth=5000): - queue_type = pymqi.CMQC.MQQT_LOCAL + + @classmethod + def inquire_qmgr_version(cls): + return cls.qmgr.inquire(pymqi.CMQC.MQCA_VERSION) @@ -38,8 +64,12 @@ - args = {pymqi.CMQC.MQCA_Q_NAME: utils.py3str2bytes(queue_name), - pymqi.CMQC.MQIA_Q_TYPE: queue_type, - pymqi.CMQC.MQIA_MAX_Q_DEPTH: max_depth, - pymqi.CMQCFC.MQIACF_REPLACE: pymqi.CMQCFC.MQRP_YES} + def create_queue(self, queue_name, max_depth=5000, args=None): + if args: + args[pymqi.CMQC.MQCA_Q_NAME] = utils.py3str2bytes(queue_name) + else: + args = {pymqi.CMQC.MQCA_Q_NAME: utils.py3str2bytes(queue_name), + pymqi.CMQC.MQIA_Q_TYPE: pymqi.CMQC.MQQT_LOCAL, + pymqi.CMQC.MQIA_MAX_Q_DEPTH: max_depth, + pymqi.CMQCFC.MQIACF_REPLACE: pymqi.CMQCFC.MQRP_YES} pcf = pymqi.PCFExecute(self.qmgr) pcf.MQCMD_CREATE_Q(args) @@ -47,4 +77,33 @@ pcf = pymqi.PCFExecute(self.qmgr) args = {pymqi.CMQC.MQCA_Q_NAME: utils.py3str2bytes(queue_name), pymqi.CMQCFC.MQIACF_PURGE: pymqi.CMQCFC.MQPO_YES} - pcf.MQCMD_DELETE_Q(args) \ No newline at end of file + pcf.MQCMD_DELETE_Q(args) + + def create_channel(self, channel_name, args=None): + if args: + args[pymqi.CMQCFC.MQCACH_CHANNEL_NAME] = utils.py3str2bytes(channel_name) + else: + args = {pymqi.CMQCFC.MQCACH_CHANNEL_NAME: utils.py3str2bytes(channel_name), + pymqi.CMQCFC.MQIACH_CHANNEL_TYPE: pymqi.CMQC.MQCHT_SVRCONN, + pymqi.CMQCFC.MQIACF_REPLACE: pymqi.CMQCFC.MQRP_YES} + pcf = pymqi.PCFExecute(self.qmgr) + pcf.MQCMD_CREATE_CHANNEL(args) + + def delete_channel(self, channel_name): + pcf = pymqi.PCFExecute(self.qmgr) + args = {pymqi.CMQCFC.MQCACH_CHANNEL_NAME: utils.py3str2bytes(channel_name)} + pcf.MQCMD_DELETE_CHANNEL(args) + + def create_auth_rec(self, args): + pcf = pymqi.PCFExecute(self.qmgr) + pcf.MQCMD_SET_CHLAUTH_REC(args) + + def delete_auth_rec(self, args): + pcf = pymqi.PCFExecute(self.qmgr) + pcf.MQCMD_SET_CHLAUTH_REC(args) + + @classmethod + def edit_qmgr(cls, args): + pcf = pymqi.PCFExecute(cls.qmgr) + pcf.MQCMD_CHANGE_Q_MGR(args) + diff --git a/code/tests/test_tls.py b/code/tests/test_tls.py new file mode 100644 index 0000000000000000000000000000000000000000..36d627ad6427d8c48d55eda5dbd69a482a0ab2a2_Y29kZS90ZXN0cy90ZXN0X3Rscy5weQ== --- /dev/null +++ b/code/tests/test_tls.py @@ -0,0 +1,190 @@ +# pylint: disable=w1401 +"""Test connection with TLS(SSL). +Preparation: +Define env variable: +PYMQI_TEST_TLS_SKIP = 0 + +Create keydb files: +Default keydb localtion is: + Server: + Unix: /var/mqm/qmgrs/queue_manager_name/ssl + Client: + Unix: user HOME directory + +Command for keydb creation (for Unix): + +runmqakm -keydb -create -db /var/mqm/qmgrs/MQTEST/ssl/mqtest.kdb -pw Secret13 -stash +runmqakm -cert -create -db /var/mqm/qmgrs/MQTEST/ssl/mqtest.kdb -type kdb -pw Secret13 \ + -label mqtest -dn CN=mqtest -size 2048 -x509version 3 -expire 365 -fips -sig_alg SHA256WithRSA + +runmqakm -keydb -create -db ~/client.kdb -pw Secret13 -stash +runmqakm -cert -create -db ~/client.kdb -type kdb -pw Secret13 \ + -label client -dn CN=client -size 2048 -x509version 3 -expire 365 -fips -sig_alg SHA256WithRSA + +runmqakm -cert -extract -db /var/mqm/qmgrs/MQTEST/ssl/mqtest.kdb -pw Secret13 \ + -label mqtest -target ~/mqtest.pem +runmqakm -cert -add -db ~/client.kdb -pw Secret13 \ + -label mqtest -file ~/mqtest.pem + +runmqakm -cert -extract -db ~/client.kdb -pw Secret13 \ + -label client -target ~/client.pem +runmqakm -cert -add -db /var/mqm/qmgrs/MQTEST/ssl/mqtest.kdb -pw Secret13 \ + -label client -file ~/client.pem +""" + +import os.path +import unittest + +from test_setup import Tests # noqa +import utils # noqa + +import pymqi + +class TestTLS(Tests): + """Test Qeueu.get() method.""" + tls_channel_name = 'SSL.SVRCONN' + cypher_spec = 'TLS_RSA_WITH_AES_256_CBC_SHA256' + client_dn = 'CN=client' + cert_label_qmgr = 'mqtest' + cert_label_client = 'client' + key_repo_location_client = os.path.expanduser('~') + key_repo_location_qmgr = '/var/mqm/qmgrs/{}/ssl' + + @classmethod + def setUpClass(cls): + """Initialize test environment.""" + cls.skip = int(os.environ.get( + 'PYMQI_TEST_TLS_SKIP', 1)) + + if cls.skip: + raise unittest.SkipTest('PYMQI_TEST_TLS_SKIP initialized') + + super(TestTLS, cls).setUpClass() + cls.tls_channel_name = os.environ.get( + 'PYMQI_TEST_TLS_CHL_NAME', + cls.prefix + cls.tls_channel_name).encode() + cls.cypher_spec = os.environ.get( + 'PYMQI_TEST_TLS_CYPHER_SPEC', + cls.cypher_spec).encode() + cls.client_dn = os.environ.get( + 'PYMQI_TEST_TLS_CLIENT_DN', + cls.client_dn).encode() + cls.cert_label_qmgr = os.environ.get( + 'PYMQI_TEST_TLS_CERT_LABEL_QMGR', + cls.cert_label_qmgr).encode() + cls.cert_label_client = os.environ.get( + 'PYMQI_TEST_TLS_CERT_LABEL_CLIENT', + cls.cert_label_client).encode() + cls.key_repo_location_qmgr = os.environ.get( + 'PYMQI_TEST_TLS_KEY_REPO_LOCATION_QMGR', + cls.key_repo_location_qmgr.format(cls.queue_manager)).encode() + cls.key_repo_location_client = os.environ.get( + 'PYMQI_TEST_TLS_KEY_REPO_LOCATION_CLIENT', + cls.key_repo_location_client).encode() + + cls.key_repo_location_client_path = os.path.join( + cls.key_repo_location_client, + cls.cert_label_client + ) + + cls.key_repo_location_qmgr_path = os.path.join( + cls.key_repo_location_qmgr, + cls.cert_label_qmgr + ) + + cls._key_repo_location_qmgr = cls.qmgr.inquire(pymqi.CMQC.MQCA_SSL_KEY_REPOSITORY) + cls._certificate_label_qmgr = cls.qmgr.inquire(pymqi.CMQC.MQCA_CERT_LABEL) + + args = {pymqi.CMQC.MQCA_SSL_KEY_REPOSITORY: cls.key_repo_location_qmgr_path, + pymqi.CMQC.MQCA_CERT_LABEL: cls.cert_label_qmgr} + cls.edit_qmgr(args) + + @classmethod + def tearDownClass(cls): + """Clear test environment.""" + args = {pymqi.CMQC.MQCA_SSL_KEY_REPOSITORY: cls._key_repo_location_qmgr, + pymqi.CMQC.MQCA_CERT_LABEL: cls._certificate_label_qmgr} + cls.edit_qmgr(args) + super(TestTLS, cls).tearDownClass() + + + def setUp(self): + """Initialize test environment.""" + super(TestTLS, self).setUp() + + args = {pymqi.CMQCFC.MQCACH_CHANNEL_NAME: utils.py3str2bytes(self.tls_channel_name), + pymqi.CMQCFC.MQIACH_CHANNEL_TYPE: pymqi.CMQC.MQCHT_SVRCONN, + pymqi.CMQCFC.MQCACH_SSL_CIPHER_SPEC: self.cypher_spec, + pymqi.CMQCFC.MQCACH_SSL_PEER_NAME: self.client_dn, + pymqi.CMQCFC.MQIACH_SSL_CLIENT_AUTH: pymqi.CMQXC.MQSCA_OPTIONAL, + pymqi.CMQC.MQCA_CERT_LABEL: self.cert_label_qmgr, + pymqi.CMQCFC.MQIACF_REPLACE: pymqi.CMQCFC.MQRP_YES} + self.create_channel(self.tls_channel_name, args) + + args = {pymqi.CMQCFC.MQCACH_CHANNEL_NAME: utils.py3str2bytes(self.tls_channel_name), + pymqi.CMQCFC.MQIACF_CHLAUTH_TYPE: pymqi.CMQCFC.MQCAUT_USERMAP, + pymqi.CMQCFC.MQIACF_ACTION: pymqi.CMQCFC.MQACT_REPLACE, + pymqi.CMQCFC.MQCACH_CLIENT_USER_ID: self.user, + pymqi.CMQC.MQIA_CHECK_CLIENT_BINDING: pymqi.CMQCFC.MQCHK_REQUIRED_ADMIN, + pymqi.CMQCFC.MQIACH_USER_SOURCE: pymqi.CMQC.MQUSRC_CHANNEL} + self.create_auth_rec(args) + + args = {pymqi.CMQCFC.MQCACH_CHANNEL_NAME: utils.py3str2bytes(self.tls_channel_name), + pymqi.CMQCFC.MQIACF_CHLAUTH_TYPE: pymqi.CMQCFC.MQCAUT_BLOCKUSER, + pymqi.CMQCFC.MQCACH_MCA_USER_ID_LIST: 'nobody', + pymqi.CMQCFC.MQIACH_WARNING: pymqi.CMQC.MQWARN_NO, + pymqi.CMQCFC.MQIACF_ACTION: pymqi.CMQCFC.MQACT_REPLACE} + self.create_auth_rec(args) + + + def tearDown(self): + """Delete created objects.""" + + args = {pymqi.CMQCFC.MQCACH_CHANNEL_NAME: utils.py3str2bytes(self.tls_channel_name), + pymqi.CMQCFC.MQIACF_CHLAUTH_TYPE: pymqi.CMQCFC.MQCAUT_USERMAP, + pymqi.CMQCFC.MQIACF_ACTION: pymqi.CMQCFC.MQACT_REMOVEALL} + self.delete_auth_rec(args) + + args = {pymqi.CMQCFC.MQCACH_CHANNEL_NAME: utils.py3str2bytes(self.tls_channel_name), + pymqi.CMQCFC.MQIACF_CHLAUTH_TYPE: pymqi.CMQCFC.MQCAUT_BLOCKUSER, + pymqi.CMQCFC.MQIACF_ACTION: pymqi.CMQCFC.MQACT_REMOVEALL} + self.delete_auth_rec(args) + + self.delete_channel(self.tls_channel_name) + + super(TestTLS, self).tearDown() + + ########################################################################### + # + # Real Tests start here + # + ########################################################################### + + def test_connection_with_tls(self): + """Test connection to QueueManager with TLS""" + + qmgr = pymqi.QueueManager(None) + conn_info = pymqi.ensure_bytes('{0}({1})'.format(self.host, self.port)) + + cd = pymqi.CD(Version=pymqi.CMQXC.MQCD_VERSION_7, # pylint: disable=C0103 + ChannelName=self.tls_channel_name, + ConnectionName=conn_info, + SSLCipherSpec=self.cypher_spec) + + sco = pymqi.SCO(Version=pymqi.CMQC.MQSCO_VERSION_5, + KeyRepository=os.path.join(self.key_repo_location_client, + self.cert_label_client), + CertificateLabel=self.cert_label_client) + + opts = pymqi.CMQC.MQCNO_HANDLE_SHARE_NO_BLOCK + + qmgr.connectWithOptions(self.queue_manager, cd, sco, opts=opts, + user=self.user, password=self.password) + is_connected = qmgr.is_connected + if is_connected: + qmgr.disconnect() + + self.assertTrue(is_connected) + +if __name__ == "__main__": + unittest.main()