aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRapptz <[email protected]>2017-01-19 18:32:17 -0500
committerRapptz <[email protected]>2017-01-19 18:32:17 -0500
commit4b6b5bd35eb59a0dac72039ce5bbd21c2ad26d6a (patch)
treefb9869d2b4a098e7123f6e930d4bcea3e7a33292
parentReimplement Guild.me property without patching it in. (diff)
downloaddiscord.py-4b6b5bd35eb59a0dac72039ce5bbd21c2ad26d6a.tar.xz
discord.py-4b6b5bd35eb59a0dac72039ce5bbd21c2ad26d6a.zip
Remove email/password based login.
-rw-r--r--discord/client.py107
-rw-r--r--discord/http.py17
2 files changed, 11 insertions, 113 deletions
diff --git a/discord/client.py b/discord/client.py
index b64408ed..b967a56d 100644
--- a/discord/client.py
+++ b/discord/client.py
@@ -42,7 +42,6 @@ import websockets
import logging, traceback
import sys, re, io, enum
-import tempfile, os, hashlib
import itertools
import datetime
from collections import namedtuple
@@ -90,10 +89,6 @@ class Client:
loop : Optional[event loop].
The `event loop`_ to use for asynchronous operations. Defaults to ``None``,
in which case the default event loop is used via ``asyncio.get_event_loop()``.
- cache_auth : Optional[bool]
- Indicates if :meth:`login` should cache the authentication tokens. Defaults
- to ``True``. The method in which the cache is written is done by writing to
- disk to a temporary directory.
connector : aiohttp.BaseConnector
The `connector`_ to use for connection pooling. Useful for proxies, e.g.
with a `ProxyConnector`_.
@@ -132,7 +127,6 @@ class Client:
self.email = None
self.loop = asyncio.get_event_loop() if loop is None else loop
self._listeners = []
- self.cache_auth = options.get('cache_auth', True)
self.shard_id = options.get('shard_id')
self.shard_count = options.get('shard_count')
@@ -157,37 +151,6 @@ class Client:
def _syncer(self, guilds):
yield from self.ws.request_sync(guilds)
- def _get_cache_filename(self, email):
- filename = hashlib.md5(email.encode('utf-8')).hexdigest()
- return os.path.join(tempfile.gettempdir(), 'discord_py', filename)
-
- def _get_cache_token(self, email, password):
- try:
- log.info('attempting to login via cache')
- cache_file = self._get_cache_filename(email)
- self.email = email
- with open(cache_file, 'r') as f:
- log.info('login cache file found')
- return f.read()
-
- # at this point our check failed
- # so we have to login and get the proper token and then
- # redo the cache
- except OSError:
- log.info('a problem occurred while opening login cache')
- return None # file not found et al
-
- def _update_cache(self, email, password):
- try:
- cache_file = self._get_cache_filename(email)
- os.makedirs(os.path.dirname(cache_file), exist_ok=True)
- with os.fdopen(os.open(cache_file, os.O_WRONLY | os.O_CREAT, 0o0600), 'w') as f:
- log.info('updating login cache')
- f.write(self.http.token)
- except OSError:
- log.info('a problem occurred while updating the login cache')
- pass
-
def handle_reaction_add(self, reaction, user):
removed = []
for i, (condition, future, event_type) in enumerate(self._listeners):
@@ -301,64 +264,21 @@ class Client:
# login state management
@asyncio.coroutine
- def _login_1(self, token, **kwargs):
- log.info('logging in using static token')
- is_bot = kwargs.pop('bot', True)
- data = yield from self.http.static_login(token, bot=is_bot)
- self.email = data.get('email', None)
- self.connection.is_bot = is_bot
- self._is_logged_in.set()
-
- @asyncio.coroutine
- def _login_2(self, email, password, **kwargs):
- # attempt to read the token from cache
- self.connection.is_bot = False
-
- if self.cache_auth:
- token = self._get_cache_token(email, password)
- try:
- yield from self.http.static_login(token, bot=False)
- except:
- log.info('cache auth token is out of date')
- else:
- self._is_logged_in.set()
- return
-
-
- yield from self.http.email_login(email, password)
- self.email = email
- self._is_logged_in.set()
-
- # since we went through all this trouble
- # let's make sure we don't have to do it again
- if self.cache_auth:
- self._update_cache(email, password)
-
- @asyncio.coroutine
- def login(self, *args, **kwargs):
+ def login(self, token, *, bot=True):
"""|coro|
Logs in the client with the specified credentials.
This function can be used in two different ways.
- .. code-block:: python
-
- await client.login('token')
-
- # or
-
- await client.login('email', 'password')
-
- More than 2 parameters or less than 1 parameter raises a
- :exc:`TypeError`.
-
Parameters
-----------
- bot : bool
+ token: str
+ The authentication token. Do not prefix this token with
+ anything as the library will do it for you.
+ bot: bool
Keyword argument that specifies if the account logging on is a bot
- token or not. Only useful for logging in with a static token.
- Ignored for the email and password combo. Defaults to ``True``.
+ token or not.
Raises
------
@@ -368,15 +288,13 @@ class Client:
An unknown HTTP related error occurred,
usually when it isn't 200 or the known incorrect credentials
passing status code.
- TypeError
- The incorrect number of parameters is passed.
"""
- n = len(args)
- if n in (2, 1):
- yield from getattr(self, '_login_' + str(n))(*args, **kwargs)
- else:
- raise TypeError('login() takes 1 or 2 positional arguments but {} were given'.format(n))
+ log.info('logging in using static token')
+ data = yield from self.http.static_login(token, bot=bot)
+ self.email = data.get('email', None)
+ self.connection.is_bot = bot
+ self._is_logged_in.set()
@asyncio.coroutine
def logout(self):
@@ -974,9 +892,6 @@ class Client:
if 'token' in data:
self.http._token(data['token'], bot=False)
- if self.cache_auth:
- self._update_cache(self.email, password)
-
@asyncio.coroutine
def change_presence(self, *, game=None, status=None, afk=False):
"""|coro|
diff --git a/discord/http.py b/discord/http.py
index cb0a666e..e4d48690 100644
--- a/discord/http.py
+++ b/discord/http.py
@@ -244,23 +244,6 @@ class HTTPClient:
# login management
@asyncio.coroutine
- def email_login(self, email, password):
- payload = {
- 'email': email,
- 'password': password
- }
-
- try:
- data = yield from self.request(Route('POST', '/auth/login'), json=payload)
- except HTTPException as e:
- if e.response.status == 400:
- raise LoginFailure('Improper credentials have been passed.') from e
- raise
-
- self._token(data['token'], bot=False)
- return data
-
- @asyncio.coroutine
def static_login(self, token, *, bot):
old_token, old_bot = self.token, self.bot_token
self._token(token, bot=bot)