Skip to content

Commit

Permalink
Merge branch 'develop' into change-internal-request-variables
Browse files Browse the repository at this point in the history
  • Loading branch information
josephmancuso committed Jun 3, 2018
2 parents b8b4fd3 + 4fd0fc9 commit 552f454
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 13 deletions.
19 changes: 17 additions & 2 deletions masonite/autoload.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@

class Autoload:

def __init__(self, app):
classes = {}

def __init__(self, app=None):
self.app = app

def load(self, directories):
Expand All @@ -18,4 +20,17 @@ def load(self, directories):
mod = importlib.import_module(module_loader.path.replace('/', '.') + '.' + name)
for obj in inspect.getmembers(mod):
if inspect.isclass(obj[1]):
self.app.bind(obj[1].__name__, obj[1])
self.app.bind(obj[1].__name__, obj[1])

def instances(self, directories, instance):
for (module_loader, name, ispkg) in pkgutil.iter_modules(directories):
search_path = module_loader.path
if search_path.endswith('/'):
raise InvalidAutoloadPath('Autoload path cannot have a trailing slash')

mod = importlib.import_module(module_loader.path.replace('/', '.') + '.' + name)
for obj in inspect.getmembers(mod):
if inspect.isclass(obj[1]) and issubclass(obj[1], instance):
self.classes.update({obj[1].__name__: obj[1]})

return self
4 changes: 2 additions & 2 deletions masonite/drivers/CacheDiskDriver.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def store(self, key, value, extension=".txt", location=None):

return key

def store_for(self, key, value, cache_time, cache_type, extension=".txt"):
def store_for(self, key, value, cache_time, cache_type, extension=".txt", location=None):
"""
Store content with time, type and extension
"""
Expand Down Expand Up @@ -66,7 +66,7 @@ def store_for(self, key, value, cache_time, cache_type, extension=".txt"):

key = self.store(
key + ":" + str(cache_for_time),
value, extension,
value, extension, location
)

return key
Expand Down
32 changes: 26 additions & 6 deletions masonite/facades/Auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ class Auth:
"""
This class will be used to authenticate users based on the config/auth.py file
"""

_once = False

def __init__(self, request, auth_model=None):
self.request = request
Expand Down Expand Up @@ -36,16 +38,17 @@ def user(self):
def login(self, name, password):
"""
Login the user based on the parameters provided
"""
"""
auth_column = self.auth_model.__auth__
try:
model = self.auth_model.where(auth_column, name).first()

if model and bcrypt.checkpw(bytes(password, 'utf-8'), bytes(model.password, 'utf-8')):
remember_token = str(uuid.uuid4())
model.remember_token = remember_token
model.save()
self.request.cookie('token', remember_token)
if not self._once:
remember_token = str(uuid.uuid4())
model.remember_token = remember_token
model.save()
self.request.cookie('token', remember_token)
return model

except Exception as exception:
Expand All @@ -54,5 +57,22 @@ def login(self, name, password):
return False

def logout(self):
self.request.cookie('token', '; expires=Thu, 01 Jan 1970 00:00:00 GMT', False)
self.request.delete_cookie('token')
return self

def login_by_id(self, id):
model = self.auth_model.find(id)

if model:
if not self._once:
remember_token = str(uuid.uuid4())
model.remember_token = remember_token
model.save()
self.request.cookie('token', remember_token)
return model

return False

def once(self):
self._once = True
return self
61 changes: 58 additions & 3 deletions tests/test_auth.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,67 @@
from masonite.facades.Auth import Auth
from masonite.request import Request
from masonite.testsuite.TestSuite import generate_wsgi

class MockUser():

__auth__ = 'email'
password = '$2a$04$SXAMKoNuuiv7iO4g4U3ZOemyJJiKAHomUIFfGyH4hyo4LrLjcMqvS'
email = 'user@email.com'
id = 1

def where(self, column, name):
return self

def first(self):
return self

def save(self):
pass

def find(self, id):
if self.id == id:
return self
return False

class TestAuth:

def setup_method(self):
REQUEST = Request({})
self.request = Request(generate_wsgi())

self.AUTH = Auth(REQUEST, object)
self.auth = Auth(self.request, MockUser())

def test_auth(self):
assert self.AUTH
assert self.auth

def test_login_user(self):
assert isinstance(self.auth.login('user@email.com', 'secret'), MockUser)
assert self.request.get_cookie('token')

def test_get_user(self):
assert self.auth.login_by_id(1)
assert isinstance(self.auth.user(), MockUser)

def test_get_user_returns_false_if_not_loggedin(self):
self.auth.login('user@email.com', 'wrong_secret')
assert self.auth.user() is False

def test_logout_user(self):
assert isinstance(self.auth.login('user@email.com', 'secret'), MockUser)
assert self.request.get_cookie('token')

self.auth.logout()
assert not self.request.get_cookie('token')
assert not self.auth.user()

def test_login_user_fails(self):
assert self.auth.login('user@email.com', 'bad_password') is False

def test_login_by_id(self):
assert isinstance(self.auth.login_by_id(1), MockUser)
assert self.request.get_cookie('token')

assert self.auth.login_by_id(2) is False

def test_login_once_does_not_set_cookie(self):
assert isinstance(self.auth.once().login_by_id(1), MockUser)
assert self.request.get_cookie('token') is None
4 changes: 4 additions & 0 deletions tests/test_autoload.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,7 @@ def test_autoload_loads_from_directories_with_trailing_slash_raises_exception(se
with pytest.raises(InvalidAutoloadPath):
Autoload(self.app).load(['app/http/controllers/'])


def test_autoload_loads_from_directories_and_instances(self):
classes = Autoload().instances(['app/http/controllers'], object).classes
assert 'TestController' in classes

0 comments on commit 552f454

Please sign in to comment.