Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Admin user feature (Second attempt) #186

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -114,6 +114,28 @@ public interface GreenMailOperations {
*/
GreenMailUser setUser(String email, String login, String password);

/**
* Sets the password for the account linked to email. If no account exits, one is automatically created when an email is received
* The automatically created account has the account login and password equal to the email address.
*
* @param login Login for which the password should be set. This is assumed to be the same as the email address.
* @param password New password
* @return the admin user created
*/
GreenMailUser setAdmin(String login, String password);

/**
* Sets the password for the account linked to email. If no account exits, one is automatically created when an email is received
* The automatically created account has the account login and password equal to the email address.
*
* @param email Email address for which the password should be set
* @param login Login name for login. This may be different to the email address. E.g. the email address could be
* "info@localhost", the login could be "info".
* @param password New password
* @return the admin user created
*/
GreenMailUser setAdmin(String email, String login, String password);

/**
* Sets up accounts with password based on a properties map where the key is the email/login and the value the password
*
Expand Down
Expand Up @@ -24,6 +24,7 @@ public interface ImapConstants {
char NAMESPACE_PREFIX_CHAR = '#';
String HIERARCHY_DELIMITER = String.valueOf(HIERARCHY_DELIMITER_CHAR);
String NAMESPACE_PREFIX = String.valueOf(NAMESPACE_PREFIX_CHAR);
String ALL = "*";

String INBOX_NAME = "INBOX";
String STORAGE = "STORAGE";
Expand Down
Expand Up @@ -40,6 +40,13 @@ public interface ImapHostManager {
*/
List<StoredMessage> getAllMessages();

/**
* Returns all messages.
*
* @return a list of messages.
*/
List<StoredMessage> getAllMessages(GreenMailUser user);

/**
* Returns the hierarchy delimiter for mailboxes on this host.
*
Expand All @@ -58,7 +65,7 @@ public interface ImapHostManager {
* @param mailboxName String name of the target.
* @return an Mailbox reference.
*/
MailFolder getFolder(GreenMailUser user, String mailboxName);
MailFolder getFolder(GreenMailUser user, String mailboxName) throws FolderException;

/**
* Returns a reference to an existing Mailbox.
Expand Down
Expand Up @@ -39,14 +39,29 @@ public ImapHostManagerImpl(Store store) {

@Override
public List<StoredMessage> getAllMessages() {
List<StoredMessage> ret = new ArrayList<>();
try {
Collection<MailFolder> boxes = store.listMailboxes("*");
for (MailFolder boxe : boxes) {
ret.addAll(boxe.getMessages());
}
return getAllMessages(store.listMailboxes("*"));
} catch (FolderException e) {
throw new RuntimeException(e);
}
}

@Override
public List<StoredMessage> getAllMessages(GreenMailUser user) {
try {
return getAllMessages(listMailboxes(user, "*"));
} catch (FolderException e) {
throw new IllegalStateException(e);
throw new RuntimeException(e);
}
}

private List<StoredMessage> getAllMessages(Collection<MailFolder> boxes) {
List<StoredMessage> ret = new ArrayList<>();
for (MailFolder folder : boxes) {
List<StoredMessage> messages = folder.getMessages();
for (StoredMessage message : messages) {
ret.add(message);
}
}
return ret;
}
Expand All @@ -57,13 +72,21 @@ public char getHierarchyDelimiter() {
}

/**
* @throws FolderException
* @see ImapHostManager#getFolder
*/
@Override
public MailFolder getFolder(GreenMailUser user, String mailboxName) {
public MailFolder getFolder(GreenMailUser user, String mailboxName) throws FolderException {
String name = getQualifiedMailboxName(user, mailboxName);
if (user.isAdmin() && !mailboxName.startsWith(NAMESPACE_PREFIX)) {
Collection<MailFolder> mailboxes = store.listMailboxes(ALL);
for (MailFolder folder : mailboxes) {
if (folder.getFullName().endsWith(mailboxName)) {
return folder;
}
}
}
MailFolder folder = store.getMailbox(name);
return checkViewable(folder);
return (checkViewable(folder));
}

@Override
Expand Down
Expand Up @@ -16,6 +16,8 @@ public interface GreenMailUser {
void deliver(MovingMessage msg);
void deliver(MimeMessage msg);

boolean isAdmin();

void create();

void delete();
Expand Down
Expand Up @@ -21,17 +21,23 @@ public class UserImpl implements GreenMailUser {
private final String cachedHashCodeAsString;
String login;
String password;
private boolean admin;
private ImapHostManager imapHostManager;

public UserImpl(String email, String login, String password, ImapHostManager imapHostManager) {
public UserImpl(String email, String login, String password, boolean admin, ImapHostManager imapHostManager) {
this.email = email;
cachedHashCode = email.hashCode();
cachedHashCodeAsString = String.valueOf(cachedHashCode);
this.login = login;
this.password = password;
this.admin = admin;
this.imapHostManager = imapHostManager;
}

public boolean isAdmin() {
return admin;
}

@Override
public void create() {
try {
Expand Down
Expand Up @@ -35,7 +35,14 @@ public GreenMailUser getUserByEmail(String email) {
}

public GreenMailUser createUser(String email, String login, String password) throws UserException {
GreenMailUser user = new UserImpl(email, login, password, imapHostManager);
GreenMailUser user = new UserImpl(email, login, password, false, imapHostManager);
user.create();
addUser(user);
return user;
}

public GreenMailUser createAdmin(String email, String login, String password) throws UserException {
GreenMailUser user = new UserImpl(email, login, password, true, imapHostManager);
user.create();
addUser(user);
return user;
Expand Down
Expand Up @@ -263,15 +263,33 @@ public MimeMessage[] getReceivedMessagesForDomain(String domain) {

@Override
public GreenMailUser setUser(String login, String password) {
return setUser(login, login, password);
return _setUser(login, login, password, false);
}

@Override
public GreenMailUser setUser(String email, String login, String password) {
return _setUser(email, login, password, false);
}

@Override
public GreenMailUser setAdmin(String login, String password) {
return _setUser(login, login, password, true);
}

@Override
public GreenMailUser setAdmin(String email, String login, String password) {
return _setUser(email, login, password, true);
}

private GreenMailUser _setUser(String email, String login, String password, boolean admin) {
GreenMailUser user = managers.getUserManager().getUser(login);
if (null == user) {
try {
user = managers.getUserManager().createUser(email, login, password);
if(admin){
user = managers.getUserManager().createAdmin(email, login, password);
} else {
user = managers.getUserManager().createUser(email, login, password);
}
} catch (UserException e) {
throw new RuntimeException(e);
}
Expand All @@ -291,7 +309,7 @@ public void setUsers(Properties users) {
for (Object o : users.keySet()) {
String email = (String) o;
String password = users.getProperty(email);
setUser(email, email, password);
_setUser(email, email, password, false);
}
}

Expand Down
Expand Up @@ -89,6 +89,16 @@ public GreenMailUser setUser(String email, String login, String password) {
return getGreenMail().setUser(email, login, password);
}

@Override
public GreenMailUser setAdmin(String login, String password) {
return getGreenMail().setAdmin(login, password);
}

@Override
public GreenMailUser setAdmin(String email, String login, String password) {
return getGreenMail().setAdmin(email, login, password);
}

@Override
public void setUsers(Properties users) {
getGreenMail().setUsers(users);
Expand Down
Expand Up @@ -59,6 +59,20 @@ public void testCreateAndDeleteUser() throws UserException {
assertTrue(userManager.listUser().isEmpty());
}

@Test
public void testCreateAndDeleteAdmin() throws UserException {
ImapHostManager imapHostManager = new ImapHostManagerImpl(new InMemoryStore());
UserManager userManager = new UserManager(imapHostManager);

assertTrue(userManager.listUser().isEmpty());

GreenMailUser user = userManager.createAdmin("foo@bar.com", "foo", "pwd");
assertEquals(1, userManager.listUser().size());

userManager.deleteUser(user);
assertTrue(userManager.listUser().isEmpty());
}

@Test
public void testNoAuthRequired() {
ImapHostManager imapHostManager = new ImapHostManagerImpl(new InMemoryStore());
Expand Down