[Home] [Help]
PACKAGE BODY: APPS.FND_OID_PLUG
Source
1 PACKAGE BODY FND_OID_PLUG AS
2 /* $Header: AFSCOPGB.pls 120.1.12010000.2 2008/12/10 20:43:34 rsantis ship $ */
3
4 /*
5 G_SINGLE_REALM_TYPE integer := 0;
6 G_MULTI_REAL_TYPE integer :=1 ;
7 G_CUSTOM_DIT intger := 2;
8
9
10 PREFERENCES
11 ==============
12
13
14
15 REALM:
16 NICKNAMEATTR:
17 COMMONNAMEATTR:
18 SEARCH_BASE:
19 CREATE_BASE:
20
21 PLUGIN_NAME: if null, all above are filled with defaults.
22 if not null all are null and the plugin must implement
23 getRealm(Username)
24 getDN(username)
25 getUserRepository(username)
26 getRDN(username)
27
28
29
30 */
31 /*
32 * Constants
33 */
34 G_MODULE_SOURCE varchar2(100):= 'fnd.plsql.oid.fnd_oid_plug.';
35 G_PREF_USER varchar2(20):='#INTERNAL';
36 G_PREF_MODULE varchar2(20):='OID_CONF';
37 G_STATIC_DESC varchar(20):='STATIC';
38 G_DYNAMIC_DESC varchar(20):='DYNAMIC';
39
40
41 /*
42 * GLOBALS
43 */
44 plugin_type integer := null;
45 invalid_deployment exception;
46 single_init boolean := false;
47 g_realm varchar2(1000):=null;
48 g_user_repo varchar2(1000) := null;
49 g_user_search varchar2(1000):=null;
50 g_nicknameatt varchar2(50):=null;
51 g_cnatt varchar2(50) := null;
52
53
54 function getAttribute(ldap in out nocopy dbms_ldap.session,dn in varchar2, attrName in varchar2, filterExp in varchar2 default 'objectclass=*'
55 , p_scope in pls_integer default dbms_ldap.SCOPE_BASE )
56 return varchar2
57 is
58 result pls_integer;
59 l_attrs dbms_ldap.string_collection;
60 l_message dbms_ldap.message := NULL;
61 l_entry dbms_ldap.message := NULL;
62 l_result varchar2(4000);
63 l_module_source varchar2(1000) ;
64 BEGIN
65 l_module_source := G_MODULE_SOURCE || 'getAttribute: ';
66
67 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
68 then
69 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
70 end if;
71
72 l_attrs(0):= attrName;
73 result := dbms_ldap.search_s(ld => ldap
74 , base => dn
75 , scope => p_scope
76 , filter => filterExp
77 , attrs => l_attrs
78 , attronly => 0
79 , res => l_message);
80 l_entry := dbms_ldap.first_entry(ldap, l_message);
81 if (l_entry is null ) then return null; end if;
82 l_attrs := dbms_ldap.get_values(ldap, l_entry, attrName);
83 l_result := l_attrs(0);
84 if (fnd_log.LEVEL_STATEMENT >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
85 then
86 fnd_log.string(fnd_log.LEVEL_STATEMENT, l_module_source, 'ldapsearch -b "'||dn||'" -s base "'||filterExp||'" '||attrName);
87 fnd_log.string(fnd_log.LEVEL_STATEMENT, l_module_source, 'result:'||l_result);
88 end if;
89
90 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
91 then
92 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END ');
93 end if;
94 return l_result;
95
96
97 exception
98
99 when NO_DATA_FOUND then
100 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
101 then
102 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END -> NULL');
103 end if;
104 return null;
105
106
107 when dbms_ldap.general_error then
108
109 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
110 then
111 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END no rows');
112 end if;
113 return null;
114
115 when OTHERS then
116 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
117 then
118 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END -> EXCEPTION '||sqlerrm);
119 end if;
120 l_result :=sqlerrm;
121 raise;
122 END getAttribute;
123
124
125 function getRealmNickNameattr(realm in varchar2) return varchar2
126 is
127 ldap dbms_ldap.session;
128 ret varchar2(2000);
129 flag pls_integer;
130 l_module_source varchar2(1000) ;
131 BEGIN
132 l_module_source := G_MODULE_SOURCE || 'getRealmNickNameattr: ';
133
134 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
135 then
136 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin realm='||realm);
137 end if;
138
139 ldap := fnd_ldap_util.c_get_oid_session(flag);
140 ret := getAttribute(ldap,'cn=Common,cn=Products,cn=OracleContext,'||realm,'orclcommonnicknameattribute');
141 fnd_ldap_util.c_unbind(ldap,flag);
142 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
143 then
144 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END nicknameAttr='||ret);
145 end if;
146 return ret;
147 end getRealmNickNameattr;
148
149 procedure setPlugin(
150 default_realm in varchar2 default null,
151 default_user_repository in varchar2 default null,
152 plugin_name in varchar2 default null) AS
153 ldap dbms_ldap.session;
154 res pls_integer;
155 flag pls_integer;
156 l_module_source varchar2(1000) ;
157 ret varchar2(4000);
158
159 deploy_failed_exp exception;
160 repo_guid varchar2(4000);
161
162 PRAGMA EXCEPTION_INIT (deploy_failed_exp, -20002);
163 BEGIN
164 if (default_realm is not null) then
165 raise_application_error(-20002, 'default_realm parameter must be null ');
166 end if;
167 if (plugin_name is not null) then
168 raise_application_error(-20002, 'plugin_name parameter must be null ');
169 end if;
170 plugin_type := null ; -- bug 6164880
171
172 l_module_source := G_MODULE_SOURCE || 'setPlugin: ';
173
174 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
175 then
176 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin' );
177 end if;
178
179 if (plugin_name is not null) then
180 fnd_preference.put(G_PREF_USER,G_PREF_MODULE,L_TYPE,G_DYNAMIC_DESC);
181 fnd_preference.put(G_PREF_USER,G_PREF_MODULE,L_REALM,'begin :1 := '||plugin_name||'.Realm(:2); end;');
182 fnd_preference.put(G_PREF_USER,G_PREF_MODULE,L_REPOSITORY,'begin :1 := '||plugin_name||'.UserRepository(:2); end;');
183 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
184 then
185 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'End' );
186 end if;
187 return;
188 else
189 ldap := fnd_ldap_util.c_get_oid_session(flag);
190 if (default_realm is not null) then
191 g_realm := default_realm;
192 else
193 g_realm := getAttribute(ldap,'cn=Common,cn=Products,cn=OracleContext','orclDefaultSubscriber');
194 end if;
195
196 if (default_user_repository is not null) then
197 g_user_repo := default_user_repository;
198 else
199 g_user_repo := getAttribute(ldap,'cn=Common,cn=Products,cn=OracleContext,'||g_realm,'orclcommondefaultusercreatebase');
200 end if;
201 if (g_user_repo is null) then
202 g_user_repo := 'cn=Users,'||g_realm;
203 end if;
204
205
206
207 g_user_search := getAttribute(ldap,'cn=Common,cn=Products,cn=OracleContext,'||g_realm,'orclcommonusersearchbase');
208
209 if (g_user_search is null) then
210 g_user_search := 'cn=Users,'||g_realm;
211 end if;
212
213
214
215 g_cnatt := getAttribute(ldap,'cn=Common,cn=Products,cn=OracleContext,'||g_realm,'orclcommonnamingattribute');
216
217 if (g_cnatt is null) then
218 g_cnatt := 'cn';
219 end if;
220
221 g_nicknameatt := getAttribute(ldap,'cn=Common,cn=Products,cn=OracleContext,'||g_realm,'orclcommonnicknameattribute');
222 if (g_nicknameatt is null) then
223 g_nicknameatt := 'uid';
224 end if;
225
226 -- validation
227 if (g_realm is null) then raise_application_error(-20002, 'Cannot determine realm'); end if;
228 if (g_user_repo is null) then raise_application_error(-20002, 'Cannot determine user create base'); end if;
229 if (g_user_search is null) then raise_application_error(-20002, 'Cannot determine user search base'); end if;
230 if (g_cnatt is null) then raise_application_error(-20002, 'Cannot determine Common Name Attribute'); end if;
231 if (g_nicknameatt is null) then raise_application_error(-20002, 'Cannot determine Nickname Attribute'); end if;
232 -- check existene
233
234 ret := getAttribute(ldap,g_realm,'objectClass','objectclass=orclSubscriber');
235 if (ret is null ) then raise_application_error(-20002, g_realm||' is not a realm'); end if;
236
237 ret := getAttribute(ldap,g_user_search,'objectClass');
238 if (ret is null) then raise_application_error(-20002, 'Search Base "'||g_user_search||'" does not exists'); end if;
239
240 ret := getAttribute(ldap,g_user_repo,'objectClass');
241 if (ret is null) then raise_application_error(-20002, 'User Create Base "'||g_user_repo||'" does not exists'); end if;
242
243 -- realm userSearchBase has a single attribute
244
245 res := count_attributes(ldap,'cn=Common,cn=Products,cn=OracleContext,'||g_realm,'orclcommonusersearchbase');
246 if (res is null or res=0) then
247 raise_application_error(-20002, 'Cannot deploy on realm "'||g_user_repo||'"m has no attribute "orclcommonusersearchbase"'); end if;
248 if (res > 1 )
249 then raise_application_error(-20002, 'Cannot deploy on realm "'||g_user_repo||'" it has too many UserSearchBase entries '); end if;
250
251
252 --check g_user_repo is reachable from g_user_search
253 repo_guid:= getAttribute(ldap,g_user_repo,'orclGuid');
254 if (repo_guid is null) then raise_application_error(-20002, 'User Create Base "'||g_user_repo||'" must have orclGuid'); end if;
255 ret := getAttribute (ldap, g_user_search,'orclGuid','orclGuid='||repo_guid,dbms_ldap.SCOPE_SUBTREE);
256 if (ret is null or repo_guid<>ret) then raise_application_error(-20002, 'Cannot reach "'||g_user_repo||'" from '||g_user_search); end if;
257
258
259
260 -- nickname is searcheable
261 begin
262 ret := getAttribute (ldap, g_user_search,g_nicknameatt||'='||'sample not simple',dbms_ldap.SCOPE_SUBTREE );
263 exception when dbms_ldap.general_error then
264 raise_application_error(-20002, 'Cannot use "'||g_nicknameatt||'" for ldap search ',true);
265 end;
266
267
268 fnd_preference.put(G_PREF_USER,G_PREF_MODULE,L_TYPE,G_STATIC_DESC);
269 fnd_preference.put(G_PREF_USER,G_PREF_MODULE,L_REALM,g_realm);
270 fnd_preference.put(G_PREF_USER,G_PREF_MODULE,L_CN_ATT,g_cnatt);
271 fnd_preference.put(G_PREF_USER,G_PREF_MODULE,L_NICK_ATT,g_nicknameatt);
272 fnd_preference.put(G_PREF_USER,G_PREF_MODULE,L_SEARCH,g_user_search);
273 fnd_preference.put(G_PREF_USER,G_PREF_MODULE,L_REPOSITORY,g_user_repo);
274 fnd_ldap_util.c_unbind(ldap,flag);
275
276 end if;
277 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
278 then
279 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'End' );
280 end if;
281 EXCEPTION
282 when others then
283 rollback;
284 raise;
285
286 END setPlugin;
287
288 PROCEDURE upgrade_preferences is
289
290 l_realm varchar2(4000);
291 l_repo varchar2(4000);
292 ldap dbms_ldap.session;
293 flag pls_integer;
294 l_module_source varchar2(1000) ;
295 BEGIN
296 l_module_source := G_MODULE_SOURCE || 'upgrade_preferences: ';
297
298 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
299 then
300 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
301 end if;
302 ldap := fnd_ldap_util.c_get_oid_session(flag);
303 l_realm := getAttribute(ldap,'cn=Common,cn=Products,cn=OracleContext','orclDefaultSubscriber');
304 l_repo := getAttribute(ldap,'cn=Common,cn=Products,cn=OracleContext,'||l_realm,'orclcommondefaultusercreatebase');
305 if (fnd_log.LEVEL_STATEMENT >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
306 then
307 fnd_log.string(fnd_log.LEVEL_STATEMENT, l_module_source, 'AUTO UPGRADE');
308 fnd_log.string(fnd_log.LEVEL_STATEMENT, l_module_source, '=============');
309 fnd_log.string(fnd_log.LEVEL_STATEMENT, l_module_source, 'realm:'||l_realm);
310 fnd_log.string(fnd_log.LEVEL_STATEMENT, l_module_source, 'user creation base:'||l_repo);
311 end if;
312
313 setPlugin( default_realm => l_realm ,default_user_repository=>l_repo,plugin_name =>null);
314 fnd_ldap_util.c_unbind(ldap,flag);
315
316 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
317 then
318 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'end');
319 end if;
320
321
322 exception when others then
323 if (fnd_log.LEVEL_UNEXPECTED >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
324 then
325 fnd_log.string(fnd_log.LEVEL_UNEXPECTED , l_module_source, 'Error '||sqlerrm);
326 end if;
327 raise;
328 END upgrade_preferences;
329
330
331 function pluginType return integer AS
332 val varchar2(20);
333 l_module_source varchar2(1000) ;
334 BEGIN
335 l_module_source := G_MODULE_SOURCE || 'pluginType: ';
336
337 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
338 then
339 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
340 end if;
341 if (plugin_type is null)
342 then
343 val := fnd_preference.get(G_PREF_USER,G_PREF_MODULE,L_TYPE);
344 if (val IS NULL) THEN
345 -- FIRST TIME CALLER, after patch application
346 -- make it compatible with new functionality
347 upgrade_preferences;
348 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
349 then
350 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END(1)');
351 end if;
352 return pluginType;
353 elsif (val=G_STATIC_DESC) THEN
354 plugin_type:=G_STATIC;
355 g_realm:=fnd_preference.get(G_PREF_USER,G_PREF_MODULE,L_REALM);
356 g_cnatt:=fnd_preference.get(G_PREF_USER,G_PREF_MODULE,L_CN_ATT);
357 g_nicknameatt:=fnd_preference.get(G_PREF_USER,G_PREF_MODULE,L_NICK_ATT);
358 g_user_search:=fnd_preference.get(G_PREF_USER,G_PREF_MODULE,L_SEARCH);
359 g_user_repo:=fnd_preference.get(G_PREF_USER,G_PREF_MODULE,L_REPOSITORY);
360
361 elsif (val=G_DYNAMIC_DESC) THEN
362 plugin_type:=G_DYNAMIC;
363 g_realm:=fnd_preference.get(G_PREF_USER,G_PREF_MODULE,L_REALM);
364 g_user_repo:=fnd_preference.get(G_PREF_USER,G_PREF_MODULE,L_REPOSITORY);
365
366 else
367 if (fnd_log.LEVEL_UNEXPECTED >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
368 then
369 fnd_log.string(fnd_log.LEVEL_UNEXPECTED, l_module_source, 'invalid deployment option/val='||val);
370 end if;
371 raise invalid_deployment;
372 end if;
373 end if;
374 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
375 then
376 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END');
377 end if;
378 RETURN plugin_type;
379 END pluginType;
380
381
382 function sql_execute(stmt in varchar2, param in varchar ) return varchar2 as
383 c pls_integer;
384 res pls_integer;
385 result varchar2(4000);
386 l_module_source varchar2(1000) ;
387 BEGIN
388 l_module_source := G_MODULE_SOURCE || 'sql_execute: ';
389
390 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
391 then
392 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
393 end if;
394 c := dbms_sql.open_cursor;
395 dbms_sql.parse(c, stmt, dbms_sql.NATIVE);
396 dbms_sql.bind_variable(c, ':2', param);
397 dbms_sql.bind_variable(c,':1',result,4000);
398 res := dbms_sql.execute(c);
399 dbms_sql.variable_value(c,':1',result);
400 dbms_sql.close_cursor(c);
401
402 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
403 then
404 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END');
405 end if;
406 return result;
407 END sql_execute;
408
409
410 function getDN(username in varchar2) return varchar2 AS
411
412 l_module_source varchar2(1000) ;
413 result varchar2(4000);
414 BEGIN
415 l_module_source := G_MODULE_SOURCE || 'getDN: ';
416
417 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
418 then
419 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
420 end if;
421
422
423 if (plugin_type is null) then plugin_type:=pluginType; end if;
424
425 result := getRDN(username)||','||getUserRepository(username);
426
427 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
428 then
429 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END ->'||result);
430 end if;
431 return result;
432
433 END getDN;
434
435
436
437 function getRealmDN(username varchar2) return varchar2 AS
438 result varchar2(4000);
439 l_module_source varchar2(1000) ;
440 BEGIN
441 l_module_source := G_MODULE_SOURCE || 'getRealmDN: ';
442
443 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
444 then
445 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
446 end if;
447
448 if (plugin_type is null) then plugin_type:=pluginType; end if;
449 if (plugin_type=G_STATIC) then
450 result:= g_realm;
451 else
452 result := sql_execute(g_realm,username);
453 end if;
454
455 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
456 then
457 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END ->'||result);
458 end if;
459
460 return result;
461 END getRealmDN;
462
463 function getUserRepository(username in varchar2) return varchar2 AS
464 result varchar2(4000);
465 l_module_source varchar2(1000) ;
466 BEGIN
467 l_module_source := G_MODULE_SOURCE || 'getUserRepository: ';
468
469 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
470 then
471 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
472 end if;
473
474 if (plugin_type is null) then plugin_type:=pluginType; end if;
475 if (plugin_type=G_STATIC) then
476 result := g_user_repo;
477 else
478 result := sql_execute(g_user_repo,username);
479 end if;
480
481
482 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
483 then
484 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END ->'||result);
485 end if;
486
487
488 return result;
489 END getUserRepository;
490
491 function getNickNameattr(username in varchar2) return varchar2 AS
492
493 ldap dbms_ldap.session;
494 dummy pls_integer;
495 result varchar2(4000);
496 l_module_source varchar2(1000) ;
497 BEGIN
498 l_module_source := G_MODULE_SOURCE || 'getNickNameattr: ';
499
500 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
501 then
502 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
503 end if;
504
505
506 if (plugin_type is null) then plugin_type:=pluginType; end if;
507 if (plugin_type=G_STATIC) then
508 result := g_nicknameatt;
509 else
510 ldap := fnd_ldap_util.c_get_oid_session(dummy);
511 result := getAttribute(ldap,'cn=Common,cn=Products,cn=OracleContext,'||getRealmDN(username),'orclcommonnicknameattribute');
512 fnd_ldap_util.c_unbind(ldap,dummy);
513 if (result is null) then result:='uid'; end if;
514 end if;
515
516 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
517 then
518 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END ->'||result);
519 end if;
520
521
522 return result;
523 END getNickNameattr;
524
525 function getRDN(username in varchar2) return varchar2 AS
526
527 result varchar2(4000);
528 l_module_source varchar2(1000) ;
529 BEGIN
530 l_module_source := G_MODULE_SOURCE || 'getRDN: ';
531
532 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
533 then
534 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
535 end if;
536
537 if (plugin_type is null) then plugin_type:=pluginType; end if;
538 if (plugin_type=G_STATIC) then
539 result:= g_cnatt||'='||username;
540 else
541 result:= getNickNameattr(username)||'='||username;
542 end if;
543
544 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
545 then
546 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END ->'||result);
547 end if;
548
549
550 return result;
551 END getRDN;
552
553 function getSearchBase(username in varchar2) return varchar2 AS
554 res varchar2(1000);
555 ldap dbms_ldap.session;
556 dummy pls_integer;
557 result varchar2(4000);
558 l_module_source varchar2(1000) ;
559 BEGIN
560 l_module_source := G_MODULE_SOURCE || 'getSearchBase: ';
561
562 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
563 then
564 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
565 end if;
566
567 if (plugin_type is null) then plugin_type:=pluginType; end if;
568 if (plugin_type=G_STATIC) then
569 result:= g_user_search;
570 else
571 ldap := fnd_ldap_util.c_get_oid_session(dummy);
572 result:= getAttribute(ldap,'cn=Common,cn=Products,cn=OracleContext,'||getRealmDN(username),'orclcommonusersearchbase');
573 fnd_ldap_util.c_unbind(ldap,dummy);
574 end if;
575
576 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
577 then
578 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END ->'||result);
579 end if;
580
581
582 return result;
583 END getSearchBase;
584
585 function getSearchFilter(username in varchar2) return varchar2 AS
586 result varchar2(4000);
587 l_module_source varchar2(1000) ;
588 BEGIN
589 l_module_source := G_MODULE_SOURCE || 'getSearchFilter: ';
590
591 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
592 then
593 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
594 end if;
595
596 if (plugin_type is null) then plugin_type:=pluginType; end if;
597 if (plugin_type=G_STATIC) then
598 result:= g_nicknameatt||'='||username;
599 else
600 result:=getRDN(username);
601 end if;
602
603 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
604 then
605 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END ->'||result);
606 end if;
607
608
609 return result;
610 END getSearchFilter;
611
612
613 function getNickNameAttributeFromRealm(realmDn in varchar2) return varchar2
614 is
615
616 ldap dbms_ldap.session;
617 dummy pls_integer;
618 result varchar2(4000);
619 l_module_source varchar2(1000) ;
620 BEGIN
621 l_module_source := G_MODULE_SOURCE || 'getNickNameAttributeFromRealm: ';
622
623 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
624 then
625 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
626 end if;
627
628 ldap := fnd_ldap_util.c_get_oid_session(dummy);
629 result:= getAttribute(ldap,'cn=Common,cn=Products,cn=OracleContext,'||realmDn,'orclcommonnicknameattribute');
630 fnd_ldap_util.c_unbind(ldap,dummy);
631 if (result is null) then result:='uid'; end if;
632 return result;
633 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
634 then
635 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END ->'||result);
636 end if;
637
638
639 return result;
640
641 END getNickNameAttributeFromRealm;
642
643 function getUsernameFromEntry(attr_list ldap_attr_list) return varchar2
644 is
645 j pls_integer;
646 result varchar2(4000);
647 l_module_source varchar2(1000) ;
648 BEGIN
649 l_module_source := G_MODULE_SOURCE || 'getUsernameFromEntry: ';
650
651 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
652 then
653 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
654 end if;
655
656 if (attr_list is not null AND attr_list.count > 0)
657 then
658 for j in attr_list.first .. attr_list.last
659 loop
660
661 if(upper(attr_list(j).attr_name) = 'ORCLGUID') then
662 result:= get_username_from_guid(attr_list(j).attr_value);
663 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
664 then
665 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END ->'||result);
666 end if;
667
668 return result;
669 end if;
670 end loop;
671 end if;
672 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
673 then
674 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END -> raise NO_DATA_FOUND');
675 end if;
676 raise no_data_found;
677 end getUsernameFromEntry;
678
679 function get_entry_dn(ldap in out nocopy dbms_ldap.session, p_guid IN raw ) return varchar2
680 is
681 result pls_integer;
682 entry_dn varchar(4000);
683 l_message dbms_ldap.message ;
684 l_attrs dbms_ldap.string_collection;
685 l_entry dbms_ldap.message;
686
687 l_module_source varchar2(1000) ;
688 BEGIN
689 l_module_source := G_MODULE_SOURCE || 'get_entry_dn: ';
690
691 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
692 then
693 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
694 end if;
695
696 l_attrs(0) := 'dn'; -- NO_ATTRS
697 result := dbms_ldap.search_s(ld => ldap
698 , base => ''
699 , scope => dbms_ldap.SCOPE_SUBTREE
700 , filter => 'orclguid='||p_guid
701 , attrs => l_attrs
702 , attronly => 0
703 , res => l_message);
704 l_entry := dbms_ldap.first_entry(ldap, l_message);
705 entry_dn := dbms_ldap.get_dn(ldap,l_entry);
706 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
707 then
708 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END ->'||entry_dn);
709 end if;
710
711 return entry_dn;
712
713 end get_entry_dn;
714
715 function get_realm_from_user_dn(ldap in out nocopy dbms_ldap.session, user_dn in varchar2 )
716 return varchar2
717
718 is
719 cn_list dbms_ldap.STRING_COLLECTION;
720 len pls_integer;
721 i pls_integer;
722 j pls_integer;
723 dn varchar2(4000);
724 g varchar2(1000);
725 result varchar2(4000);
726 l_module_source varchar2(1000) ;
727 BEGIN
728 l_module_source := G_MODULE_SOURCE || 'get_realm_from_user_dn: ';
729
730 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
731 then
732 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
733 end if;
734 cn_list := dbms_ldap.explode_dn(user_dn,0);
735 len := cn_list.count;
736 i:= 0;
737 while (i<len) loop
738
739 -- construct a new dn from 0..1
740 dn := cn_list(i);
741 j:=i+1;
742 while(j<len) loop
743 dn := dn||','||cn_list(j);
744 j:=j+1;
745 end loop;
746 g := getAttribute(ldap,dn,'orclguid','objectclass=orclSubscriber');
747 if (g is not null) then
748 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
749 then
750 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END ->'||dn);
751 end if;
752 return dn;
753 end if;
754 i:=i+1;
755 end loop;
756 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
757 then
758 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END NULL!');
759 end if;
760 return null;
761 end get_realm_from_user_dn;
762
763
764 function get_username_from_guid(p_user_guid IN fnd_user.user_guid%type ) return varchar2
765 is
766 ldap dbms_ldap.session;
767 dummy pls_integer;
768
769 user_dn varchar2(4000);
770 realm_dn varchar2(4000);
771 user_name varchar2(1000);
772 nickNameAttr varchar2(50);
773 l_module_source varchar2(1000) ;
774 BEGIN
775 l_module_source := G_MODULE_SOURCE || 'get_username_from_guid: ';
776
777 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
778 then
779 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
780 end if;
781
782 ldap := fnd_ldap_util.c_get_oid_session(dummy);
783
784 user_dn := get_entry_dn(ldap,p_user_guid);
785 if user_dn is null theN raise NO_DATA_FOUND ; end if;
786 realm_dn := get_realm_from_user_dn(ldap,user_dn);
787 if user_dn is null then raise NO_DATA_FOUND ; end if;
788 nickNameAttr:=getAttribute(ldap,'cn=Common,cn=Products,cn=OracleContext,'||realm_dn,'orclCommonNicknameAttribute');
789 if user_dn is null then raise NO_DATA_FOUND ; end if;
790 user_name := getAttribute(ldap,user_dn,nickNameAttr);
791 if user_dn is null then raise NO_DATA_FOUND ; end if;
792 fnd_ldap_util.c_unbind(ldap,dummy);
793
794 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
795 then
796 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END ->'||user_name);
797 end if;
798
799 return user_name;
800 EXCEPTION when NO_DATA_FOUND THEN
801 fnd_ldap_util.c_unbind(ldap,dummy);
802 if (fnd_log.LEVEL_EXCEPTION >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
803 then
804 fnd_log.string(fnd_log.LEVEL_EXCEPTION, l_module_source, ' Not found guid='||p_user_guid);
805 end if;
806 raise;
807 end get_username_from_guid;
808
809
810 function get_default_realm return varchar2
811 is
812 res varchar2(1000);
813 ldap dbms_ldap.session;
814 dummy pls_integer;
815 result varchar2(4000);
816 l_module_source varchar2(1000) ;
817 BEGIN
818 l_module_source := G_MODULE_SOURCE || 'get_default_realm: ';
819
820 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
821 then
822 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
823 end if;
824
825 if (plugin_type is null) then plugin_type:=pluginType; end if;
826 if (plugin_type=G_STATIC) then
827 result:= g_realm;
828 else
829 -- NO to much sense to have the default realm in a DYNAMIC configuration
830 -- maybe we need to log an UNEXPECTED condition
831 ldap := fnd_ldap_util.c_get_oid_session(dummy);
832 result := getAttribute(ldap,'cn=Common,cn=Products,cn=OracleContext','orcldefaultsubscriber');
833 fnd_ldap_util.c_unbind(ldap,dummy);
834 end if;
835 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
836 then
837 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END ->'||result);
838 end if;
839 return result;
840 END get_default_realm;
841
842 function get_realm_dn( p_user_guid in raw default null, p_user_name in varchar2 default null)
843 return varchar2
844 is
845 ldap dbms_ldap.session;
846 flag pls_integer;
847 result varchar2(4000);
848 l_module_source varchar2(1000) ;
849 BEGIN
850 l_module_source := G_MODULE_SOURCE || 'get_realm_dn: ';
851
852 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
853 then
854 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
855 if (fnd_log.LEVEL_STATEMENT >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
856 then
857 fnd_log.string(fnd_log.LEVEL_STATEMENT, l_module_source, 'guid:'||p_user_guid);
858 fnd_log.string(fnd_log.LEVEL_STATEMENT, l_module_source, 'username:'||p_user_name);
859 end if;
860 end if;
861
862 ldap := fnd_ldap_util.c_get_oid_session(flag);
863 result := null;
864 if (p_user_guid is not null) then
865 result:=get_realm_from_user_dn(ldap,get_entry_dn(ldap,p_user_guid));
866 if (fnd_log.LEVEL_STATEMENT >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
867 then
868 fnd_log.string(fnd_log.LEVEL_STATEMENT, l_module_source, 'Using guid, realm:'||result);
869 end if;
870 end if;
871 if (result is null and p_user_name is not null) then
872 result:= getRealmDN(p_user_name);
873 if (fnd_log.LEVEL_STATEMENT >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
874 then
875 fnd_log.string(fnd_log.LEVEL_STATEMENT, l_module_source, 'Using username, realm:'||result);
876 end if;
877 end if;
878 if (result is null) then
879 result := get_default_realm;
880 if (fnd_log.LEVEL_STATEMENT >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
881 then
882 fnd_log.string(fnd_log.LEVEL_STATEMENT, l_module_source, 'fallback to default realm:'||result);
883 end if;
884 end if;
885 fnd_ldap_util.c_unbind(ldap,flag);
886
887 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
888 then
889 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END ->'||result);
890 end if;
891 return result;
892 end get_realm_dn;
893
894
895
896 function count_attributes(ldap in out nocopy dbms_ldap.session, dn in varchar2, attName in varchar2)
897 return integer
898 is
899 l_result pls_integer;
900 l_attrs dbms_ldap.string_collection;
901 l_message dbms_ldap.message := NULL;
902 l_entry dbms_ldap.message := NULL;
903 l_module_source varchar2(4000);
904 begin
905 l_module_source := G_MODULE_SOURCE || 'count_attributes: ';
906
907 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
908 then
909 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'Begin');
910 if (fnd_log.LEVEL_STATEMENT >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
911 then
912 fnd_log.string(fnd_log.LEVEL_STATEMENT, l_module_source, 'dn:'||dn);
913 fnd_log.string(fnd_log.LEVEL_STATEMENT, l_module_source, 'attribute:'||attName);
914 end if;
915 end if;
916 l_attrs(0):= attName;
917 l_result := dbms_ldap.search_s(ld => ldap
918 , base => dn
919 , scope => dbms_ldap.SCOPE_BASE
920 , filter => 'objectclass=*'
921 , attrs => l_attrs
922 , attronly => 0
923 , res => l_message);
924 l_entry := dbms_ldap.first_entry(ldap, l_message);
925 if (l_entry is null ) then
926 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
927 then
928 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'End(not found)');
929 end if;
930 return 0;
931 end if;
932 l_attrs := dbms_ldap.get_values(ldap, l_entry, attName);
933 l_result := l_attrs.count;
934 if (fnd_log.LEVEL_STATEMENT >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
935 then
936 fnd_log.string(fnd_log.LEVEL_STATEMENT, l_module_source, 'result:'||l_result);
937 end if;
938 if (fnd_log.LEVEL_PROCEDURE >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
939 then
940 fnd_log.string(fnd_log.LEVEL_PROCEDURE, l_module_source, 'END');
941 end if;
942 return l_result;
943
944 EXCEPTION when others then
945 if (fnd_log.LEVEL_UNEXPECTED >= fnd_log.G_CURRENT_RUNTIME_LEVEL)
946 then
947 fnd_log.string(fnd_log.LEVEL_UNEXPECTED , l_module_source, 'Error '||sqlerrm);
948 end if;
949 raise;
950 end count_attributes;
951
952 procedure setPlugin(default_user_repository in varchar2 default null)
953 is
954 begin
955 setPlugIn(null,default_user_repository,null);
956 end setPlugin;
957 END FND_OID_PLUG;