package fi.otavanopisto.pyramus.plugin.ldap.views;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPEntry;
import com.novell.ldap.LDAPException;
import com.novell.ldap.LDAPSearchResults;
import fi.internetix.smvc.SmvcRuntimeException;
import fi.internetix.smvc.controllers.PageRequestContext;
import fi.otavanopisto.pyramus.dao.DAOFactory;
import fi.otavanopisto.pyramus.dao.base.EmailDAO;
import fi.otavanopisto.pyramus.dao.users.UserDAO;
import fi.otavanopisto.pyramus.domainmodel.users.Role;
import fi.otavanopisto.pyramus.domainmodel.users.User;
import fi.otavanopisto.pyramus.framework.PyramusFormViewController;
import fi.otavanopisto.pyramus.framework.UserRole;
import fi.otavanopisto.pyramus.plugin.ldap.LDAPUtils;
public class ImportLDAPUsersViewController extends PyramusFormViewController {
public void processForm(PageRequestContext requestContext) {
UserDAO userDAO = DAOFactory.getInstance().getUserDAO();
List<Map<String, String>> result = new ArrayList<Map<String, String>>();
LDAPSearchResults searchResults;
try {
List<String> attributes = new ArrayList<String>();
String usernameAttr = System.getProperty("authentication.ldap.usernameAttr");
String emailAttr = System.getProperty("authentication.ldap.emailAttr");
String firstnameAttr = System.getProperty("authentication.ldap.firstnameAttr");
String lastnameAttr = System.getProperty("authentication.ldap.lastnameAttr");
String defaultEmailDomain = System.getProperty("authentication.ldap.defaultEmailDomain");
String uniqueIdAttr = System.getProperty("authentication.ldap.uniqueIdAttr");
boolean idEncoded = "1".equals(System.getProperty("authentication.ldap.uniqueIdEncoded"));
attributes.add(uniqueIdAttr);
attributes.add(usernameAttr);
attributes.add(firstnameAttr);
attributes.add(lastnameAttr);
if (!StringUtils.isBlank(emailAttr))
attributes.add(emailAttr);
LDAPConnection connection = LDAPUtils.getLDAPConnection();
searchResults = connection.search(System.getProperty("authentication.ldap.authdn"), LDAPConnection.SCOPE_SUB, System.getProperty("authentication.ldap.personFilter").trim(), attributes.toArray(new String[0]), false);
while (searchResults != null && searchResults.hasMore()) {
LDAPEntry entry = searchResults.next();
LDAPAttribute attr;
String username = entry.getAttribute(usernameAttr).getStringValue();
attr = entry.getAttribute(uniqueIdAttr);
String id = idEncoded ? LDAPUtils.getAttributeBinaryValue(attr) : attr.getStringValue();
boolean existsOnDB = userDAO.findByExternalIdAndAuthProvider(id, "LDAP") != null;
if (!existsOnDB) {
Map<String, String> info = new HashMap<String, String>();
attr = entry.getAttribute(firstnameAttr);
String firstName = attr != null ? attr.getStringValue() : "";
attr = entry.getAttribute(lastnameAttr);
String lastName = attr != null ? attr.getStringValue() : "";
String email = "";
if (!StringUtils.isBlank(emailAttr)) {
attr = entry.getAttribute(emailAttr);
email = attr != null ? attr.getStringValue() : "";;
}
if (StringUtils.isBlank(email) && !StringUtils.isBlank(firstName) && !StringUtils.isBlank(lastName))
email = username.toLowerCase() + '@' + defaultEmailDomain;
info.put("username", username);
info.put("firstName", firstName);
info.put("lastName", lastName);
info.put("email", email);
info.put("id", id);
result.add(info);
}
}
} catch (LDAPException e) {
throw new SmvcRuntimeException(e);
}
requestContext.getRequest().setAttribute("users", result);
requestContext.setIncludeFtl("/plugin/ldap/ftl/importldapusers.ftl");
}
public void processSend(PageRequestContext requestContext) {
EmailDAO emailDAO = DAOFactory.getInstance().getEmailDAO();
UserDAO userDAO = DAOFactory.getInstance().getUserDAO();
List<User> createdUsers = new ArrayList<User>();
int rowCount = requestContext.getInteger("importTable.rowCount");
for (int i = 0; i < rowCount; i++) {
String colPrefix = "importTable." + i;
if ("1".equals(requestContext.getString(colPrefix + ".import"))) {
String email = requestContext.getString(colPrefix + ".email");
String firstName = requestContext.getString(colPrefix + ".firstName");
String lastName = requestContext.getString(colPrefix + ".lastName");
String roleName = requestContext.getString(colPrefix + ".role");
String id = requestContext.getString(colPrefix + ".id");
Role role = Enum.valueOf(Role.class, roleName);
User user = userDAO.create(firstName, lastName, id, "LDAP", role);
emailDAO.create(user.getContactInfo(), null, Boolean.TRUE, email);
createdUsers.add(user);
}
}
requestContext.getRequest().setAttribute("createdUsers", createdUsers);
requestContext.setRedirectURL(requestContext.getRequest().getContextPath() + "system/importldapusers.page");
}
public UserRole[] getAllowedRoles() {
return new UserRole[] { UserRole.ADMINISTRATOR };
}
}