1
0
Fork 0
forked from vbatts/maubot

Add Matrix client login/register commands

This commit is contained in:
Tulir Asokan 2019-06-08 17:02:44 +03:00
parent 523da95c17
commit d5e78db5cf
7 changed files with 88 additions and 20 deletions

View file

@ -1 +1 @@
from . import upload, build, login, init, logs
from . import upload, build, login, init, logs, auth

View file

@ -0,0 +1,65 @@
# maubot - A plugin-based Matrix bot system.
# Copyright (C) 2019 Tulir Asokan
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
from urllib.request import urlopen, Request
from urllib.error import HTTPError
import json
from colorama import Fore
import click
from ..config import get_token
from ..cliq import cliq
history_count: int = 10
@cliq.command(help="Log into a Matrix account via the Maubot server")
@cliq.option("-h", "--homeserver", help="The homeserver to log into", required=True)
@cliq.option("-u", "--username", help="The username to log in with", required=True)
@cliq.option("-p", "--password", help="The password to log in with", inq_type="password",
required=True)
@cliq.option("-s", "--server", help="The maubot instance to log in through", default="",
required=False, prompt=False)
@click.option("-r", "--register", help="Register instead of logging in", is_flag=True,
default=False)
def auth(homeserver: str, username: str, password: str, server: str, register: bool) -> None:
server, token = get_token(server)
if not token:
return
endpoint = "register" if register else "login"
req = Request(f"{server}/_matrix/maubot/v1/client/auth/{homeserver}/{endpoint}",
headers={
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
},
data=json.dumps({
"username": username,
"password": password,
}).encode("utf-8"))
try:
with urlopen(req) as resp_data:
resp = json.load(resp_data)
action = "registered" if register else "logged in as"
print(f"{Fore.GREEN}Successfully {action} "
f"{Fore.CYAN}{resp['user_id']}{Fore.GREEN}.")
print(f"{Fore.GREEN}Access token: {Fore.CYAN}{resp['access_token']}{Fore.RESET}")
except HTTPError as e:
try:
err = json.load(e)
except json.JSONDecodeError:
err = {}
action = "register" if register else "log in"
print(f"{Fore.RED}Failed to {action}: {err.get('error', str(e))}{Fore.RESET}")

View file

@ -98,10 +98,7 @@ def write_plugin(meta: PluginMeta, output: Union[str, IO]) -> None:
def upload_plugin(output: Union[str, IO], server: str) -> None:
if not server:
server, token = get_default_server()
else:
token = get_token(server)
server, token = get_token(server)
if not token:
return
if isinstance(output, str):

View file

@ -21,7 +21,7 @@ from aiohttp import WSMsgType, WSMessage, ClientSession
from mautrix.client.api.types.util import Obj
import click
from ..config import get_token, get_default_server
from ..config import get_token
from ..base import app
history_count: int = 10
@ -31,10 +31,7 @@ history_count: int = 10
@click.argument("server", required=False)
@click.option("-t", "--tail", default=10, help="Maximum number of old log lines to display")
def logs(server: str, tail: int) -> None:
if not server:
server, token = get_default_server()
else:
token = get_token(server)
server, token = get_token(server)
if not token:
return
global history_count

View file

@ -33,10 +33,7 @@ class UploadError(Exception):
@click.argument("path")
@click.option("-s", "--server", help="The maubot instance to upload the plugin to")
def upload(path: str, server: str) -> None:
if not server:
server, token = get_default_server()
else:
token = get_token(server)
server, token = get_token(server)
if not token:
return
with open(path, "rb") as file: