| skipped 27 lines |
28 | 28 | | from aardwolf.commons.iosettings import RDPIOSettings |
29 | 29 | | from asyauth.common.credentials import UniCredential |
30 | 30 | | from asyauth.common.constants import asyauthSecret |
| 31 | + | from asysocks.unicomm.client import UniClient |
| 32 | + | from asysocks.unicomm.common.connection import UniConnection |
| 33 | + | from asysocks.unicomm.common.packetizers import StreamPacketizer |
31 | 34 | | |
32 | 35 | | from PIL import Image |
33 | 36 | | try: |
| skipped 22 lines |
56 | 59 | | self.credentials = credentials |
57 | 60 | | self.authapi = None |
58 | 61 | | self.iosettings = iosettings |
| 62 | + | self.__connection:UniConnection = None |
59 | 63 | | self.shared_flag = False |
60 | 64 | | self.client_version = '003.008' |
61 | 65 | | self.server_version = None |
| skipped 110 lines |
172 | 176 | | async def terminate(self): |
173 | 177 | | try: |
174 | 178 | | if self.__writer is not None: |
175 | | - | self.__writer.close() |
| 179 | + | await self.__writer.close() |
176 | 180 | | if self.__refresh_screen_task is not None: |
177 | 181 | | self.__refresh_screen_task.cancel() |
178 | 182 | | if self.__reader_loop_task is not None: |
| skipped 23 lines |
202 | 206 | | Performs the entire connection sequence |
203 | 207 | | """ |
204 | 208 | | try: |
205 | | - | # starting lower-layer transports |
206 | | - | logger.debug('Selecting network') |
207 | | - | remote_socket, err = await NetworkSelector.select(self.target) |
208 | | - | if err is not None: |
209 | | - | raise err |
210 | | - | |
211 | | - | logger.debug('Connecting sockets') |
212 | | - | _, err = await remote_socket.connect() |
213 | | - | if err is not None: |
214 | | - | raise err |
215 | | - | |
216 | | - | logger.debug('Wrapping sockets to streamer') |
217 | | - | self.__reader, self.__writer = await TCPStream.from_tcpsocket(remote_socket) |
| 209 | + | packetizer = StreamPacketizer() |
| 210 | + | client = UniClient(self.target, packetizer) |
| 211 | + | self.__connection = await client.connect() |
| 212 | + | asyncio.create_task(self.__connection.stream()) |
| 213 | + | self.__reader = self.__connection.packetizer |
| 214 | + | self.__writer = self.__connection |
218 | 215 | | |
219 | 216 | | logger.debug('Performing banner exchange') |
220 | 217 | | _, err = await self.__banner_exchange() |
| skipped 56 lines |
277 | 274 | | logger.debug('Server version: %s' % self.server_version) |
278 | 275 | | version_reply = b'RFB %s\n' % self.client_version.encode() |
279 | 276 | | logger.debug('Version reply: %s' % version_reply) |
280 | | - | self.__writer.write(version_reply) |
| 277 | + | await self.__writer.write(version_reply) |
281 | 278 | | return True, None |
282 | 279 | | except Exception as e: |
283 | 280 | | return None, e |
| skipped 34 lines |
318 | 315 | | |
319 | 316 | | elif self.__selected_security_type == 2: |
320 | 317 | | logger.debug('Selecting default VNC auth type') |
321 | | - | self.__writer.write(bytes([self.__selected_security_type])) |
| 318 | + | await self.__writer.write(bytes([self.__selected_security_type])) |
322 | 319 | | challenge = await self.__reader.readexactly(16) |
323 | 320 | | |
324 | 321 | | # no username used here, but we support RDP as well |
| skipped 14 lines |
339 | 336 | | newkey+= bytes([btgt]) |
340 | 337 | | ctx = DES(newkey, mode = MODE_ECB, IV = None) |
341 | 338 | | response = ctx.encrypt(challenge) |
342 | | - | self.__writer.write(response) |
| 339 | + | await self.__writer.write(response) |
343 | 340 | | |
344 | 341 | | else: |
345 | 342 | | raise Exception('Unsupported security type selected!') |
| skipped 15 lines |
361 | 358 | | async def __client_init(self): |
362 | 359 | | try: |
363 | 360 | | # sending client init |
364 | | - | self.__writer.write(bytes([int(self.shared_flag)])) |
| 361 | + | await self.__writer.write(bytes([int(self.shared_flag)])) |
365 | 362 | | # reading server_init |
366 | 363 | | framebuffer_width = await self.__reader.readexactly(2) |
367 | 364 | | self.width = int.from_bytes(framebuffer_width, byteorder = 'big', signed = False) |
| skipped 66 lines |
434 | 431 | | async def send_key_char(self, char, is_pressed): |
435 | 432 | | try: |
436 | 433 | | msg = pack("!BBxxI", 4, int(is_pressed), char) |
437 | | - | self.__writer.write(msg) |
| 434 | + | await self.__writer.write(msg) |
438 | 435 | | return True, None |
439 | 436 | | except Exception as e: |
440 | 437 | | traceback.print_exc() |
| skipped 27 lines |
468 | 465 | | if buttoncode == 5: buttonmask |= 16 |
469 | 466 | | |
470 | 467 | | msg = pack("!BBHH", 5, buttonmask, xPos, yPos) |
471 | | - | self.__writer.write(msg) |
| 468 | + | await self.__writer.write(msg) |
472 | 469 | | return True, None |
473 | 470 | | except Exception as e: |
474 | 471 | | traceback.print_exc() |
| skipped 112 lines |
587 | 584 | | txtdata = indata.data.encode('latin-1') |
588 | 585 | | msg = pack("!BxxxI", 6, len(txtdata)) |
589 | 586 | | msg += txtdata |
590 | | - | self.__writer.write(msg) |
| 587 | + | await self.__writer.write(msg) |
591 | 588 | | except Exception as e: |
592 | 589 | | traceback.print_exc() |
593 | 590 | | continue |
| skipped 57 lines |
651 | 648 | | |
652 | 649 | | async def __reader_loop(self): |
653 | 650 | | try: |
| 651 | + | ctr = 0 |
654 | 652 | | while True: |
655 | 653 | | msgtype = await self.__reader.readexactly(1) |
656 | 654 | | msgtype = ord(msgtype) |
| skipped 129 lines |
786 | 784 | | for encoding in list_of_encodings: |
787 | 785 | | enc_encodings += encoding.to_bytes(4, byteorder = 'big', signed = True) |
788 | 786 | | sendbuff = pack("!BxH", 2, len(list_of_encodings)) + enc_encodings |
789 | | - | self.__writer.write(sendbuff) |
| 787 | + | await self.__writer.write(sendbuff) |
790 | 788 | | return True, None |
791 | 789 | | except Exception as e: |
792 | 790 | | return None, e |
| skipped 3 lines |
796 | 794 | | """Sends a setpixelformat message to the server, letting the server know our preferred image data encodings""" |
797 | 795 | | |
798 | 796 | | pixformat = pack("!BBBBHHHBBBxxx", bpp, depth, bigendian, truecolor, redmax, greenmax, bluemax, redshift, greenshift, blueshift) |
799 | | - | self.__writer.write(b'\x00\x00\x00\x00' + pixformat) |
| 797 | + | await self.__writer.write(b'\x00\x00\x00\x00' + pixformat) |
800 | 798 | | # rember these settings |
801 | 799 | | self.bpp, self.depth, self.bigendian, self.truecolor = bpp, depth, bigendian, truecolor |
802 | 800 | | self.redmax, self.greenmax, self.bluemax = redmax, greenmax, bluemax |
| skipped 9 lines |
812 | 810 | | if height is None: |
813 | 811 | | height = self.height - y |
814 | 812 | | |
815 | | - | self.__writer.write(pack("!BBHHHH", 3, incremental, x, y, width, height)) |
| 813 | + | await self.__writer.write(pack("!BBHHHH", 3, incremental, x, y, width, height)) |
816 | 814 | | |
817 | 815 | | async def amain(): |
818 | 816 | | try: |
| skipped 4 lines |
823 | 821 | | iosettings = RDPIOSettings() |
824 | 822 | | iosettings.video_out_format = VIDEO_FORMAT.RAW |
825 | 823 | | |
826 | | - | url = 'vnc+plain://alma:[email protected]:5900' |
| 824 | + | url = 'vnc+plain-password://alma:[email protected]:5900' |
827 | 825 | | url = RDPConnectionFactory.from_url(url) |
828 | 826 | | connection = url.get_connection(iosettings) |
829 | 827 | | |
| skipped 17 lines |