DBA Data[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;