Exemplo n.º 1
0
    def set_active(self, current_chat=None):
        """Выбор активного пользователя."""
        chat_name = current_chat or self.get_current_chat()
        if not self.current_user:
            self.current_user = self.get_current_user()
        if not chat_name:
            return

        user = User.by_name(chat_name)
        chat = Chat.filter_by(name=chat_name).first() or next((c for c in user.get_chats() if c.is_personal), None)
        obj = user or chat

        self.chat_members = chat.members
        self.current_chat = chat.name
        self.set_current_chat(chat)
        self.set_view_obj(obj)
        client = self.get_client()
        for cm in self.chat_members:
            if self.current_user == cm:
                continue
            client.notify(settings.PUBLIC_KEY_REQUEST, contact=cm.username)
        self.make_encryptor()

        if obj:
            self.fill_chat()
            if obj.avatar:
                self.set_ava(obj.avatar)
            else:
                self.clear_ava()
Exemplo n.º 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}')
Exemplo n.º 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}')
Exemplo n.º 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''
Exemplo n.º 5
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()
Exemplo n.º 6
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)
Exemplo n.º 7
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}')
Exemplo n.º 8
0
        def result(text_button, instance):
            current_user = User.by_name(settings.USER_NAME)
            text = str(instance.text_field.text)
            if instance.text_field.text:
                chat = Chat.filter_by(name=text).first()
                if chat:
                    toast('Ошибка Создание чата\nТакая группа уже существует')
                    return

                with db_lock:
                    chat = Chat.create(name=text,
                                       owner=current_user,
                                       is_personal=False)
                    chat.members.append(current_user)
                    chat.save()
                cg = self.get_screen('create_group')
                cg.instance_chat = chat
                print('set chat', cg.instance_chat)
                self.show_screen('create_group')
            toast(instance.text_field.text)
Exemplo n.º 9
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}')
Exemplo n.º 10
0
 def get_current_user(self):
     return User.by_name(settings.USER_NAME) if hasattr(User, '_session') else None
Exemplo n.º 11
0
 def get_raw_data(self, **kwargs):
     user = User.by_name(settings.USER_NAME)
     search = kwargs.get('search', '')
     return user.get_chats(search) if kwargs.get('contacts', True) else user.not_contacts(search)