1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.security.app.dialog.field.validator;
35
36 import info.magnolia.cms.security.MgnlUserManager;
37 import info.magnolia.cms.security.SecuritySupport;
38 import info.magnolia.cms.security.UserManager;
39 import info.magnolia.ui.vaadin.integration.jcr.JcrNewNodeAdapter;
40 import info.magnolia.ui.vaadin.integration.jcr.JcrNodeAdapter;
41
42 import javax.jcr.RepositoryException;
43
44 import org.apache.commons.lang3.StringUtils;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47
48 import com.vaadin.v7.data.Item;
49 import com.vaadin.v7.data.validator.AbstractStringValidator;
50
51
52
53
54 public class UniqueUserNameValidator extends AbstractStringValidator {
55
56 private static final Logger log = LoggerFactory.getLogger(UniqueUserNameValidator.class);
57
58 private final Item item;
59 private SecuritySupport securitySupport;
60
61 public UniqueUserNameValidator(Item item, String errorMessage, SecuritySupport securitySupport) {
62 super(errorMessage);
63 this.item = item;
64 this.securitySupport = securitySupport;
65 }
66
67 @Override
68 protected boolean isValidValue(String value) {
69
70 if (item instanceof JcrNodeAdapter) {
71
72 if (!(item instanceof JcrNewNodeAdapter)) {
73 try {
74 String currentName = ((JcrNodeAdapter)item).getJcrItem().getName();
75 if (StringUtils.equals(value, currentName)) {
76 return true;
77 }
78 } catch (RepositoryException e) {
79 log.error("Exception occurred getting node name of node [{}]", ((JcrNodeAdapter) item).getItemId(), e);
80 return false;
81 }
82 }
83
84
85 String path;
86 try {
87 path = ((JcrNodeAdapter) item).getJcrItem().getPath();
88 } catch (RepositoryException e) {
89 log.error("Exception getting path of node [{}]", ((JcrNodeAdapter) item).getItemId(), e);
90 return false;
91 }
92
93 UserManager userManager = securitySupport.getUserManager(getRealmName(path));
94 if (!(userManager instanceof MgnlUserManager) || !((MgnlUserManager) userManager).isAllowCrossRealmDuplicateNames()) {
95
96 userManager = securitySupport.getUserManager();
97 }
98
99
100 if (userManager.getUser(value) == null) {
101 return true;
102 }
103 }
104 return false;
105 }
106
107 private String getRealmName(String path) {
108 path = path.substring(1);
109 int idx = path.indexOf("/");
110 if (idx == -1) {
111 return path;
112 }
113 return StringUtils.substringBefore(path, "/");
114 }
115 }