Project

General

Profile

1
package eu.dnetlib.openaire.user.utils;
2

    
3
import com.unboundid.ldap.sdk.*;
4
import com.unboundid.ldap.sdk.extensions.PasswordModifyExtendedRequest;
5
import com.unboundid.ldap.sdk.extensions.PasswordModifyExtendedResult;
6

    
7
import eu.dnetlib.openaire.user.store.LDAPConnector;
8

    
9
import org.apache.commons.validator.routines.EmailValidator;
10
import org.apache.log4j.Logger;
11
import org.springframework.beans.factory.annotation.Autowired;
12

    
13
import java.util.ArrayList;
14
import java.util.List;
15

    
16
/**
17
 * Created by kiatrop on 29/9/2017.
18
 */
19

    
20
public class LDAPActions {
21

    
22
    private LDAPConnector ldapConnector;
23

    
24
    private Logger logger = Logger.getLogger(LDAPConnector.class);
25

    
26
    public String getUsername(String email) throws LDAPException {
27
        Filter filter = Filter.createEqualityFilter("mail", email);
28
        SearchRequest searchRequest = new SearchRequest("dc=openaire,dc=eu", SearchScope.SUB, filter, "uid");
29
        SearchResult searchResult = ldapConnector.getConnection().search(searchRequest);
30

    
31
        if (searchResult.getSearchEntries() != null) {
32
            if (searchResult.getSearchEntries().size() > 1) {
33
                logger.warn("An email is used for two different usernames! We only keep the first one.");
34
            }
35

    
36
            if (searchResult.getSearchEntries().size() == 0) {
37
                return null;
38
            }
39

    
40
            if (searchResult.getSearchEntries().get(0) != null) {
41
                return searchResult.getSearchEntries().get(0).getAttributeValue("uid");
42
            }
43
        }
44

    
45
        return null;
46
    }
47

    
48
    public Entry createUser(String username, String email, String fistName, String lastName, String password) throws Exception {
49

    
50
        if(!username.matches("^[a-zA-Z0-9][a-zA-Z0-9_-]{2,15}")){
51
            throw new CustomLDAPException("Invalid username!");
52
        }
53

    
54
        if(!EmailValidator.getInstance().isValid(email)){
55
            throw new CustomLDAPException("Invalid email!");
56
        }
57

    
58
        Filter uidFilter = Filter.createEqualityFilter("uid", username);
59
        SearchRequest uidRequest = new SearchRequest("dc=openaire,dc=eu", SearchScope.SUB, uidFilter, "cn", "mail", "uid", "objectClass");
60

    
61
        Filter mailFilter = Filter.createEqualityFilter("mail", email);
62
        SearchRequest mailRequest = new SearchRequest("dc=openaire,dc=eu", SearchScope.SUB, mailFilter, "cn", "mail", "uid", "objectClass");
63

    
64
        SearchResult searchResult = ldapConnector.getConnection().search(uidRequest);
65
        if(!searchResult.getSearchEntries().isEmpty()){
66
            throw new CustomLDAPException("Username " + username + " already exists!");
67
        }
68
        searchResult = ldapConnector.getConnection().search(mailRequest);
69
        if(!searchResult.getSearchEntries().isEmpty()){
70
            throw new CustomLDAPException("Email " + email + " already exists!");
71
        }
72

    
73
        Entry entry = new Entry("dn: uid=" + username + ",ou=users,dc=openaire,dc=eu",
74
                "objectClass: inetOrgPerson",
75
                "objectClass: eduPerson",
76
                "cn: "  + username,
77
                "uid: " + username,
78
                "displayName: " + fistName + " " + lastName,
79
                "mail: " + email,
80
                "givenName: " + fistName,
81
                "sn: " + lastName,
82
                "eduPersonPrincipalName: " + username + "@openaire.eu",
83
                "userPassword: " + password);
84
        ldapConnector.getConnection().add(entry);
85
        logger.info("User: " + username + " was created successfully!");
86

    
87
        return entry;
88
    }
89

    
90
    public void updateUser(String username, String email, String firstName, String lastName, String password) throws Exception {
91
        SearchRequest searchRequest = new SearchRequest("dc=openaire,dc=eu", SearchScope.SUB, Filter.createEqualityFilter("uid", username), "mail", "givenName", "sn", "displayName");
92
        SearchResult searchResult = ldapConnector.getConnection().search(searchRequest);
93
        List<Modification> mods = new ArrayList<>();
94

    
95
        if (!searchResult.getSearchEntries().isEmpty()) {
96
            Entry entry = searchResult.getSearchEntries().get(0);
97
            if(!entry.getAttributeValue("mail").equals(email)){
98
                if(!EmailValidator.getInstance().isValid(email)){
99
                    throw new CustomLDAPException("Invalid email!");
100
                }
101
                Filter uidFilter = Filter.createEqualityFilter("uid", username);
102
                Filter mailFilter = Filter.createEqualityFilter("mail", email);
103
                SearchRequest mailRequest = new SearchRequest("dc=openaire,dc=eu", SearchScope.SUB, Filter.createANDFilter(mailFilter, Filter.createNOTFilter(uidFilter)), "mail", "givenName", "sn", "displayName");
104
                SearchResult mailResult = ldapConnector.getConnection().search(mailRequest);
105
                if(!mailResult.getSearchEntries().isEmpty()){
106
                    throw new CustomLDAPException("Email " + email + " already in use!");
107
                }
108
                mods.add(new Modification(ModificationType.REPLACE, "mail", email));
109
            }
110
            if(entry.getAttributeValue("givenName") == null){
111
                mods.add(new Modification(ModificationType.ADD, "givenName", firstName));
112
            } else if(!entry.getAttributeValue("givenName").equals(firstName)){
113
                mods.add(new Modification(ModificationType.REPLACE, "givenName", firstName));
114
            }
115
            if(entry.getAttributeValue("sn") == null){
116
                mods.add(new Modification(ModificationType.ADD, "sn", lastName));
117
            } else if(!entry.getAttributeValue("sn").equals(lastName)){
118
                mods.add(new Modification(ModificationType.REPLACE, "sn", lastName));
119
            }
120
            if(entry.getAttributeValue("displayName") == null) {
121
                mods.add(new Modification(ModificationType.ADD, "displayName", firstName + " " + lastName));
122
            } else if (!entry.getAttributeValue("displayName").equals(firstName + " " + lastName)) {
123
                mods.add(new Modification(ModificationType.REPLACE, "displayName", firstName + " " + lastName));
124
            }
125

    
126
            //mods.add(new Modification(ModificationType.REPLACE, "userPassword",password));
127
            if(!mods.isEmpty()) {
128
                ldapConnector.getConnection().modify(entry.getDN(), mods);
129
            }
130
            PasswordModifyExtendedRequest passwordModifyExtendedRequest = new PasswordModifyExtendedRequest(entry.getDN(), (String) null, password);
131
            PasswordModifyExtendedResult passwordModifyResult = (PasswordModifyExtendedResult) ldapConnector.getConnection().processExtendedOperation(passwordModifyExtendedRequest);
132
        } else {
133
            throw new CustomLDAPException("Username " + username + " not found!");
134
        }
135
    }
136

    
137
//    public void resetPassword(String username, String email, String password) throws Exception {
138
//        SearchRequest searchRequest = new SearchRequest("dc=openaire,dc=eu", SearchScope.SUB, Filter.createEqualityFilter("uid", username), "mail");
139
//        SearchResult searchResult = ldapConnector.getConnection().search(searchRequest);
140
//        List<Modification> mods = new ArrayList<>();
141
//
142
//        if (!searchResult.getSearchEntries().isEmpty()) {
143
//            Entry entry = searchResult.getSearchEntries().get(0);
144
//            if(!entry.getAttributeValue("mail").equals(email)){
145
//                if(!EmailValidator.getInstance().isValid(email)){
146
//                    throw new CustomLDAPException("Invalid email!");
147
//                }
148
//                Filter uidFilter = Filter.createEqualityFilter("uid", username);
149
//                Filter mailFilter = Filter.createEqualityFilter("mail", email);
150
//                SearchRequest mailRequest = new SearchRequest("dc=openaire,dc=eu", SearchScope.SUB, Filter.createANDFilter(mailFilter, Filter.createNOTFilter(uidFilter)), "mail", "givenName", "sn", "displayName");
151
//                SearchResult mailResult = ldapConnector.getConnection().search(mailRequest);
152
//                if(!mailResult.getSearchEntries().isEmpty()){
153
//                    throw new CustomLDAPException("Email " + email + " already in use!");
154
//                }
155
//                mods.add(new Modification(ModificationType.REPLACE, "mail", email));
156
//            }
157
//            //mods.add(new Modification(ModificationType.REPLACE, "userPassword",password));
158
//            if(!mods.isEmpty()) {
159
//                ldapConnector.getConnection().modify(entry.getDN(), mods);
160
//            }
161
//            PasswordModifyExtendedRequest passwordModifyExtendedRequest = new PasswordModifyExtendedRequest(entry.getDN(), (String) null, password);
162
//            PasswordModifyExtendedResult passwordModifyResult = (PasswordModifyExtendedResult) ldapConnector.getConnection().processExtendedOperation(passwordModifyExtendedRequest);
163
//        } else {
164
//            throw new CustomLDAPException("Username " + username + " not found!");
165
//        }
166
//    }
167

    
168
    public void resetPassword(String username, String password) throws Exception {
169
        LDAPConnection connection = ldapConnector.getConnection();
170

    
171
        try {
172

    
173
            Filter filter = Filter.createEqualityFilter("uid", username); //uid
174
            SearchRequest searchRequest = new SearchRequest(ldapConnector.getUsersDN(), SearchScope.SUB, filter, "uid");
175
            SearchResult searchResult = connection.search(searchRequest);
176
            String dn = null;
177
            for (SearchResultEntry entry : searchResult.getSearchEntries()) {
178
                dn = "uid=" + entry.getAttributeValue("uid") + "," + ldapConnector.getUsersDN();
179
                logger.info("dn " + dn);
180
            }
181
            Modification mod1 = new Modification(ModificationType.REPLACE, "userPassword", password);
182
            //Modification mod2 = new Modification(ModificationType.REPLACE, "uid");
183
            logger.info("mod1: " + mod1);
184
            logger.info("Mphka sto reset password");
185
            connection.modify(dn, mod1);
186

    
187
        } catch (Exception e) {
188
            logger.error("Fail to reset password.", e);
189
            throw e;
190

    
191
        } finally {
192
            if (connection != null)
193
                connection.close();
194
        }
195
    }
196

    
197

    
198
    public LDAPConnector getLdapConnector() {
199
        return ldapConnector;
200
    }
201

    
202
    public void setLdapConnector(LDAPConnector ldapConnector) {
203
        this.ldapConnector = ldapConnector;
204
    }
205
}
(3-3/4)