Beispiel #1
0
 def update(self, proto, msg=None, *args, **kwargs):
     proto.write(
         Message(**{
             settings.ACTION: self.name,
             settings.USER: settings.USER_NAME,
         }))
     proto.notify(f'send_{self.name}')
Beispiel #2
0
 def update(self, proto, msg=None, **kwargs):
     code = getattr(msg, settings.RESPONSE, '')
     if code == 202:
         lst = []
         for username, ava in getattr(msg, settings.LIST_INFO, []):
             user = User.by_name(username=username)
             if user:
                 if ava:
                     user.avatar = QByteArray.fromBase64(
                         base64.b64decode(ava))
             else:
                 user = User(username=username,
                             password='******',
                             avatar=QByteArray.fromBase64(
                                 base64.b64decode(ava)) if ava else None)
             lst.append(user)
         with db_lock:
             User.save_all(lst)
         proto.notify(f'done_{self.name}')
     else:
         proto.write(
             Message(
                 **{
                     settings.ACTION: settings.USERS_REQUEST,
                     settings.USER: settings.USER_NAME,
                 }))
         proto.notify(f'send_{self.name}')
Beispiel #3
0
 def update(self, proto, msg, *args, **kwargs):
     user = User.by_name(settings.USER_NAME)
     ans_data = getattr(msg, settings.DATA, '')
     code = getattr(msg, settings.RESPONSE, '')
     if code == 511:
         digest = hmac.new(user.auth_key, ans_data.encode('utf-8')).digest()
         proto.write(
             Message(response=511,
                     **{
                         settings.ACTION:
                         settings.AUTH,
                         settings.DATA:
                         binascii.b2a_base64(digest).decode('ascii'),
                         settings.USER:
                         user.username,
                     }))
         proto.notify('done_511')
     elif code == 212:
         user.active = True
         with db_lock:
             user.save()
         proto.notify(f'done_{self.name}')
     elif code == 412:
         logger.error(f'{msg}')
         proto.notify(f'fail_{self.name}')
Beispiel #4
0
    def connection_made(self, transport):
        self.transport = transport
        user = User.by_name(settings.USER_NAME)
        hash_ = binascii.hexlify(
            hashlib.pbkdf2_hmac(
                'sha512',
                settings.get('password').encode('utf-8'),
                settings.USER_NAME.encode('utf-8'),
                10000,
            ))
        if user:
            user.password = settings.get('password')
            user.auth_key = hash_
            user.active = False
        else:
            user = User(username=settings.USER_NAME,
                        password=settings.get('password'),
                        auth_key=hash_)
        with db_lock:
            user.save()
        logger.debug('Установлено соединение с сервером.')

        self.write(Message.presence())
        self.def_size, self.transport.max_size, self.cur_size = self.transport.max_size, self.CHUNK_SIZE, self.CHUNK_SIZE
        self._thread.notify('new_connect')
        self.long_data = b''
Beispiel #5
0
 def update(self, proto, msg=None, *args, **kwargs):
     code = getattr(msg, settings.RESPONSE, '')
     if code == 202:
         Chat.chats_merge(getattr(msg, settings.LIST_INFO, []))
         proto.notify(f'done_{self.name}')
     else:
         proto.write(
             Message(
                 **{
                     settings.ACTION: settings.GET_CHATS,
                     settings.USER: settings.USER_NAME,
                 }))
         proto.notify(f'send_{self.name}')
Beispiel #6
0
 def send_chat(self, chat):
     self.client.notify(
         f'send_{settings.MESSAGE}',
         msg=Message(
             **{
                 settings.ACTION: settings.EDIT_CHAT,
                 settings.USER: settings.USER_NAME,
                 settings.DATA: {
                     'name': chat.name,
                     'owner': chat.owner.username if chat.owner else None,
                     'is_personal': chat.is_personal,
                     'members': [i.username for i in chat.members],
                 },
             }))
Beispiel #7
0
 def del_active(self, row):
     user = User.by_name(settings.USER_NAME)
     name_contact = row.text
     try:
         with db_lock:
             chat = user.del_contact(name_contact)
         self.app.client.notify(f'send_{settings.MESSAGE}', msg=Message(**{
             settings.ACTION: settings.DEL_CONTACT,
             settings.USER: settings.USER_NAME,
             settings.ACCOUNT_NAME: name_contact,
         }))
         self.app.send_chat(chat)
     except (ContactExists, NotFoundUser, ContactNotExists) as e:
         toast('Ошибка\n' + str(e))
         logger.error(e)
     else:
         self.make_data()
Beispiel #8
0
 def add_contact(self, current_chat):
     """Добавление контакта."""
     user = User.by_name(settings.USER_NAME)
     try:
         with db_lock:
             chat = user.add_contact(current_chat)
         self.app.client.notify(
             f'send_{settings.MESSAGE}',
             msg=Message(
                 **{
                     settings.ACTION: settings.ADD_CONTACT,
                     settings.USER: settings.USER_NAME,
                     settings.ACCOUNT_NAME: current_chat,
                 }))
         self.app.send_chat(chat)
     except (ContactExists, NotFoundUser, ContactNotExists) as e:
         self.app.show_info('Ошибка\n' + str(e))
         logger.error(e)
Beispiel #9
0
    def make_message(self, username, text=''):
        """Создать объект сообщения.

        Args:
            username: (str) Name destination
            text: [description] (default: {''})

        Returns:
            :py:class:`~jim_mes.Message`

        """
        return Message(**{
            settings.ACTION: settings.MESSAGE,
            settings.SENDER: settings.USER_NAME,
            settings.DESTINATION: username,
            settings.MESSAGE_TEXT: text,
            'chat': self.current_chat,
        })
Beispiel #10
0
 def update(self, proto, msg=None, *args, **kwargs):
     code = getattr(msg, settings.RESPONSE, '')
     if code == 202:
         user = User.by_name(settings.USER_NAME)
         for contact in getattr(msg, settings.LIST_INFO, []):
             try:
                 with db_lock:
                     user.add_contact(contact)
             except ContactExists:
                 pass
         proto.notify(f'done_{self.name}')
     else:
         proto.write(
             Message(
                 **{
                     settings.ACTION: settings.GET_CONTACTS,
                     settings.USER: settings.USER_NAME,
                 }))
         proto.notify(f'send_{self.name}')
Beispiel #11
0
    def data_received(self, data):
        if len(data) == self.CHUNK_SIZE:
            self.cur_size = struct.unpack('>I', data)[0]
            self.transport.max_size = min(self.cur_size, self.def_size)
            return
        self.long_data += data

        if self.cur_size > len(self.long_data):
            return

        self.transport.max_size = self.cur_size = self.CHUNK_SIZE
        if len(self.long_data) < 1024:
            logger.debug(
                f'Server say: {self.long_data.decode(settings.get("encoding", "utf-8"))}'
            )
        else:
            logger.debug(f'Server say message len {len(self.long_data)}')

        mes = Message(self.long_data)
        self.long_data = b''
        self._thread.run_command(self, mes)
Beispiel #12
0
 def update(self, proto, msg=None, *args, **kwargs):
     code = getattr(msg, settings.RESPONSE, '')
     if not msg:
         dest = kwargs.get('contact')
         if not dest:
             logger.info('Не указан контакт чей ключ нужно получить')
             return
         proto.write(
             Message(
                 **{
                     settings.ACTION: settings.PUBLIC_KEY_REQUEST,
                     settings.SENDER: settings.USER_NAME,
                     settings.DESTINATION: dest,
                 }))
         proto.notify(f'send_{self.name}')
     elif code == 202:
         pub_key = getattr(msg, settings.DATA, '')
         with db_lock:
             rest_user = User.by_name(
                 getattr(msg, settings.ACCOUNT_NAME, ''))
             rest_user.pub_key = pub_key
             rest_user.save()
         proto.notify(f'done_{self.name}')