예제 #1
0
 def connect(self):
     my_hostname = socket.gethostname()
     my_ip = socket.gethostbyname(my_hostname)
     self.socket = None
     vista_info = socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC,
                                     socket.SOCK_STREAM)
     af, socktype, proto, canonname, sa = vista_info[0]
     try:
         self.socket = socket.socket(af, socktype, proto)
         self.socket.connect(sa)
     except socket.error as message:
         if self.socket:
             self.socket.close()
             self.socket = None
         raise VistaException('Unable to connect: ' + message)
     params = [
         RpcParameter(RpcParameter.LITERAL, my_ip),
         RpcParameter(RpcParameter.LITERAL, my_hostname)
     ]
     rpc = VistaRpc.prepare('HELLO', params)
     try:
         response = self.execute(rpc)
     except:
         raise VistaException('No VistA listener at ' + self.host +
                              ', port ' + self.port)
     if response != 'accept':
         self.disconnect()
         raise VistaException('Connection not accepted: ' + response)
     self.is_connected = True
예제 #2
0
 def test_connect_rpc(self):
     expected = "[XWB]10304\x0ATCPConnect50013192.168.1.107f00010f0022LAPTOP2.v11.med.va.govf\x04"
     params = [
         RpcParameter(RpcParameter.LITERAL, '192.168.1.107'),
         RpcParameter(RpcParameter.LITERAL, 'LAPTOP2.v11.med.va.gov')
     ]
     actual = VistaRpc.prepare('HELLO', params)
     self.assertEqual(expected, actual)
예제 #3
0
 def test_cipher_pad(self):
     param = RpcParameter(RpcParameter.LITERAL, "SomeParam")
     self.assertEqual(20, len(param._RpcParameter__cipher_pad()))
     rownum = 0
     for row in param._RpcParameter__cipher_pad():
         self.assertEqual(94, len(row))
         colnum = 0
         for col in row:
             self.assertEqual(self.ASCII_PAD[rownum][colnum], ord(col))
             colnum += 1
         rownum += 1
예제 #4
0
 def test_cipher_pad(self):
     param = RpcParameter(RpcParameter.LITERAL, "SomeParam")
     self.assertEqual(20, len(param._RpcParameter__cipher_pad()))
     rownum = 0
     for row in param._RpcParameter__cipher_pad():
         self.assertEqual(94, len(row))
         colnum = 0
         for col in row:
             self.assertEqual(self.ASCII_PAD[rownum][colnum], ord(col))
             colnum += 1
         rownum += 1
예제 #5
0
    def test_init(self):
        param = RpcParameter(RpcParameter.LITERAL, 'SomeParam')
        self.assertEqual(RpcParameter.LITERAL, param.type)
        self.assertEqual('SomeParam', param.value)

        param = RpcParameter(RpcParameter.ENCRYPTED, 'lgs413')
        self.assertEqual(RpcParameter.LITERAL, param.type)
        self.assertTrue(re.match(r"[\x20-\x7E]{8}", param.value) is not None)

        param = RpcParameter(RpcParameter.ENCRYPTED, 'lgs413', [0, 1])
        self.assertEqual(RpcParameter.LITERAL, param.type)
        self.assertEqual(' CTgF#b!', param.value)
예제 #6
0
    def test_decrypt(self):
        expected = "lgs413"
        actual = RpcParameter.decrypt(" CTgF#b!")
        self.assertEqual(expected, actual)

        expected = "lgs413"
        actual = RpcParameter.decrypt("!S;|\\M&3")
        self.assertEqual(expected, actual)

        expected = "lgs413"
        actual = RpcParameter.decrypt(",P2GzBT1")
        self.assertEqual(expected, actual)
예제 #7
0
    def test_decrypt(self):
        expected = "lgs413"
        actual = RpcParameter.decrypt(" CTgF#b!")
        self.assertEqual(expected, actual)

        expected = "lgs413"
        actual = RpcParameter.decrypt("!S;|\\M&3")
        self.assertEqual(expected, actual)

        expected = "lgs413"
        actual = RpcParameter.decrypt(",P2GzBT1")
        self.assertEqual(expected, actual)
예제 #8
0
    def test_encrypt(self):
        param = RpcParameter(RpcParameter.ENCRYPTED, 'SomeParam')
        expected = " CTgF#b!"
        actual = param.encrypt('lgs413', [0, 1])
        self.assertEqual(expected, actual)

        expected = "!S;|\\M&3"
        actual = param.encrypt('lgs413', [1, 19])
        self.assertEqual(expected, actual)

        expected = ",P2GzBT1"
        actual = param.encrypt('lgs413', [12, 17])
        self.assertEqual(expected, actual)
예제 #9
0
    def test_encrypt(self):
        param = RpcParameter(RpcParameter.ENCRYPTED, 'SomeParam')
        expected = " CTgF#b!"
        actual = param.encrypt('lgs413', [0,1])
        self.assertEqual(expected, actual)

        expected = "!S;|\\M&3"
        actual = param.encrypt('lgs413', [1,19])
        self.assertEqual(expected, actual)

        expected = ",P2GzBT1"
        actual = param.encrypt('lgs413', [12,17])
        self.assertEqual(expected, actual)
예제 #10
0
 def test_list_to_string(self):
     lst = [('"FILE"', '200'), ('"FIELDS"', '@;.01;2;4;5;.141;8;9;11;29'),
            ('"FLAGS"', 'IP'), ('"MAX"', '1'), ('"FROM"', '545'),
            ('"XREF"', '#')]
     expected = "006\"FILE\"003200t008\"FIELDS\"026@;.01;2;4;5;.141;8;9;11;29t007\"FLAGS\"002IPt005\"MAX\"0011t006\"FROM\"003545t006\"XREF\"001#f"
     actual = RpcParameter.list_to_string(lst)
     self.assertEqual(expected, actual)
예제 #11
0
 def set_context(self, cxn, context):
     param = [RpcParameter(RpcParameter.ENCRYPTED, context)]
     rpc = VistaRpc.prepare('XWB CREATE CONTEXT', param)
     response = cxn.execute(rpc)
     if response != '1':
         raise VistaException(response)
     self.context = context
예제 #12
0
 def test_list_to_string(self):
     lst = [
         ('"FILE"', '200'),
         ('"FIELDS"', '@;.01;2;4;5;.141;8;9;11;29'),
         ('"FLAGS"', 'IP'),
         ('"MAX"', '1'),
         ('"FROM"', '545'),
         ('"XREF"', '#')
     ]
     expected = "006\"FILE\"003200t008\"FIELDS\"026@;.01;2;4;5;.141;8;9;11;29t007\"FLAGS\"002IPt005\"MAX\"0011t006\"FROM\"003545t006\"XREF\"001#f"
     actual = RpcParameter.list_to_string(lst)
     self.assertEqual(expected, actual)
예제 #13
0
 def prepare_param_str(params):
     param_str = '5'
     if params:
         for param in params:
             if param.type == RpcParameter.LITERAL:
                 param_str += '0' + VistaUtils.str_pack(param.value, VistaRpc.COUNT_WIDTH) + 'f'
             elif param.type == RpcParameter.REFERENCE:
                 param_str += '1' + VistaUtils.str_pack(param.value, VistaRpc.COUNT_WIDTH) + 'f'
             elif param.type == RpcParameter.LIST:
                 param_str += '2' + RpcParameter.list_to_string(param.value)
             else:
                 raise VistaException('Invalid param type')
     if param_str == '5' : param_str += '4f'
     return param_str
예제 #14
0
 def prepare_param_str(params):
     param_str = '5'
     if params:
         for param in params:
             if param.type == RpcParameter.LITERAL:
                 param_str += '0' + VistaUtils.str_pack(
                     param.value, VistaRpc.COUNT_WIDTH) + 'f'
             elif param.type == RpcParameter.REFERENCE:
                 param_str += '1' + VistaUtils.str_pack(
                     param.value, VistaRpc.COUNT_WIDTH) + 'f'
             elif param.type == RpcParameter.LIST:
                 param_str += '2' + RpcParameter.list_to_string(param.value)
             else:
                 raise VistaException('Invalid param type')
     if param_str == '5': param_str += '4f'
     return param_str
예제 #15
0
    def login(self, cxn, access_code, verify_code, context=None):
        rpc = VistaRpc.prepare('XUS SIGNON SETUP')
        response = cxn.execute(rpc)
        if response is None:
            raise VistaException('Unable to setup login')
        param = [RpcParameter(RpcParameter.ENCRYPTED, access_code + ';' + verify_code)]
        rpc = VistaRpc.prepare('XUS AV CODE', param)
        response = cxn.execute(rpc)
        if response is None:
            raise VistaException('No response to login request')
        greeting = self.load(response)
        self.access_code = access_code
        self.verify_code = verify_code

        if context is not None:
            self.set_context(cxn, context)

        return greeting
예제 #16
0
 def __prepare(self):
     self.__prepare_param_list()
     params = RpcParameter(RpcParameter.LIST, self.param_list)
     self.rpc = VistaRpc.prepare('DDR LISTER', [params])
예제 #17
0
 def test_login_rpc(self):
     expected = "[XWB]11302\x051.108\x0BXUS AV CODE50017.r v11k3}!r&sAgP$f\x04"
     param = RpcParameter(RpcParameter.ENCRYPTED, 'ijr773;Akiba12.', [14,4])
     actual = VistaRpc.prepare('XUS AV CODE', [param])
     self.assertEqual(expected, actual)
예제 #18
0
 def test_set_context_rpc(self):
     expected = "[XWB]11302\x051.108\x12XWB CREATE CONTEXT50019(&y?#jy<?x:=?#68y].f\x04"
     param = RpcParameter(RpcParameter.ENCRYPTED, 'OR CPRS GUI CHART', [8,14])
     actual = VistaRpc.prepare('XWB CREATE CONTEXT', [param])
     self.assertEqual(expected, actual)
예제 #19
0
 def test_get_variable_value_rpc(self):
     arg = "$P($G(^DIC(3.1,1362,0)),U,1)"
     expected = "[XWB]11302\x051.108\x16XWB GET VARIABLE VALUE51028$P($G(^DIC(3.1,1362,0)),U,1)f\x04"
     param = RpcParameter(RpcParameter.REFERENCE, arg)
     actual = VistaRpc.prepare('XWB GET VARIABLE VALUE', [param])
     self.assertEqual(expected, actual)