Skip to content
This repository was archived by the owner on Dec 12, 2018. It is now read-only.

Commit 07b6e2f

Browse files
committed
WIP - bad password check still fails TCK
1 parent a95a812 commit 07b6e2f

File tree

7 files changed

+293
-6
lines changed

7 files changed

+293
-6
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.stormpath.sdk.directory;
2+
3+
import com.stormpath.sdk.resource.Resource;
4+
5+
import java.util.Date;
6+
import java.util.Map;
7+
8+
public interface OktaPasswordPolicy extends Resource {
9+
10+
String getType();
11+
String getId();
12+
String getStatus();
13+
String getName();
14+
String getDescription();
15+
int getPriority();
16+
boolean getSystem();
17+
Map<String, Object> getConditions();
18+
Date getCreated();
19+
Date getLastUpdated();
20+
Map<String, Object> getSettings();
21+
Map<String, Object> getDelegation();
22+
Map<String, Object> getRules();
23+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.stormpath.sdk.directory;
2+
3+
import com.stormpath.sdk.resource.CollectionResource;
4+
5+
public interface OktaPasswordPolicyList extends CollectionResource<OktaPasswordPolicy> {
6+
}

extensions/servlet/src/main/java/com/stormpath/sdk/servlet/mvc/provider/ExternalAccountStoreModelFactory.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,14 @@ public List<AccountStoreModel> getAccountStores(HttpServletRequest request) {
5959
AccountStoreModelVisitor visitor =
6060
new AccountStoreModelVisitor(accountStores, getAuthorizeBaseUri(request, app.getWebConfig()));
6161

62-
for (ApplicationAccountStoreMapping mapping : mappings) {
62+
// TODO - if introduced for Okta. Need to deal with for real when we add social support
63+
if (mappings.getHref() != null) {
64+
for (ApplicationAccountStoreMapping mapping : mappings) {
6365

64-
final AccountStore accountStore = mapping.getAccountStore();
66+
final AccountStore accountStore = mapping.getAccountStore();
6567

66-
accountStore.accept(visitor);
68+
accountStore.accept(visitor);
69+
}
6770
}
6871

6972
return visitor.getAccountStores();
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package com.stormpath.sdk.impl.directory;
2+
3+
import com.stormpath.sdk.directory.OktaPasswordPolicy;
4+
import com.stormpath.sdk.impl.ds.InternalDataStore;
5+
import com.stormpath.sdk.impl.resource.AbstractInstanceResource;
6+
import com.stormpath.sdk.impl.resource.BooleanProperty;
7+
import com.stormpath.sdk.impl.resource.DateProperty;
8+
import com.stormpath.sdk.impl.resource.IntegerProperty;
9+
import com.stormpath.sdk.impl.resource.MapProperty;
10+
import com.stormpath.sdk.impl.resource.Property;
11+
import com.stormpath.sdk.impl.resource.StringProperty;
12+
13+
import java.util.Date;
14+
import java.util.Map;
15+
16+
public class DefaultOktaPasswordPolicy extends AbstractInstanceResource implements OktaPasswordPolicy {
17+
18+
// SIMPLE PROPERTIES
19+
static final StringProperty TYPE = new StringProperty("type");
20+
static final StringProperty ID = new StringProperty("id");
21+
static final StringProperty STATUS = new StringProperty("status");
22+
static final StringProperty NAME = new StringProperty("name");
23+
static final StringProperty DESCRIPTION = new StringProperty("description");
24+
static final IntegerProperty PRIORITY = new IntegerProperty("priority");
25+
static final BooleanProperty SYSTEM = new BooleanProperty("system");
26+
static final DateProperty CREATED = new DateProperty("created");
27+
static final DateProperty LAST_UPDATED = new DateProperty("lastUpdated");
28+
29+
// MAP Properties
30+
static final MapProperty CONDITIONS = new MapProperty("conditions");
31+
static final MapProperty SETTINGS = new MapProperty("settings");
32+
static final MapProperty DELEGATION = new MapProperty("delegation");
33+
static final MapProperty RULES = new MapProperty("rules");
34+
35+
private static final Map<String, Property> PROPERTY_DESCRIPTORS = createPropertyDescriptorMap(
36+
TYPE, ID, STATUS, NAME, DESCRIPTION, PRIORITY, SYSTEM, CREATED, LAST_UPDATED, CONDITIONS, SETTINGS, DELEGATION, RULES
37+
);
38+
39+
public DefaultOktaPasswordPolicy(InternalDataStore dataStore) {
40+
super(dataStore);
41+
}
42+
43+
public DefaultOktaPasswordPolicy(InternalDataStore dataStore, Map<String, Object> properties) {
44+
super(dataStore, properties);
45+
}
46+
47+
@Override
48+
public Map<String, Property> getPropertyDescriptors() {
49+
return PROPERTY_DESCRIPTORS;
50+
}
51+
52+
53+
@Override
54+
public String getType() {
55+
return getString(TYPE);
56+
}
57+
58+
@Override
59+
public String getId() {
60+
return getString(ID);
61+
}
62+
63+
@Override
64+
public String getStatus() {
65+
return getString(STATUS);
66+
}
67+
68+
@Override
69+
public String getName() {
70+
return getString(NAME);
71+
}
72+
73+
@Override
74+
public String getDescription() {
75+
return getString(DESCRIPTION);
76+
}
77+
78+
@Override
79+
public int getPriority() {
80+
return getInt(PRIORITY);
81+
}
82+
83+
@Override
84+
public boolean getSystem() {
85+
return getBoolean(SYSTEM);
86+
}
87+
88+
@Override
89+
public Map<String, Object> getConditions() {
90+
return getMap(CONDITIONS);
91+
}
92+
93+
@Override
94+
public Date getCreated() {
95+
return getDateProperty(CREATED);
96+
}
97+
98+
@Override
99+
public Date getLastUpdated() {
100+
return getDateProperty(LAST_UPDATED);
101+
}
102+
103+
@Override
104+
public Map<String, Object> getSettings() {
105+
return getMap(SETTINGS);
106+
}
107+
108+
@Override
109+
public Map<String, Object> getDelegation() {
110+
return getMap(DELEGATION);
111+
}
112+
113+
@Override
114+
public Map<String, Object> getRules() {
115+
return getMap(RULES);
116+
}
117+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.stormpath.sdk.impl.directory;
2+
3+
import com.stormpath.sdk.directory.OktaPasswordPolicy;
4+
import com.stormpath.sdk.directory.OktaPasswordPolicyList;
5+
import com.stormpath.sdk.impl.ds.InternalDataStore;
6+
import com.stormpath.sdk.impl.resource.AbstractCollectionResource;
7+
import com.stormpath.sdk.impl.resource.ArrayProperty;
8+
import com.stormpath.sdk.impl.resource.Property;
9+
10+
import java.util.Map;
11+
12+
public class DefaultOktaPasswordPolicyList extends AbstractCollectionResource<OktaPasswordPolicy> implements OktaPasswordPolicyList {
13+
14+
private static final ArrayProperty<OktaPasswordPolicy> ITEMS = new ArrayProperty<>("items", OktaPasswordPolicy.class);
15+
16+
private static final Map<String, Property> PROPERTY_DESCRIPTORS = createPropertyDescriptorMap(OFFSET, LIMIT, ITEMS);
17+
18+
public DefaultOktaPasswordPolicyList(InternalDataStore dataStore) {
19+
super(dataStore);
20+
}
21+
22+
public DefaultOktaPasswordPolicyList(InternalDataStore dataStore, Map<String, Object> properties) {
23+
super(dataStore, properties);
24+
}
25+
26+
public DefaultOktaPasswordPolicyList(InternalDataStore dataStore, Map<String, Object> properties, Map<String, Object> queryParams) {
27+
super(dataStore, properties, queryParams);
28+
}
29+
30+
@Override
31+
public Map<String, Property> getPropertyDescriptors() {
32+
return PROPERTY_DESCRIPTORS;
33+
}
34+
35+
@Override
36+
protected Class<OktaPasswordPolicy> getItemType() {
37+
return OktaPasswordPolicy.class;
38+
}
39+
}

impl/src/main/java/com/stormpath/sdk/impl/directory/OktaDirectory.java

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
import com.stormpath.sdk.directory.Directory;
1212
import com.stormpath.sdk.directory.DirectoryOptions;
1313
import com.stormpath.sdk.directory.DirectoryStatus;
14+
import com.stormpath.sdk.directory.OktaPasswordPolicy;
1415
import com.stormpath.sdk.directory.PasswordPolicy;
16+
import com.stormpath.sdk.directory.OktaPasswordPolicyList;
17+
import com.stormpath.sdk.directory.PasswordStrength;
1518
import com.stormpath.sdk.group.CreateGroupRequest;
1619
import com.stormpath.sdk.group.Group;
1720
import com.stormpath.sdk.group.GroupCriteria;
@@ -21,6 +24,9 @@
2124
import com.stormpath.sdk.impl.resource.AbstractResource;
2225
import com.stormpath.sdk.impl.resource.Property;
2326
import com.stormpath.sdk.lang.Assert;
27+
import com.stormpath.sdk.mail.EmailStatus;
28+
import com.stormpath.sdk.mail.ModeledEmailTemplateList;
29+
import com.stormpath.sdk.mail.UnmodeledEmailTemplateList;
2430
import com.stormpath.sdk.organization.OrganizationAccountStoreMappingCriteria;
2531
import com.stormpath.sdk.organization.OrganizationAccountStoreMappingList;
2632
import com.stormpath.sdk.organization.OrganizationCriteria;
@@ -187,7 +193,10 @@ public Provider getProvider() {
187193

188194
@Override
189195
public PasswordPolicy getPasswordPolicy() {
190-
throw new UnsupportedOperationException("Not implemented.");
196+
String passwordPolicyHref = getHref() + "/policies?type=PASSWORD";
197+
OktaPasswordPolicyList policies = getDataStore().getResource(passwordPolicyHref, OktaPasswordPolicyList.class);
198+
OktaPasswordPolicy oktaPasswordPolicy = policies.single();
199+
return transformOktaPasswordPolicy(oktaPasswordPolicy);
191200
}
192201

193202
@Override
@@ -234,4 +243,78 @@ public OrganizationAccountStoreMappingList getOrganizationAccountStoreMappings(O
234243
public Schema getAccountSchema() {
235244
throw new UnsupportedOperationException("Not implemented.");
236245
}
246+
247+
@SuppressWarnings("unchecked")
248+
private PasswordPolicy transformOktaPasswordPolicy(OktaPasswordPolicy oktaPasswordPolicy) {
249+
final Map<String, Object> strengthMap = (Map<String, Object>)
250+
((Map<String, Object>)oktaPasswordPolicy.getSettings().get("password")).get("complexity");
251+
PasswordPolicy ret = new PasswordPolicy() {
252+
@Override
253+
public int getResetTokenTtlHours() {
254+
return 0;
255+
}
256+
257+
@Override
258+
public PasswordPolicy setResetTokenTtlHours(int resetTokenTtl) {
259+
return null;
260+
}
261+
262+
@Override
263+
public EmailStatus getResetEmailStatus() {
264+
return null;
265+
}
266+
267+
@Override
268+
public PasswordPolicy setResetEmailStatus(EmailStatus status) {
269+
return null;
270+
}
271+
272+
@Override
273+
public EmailStatus getResetSuccessEmailStatus() {
274+
return null;
275+
}
276+
277+
@Override
278+
public PasswordPolicy setResetSuccessEmailStatus(EmailStatus status) {
279+
return null;
280+
}
281+
282+
@Override
283+
public PasswordStrength getStrength() {
284+
PasswordStrength p = new DefaultPasswordStrength(getDataStore());
285+
286+
p.setMinLength((Integer) strengthMap.get("minLength"));
287+
p.setMinLowerCase((Integer) strengthMap.get("minLowerCase"));
288+
p.setMinUpperCase((Integer) strengthMap.get("minUpperCase"));
289+
p.setMinNumeric((Integer) strengthMap.get("minNumber"));
290+
p.setMinSymbol((Integer) strengthMap.get("minSymbol"));
291+
p.setMaxLength(1024);
292+
p.setMinDiacritic(0);
293+
p.setPreventReuse(0);
294+
295+
return p;
296+
}
297+
298+
@Override
299+
public ModeledEmailTemplateList getResetEmailTemplates() {
300+
return null;
301+
}
302+
303+
@Override
304+
public UnmodeledEmailTemplateList getResetSuccessEmailTemplates() {
305+
return null;
306+
}
307+
308+
@Override
309+
public String getHref() {
310+
return "local";
311+
}
312+
313+
@Override
314+
public void save() {
315+
316+
}
317+
};
318+
return ret;
319+
}
237320
}

impl/src/main/java/com/stormpath/sdk/impl/ds/JacksonMapMarshaller.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@
2020
import com.fasterxml.jackson.databind.ObjectMapper;
2121
import com.fasterxml.jackson.databind.SerializationFeature;
2222

23+
import java.io.ByteArrayOutputStream;
2324
import java.io.IOException;
2425
import java.io.InputStream;
2526
import java.util.LinkedHashMap;
27+
import java.util.List;
2628
import java.util.Map;
2729

2830
/**
@@ -74,11 +76,25 @@ public Map unmarshal(String marshalled) {
7476
}
7577
}
7678

79+
@SuppressWarnings("unchecked")
7780
@Override
7881
public Map<String, Object> unmarshall(InputStream marshalled) {
7982
try {
80-
TypeReference<LinkedHashMap<String,Object>> typeRef = new TypeReference<LinkedHashMap<String,Object>>(){};
81-
return this.objectMapper.readValue(marshalled, typeRef);
83+
Object resolvedObj = this.objectMapper.readValue(marshalled, Object.class);
84+
if (resolvedObj instanceof Map) {
85+
return (Map<String, Object>) resolvedObj;
86+
} else if (resolvedObj instanceof List) {
87+
List list = (List) resolvedObj;
88+
Map<String, Object> ret = new LinkedHashMap<>();
89+
ret.put("items", list);
90+
ret.put("offset", 0);
91+
ret.put("limit", 100);
92+
ret.put("size", list.size());
93+
ret.put("href", "local");
94+
return ret;
95+
}
96+
throw new MarshalingException("Unable to convert InputStream String to Map. " +
97+
"Resolved Object is neither a Map or a List: " + resolvedObj.getClass());
8298
} catch (IOException e) {
8399
throw new MarshalingException("Unable to convert InputStream String to Map.", e);
84100
}

0 commit comments

Comments
 (0)