Skip to content

Commit b056cd4

Browse files
Merge pull request #3981 from sarkapalkovicova/lsaai_login_policy
feat(core): lsaai login policy
2 parents 2a344a3 + 1455c37 commit b056cd4

File tree

2 files changed

+170
-1
lines changed

2 files changed

+170
-1
lines changed

perun-core/src/main/java/cz/metacentrum/perun/core/impl/modules/attributes/urn_perun_user_attribute_def_def_login_namespace_lifescienceid_username.java

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,80 @@
44
import cz.metacentrum.perun.core.api.AttributeDefinition;
55
import cz.metacentrum.perun.core.api.AttributesManager;
66
import cz.metacentrum.perun.core.api.User;
7+
import cz.metacentrum.perun.core.api.exceptions.AlreadyReservedLoginException;
78
import cz.metacentrum.perun.core.api.exceptions.AttributeNotExistsException;
9+
import cz.metacentrum.perun.core.api.exceptions.ConsistencyErrorException;
810
import cz.metacentrum.perun.core.api.exceptions.InternalErrorException;
11+
import cz.metacentrum.perun.core.api.exceptions.LoginIsAlreadyBlockedException;
912
import cz.metacentrum.perun.core.api.exceptions.WrongAttributeAssignmentException;
1013
import cz.metacentrum.perun.core.api.exceptions.WrongAttributeValueException;
1114
import cz.metacentrum.perun.core.api.exceptions.WrongReferenceAttributeValueException;
12-
import cz.metacentrum.perun.core.blImpl.ModulesUtilsBlImpl;
1315
import cz.metacentrum.perun.core.impl.PerunSessionImpl;
1416

17+
import java.util.List;
18+
import java.util.regex.Matcher;
19+
import java.util.regex.Pattern;
20+
1521
public class urn_perun_user_attribute_def_def_login_namespace_lifescienceid_username extends urn_perun_user_attribute_def_def_login_namespace{
1622
private final static String elixirUsername = "urn:perun:user:attribute-def:def:login-namespace:elixir";
1723
private final static String bbmriUsername = "urn:perun:user:attribute-def:def:login-namespace:bbmri";
1824

25+
private static final Pattern startWithLetterPattern = Pattern.compile("^[A-Za-z].*$");
26+
private static final Pattern onlyNumbersPattern = Pattern.compile("^[0-9]+$");
27+
28+
1929
@Override
2030
public void changedAttributeHook(PerunSessionImpl sess, User user, Attribute attribute) {
2131
trySetAttribute(sess, user, attribute, elixirUsername);
2232
trySetAttribute(sess, user, attribute, bbmriUsername);
2333
}
2434

35+
@Override
36+
public void checkAttributeSyntax(PerunSessionImpl sess, User user, Attribute attribute) throws WrongAttributeValueException {
37+
super.checkAttributeSyntax(sess, user, attribute);
38+
39+
if (attribute.getValue() == null) return;
40+
41+
String value = attribute.valueAsString();
42+
43+
Matcher onlyNumbersMatcher = onlyNumbersPattern.matcher(value);
44+
if (onlyNumbersMatcher.matches()) {
45+
throw new WrongAttributeValueException(attribute, user, "Login can not consist of only numbers.");
46+
}
47+
48+
Matcher startWithLetterMatcher = startWithLetterPattern.matcher(value);
49+
if (!startWithLetterMatcher.matches()) {
50+
throw new WrongAttributeValueException(attribute, user, "Login must start with a letter.");
51+
}
52+
}
53+
54+
@Override
55+
public void checkAttributeSemantics(PerunSessionImpl sess, User user, Attribute attribute) throws WrongReferenceAttributeValueException, WrongAttributeAssignmentException {
56+
String userLogin = attribute.valueAsString();
57+
if (userLogin == null) {
58+
throw new WrongReferenceAttributeValueException(attribute, null, user, null, "Value can't be null");
59+
}
60+
List<User> usersWithSameLogin = sess.getPerunBl().getUsersManagerBl().getUsersByAttribute(sess, attribute, true);
61+
usersWithSameLogin.remove(user);
62+
63+
if (!usersWithSameLogin.isEmpty()) {
64+
if(usersWithSameLogin.size() > 1) {
65+
throw new ConsistencyErrorException("FATAL ERROR: Duplicated Login detected." + attribute + " " + usersWithSameLogin);
66+
}
67+
throw new WrongReferenceAttributeValueException(attribute, attribute, user, null, usersWithSameLogin.get(0), null, "This login " + attribute.getValue() + " is already occupied.");
68+
}
69+
70+
try {
71+
String namespace = attribute.getFriendlyNameParameter();
72+
sess.getPerunBl().getUsersManagerBl().checkReservedLogins(sess, namespace, userLogin, true);
73+
sess.getPerunBl().getUsersManagerBl().checkBlockedLogins(sess, namespace, userLogin, true);
74+
} catch (AlreadyReservedLoginException ex) {
75+
throw new WrongReferenceAttributeValueException(attribute, null, user, null, null, null, "Login in specific namespace already reserved.", ex);
76+
} catch (LoginIsAlreadyBlockedException ex) {
77+
throw new WrongReferenceAttributeValueException(attribute, null, "Login is blocked.", ex);
78+
}
79+
}
80+
2581
/**
2682
* Set attribute if it is not filled yet
2783
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package cz.metacentrum.perun.core.impl.modules.attributes;
2+
3+
import cz.metacentrum.perun.core.api.Attribute;
4+
import cz.metacentrum.perun.core.api.AttributesManager;
5+
import cz.metacentrum.perun.core.api.BeansUtils;
6+
import cz.metacentrum.perun.core.api.CoreConfig;
7+
import cz.metacentrum.perun.core.api.User;
8+
import cz.metacentrum.perun.core.api.exceptions.WrongAttributeValueException;
9+
import cz.metacentrum.perun.core.api.exceptions.WrongReferenceAttributeValueException;
10+
import cz.metacentrum.perun.core.bl.PerunBl;
11+
import cz.metacentrum.perun.core.bl.UsersManagerBl;
12+
import cz.metacentrum.perun.core.impl.PerunSessionImpl;
13+
import cz.metacentrum.perun.core.impl.modules.pwdmgr.LifescienceidusernamePasswordManagerModule;
14+
import cz.metacentrum.perun.core.implApi.modules.pwdmgr.PasswordManagerModule;
15+
import org.junit.AfterClass;
16+
import org.junit.Before;
17+
import org.junit.BeforeClass;
18+
import org.junit.Test;
19+
20+
import java.util.ArrayList;
21+
import java.util.List;
22+
23+
import static java.util.Collections.emptyList;
24+
import static org.mockito.Mockito.mock;
25+
import static org.mockito.Mockito.when;
26+
27+
public class urn_perun_user_attribute_def_def_login_namespace_lifescienceid_usernameTest {
28+
private static urn_perun_user_attribute_def_def_login_namespace_lifescienceid_username classInstance;
29+
private static PerunSessionImpl session;
30+
private static final User user = new User(1, "User", "1", "", "", "");
31+
private static final User user2 = new User(2, "User", "2", "", "", "");
32+
private static Attribute attributeToCheck;
33+
private static CoreConfig originalCoreConfig;
34+
private static final CoreConfig mockedCoreConfig = mock(CoreConfig.class);
35+
36+
@BeforeClass
37+
public static void setUpCoreConfig() {
38+
originalCoreConfig = BeansUtils.getCoreConfig();
39+
BeansUtils.setConfig(mockedCoreConfig);
40+
when(mockedCoreConfig.getGeneratedLoginNamespaces())
41+
.thenReturn(emptyList());
42+
}
43+
44+
@AfterClass
45+
public static void resetCoreConfig() {
46+
BeansUtils.setConfig(originalCoreConfig);
47+
}
48+
49+
@Before
50+
public void setUp() {
51+
classInstance = new urn_perun_user_attribute_def_def_login_namespace_lifescienceid_username();
52+
session = mock(PerunSessionImpl.class);
53+
attributeToCheck = new Attribute();
54+
attributeToCheck.setNamespace(AttributesManager.NS_USER_ATTR_DEF);
55+
attributeToCheck.setFriendlyName("login-namespace:lifescienceid-username");
56+
attributeToCheck.setValue("test");
57+
58+
PerunBl perunBl = mock(PerunBl.class);
59+
when(session.getPerunBl()).thenReturn(perunBl);
60+
UsersManagerBl usersManagerBl = mock(UsersManagerBl.class);
61+
when(session.getPerunBl().getUsersManagerBl()).thenReturn(usersManagerBl);
62+
PasswordManagerModule module = mock(LifescienceidusernamePasswordManagerModule.class);
63+
when(session.getPerunBl().getUsersManagerBl().getPasswordManagerModule(session, "lifescienceid-username")).thenReturn(module);
64+
}
65+
66+
@Test(expected = WrongAttributeValueException.class)
67+
public void testSyntaxOnlyNumbers() throws Exception {
68+
System.out.println("testSyntaxOnlyNumbers()");
69+
attributeToCheck.setValue("1234");
70+
71+
classInstance.checkAttributeSyntax(session, user, attributeToCheck);
72+
}
73+
74+
@Test(expected = WrongAttributeValueException.class)
75+
public void testSyntaxStartWithNumber() throws Exception {
76+
System.out.println("testSyntaxStartWithNumber()");
77+
attributeToCheck.setValue("1aaa");
78+
79+
classInstance.checkAttributeSyntax(session, user, attributeToCheck);
80+
}
81+
82+
@Test
83+
public void testSyntaxStartWithLetter() throws Exception {
84+
System.out.println("testSyntaxStartWithLetter()");
85+
attributeToCheck.setValue("a111");
86+
87+
classInstance.checkAttributeSyntax(session, user, attributeToCheck);
88+
}
89+
90+
@Test(expected = WrongReferenceAttributeValueException.class)
91+
public void testCheckAttributeSemanticsWithNullAttribute() throws Exception {
92+
System.out.println("testCheckAttributeSemanticsWithNullAttribute()");
93+
attributeToCheck.setValue(null);
94+
95+
classInstance.checkAttributeSemantics(session, user, attributeToCheck);
96+
}
97+
98+
@Test(expected = WrongReferenceAttributeValueException.class)
99+
public void testCheckAttributeSemanticsDuplicateDetected() throws Exception {
100+
System.out.println("testCheckAttributeSemanticsDuplicateDetected()");
101+
when(session.getPerunBl().getUsersManagerBl().getUsersByAttribute(session, attributeToCheck, true)).thenReturn(new ArrayList<>(List.of(user, user2)));
102+
103+
classInstance.checkAttributeSemantics(session, user, attributeToCheck);
104+
}
105+
106+
@Test
107+
public void testCheckAttributeSemanticsCorrectValue() throws Exception {
108+
System.out.println("testCheckAttributeSemanticsCorrectValue()");
109+
when(session.getPerunBl().getUsersManagerBl().getUsersByAttribute(session, attributeToCheck, true)).thenReturn(new ArrayList<>(List.of(user)));
110+
111+
classInstance.checkAttributeSemantics(session, user, attributeToCheck);
112+
}
113+
}

0 commit comments

Comments
 (0)