Implement registering (untested), fix auth stuff and possibly break stuff. Fixes #44
This commit is contained in:
@@ -51,6 +51,50 @@ def register(evt):
|
|||||||
return evt.reply("Not yet implemented.")
|
return evt.reply("Not yet implemented.")
|
||||||
|
|
||||||
|
|
||||||
|
@command_handler(needs_auth=False, management_only=True)
|
||||||
|
async def register(evt):
|
||||||
|
if evt.sender.logged_in:
|
||||||
|
return await evt.reply("You are already logged in.")
|
||||||
|
elif len(evt.args) < 1:
|
||||||
|
return await evt.reply("**Usage:** `$cmdprefix+sp register <phone> <full name>`")
|
||||||
|
|
||||||
|
phone_number = evt.args[0]
|
||||||
|
full_name = evt.args[1:].split(" ", 1)
|
||||||
|
if len(full_name) == 1:
|
||||||
|
full_name.append("")
|
||||||
|
await request_code(evt, phone_number, {
|
||||||
|
"next": enter_code_register,
|
||||||
|
"action": "Register",
|
||||||
|
"full_name": full_name,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
async def enter_code_register(evt):
|
||||||
|
if len(evt.args) == 0:
|
||||||
|
return await evt.reply("**Usage:** `$cmdprefix+sp <code>`")
|
||||||
|
try:
|
||||||
|
await evt.sender.ensure_started(even_if_no_session=True)
|
||||||
|
first_name, last_name = evt.sender.command_status["full_name"]
|
||||||
|
user = await evt.sender.client.sign_up(evt.args[0], first_name, last_name)
|
||||||
|
asyncio.ensure_future(evt.sender.post_login(user), loop=evt.loop)
|
||||||
|
evt.sender.command_status = None
|
||||||
|
return await evt.reply(f"Successfully registered to Telegram.")
|
||||||
|
except PhoneNumberOccupiedError:
|
||||||
|
return await evt.reply("That phone number has already been registered. "
|
||||||
|
"You can log in with `$cmdprefix+sp login`.")
|
||||||
|
except FirstNameInvalidError:
|
||||||
|
return await evt.reply("Invalid name. Please set a Matrix displayname before registering.")
|
||||||
|
except PhoneCodeExpiredError:
|
||||||
|
return await evt.reply(
|
||||||
|
"Phone code expired. Try again with `$cmdprefix+sp register <phone>`.")
|
||||||
|
except PhoneCodeInvalidError:
|
||||||
|
return await evt.reply("Invalid phone code.")
|
||||||
|
except Exception:
|
||||||
|
evt.log.exception("Error sending phone code")
|
||||||
|
return await evt.reply("Unhandled exception while sending code. "
|
||||||
|
"Check console for more details.")
|
||||||
|
|
||||||
|
|
||||||
@command_handler(needs_auth=False, management_only=True)
|
@command_handler(needs_auth=False, management_only=True)
|
||||||
async def login(evt):
|
async def login(evt):
|
||||||
if evt.sender.logged_in:
|
if evt.sender.logged_in:
|
||||||
@@ -80,22 +124,12 @@ async def login(evt):
|
|||||||
return await evt.reply("This bridge instance has been configured to not allow logging in.")
|
return await evt.reply("This bridge instance has been configured to not allow logging in.")
|
||||||
|
|
||||||
|
|
||||||
@command_handler(needs_auth=False)
|
async def request_code(evt, phone_number, next_status):
|
||||||
async def enter_phone(evt):
|
ok = False
|
||||||
if len(evt.args) == 0:
|
|
||||||
return await evt.reply("**Usage:** `$cmdprefix+sp enter-phone <phone>`")
|
|
||||||
elif not evt.config.get("bridge.allow_matrix_login", True):
|
|
||||||
return await evt.reply("This bridge instance does not allow in-Matrix login. "
|
|
||||||
"Please use `$cmdprefix+sp login` to get login instructions")
|
|
||||||
|
|
||||||
phone_number = evt.args[0]
|
|
||||||
try:
|
try:
|
||||||
await evt.sender.ensure_started(even_if_no_session=True)
|
await evt.sender.ensure_started(even_if_no_session=True)
|
||||||
await evt.sender.client.sign_in(phone_number)
|
await evt.sender.client.sign_in(phone_number)
|
||||||
evt.sender.command_status = {
|
ok = True
|
||||||
"next": enter_code,
|
|
||||||
"action": "Login",
|
|
||||||
}
|
|
||||||
return await evt.reply(f"Login code sent to {phone_number}. Please send the code here.")
|
return await evt.reply(f"Login code sent to {phone_number}. Please send the code here.")
|
||||||
except PhoneNumberAppSignupForbiddenError:
|
except PhoneNumberAppSignupForbiddenError:
|
||||||
return await evt.reply(
|
return await evt.reply(
|
||||||
@@ -109,17 +143,31 @@ async def enter_phone(evt):
|
|||||||
"Your phone number has been temporarily blocked for flooding. "
|
"Your phone number has been temporarily blocked for flooding. "
|
||||||
f"Please wait for {format_duration(e.seconds)} before trying again.")
|
f"Please wait for {format_duration(e.seconds)} before trying again.")
|
||||||
except PhoneNumberBannedError:
|
except PhoneNumberBannedError:
|
||||||
return await evt.reply("Your phone number has been banned from Telegram.")
|
return await evt.reply("Your phone number has been banned from Telegram.")
|
||||||
except PhoneNumberUnoccupiedError:
|
except PhoneNumberUnoccupiedError:
|
||||||
return await evt.reply("That phone number has not been registered. "
|
return await evt.reply("That phone number has not been registered. "
|
||||||
"Please register with `$cmdprefix+sp register <phone>`.")
|
"Please register with `$cmdprefix+sp register <phone>`.")
|
||||||
except Exception:
|
except Exception:
|
||||||
evt.log.exception("Error requesting phone code")
|
evt.log.exception("Error requesting phone code")
|
||||||
return await evt.reply("Unhandled exception while requesting code. "
|
return await evt.reply("Unhandled exception while requesting code. "
|
||||||
"Check console for more details.")
|
"Check console for more details.")
|
||||||
finally:
|
finally:
|
||||||
if evt.sender.command_status["next"] == enter_phone:
|
evt.sender.command_status = next_status if ok else None
|
||||||
evt.sender.command_status = None
|
|
||||||
|
|
||||||
|
@command_handler(needs_auth=False)
|
||||||
|
async def enter_phone(evt):
|
||||||
|
if len(evt.args) == 0:
|
||||||
|
return await evt.reply("**Usage:** `$cmdprefix+sp enter-phone <phone>`")
|
||||||
|
elif not evt.config.get("bridge.allow_matrix_login", True):
|
||||||
|
return await evt.reply("This bridge instance does not allow in-Matrix login. "
|
||||||
|
"Please use `$cmdprefix+sp login` to get login instructions")
|
||||||
|
|
||||||
|
phone_number = evt.args[0]
|
||||||
|
await request_code(evt, phone_number, {
|
||||||
|
"next": enter_code,
|
||||||
|
"action": "Login",
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
@command_handler(needs_auth=False)
|
@command_handler(needs_auth=False)
|
||||||
@@ -136,8 +184,7 @@ async def enter_code(evt):
|
|||||||
evt.sender.command_status = None
|
evt.sender.command_status = None
|
||||||
return await evt.reply(f"Successfully logged in as @{user.username}")
|
return await evt.reply(f"Successfully logged in as @{user.username}")
|
||||||
except PhoneCodeExpiredError:
|
except PhoneCodeExpiredError:
|
||||||
return await evt.reply(
|
return await evt.reply("Phone code expired. Try again with `$cmdprefix+sp login`.")
|
||||||
"Phone code expired. Try again with `$cmdprefix+sp login <phone>`.")
|
|
||||||
except PhoneCodeInvalidError:
|
except PhoneCodeInvalidError:
|
||||||
return await evt.reply("Invalid phone code.")
|
return await evt.reply("Invalid phone code.")
|
||||||
except SessionPasswordNeededError:
|
except SessionPasswordNeededError:
|
||||||
@@ -160,7 +207,6 @@ async def enter_password(evt):
|
|||||||
elif not evt.config.get("bridge.allow_matrix_login", True):
|
elif not evt.config.get("bridge.allow_matrix_login", True):
|
||||||
return await evt.reply("This bridge instance does not allow in-Matrix login. "
|
return await evt.reply("This bridge instance does not allow in-Matrix login. "
|
||||||
"Please use `$cmdprefix+sp login` to get login instructions")
|
"Please use `$cmdprefix+sp login` to get login instructions")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await evt.sender.ensure_started(even_if_no_session=True)
|
await evt.sender.ensure_started(even_if_no_session=True)
|
||||||
user = await evt.sender.client.sign_in(password=evt.args[0])
|
user = await evt.sender.client.sign_in(password=evt.args[0])
|
||||||
|
|||||||
@@ -81,12 +81,13 @@ class CommandHandler:
|
|||||||
async def handle(self, room, sender, command, args, is_management, is_portal):
|
async def handle(self, room, sender, command, args, is_management, is_portal):
|
||||||
evt = CommandEvent(self, room, sender, command, args,
|
evt = CommandEvent(self, room, sender, command, args,
|
||||||
is_management, is_portal)
|
is_management, is_portal)
|
||||||
|
orig_command = command
|
||||||
command = command.lower()
|
command = command.lower()
|
||||||
try:
|
try:
|
||||||
command = command_handlers[command]
|
command = command_handlers[command]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
if sender.command_status and "next" in sender.command_status:
|
if sender.command_status and "next" in sender.command_status:
|
||||||
args.insert(0, command)
|
args.insert(0, orig_command)
|
||||||
evt.command = ""
|
evt.command = ""
|
||||||
command = sender.command_status["next"]
|
command = sender.command_status["next"]
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -843,7 +843,6 @@ class Portal:
|
|||||||
text, html, relates_to = await formatter.telegram_to_matrix(evt, source,
|
text, html, relates_to = await formatter.telegram_to_matrix(evt, source,
|
||||||
self.main_intent)
|
self.main_intent)
|
||||||
await intent.set_typing(self.mxid, is_typing=False)
|
await intent.set_typing(self.mxid, is_typing=False)
|
||||||
print(self.main_intent.client.get_download_url(file.mxc))
|
|
||||||
inline_img = f"<img src='{file.mxc}' alt='Inline Telegram photo'/><br/>\n"
|
inline_img = f"<img src='{file.mxc}' alt='Inline Telegram photo'/><br/>\n"
|
||||||
html = inline_img + (html or escape(text))
|
html = inline_img + (html or escape(text))
|
||||||
text = f"Inline image: {text}"
|
text = f"Inline image: {text}"
|
||||||
|
|||||||
@@ -46,7 +46,9 @@ class PublicBridgeWebsite:
|
|||||||
user = (User.get_by_mxid(request.rel_url.query["mxid"], create=False)
|
user = (User.get_by_mxid(request.rel_url.query["mxid"], create=False)
|
||||||
if "mxid" in request.rel_url.query else None)
|
if "mxid" in request.rel_url.query else None)
|
||||||
if not user:
|
if not user:
|
||||||
return self.render_login(mxid=request.rel_url.query["mxid"], state="request")
|
return self.render_login(
|
||||||
|
mxid=request.rel_url.query["mxid"] if "mxid" in request.rel_url.query else None,
|
||||||
|
state="request")
|
||||||
elif not user.whitelisted:
|
elif not user.whitelisted:
|
||||||
return self.render_login(mxid=user.mxid, error="You are not whitelisted.", status=403)
|
return self.render_login(mxid=user.mxid, error="You are not whitelisted.", status=403)
|
||||||
await user.ensure_started()
|
await user.ensure_started()
|
||||||
@@ -153,7 +155,8 @@ class PublicBridgeWebsite:
|
|||||||
if "phone" in data:
|
if "phone" in data:
|
||||||
return await self.post_login_phone(user, data["phone"])
|
return await self.post_login_phone(user, data["phone"])
|
||||||
elif "code" in data:
|
elif "code" in data:
|
||||||
resp = await self.post_login_code(user, data["code"], password_in_data="password" in data)
|
resp = await self.post_login_code(user, data["code"],
|
||||||
|
password_in_data="password" in data)
|
||||||
if resp or "password" not in data:
|
if resp or "password" not in data:
|
||||||
return resp
|
return resp
|
||||||
elif "password" not in data:
|
elif "password" not in data:
|
||||||
|
|||||||
Reference in New Issue
Block a user