Exemple #1
0
class AuthCore(object):
    def __init__(self, event, online_mode, auth_timeout):
        self.online_mode = online_mode
        self.auth_timeout = auth_timeout
        self.__event = event
        self.ygg = YggdrasilCore()
        self._shared_secret = None
        self._username = None

    def get_username(self):
        return self._username

    def set_username(self, username):
        self.ygg.username = username

    username = property(get_username, set_username)

    def set_password(self, password):
        if password and not self.online_mode:
            logger.warning("PASSWORD PROVIDED WITH ONLINE_MODE == FALSE")
            logger.warning("YOU PROBABLY DIDN'T WANT TO DO THAT")
        self.ygg.password = password

    password = property(lambda x: bool(x.ygg.password), set_password)

    def set_client_token(self, client_token):
        if not self.online_mode:
            logger.warning("CLIENT TOKEN PROVIDED WITH ONLINE_MODE == FALSE")
            logger.warning("YOU PROBABLY DIDN'T WANT TO DO THAT")
        self.ygg.client_token = client_token

    client_token = property(lambda x: bool(x.ygg.client_token),
                            set_client_token)

    def set_auth_token(self, auth_token):
        if not self.online_mode:
            logger.warning("AUTH TOKEN PROVIDED WITH ONLINE_MODE == FALSE")
            logger.warning("YOU PROBABLY DIDN'T WANT TO DO THAT")
        self.ygg.auth_token = auth_token

    auth_token = property(lambda x: bool(x.ygg.auth_token), set_auth_token)

    def get_shared_secret(self):
        self._shared_secret = self._shared_secret or os.urandom(16)
        return self._shared_secret

    shared_secret = property(get_shared_secret)

    def start_session(self):
        if not self.online_mode:
            self._username = self.ygg.username
            return True
        if self.ygg.login():
            self._username = self.ygg.selected_profile['name']
            return True
        self.__event.emit('auth_session_error')
        return False

    def send_session_auth(self, pubkey_raw, server_id_raw):
        server_id = java_hex_digest(
            hashlib.sha1(
                server_id_raw.encode('ascii') + self.shared_secret +
                pubkey_raw))
        logger.info('Attempting to authenticate with Mojang session server')
        url = "https://sessionserver.mojang.com/session/minecraft/join"
        data = json.dumps({
            'accessToken': self.ygg.access_token,
            'selectedProfile': self.ygg.selected_profile,
            'serverId': server_id,
        }).encode('utf-8')
        headers = {'Content-Type': 'application/json'}
        req = request.Request(url, data, headers)
        try:
            rep = request.urlopen(
                req, timeout=self.auth_timeout).read().decode('ascii')
        except URLError:
            rep = "Couldn't connect to sessionserver.mojang.com"
        if rep:
            logger.warning('Mojang session auth response: %s', rep)
        logger.info('Session authentication successful')
Exemple #2
0
class AuthCore(object):
    def __init__(self, event, online_mode, auth_timeout):
        self.online_mode = online_mode
        self.auth_timeout = auth_timeout
        self.__event = event
        self.ygg = YggdrasilCore()
        self._shared_secret = None
        self._username = None

    def get_username(self):
        return self._username

    def set_username(self, username):
        self.ygg.username = username

    username = property(get_username, set_username)

    def set_password(self, password):
        if password and not self.online_mode:
            logger.warning("PASSWORD PROVIDED WITH ONLINE_MODE == FALSE")
            logger.warning("YOU PROBABLY DIDN'T WANT TO DO THAT")
        self.ygg.password = password

    password = property(lambda x: bool(x.ygg.password), set_password)

    def set_client_token(self, client_token):
        if not self.online_mode:
            logger.warning("CLIENT TOKEN PROVIDED WITH ONLINE_MODE == FALSE")
            logger.warning("YOU PROBABLY DIDN'T WANT TO DO THAT")
        self.ygg.client_token = client_token

    client_token = property(lambda x: bool(x.ygg.client_token), set_client_token)

    def set_auth_token(self, auth_token):
        if not self.online_mode:
            logger.warning("AUTH TOKEN PROVIDED WITH ONLINE_MODE == FALSE")
            logger.warning("YOU PROBABLY DIDN'T WANT TO DO THAT")
        self.ygg.auth_token = auth_token

    auth_token = property(lambda x: bool(x.ygg.auth_token), set_auth_token)

    def get_shared_secret(self):
        self._shared_secret = self._shared_secret or os.urandom(16)
        return self._shared_secret

    shared_secret = property(get_shared_secret)

    def start_session(self):
        if not self.online_mode:
            self._username = self.ygg.username
            return True
        if self.ygg.login():
            self._username = self.ygg.selected_profile["name"]
            return True
        self.__event.emit("auth_session_error")
        return False

    def send_session_auth(self, pubkey_raw, server_id_raw):
        server_id = java_hex_digest(hashlib.sha1(server_id_raw.encode("ascii") + self.shared_secret + pubkey_raw))
        logger.info("Attempting to authenticate with Mojang session server")
        url = "https://sessionserver.mojang.com/session/minecraft/join"
        data = json.dumps(
            {"accessToken": self.ygg.access_token, "selectedProfile": self.ygg.selected_profile, "serverId": server_id}
        ).encode("utf-8")
        headers = {"Content-Type": "application/json"}
        req = request.Request(url, data, headers)
        try:
            rep = request.urlopen(req, timeout=self.auth_timeout).read().decode("ascii")
        except URLError:
            rep = "Couldn't connect to sessionserver.mojang.com"
        if rep:
            logger.warning("Mojang session auth response: %s", rep)
        logger.info("Session authentication successful")