/*
* Copyright 2011 Future Systems
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.krakenapps.ldap;
import java.util.Date;
import org.krakenapps.api.DateFormat;
import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPAttributeSet;
import com.novell.ldap.LDAPEntry;
public class LdapUser {
private String accountName;
private boolean domainAdmin;
private boolean allowDialIn;
private int logonCount;
private int userAccountControl;
private String[] memberOf;
private String distinguishedName;
private String userPrincipalName;
private String organizationUnitName;
private String displayName;
private String surname;
private String givenName;
private String title;
private String department;
private String departmentNumber;
private String mail;
private String mobile;
private Date lastLogon;
private Date whenCreated;
private Date pwdLastSet;
private Date accountExpires;
@SuppressWarnings("unused")
private LdapUser() {
// for primitive parse
}
public LdapUser(LDAPEntry entry, String idAttr) {
LDAPAttributeSet attrs = entry.getAttributeSet();
this.accountName = getString(attrs, "sAMAccountName");
if (accountName == null)
accountName = getString(attrs, idAttr);
this.domainAdmin = getInt(attrs, "adminCount") > 0;
this.userAccountControl = getInt(attrs, "userAccountControl");
this.allowDialIn = "TRUE".equals(getString(attrs, "msNPAllowDialin"));
this.logonCount = getInt(attrs, "logonCount");
this.memberOf = getStringArray(attrs, "memberOf");
this.distinguishedName = getString(attrs, "distinguishedName");
this.userPrincipalName = getString(attrs, "userPrincipalName");
this.displayName = getString(attrs, "displayName");
if (displayName == null)
displayName = getString(attrs, "cn");
this.surname = getString(attrs, "sn");
this.givenName = getString(attrs, "givenName");
this.title = getString(attrs, "title");
this.department = getString(attrs, "department");
this.departmentNumber = getString(attrs, "departmentNumber");
this.mail = getString(attrs, "mail");
this.mobile = getString(attrs, "mobile");
this.lastLogon = getTimestamp(attrs, "lastLogon");
this.whenCreated = getDate(attrs, "whenCreated");
this.pwdLastSet = getTimestamp(attrs, "pwdLastSet");
long expire = getLong(attrs, "accountExpires");
if (expire != 0L && expire != 0x7FFFFFFFFFFFFFFFL)
this.accountExpires = getTimestamp(attrs, "accountExpires");
if (distinguishedName != null) {
for (String token : distinguishedName.split("(?<!\\\\),")) {
String attr = token.split("=")[0];
String value = token.split("=")[1];
if (attr.equals("OU")) {
this.organizationUnitName = value;
break;
}
}
}
}
private int getInt(LDAPAttributeSet attrs, String attrName) {
LDAPAttribute attr = attrs.getAttribute(attrName);
return (attr == null) ? 0 : Integer.parseInt(attr.getStringValue());
}
private long getLong(LDAPAttributeSet attrs, String attrName) {
LDAPAttribute attr = attrs.getAttribute(attrName);
return (attr == null) ? 0L : Long.parseLong(attr.getStringValue());
}
private Date getDate(LDAPAttributeSet attrs, String attrName) {
LDAPAttribute attr = attrs.getAttribute(attrName);
return (attr == null) ? null : DateFormat.parse("yyyyMMddHHmmss", attr.getStringValue());
}
private Date getTimestamp(LDAPAttributeSet attrs, String attrName) {
Long attr = getLong(attrs, attrName);
return (attr == null) ? null : new Date(attr / 10000L - 11644473600000L);
}
private String getString(LDAPAttributeSet attrs, String attrName) {
LDAPAttribute attr = attrs.getAttribute(attrName);
return (attr == null) ? null : attr.getStringValue();
}
private String[] getStringArray(LDAPAttributeSet attrs, String attrName) {
LDAPAttribute attr = attrs.getAttribute(attrName);
return (attr == null) ? null : attr.getStringValueArray();
}
public String getAccountName() {
return accountName;
}
public boolean isDomainAdmin() {
return domainAdmin;
}
public boolean isAllowDialIn() {
return allowDialIn;
}
public int getLogonCount() {
return logonCount;
}
public int getUserAccountControl() {
return userAccountControl;
}
public String[] getMemberOf() {
return memberOf;
}
public String getDistinguishedName() {
return distinguishedName;
}
public String getUserPrincipalName() {
return userPrincipalName;
}
public String getOrganizationUnitName() {
return organizationUnitName;
}
public String getDisplayName() {
return displayName;
}
public String getSurname() {
return surname;
}
public String getGivenName() {
return givenName;
}
public String getTitle() {
return title;
}
public String getDepartment() {
return department;
}
public String getDepartmentNumber() {
return departmentNumber;
}
public String getMail() {
return mail;
}
public String getMobile() {
return mobile;
}
public Date getLastLogon() {
return lastLogon;
}
public Date getWhenCreated() {
return whenCreated;
}
public Date getPwdLastSet() {
return pwdLastSet;
}
public Date getAccountExpires() {
return accountExpires;
}
@Override
public String toString() {
return String.format("account=%s, name=%s, title=%s, dept=%s, mail=%s", accountName, displayName, nullToEmpty(title),
nullToEmpty(department), nullToEmpty(mail));
}
private String nullToEmpty(String str) {
return (str == null) ? "" : str;
}
}