Skip to content

login_tools

LoginServerHandler

Bases: BaseHTTPRequestHandler

Login server handler.

Source code in client/ayon_ftrack/tray/login_tools.py
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
class LoginServerHandler(BaseHTTPRequestHandler):
    """Login server handler."""

    message_filepath = get_resource("sign_in_message.html")

    def __init__(self, login_callback, *args, **kw):
        """Initialise handler."""
        self.login_callback = login_callback
        BaseHTTPRequestHandler.__init__(self, *args, **kw)

    def log_message(self, format_str, *args):
        """Override method of BaseHTTPRequestHandler.

        Goal is to use `print` instead of `sys.stderr.write`
        """
        # Change
        print("%s - - [%s] %s\n" % (
            self.client_address[0],
            self.log_date_time_string(),
            format_str % args
        ))

    def do_GET(self):
        """Override to handle requests ourselves."""
        parsed_path = parse.urlparse(self.path)
        query = parsed_path.query

        api_user = None
        api_key = None
        login_credentials = None
        if "api_user" and "api_key" in query:
            login_credentials = parse.parse_qs(query)
            api_user = login_credentials["api_user"][0]
            api_key = login_credentials["api_key"][0]

            with open(self.message_filepath, "r") as message_file:
                sign_in_message = message_file.read()

            # formatting html code for python
            replacements = (
                ("{", "{{"),
                ("}", "}}"),
                ("{{}}", "{}")
            )
            for replacement in (replacements):
                sign_in_message = sign_in_message.replace(*replacement)
            message = sign_in_message.format(api_user)
        else:
            message = "<h1>Failed to sign in</h1>"

        self.send_response(200)
        self.end_headers()
        self.wfile.write(message.encode())

        if login_credentials:
            self.login_callback(
                api_user,
                api_key
            )

__init__(login_callback, *args, **kw)

Initialise handler.

Source code in client/ayon_ftrack/tray/login_tools.py
16
17
18
19
def __init__(self, login_callback, *args, **kw):
    """Initialise handler."""
    self.login_callback = login_callback
    BaseHTTPRequestHandler.__init__(self, *args, **kw)

do_GET()

Override to handle requests ourselves.

Source code in client/ayon_ftrack/tray/login_tools.py
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
def do_GET(self):
    """Override to handle requests ourselves."""
    parsed_path = parse.urlparse(self.path)
    query = parsed_path.query

    api_user = None
    api_key = None
    login_credentials = None
    if "api_user" and "api_key" in query:
        login_credentials = parse.parse_qs(query)
        api_user = login_credentials["api_user"][0]
        api_key = login_credentials["api_key"][0]

        with open(self.message_filepath, "r") as message_file:
            sign_in_message = message_file.read()

        # formatting html code for python
        replacements = (
            ("{", "{{"),
            ("}", "}}"),
            ("{{}}", "{}")
        )
        for replacement in (replacements):
            sign_in_message = sign_in_message.replace(*replacement)
        message = sign_in_message.format(api_user)
    else:
        message = "<h1>Failed to sign in</h1>"

    self.send_response(200)
    self.end_headers()
    self.wfile.write(message.encode())

    if login_credentials:
        self.login_callback(
            api_user,
            api_key
        )

log_message(format_str, *args)

Override method of BaseHTTPRequestHandler.

Goal is to use print instead of sys.stderr.write

Source code in client/ayon_ftrack/tray/login_tools.py
21
22
23
24
25
26
27
28
29
30
31
def log_message(self, format_str, *args):
    """Override method of BaseHTTPRequestHandler.

    Goal is to use `print` instead of `sys.stderr.write`
    """
    # Change
    print("%s - - [%s] %s\n" % (
        self.client_address[0],
        self.log_date_time_string(),
        format_str % args
    ))

LoginServerThread

Bases: Thread

Login server thread.

Source code in client/ayon_ftrack/tray/login_tools.py
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
class LoginServerThread(threading.Thread):
    """Login server thread."""

    def __init__(self, url, callback):
        self.url = url
        self.callback = callback
        self._server = None
        super(LoginServerThread, self).__init__()

    def _handle_login(self, api_user, api_key):
        """Login to server with *api_user* and *api_key*."""
        self.callback(api_user, api_key)

    def stop(self):
        if self._server:
            self._server.server_close()

    def run(self):
        """Listen for events."""
        self._server = HTTPServer(
            ("localhost", 0),
            functools.partial(
                LoginServerHandler, self._handle_login
            )
        )
        url = (
            f"{self.url}/user/api_credentials"
            f"?redirect_url=http://localhost:{self._server.server_port}"
        )
        webbrowser.open_new_tab(url)
        self._server.handle_request()

run()

Listen for events.

Source code in client/ayon_ftrack/tray/login_tools.py
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
def run(self):
    """Listen for events."""
    self._server = HTTPServer(
        ("localhost", 0),
        functools.partial(
            LoginServerHandler, self._handle_login
        )
    )
    url = (
        f"{self.url}/user/api_credentials"
        f"?redirect_url=http://localhost:{self._server.server_port}"
    )
    webbrowser.open_new_tab(url)
    self._server.handle_request()