auth.py - toot - Unnamed repository; edit this file 'description' to name the repository.
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
       auth.py (3069B)
       ---
            1 # -*- coding: utf-8 -*-
            2 
            3 import webbrowser
            4 
            5 from builtins import input
            6 from getpass import getpass
            7 
            8 from toot import api, config, DEFAULT_INSTANCE, User, App
            9 from toot.exceptions import ApiError, ConsoleError
           10 from toot.output import print_out
           11 
           12 
           13 def register_app(domain):
           14     print_out("Looking up instance info...")
           15     instance = api.get_instance(domain)
           16 
           17     print_out("Found instance <blue>{}</blue> running Mastodon version <yellow>{}</yellow>".format(
           18         instance['title'], instance['version']))
           19 
           20     try:
           21         print_out("Registering application...")
           22         response = api.create_app(domain)
           23     except ApiError:
           24         raise ConsoleError("Registration failed.")
           25 
           26     base_url = 'https://' + domain
           27 
           28     app = App(domain, base_url, response['client_id'], response['client_secret'])
           29     config.save_app(app)
           30 
           31     print_out("Application tokens saved.")
           32 
           33     return app
           34 
           35 
           36 def create_app_interactive(instance=None):
           37     if not instance:
           38         print_out("Choose an instance [<green>{}</green>]: ".format(DEFAULT_INSTANCE), end="")
           39         instance = input()
           40         if not instance:
           41             instance = DEFAULT_INSTANCE
           42 
           43     return config.load_app(instance) or register_app(instance)
           44 
           45 
           46 def create_user(app, access_token):
           47     # Username is not yet known at this point, so fetch it from Mastodon
           48     user = User(app.instance, None, access_token)
           49     creds = api.verify_credentials(app, user)
           50 
           51     user = User(app.instance, creds['username'], access_token)
           52     config.save_user(user, activate=True)
           53 
           54     print_out("Access token saved to config at: <green>{}</green>".format(
           55         config.get_config_file_path()))
           56 
           57     return user
           58 
           59 
           60 def login_interactive(app, email=None):
           61     print_out("Log in to <green>{}</green>".format(app.instance))
           62 
           63     if email:
           64         print_out("Email: <green>{}</green>".format(email))
           65 
           66     while not email:
           67         email = input('Email: ')
           68 
           69     password = getpass('Password: ')
           70 
           71     try:
           72         print_out("Authenticating...")
           73         response = api.login(app, email, password)
           74     except ApiError:
           75         raise ConsoleError("Login failed")
           76 
           77     return create_user(app, response['access_token'])
           78 
           79 
           80 BROWSER_LOGIN_EXPLANATION = """
           81 This authentication method requires you to log into your Mastodon instance
           82 in your browser, where you will be asked to authorize <yellow>toot</yellow> to access
           83 your account. When you do, you will be given an <yellow>authorization code</yellow>
           84 which you need to paste here.
           85 """
           86 
           87 
           88 def login_browser_interactive(app):
           89     url = api.get_browser_login_url(app)
           90     print_out(BROWSER_LOGIN_EXPLANATION)
           91 
           92     print_out("This is the login URL:")
           93     print_out(url)
           94     print_out("")
           95 
           96     yesno = input("Open link in default browser? [Y/n]")
           97     if not yesno or yesno.lower() == 'y':
           98         webbrowser.open(url)
           99 
          100     authorization_code = ""
          101     while not authorization_code:
          102         authorization_code = input("Authorization code: ")
          103 
          104     print_out("\nRequesting access token...")
          105     response = api.request_access_token(app, authorization_code)
          106 
          107     return create_user(app, response['access_token'])