23
23
package opengrok .auth .plugin ;
24
24
25
25
import java .util .Arrays ;
26
+ import java .util .Collections ;
26
27
import java .util .HashMap ;
27
28
import java .util .HashSet ;
28
29
import java .util .Map ;
35
36
import opengrok .auth .plugin .entity .User ;
36
37
import opengrok .auth .plugin .ldap .AbstractLdapProvider ;
37
38
import opengrok .auth .plugin .ldap .LdapException ;
39
+ import org .jetbrains .annotations .NotNull ;
38
40
import org .opengrok .indexer .authorization .AuthorizationException ;
39
41
import org .opengrok .indexer .configuration .Group ;
40
42
import org .opengrok .indexer .configuration .Project ;
@@ -52,6 +54,7 @@ public class LdapUserPlugin extends AbstractLdapPlugin {
52
54
private static final Logger LOGGER = Logger .getLogger (LdapUserPlugin .class .getName ());
53
55
54
56
static final String SESSION_ATTR = "opengrok-ldap-plugin-user" ;
57
+ static final String NEGATIVE_CACHE_ATTR = "opengrok-ldap-plugin-user-invalid-user" ;
55
58
56
59
/**
57
60
* List of configuration names.
@@ -135,9 +138,7 @@ protected boolean sessionExists(HttpServletRequest req) {
135
138
*/
136
139
String expandFilter (User user ) {
137
140
String filter = ldapFilter ;
138
-
139
141
filter = expandUserFilter (user , filter );
140
-
141
142
filter = filter .replace ("\\ %" , "%" );
142
143
143
144
return filter ;
@@ -170,19 +171,20 @@ public void fillSession(HttpServletRequest req, User user) {
170
171
AbstractLdapProvider ldapProvider = getLdapProvider ();
171
172
try {
172
173
AbstractLdapProvider .LdapSearchResult <Map <String , Set <String >>> res ;
173
- if ((res = ldapProvider .lookupLdapContent (dn , expandedFilter ,
174
- attrSet .toArray (new String [0 ]))) == null ) {
174
+ if ((res = ldapProvider .lookupLdapContent (dn , expandedFilter , attrSet .toArray (new String [0 ]))) == null ) {
175
175
LOGGER .log (Level .WARNING , "failed to get LDAP attributes ''{2}'' for user {0} " +
176
176
"with filter ''{1}'' from LDAP provider {3}" ,
177
177
new Object []{user , expandedFilter , attrSet , getLdapProvider ()});
178
+ LdapUser ldapUser = new LdapUser (dn , null );
179
+ ldapUser .setAttribute (NEGATIVE_CACHE_ATTR , Collections .singleton (null ));
180
+ updateSession (req , ldapUser );
178
181
return ;
179
182
}
180
183
181
184
records = res .getAttrs ();
182
185
if (Boolean .FALSE .equals (useDN )) {
183
186
dn = res .getDN ();
184
- LOGGER .log (Level .FINEST , "got DN ''{0}'' for user {1}" ,
185
- new Object []{dn , user });
187
+ LOGGER .log (Level .FINEST , "got DN ''{0}'' for user {1}" , new Object []{dn , user });
186
188
}
187
189
} catch (LdapException ex ) {
188
190
throw new AuthorizationException (ex );
@@ -206,8 +208,7 @@ public void fillSession(HttpServletRequest req, User user) {
206
208
userAttrSet .put (attrName , records .get (attrName ));
207
209
}
208
210
209
- LOGGER .log (Level .FINEST , "DN for user {0} is ''{1}'' on {2}" ,
210
- new Object []{user , dn , ldapProvider });
211
+ LOGGER .log (Level .FINEST , "DN for user {0} is ''{1}'' on {2}" , new Object []{user , dn , ldapProvider });
211
212
updateSession (req , new LdapUser (dn , userAttrSet ));
212
213
}
213
214
@@ -217,7 +218,7 @@ public void fillSession(HttpServletRequest req, User user) {
217
218
* @param req the request
218
219
* @param user the new value for user
219
220
*/
220
- void updateSession (HttpServletRequest req , LdapUser user ) {
221
+ void updateSession (@ NotNull HttpServletRequest req , LdapUser user ) {
221
222
req .getSession ().setAttribute (getSessionAttrName (), user );
222
223
}
223
224
@@ -229,13 +230,18 @@ private String getSessionAttrName() {
229
230
return getSessionAttrName (instanceNum );
230
231
}
231
232
233
+ private boolean checkUser (@ NotNull HttpServletRequest request ) {
234
+ LdapUser ldapUser = (LdapUser ) request .getSession ().getAttribute (getSessionAttrName ());
235
+ return ldapUser != null && ldapUser .getAttribute (NEGATIVE_CACHE_ATTR ) == null ;
236
+ }
237
+
232
238
@ Override
233
239
public boolean checkEntity (HttpServletRequest request , Project project ) {
234
- return request . getSession (). getAttribute ( getSessionAttrName ()) != null ;
240
+ return checkUser ( request ) ;
235
241
}
236
242
237
243
@ Override
238
244
public boolean checkEntity (HttpServletRequest request , Group group ) {
239
- return request . getSession (). getAttribute ( getSessionAttrName ()) != null ;
245
+ return checkUser ( request ) ;
240
246
}
241
247
}
0 commit comments