def run(self, server, protocol, command):
        login = command['account_name']
        password = command['password']
        public_key = command['public_key']
        hashed_password = get_hash(login, password)

        session = sessionmaker(bind=self.db_engine)()
        db_user = session.query(SQLUser).filter_by(login=login).first()
        if db_user:
            if db_user.password != hashed_password:
                protocol.send_packet(ResponsePacket(402, command['id']))
                session.close()
                return
        else:
            db_user = SQLUser(login=login,
                              password=hashed_password,
                              public_key=public_key)
            session.add(db_user)
            session.commit()

        user = User()
        user.gid = db_user.gid
        user.login = db_user.login
        user.public_key = db_user.public_key
        user.protocol = protocol
        protocol.user = user

        server.logged_users.update({user.login: user})
        protocol.send_packet(ResponsePacket(202, command['id']))