From 104716fedb2c910bc6365b0ae36fb9f96f60a98c Mon Sep 17 00:00:00 2001 From: Luke Taylor Date: Tue, 29 Apr 2008 14:39:58 +0000 Subject: [PATCH] SEC-805: Add extra fields to InetOrgPerson http://jira.springframework.org/browse/SEC-805. Added a substantial number of new fields to the class. --- .../userdetails/ldap/InetOrgPerson.java | 207 ++++++++++++++++-- .../security/userdetails/ldap/Person.java | 28 ++- .../userdetails/ldap/InetOrgPersonTests.java | 59 ++++- .../ldap/LdapUserDetailsManagerTests.java | 13 +- 4 files changed, 280 insertions(+), 27 deletions(-) diff --git a/core/src/main/java/org/springframework/security/userdetails/ldap/InetOrgPerson.java b/core/src/main/java/org/springframework/security/userdetails/ldap/InetOrgPerson.java index 36f759e0d9..358c5b1fd1 100644 --- a/core/src/main/java/org/springframework/security/userdetails/ldap/InetOrgPerson.java +++ b/core/src/main/java/org/springframework/security/userdetails/ldap/InetOrgPerson.java @@ -28,34 +28,121 @@ import org.springframework.ldap.core.DirContextOperations; * @author Luke * @version $Id$ */ -public class InetOrgPerson extends Person { - private String mail; - private String uid; - private String employeeNumber; +public class InetOrgPerson extends Person { + private String carLicense; + // Person.cn private String destinationIndicator; - - public String getMail() { - return mail; - } + private String departmentNumber; + // Person.description + private String displayName; + private String employeeNumber; + private String homePhone; + private String homePostalAddress; + private String initials; + private String mail; + private String mobile; + private String o; + private String ou; + private String postalAddress; + private String postalCode; + private String roomNumber; + private String street; + // Person.sn + // Person.telephoneNumber + private String title; + private String uid; public String getUid() { return uid; } + + public String getMail() { + return mail; + } public String getEmployeeNumber() { return employeeNumber; } + + public String getInitials() { + return initials; + } public String getDestinationIndicator() { return destinationIndicator; } + + public String getO() { + return o; + } - protected void populateContext(DirContextAdapter adapter) { + public String getOu() { + return ou; + } + + public String getTitle() { + return title; + } + + public String getCarLicense() { + return carLicense; + } + + public String getDepartmentNumber() { + return departmentNumber; + } + + public String getDisplayName() { + return displayName; + } + + public String getHomePhone() { + return homePhone; + } + + public String getRoomNumber() { + return roomNumber; + } + + public String getHomePostalAddress() { + return homePostalAddress; + } + + public String getMobile() { + return mobile; + } + + public String getPostalAddress() { + return postalAddress; + } + + public String getPostalCode() { + return postalCode; + } + + public String getStreet() { + return street; + } + + protected void populateContext(DirContextAdapter adapter) { super.populateContext(adapter); - adapter.setAttributeValue("mail", mail); - adapter.setAttributeValue("uid", uid); + adapter.setAttributeValue("carLicense", carLicense); + adapter.setAttributeValue("departmentNumber", departmentNumber); + adapter.setAttributeValue("destinationIndicator", destinationIndicator); + adapter.setAttributeValue("displayName", displayName); adapter.setAttributeValue("employeeNumber", employeeNumber); - adapter.setAttributeValue("destinationIndicator", destinationIndicator); + adapter.setAttributeValue("homePhone", homePhone); + adapter.setAttributeValue("homePostalAddress", homePostalAddress); + adapter.setAttributeValue("initials", initials); + adapter.setAttributeValue("mail", mail); + adapter.setAttributeValue("mobile", mobile); + adapter.setAttributeValue("postalAddress", postalAddress); + adapter.setAttributeValue("postalCode", postalCode); + adapter.setAttributeValue("ou", ou); + adapter.setAttributeValue("o", o); + adapter.setAttributeValue("roomNumber", roomNumber); + adapter.setAttributeValue("street", street); + adapter.setAttributeValue("uid", uid); adapter.setAttributeValues("objectclass", new String[] {"top", "person", "organizationalPerson", "inetOrgPerson"}); } @@ -65,18 +152,46 @@ public class InetOrgPerson extends Person { public Essence(InetOrgPerson copyMe) { super(copyMe); - setMail(copyMe.getMail()); - setUid(copyMe.getUid()); + setCarLicense(copyMe.getCarLicense()); + setDepartmentNumber(copyMe.getDepartmentNumber()); setDestinationIndicator(copyMe.getDestinationIndicator()); + setDisplayName(copyMe.getDisplayName()); setEmployeeNumber(copyMe.getEmployeeNumber()); + setHomePhone(copyMe.getHomePhone()); + setHomePostalAddress(copyMe.getHomePostalAddress()); + setInitials(copyMe.getInitials()); + setMail(copyMe.getMail()); + setMobile(copyMe.getMobile()); + setO(copyMe.getO()); + setOu(copyMe.getOu()); + setPostalAddress(copyMe.getPostalAddress()); + setPostalCode(copyMe.getPostalCode()); + setRoomNumber(copyMe.getRoomNumber()); + setStreet(copyMe.getStreet()); + setTitle(copyMe.getTitle()); + setUid(copyMe.getUid()); } - public Essence(DirContextOperations ctx) { + public Essence(DirContextOperations ctx) { super(ctx); - setMail(ctx.getStringAttribute("mail")); - setUid(ctx.getStringAttribute("uid")); - setEmployeeNumber(ctx.getStringAttribute("employeeNumber")); + setCarLicense(ctx.getStringAttribute("carLicense")); + setDepartmentNumber(ctx.getStringAttribute("departmentNumber")); setDestinationIndicator(ctx.getStringAttribute("destinationIndicator")); + setDisplayName(ctx.getStringAttribute("displayName")); + setEmployeeNumber(ctx.getStringAttribute("employeeNumber")); + setHomePhone(ctx.getStringAttribute("homePhone")); + setHomePostalAddress(ctx.getStringAttribute("homePostalAddress")); + setInitials(ctx.getStringAttribute("initials")); + setMail(ctx.getStringAttribute("mail")); + setMobile(ctx.getStringAttribute("mobile")); + setO(ctx.getStringAttribute("o")); + setOu(ctx.getStringAttribute("ou")); + setPostalAddress(ctx.getStringAttribute("postalAddress")); + setPostalCode(ctx.getStringAttribute("postalCode")); + setRoomNumber(ctx.getStringAttribute("roomNumber")); + setStreet(ctx.getStringAttribute("street")); + setTitle(ctx.getStringAttribute("title")); + setUid(ctx.getStringAttribute("uid")); } protected LdapUserDetailsImpl createTarget() { @@ -94,6 +209,38 @@ public class InetOrgPerson extends Person { setUsername(uid); } } + + public void setInitials(String initials) { + ((InetOrgPerson) instance).initials = initials; + } + + public void setO(String organization) { + ((InetOrgPerson) instance).o = organization; + } + + public void setOu(String ou) { + ((InetOrgPerson) instance).ou = ou; + } + + public void setRoomNumber(String no) { + ((InetOrgPerson) instance).roomNumber = no; + } + + public void setTitle(String title) { + ((InetOrgPerson) instance).title = title; + } + + public void setCarLicense(String carLicense) { + ((InetOrgPerson) instance).carLicense = carLicense; + } + + public void setDepartmentNumber(String departmentNumber) { + ((InetOrgPerson) instance).departmentNumber = departmentNumber; + } + + public void setDisplayName(String displayName) { + ((InetOrgPerson) instance).displayName = displayName; + } public void setEmployeeNumber(String no) { ((InetOrgPerson) instance).employeeNumber = no; @@ -102,5 +249,29 @@ public class InetOrgPerson extends Person { public void setDestinationIndicator(String destination) { ((InetOrgPerson) instance).destinationIndicator = destination; } + + public void setHomePhone(String homePhone) { + ((InetOrgPerson) instance).homePhone = homePhone; + } + + public void setStreet(String street) { + ((InetOrgPerson) instance).street = street; + } + + public void setPostalCode(String postalCode) { + ((InetOrgPerson) instance).postalCode = postalCode; + } + + public void setPostalAddress(String postalAddress) { + ((InetOrgPerson) instance).postalAddress = postalAddress; + } + + public void setMobile(String mobile) { + ((InetOrgPerson) instance).mobile = mobile; + } + + public void setHomePostalAddress(String homePostalAddress) { + ((InetOrgPerson) instance).homePostalAddress = homePostalAddress; + } } } diff --git a/core/src/main/java/org/springframework/security/userdetails/ldap/Person.java b/core/src/main/java/org/springframework/security/userdetails/ldap/Person.java index 3b247a93d6..b56c74dfc9 100644 --- a/core/src/main/java/org/springframework/security/userdetails/ldap/Person.java +++ b/core/src/main/java/org/springframework/security/userdetails/ldap/Person.java @@ -35,6 +35,8 @@ import java.util.Arrays; */ public class Person extends LdapUserDetailsImpl { private String sn; + private String description; + private String telephoneNumber; private List cn = new ArrayList(); protected Person() { @@ -47,10 +49,20 @@ public class Person extends LdapUserDetailsImpl { public String[] getCn() { return (String[]) cn.toArray(new String[cn.size()]); } + + public String getDescription() { + return description; + } - protected void populateContext(DirContextAdapter adapter) { + public String getTelephoneNumber() { + return telephoneNumber; + } + + protected void populateContext(DirContextAdapter adapter) { adapter.setAttributeValue("sn", sn); adapter.setAttributeValues("cn", getCn()); + adapter.setAttributeValue("description", getDescription()); + adapter.setAttributeValue("telephoneNumber", getTelephoneNumber()); if(getPassword() != null) { adapter.setAttributeValue("userPassword", getPassword()); @@ -67,6 +79,8 @@ public class Person extends LdapUserDetailsImpl { super(ctx); setCn(ctx.getStringAttributes("cn")); setSn(ctx.getStringAttribute("sn")); + setDescription(ctx.getStringAttribute("description")); + setTelephoneNumber(ctx.getStringAttribute("telephoneNumber")); Object passo = ctx.getObjectAttribute("userPassword"); if(passo != null) { @@ -75,9 +89,11 @@ public class Person extends LdapUserDetailsImpl { } } - public Essence(Person copyMe) { + public Essence(Person copyMe) { super(copyMe); setSn(copyMe.sn); + setDescription(copyMe.getDescription()); + setTelephoneNumber(copyMe.getTelephoneNumber()); ((Person) instance).cn = new ArrayList(copyMe.cn); } @@ -96,6 +112,14 @@ public class Person extends LdapUserDetailsImpl { public void addCn(String value) { ((Person) instance).cn.add(value); } + + public void setTelephoneNumber(String tel) { + ((Person) instance).telephoneNumber = tel; + } + + public void setDescription(String desc) { + ((Person) instance).description = desc; + } public LdapUserDetails createUserDetails() { Person p = (Person) super.createUserDetails(); diff --git a/core/src/test/java/org/springframework/security/userdetails/ldap/InetOrgPersonTests.java b/core/src/test/java/org/springframework/security/userdetails/ldap/InetOrgPersonTests.java index 8f9c69c2ff..6bf192e044 100644 --- a/core/src/test/java/org/springframework/security/userdetails/ldap/InetOrgPersonTests.java +++ b/core/src/test/java/org/springframework/security/userdetails/ldap/InetOrgPersonTests.java @@ -16,7 +16,6 @@ public class InetOrgPersonTests extends TestCase { InetOrgPerson p = (InetOrgPerson) essence.createUserDetails(); assertEquals("ghengis", p.getUsername()); - } public void testUsernameIsDifferentFromContextUidIfSet() { @@ -32,11 +31,23 @@ public class InetOrgPersonTests extends TestCase { InetOrgPerson.Essence essence = new InetOrgPerson.Essence(createUserContext()); InetOrgPerson p = (InetOrgPerson) essence.createUserDetails(); + assertEquals("HORS1", p.getCarLicense()); assertEquals("ghengis@mongolia", p.getMail()); assertEquals("Khan", p.getSn()); assertEquals("Ghengis Khan", p.getCn()[0]); assertEquals("00001", p.getEmployeeNumber()); - assertEquals("West", p.getDestinationIndicator()); + assertEquals("+442075436521", p.getTelephoneNumber()); + assertEquals("Steppes", p.getHomePostalAddress()); + assertEquals("+467575436521", p.getHomePhone()); + assertEquals("Hordes", p.getO()); + assertEquals("Horde1", p.getOu()); + assertEquals("On the Move", p.getPostalAddress()); + assertEquals("Changes Frequently", p.getPostalCode()); + assertEquals("Yurt 1", p.getRoomNumber()); + assertEquals("Westward Avenue", p.getStreet()); + assertEquals("Scary", p.getDescription()); + assertEquals("Ghengis McCann", p.getDisplayName()); + assertEquals("G", p.getInitials()); } public void testPasswordIsSetFromContextUserPassword() { @@ -44,21 +55,57 @@ public class InetOrgPersonTests extends TestCase { InetOrgPerson p = (InetOrgPerson) essence.createUserDetails(); assertEquals("pillage", p.getPassword()); - + } + + public void testMappingBackToContextMatchesOriginalData() { + DirContextAdapter ctx1 = createUserContext(); + DirContextAdapter ctx2 = new DirContextAdapter(); + ctx1.setAttributeValues("objectclass", new String[] {"top", "person", "organizationalPerson", "inetOrgPerson"}); + ctx2.setDn(new DistinguishedName("ignored=ignored")); + InetOrgPerson p = (InetOrgPerson) (new InetOrgPerson.Essence(ctx1)).createUserDetails(); + p.populateContext(ctx2); + + assertEquals(ctx1, ctx2); } + public void testCopyMatchesOriginalData() { + DirContextAdapter ctx1 = createUserContext(); + DirContextAdapter ctx2 = new DirContextAdapter(); + ctx2.setDn(new DistinguishedName("ignored=ignored")); + ctx1.setAttributeValues("objectclass", new String[] {"top", "person", "organizationalPerson", "inetOrgPerson"}); + InetOrgPerson p = (InetOrgPerson) (new InetOrgPerson.Essence(ctx1)).createUserDetails(); + InetOrgPerson p2 = (InetOrgPerson) new InetOrgPerson.Essence(p).createUserDetails(); + p2.populateContext(ctx2); + + assertEquals(ctx1, ctx2); + } + private DirContextAdapter createUserContext() { DirContextAdapter ctx = new DirContextAdapter(); ctx.setDn(new DistinguishedName("ignored=ignored")); ctx.setAttributeValue("uid", "ghengis"); ctx.setAttributeValue("userPassword", "pillage"); - ctx.setAttributeValue("mail", "ghengis@mongolia"); + ctx.setAttributeValue("carLicense", "HORS1"); ctx.setAttributeValue("cn", "Ghengis Khan"); - ctx.setAttributeValue("sn", "Khan"); - ctx.setAttributeValue("employeeNumber", "00001"); + ctx.setAttributeValue("description", "Scary"); ctx.setAttributeValue("destinationIndicator", "West"); + ctx.setAttributeValue("displayName", "Ghengis McCann"); + ctx.setAttributeValue("homePhone", "+467575436521"); + ctx.setAttributeValue("initials", "G"); + ctx.setAttributeValue("employeeNumber", "00001"); + ctx.setAttributeValue("homePostalAddress", "Steppes"); + ctx.setAttributeValue("mail", "ghengis@mongolia"); + ctx.setAttributeValue("mobile", "always"); ctx.setAttributeValue("o", "Hordes"); + ctx.setAttributeValue("ou", "Horde1"); + ctx.setAttributeValue("postalAddress", "On the Move"); + ctx.setAttributeValue("postalCode", "Changes Frequently"); + ctx.setAttributeValue("roomNumber", "Yurt 1"); + ctx.setAttributeValue("roomNumber", "Yurt 1"); + ctx.setAttributeValue("sn", "Khan"); + ctx.setAttributeValue("street", "Westward Avenue"); + ctx.setAttributeValue("telephoneNumber", "+442075436521"); return ctx; } diff --git a/core/src/test/java/org/springframework/security/userdetails/ldap/LdapUserDetailsManagerTests.java b/core/src/test/java/org/springframework/security/userdetails/ldap/LdapUserDetailsManagerTests.java index ed6b635e79..f782b2eed3 100644 --- a/core/src/test/java/org/springframework/security/userdetails/ldap/LdapUserDetailsManagerTests.java +++ b/core/src/test/java/org/springframework/security/userdetails/ldap/LdapUserDetailsManagerTests.java @@ -116,10 +116,21 @@ public class LdapUserDetailsManagerTests extends AbstractLdapIntegrationTests { @Test public void testCreateNewUserSucceeds() { InetOrgPerson.Essence p = new InetOrgPerson.Essence(); - p.setDn("whocares"); + p.setCarLicense("XXX"); p.setCn(new String[] {"Joe Smeth"}); + p.setDepartmentNumber("5679"); + p.setDescription("Some description"); + p.setDn("whocares"); + p.setEmployeeNumber("E781"); + p.setInitials("J"); + p.setMail("joe@smeth.com"); + p.setMobile("+44776542911"); + p.setOu("Joes Unit"); + p.setO("Organization"); + p.setRoomNumber("500X"); p.setSn("Smeth"); p.setUid("joe"); + p.setAuthorities(TEST_AUTHORITIES); mgr.createUser(p.createUserDetails());