AuthProvider
- Added provider interface DummyProvider - Added a dummy authentication provider AuthManager - Implemented an initial authentication manager
This commit is contained in:
parent
8415fd7c9f
commit
bfc5467f28
|
@ -90,4 +90,112 @@ unittest
|
|||
u.setUsername("gustav");
|
||||
assert(u.getUsername(), "gustav");
|
||||
|
||||
}
|
||||
|
||||
public interface AuthProvider
|
||||
{
|
||||
public bool authenticate(string username, string password, ref User user);
|
||||
}
|
||||
|
||||
public class DummyProvider : AuthProvider
|
||||
{
|
||||
public bool authenticate(string username, string password, ref User user)
|
||||
{
|
||||
user = User(username);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
import renaissance.server.server : Server;
|
||||
import renaissance.logging;
|
||||
|
||||
// Should handle all users authenticated and
|
||||
// act as an information base for the current
|
||||
// users
|
||||
public class AuthManager
|
||||
{
|
||||
private Server server;
|
||||
|
||||
// TODO: Need an AuthProvider here
|
||||
private AuthProvider provider;
|
||||
|
||||
/**
|
||||
* TODO: We need to find a way to easily
|
||||
* manage User* mapped to by a string (username)
|
||||
* and how updating the username (key) would
|
||||
* work (including the allocated value)
|
||||
* then
|
||||
*
|
||||
* Update: We won't expose this User*
|
||||
* to the public API as that means
|
||||
* you can manipulate the user
|
||||
* there (that is fine) but ALSO
|
||||
* replace the entire user there
|
||||
*
|
||||
* Nah, forget the above we should discern
|
||||
* between username (never changing)
|
||||
* and nick
|
||||
*
|
||||
* UPDATE2: We will STILL need to index (somehow)
|
||||
* on that then, perhaps a seperate
|
||||
*
|
||||
* What is the point of usernames? for
|
||||
* auth but then nick is what people _should_
|
||||
* see when you `membershipList()`.
|
||||
*
|
||||
* So we would need to update
|
||||
* ChannelManager code to do that
|
||||
*
|
||||
*/
|
||||
private User[string] users;
|
||||
private Mutex usersLock;
|
||||
|
||||
private this(AuthProvider provider)
|
||||
{
|
||||
this.usersLock = new Mutex();
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
private User* getUser(string username)
|
||||
{
|
||||
User* foundUser;
|
||||
|
||||
// Lock
|
||||
this.usersLock.lock();
|
||||
|
||||
foundUser = username in this.users;
|
||||
|
||||
// Unlock
|
||||
this.usersLock.unlock();
|
||||
|
||||
return foundUser;
|
||||
}
|
||||
|
||||
public bool authenticate(string username, string password)
|
||||
{
|
||||
logger.dbg("Authentication request for user '"~username~"' with password '"~password~"'");
|
||||
bool status;
|
||||
|
||||
User potentialUser = User("");
|
||||
status = this.provider.authenticate(username, password, potentialUser);
|
||||
if(status)
|
||||
{
|
||||
logger.info("Authenticated user '"~username~"'");
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.error("Authentication failed for user '"~username~"'");
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
public static AuthManager create(Server server, AuthProvider provider = new DummyProvider())
|
||||
{
|
||||
AuthManager manager = new AuthManager(provider);
|
||||
manager.server = server;
|
||||
|
||||
|
||||
return manager;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue