1 package body FND_HTTP_TICKET as
2 /* $Header: AFSTCKTB.pls 120.1 2005/07/02 04:18:30 appldev noship $ */
3 --
4 C_SECS_PER_DAY constant number := 24*60*60;
5 --
6 function CREATE_TICKET(P_OPERATION in varchar2 default null,
7 P_ARGUMENT in varchar2 default null,
8 P_LIFESPAN in number default 60)
9 return raw
10 is
11 pragma AUTONOMOUS_TRANSACTION;
12 X_TICKET raw(16);
13 X_START_DATE date;
14 X_END_DATE date := null;
15 X_END_DAY number;
16 X_END_SEC number;
17 X_END_STR varchar2(30);
18 X_LIFE_DAYS number;
19 begin
20 for I in 1..3 loop
21 X_TICKET := FND_CRYPTO.RANDOMBYTES(16);
22 begin
23 X_START_DATE := SYSDATE;
24 if (P_LIFESPAN is not null) then
25 X_END_DAY := to_number(to_char(X_START_DATE,'J'));
26 X_END_SEC := to_number(to_char(X_START_DATE,'SSSSS')) + P_LIFESPAN;
27 if (X_END_SEC >= C_SECS_PER_DAY) then
28 X_LIFE_DAYS := floor(X_END_SEC/C_SECS_PER_DAY);
29 X_END_SEC := X_END_SEC - (X_LIFE_DAYS * C_SECS_PER_DAY);
30 X_END_DAY := X_END_DAY + X_LIFE_DAYS;
31 end if;
32 X_END_STR := to_char(to_date(to_char(X_END_DAY),'J'),'YYYY/MM/DD')||
33 ' '||to_char(to_date(to_char(X_END_SEC), 'SSSSS'),
34 'HH24:MI:SS');
35 X_END_DATE := to_date(X_END_STR,'YYYY/MM/DD HH24:MI:SS');
36 end if;
37 insert into FND_HTTP_TICKETS (TICKET, OPERATION, ARGUMENT,
38 START_DATE, END_DATE)
39 values (X_TICKET, P_OPERATION, P_ARGUMENT,
40 X_START_DATE, X_END_DATE);
41 commit;
42 return(X_TICKET);
43 exception
44 when DUP_VAL_ON_INDEX then
45 null; -- retry up to three times before failing
46 when OTHERS then
47 exit; -- some other failure, exit the loop now
48 end;
49 end loop;
50 rollback;
51 return(null);
52 end CREATE_TICKET;
53 --
54 function CREATE_TICKET_STRING(P_OPERATION in varchar2 default null,
55 P_ARGUMENT in varchar2 default null,
56 P_LIFESPAN in number default 60)
57 return varchar2
58 is
59 begin
60 return(FND_CRYPTO.ENCODE(CREATE_TICKET(P_OPERATION,
61 P_ARGUMENT,
62 P_LIFESPAN),
63 FND_CRYPTO.ENCODE_URL));
64 end CREATE_TICKET_STRING;
65 --
66 function SET_SERVICE_TICKET(P_SERVICE in varchar2) return raw
67 is
68 pragma AUTONOMOUS_TRANSACTION;
69 X_TICKET raw(16);
70 X_OLD_TICKET raw(16);
71 X_END_DATE date;
72 begin
73 select TICKET, OLD_TICKET, END_DATE
74 into X_TICKET, X_OLD_TICKET, X_END_DATE
75 from FND_HTTP_SERVICE_TICKETS
76 where SERVICE = P_SERVICE
77 for update;
78 if (X_END_DATE <= SYSDATE) then
79 X_OLD_TICKET := X_TICKET;
80 X_TICKET := FND_CRYPTO.RANDOMBYTES(16);
81 update FND_HTTP_SERVICE_TICKETS
82 set TICKET = X_TICKET,
83 OLD_TICKET = X_OLD_TICKET,
84 END_DATE = SYSDATE + 1
85 where SERVICE = P_SERVICE;
86 commit;
87 else
88 rollback;
89 end if;
90 return(UTL_RAW.CONCAT(X_TICKET, X_OLD_TICKET));
91 exception when OTHERS then
92 rollback;
93 return(null);
94 end SET_SERVICE_TICKET;
95 --
96 function GET_SERVICE_TICKET(P_SERVICE in varchar2)
97 return raw
98 is
99 X_TICKET raw(16);
100 X_OLD_TICKET raw(16);
101 X_END_DATE date;
102 begin
103 select TICKET, OLD_TICKET, END_DATE
104 into X_TICKET, X_OLD_TICKET, X_END_DATE
105 from FND_HTTP_SERVICE_TICKETS where SERVICE = P_SERVICE;
106 if (X_END_DATE <= SYSDATE) then
107 return(SET_SERVICE_TICKET(P_SERVICE));
108 end if;
109 return(UTL_RAW.CONCAT(X_TICKET, X_OLD_TICKET));
110 exception when OTHERS then
111 return(null);
112 end GET_SERVICE_TICKET;
113 --
114 function GET_SERVICE_TICKET_STRING(P_SERVICE in varchar2)
115 return varchar2
116 is
117 X_TICKETS raw(32);
118 begin
119 X_TICKETS := GET_SERVICE_TICKET(P_SERVICE);
120 return(FND_CRYPTO.ENCODE(UTL_RAW.SUBSTR(X_TICKETS,1,16),
121 FND_CRYPTO.ENCODE_URL)||
122 FND_CRYPTO.ENCODE(UTL_RAW.SUBSTR(X_TICKETS,17,16),
123 FND_CRYPTO.ENCODE_URL));
124 end GET_SERVICE_TICKET_STRING;
125 --
126 function COMPARE_SERVICE_TICKETS(P_TICKET1 in raw, P_TICKET2 in raw)
127 return boolean
128 is
129 X_TICKET11 raw(16);
130 X_TICKET12 raw(16);
131 X_TICKET21 raw(16);
132 X_TICKET22 raw(16);
133 begin
134 if ((P_TICKET1 is null) or (P_TICKET2 is null)) then
135 return(false);
136 end if;
137 X_TICKET11 := UTL_RAW.SUBSTR(P_TICKET1,1,16);
138 X_TICKET12 := UTL_RAW.SUBSTR(P_TICKET1,17,16);
139 X_TICKET21 := UTL_RAW.SUBSTR(P_TICKET2,1,16);
140 X_TICKET22 := UTL_RAW.SUBSTR(P_TICKET2,17,16);
141 return((X_TICKET11 = X_TICKET21) or (X_TICKET12 = X_TICKET21) or
142 (X_TICKET11 = X_TICKET22) or (X_TICKET12 = X_TICKET22));
143 end COMPARE_SERVICE_TICKETS;
144 --
145 function COMPARE_SERVICE_TICKET_STRINGS(P_TICKET1 in varchar2,
146 P_TICKET2 in varchar2)
147 return boolean
148 is
149 N1 number;
150 N2 number;
151 X_TICKET11 varchar2(256);
152 X_TICKET12 varchar2(256);
153 X_TICKET21 varchar2(256);
154 X_TICKET22 varchar2(256);
155 begin
156 if ((P_TICKET1 is null) or (P_TICKET2 is null)) then
157 return(false);
158 end if;
159 N1 := length(P_TICKET1)/2;
160 N2 := length(P_TICKET2)/2;
161 if (N1 <> N2) then
162 return(false);
163 end if;
164 X_TICKET11 := substr(P_TICKET1,1,N1);
165 X_TICKET12 := substr(P_TICKET1,1+N1,N1);
166 X_TICKET21 := substr(P_TICKET2,1,N2);
167 X_TICKET22 := substr(P_TICKET2,1+N2,N2);
168 return((X_TICKET11 = X_TICKET21) or (X_TICKET12 = X_TICKET21) or
169 (X_TICKET11 = X_TICKET22) or (X_TICKET12 = X_TICKET22));
170 end COMPARE_SERVICE_TICKET_STRINGS;
171 --
172 function CHECK_TICKET(P_TICKET in raw,
173 P_OPERATION out nocopy varchar2,
174 P_ARGUMENT out nocopy varchar2)
175 return boolean
176 is
177 X_END_DATE date;
178 begin
179 select OPERATION, ARGUMENT, END_DATE
180 into P_OPERATION, P_ARGUMENT, X_END_DATE
181 from FND_HTTP_TICKETS
182 where TICKET = P_TICKET;
183 if (X_END_DATE is not null) then
184 if (X_END_DATE < SYSDATE) then
185 return(false);
186 end if;
187 end if;
188 return(true);
189 exception when OTHERS then
190 return(null);
191 end CHECK_TICKET;
192 --
193 function CHECK_TICKET(P_TICKET in raw) return boolean
194 is
195 X_OPERATION varchar2(255);
196 X_ARGUMENT varchar2(4000);
197 begin
198 return(CHECK_TICKET(P_TICKET, X_OPERATION, X_ARGUMENT));
199 end CHECK_TICKET;
200 --
201 function CHECK_TICKET_STRING(P_TICKET in varchar2,
202 P_OPERATION out nocopy varchar2,
203 P_ARGUMENT out nocopy varchar2)
204 return boolean
205 is
206 begin
207 return(CHECK_TICKET(FND_CRYPTO.DECODE(P_TICKET, FND_CRYPTO.ENCODE_URL),
208 P_OPERATION, P_ARGUMENT));
209 end CHECK_TICKET_STRING;
210 --
211 function CHECK_TICKET_STRING(P_TICKET in varchar2) return boolean
212 is
213 begin
214 return(CHECK_TICKET(FND_CRYPTO.DECODE(P_TICKET, FND_CRYPTO.ENCODE_URL)));
215 end CHECK_TICKET_STRING;
216 --
217 function UPDATE_TICKET(P_TICKET in raw,
218 P_OPERATION in varchar2,
219 P_ARGUMENT in varchar2)
220 return boolean
221 is
222 pragma AUTONOMOUS_TRANSACTION;
223 X_END_DATE date;
224 begin
225 update FND_HTTP_TICKETS
226 set OPERATION = P_OPERATION,
227 ARGUMENT = P_ARGUMENT
228 where TICKET = P_TICKET
229 returning END_DATE into X_END_DATE;
230 if (X_END_DATE is not null) then
231 if (X_END_DATE < SYSDATE) then
232 rollback;
233 return(false);
234 end if;
235 end if;
236 commit;
237 return(true);
238 exception when OTHERS then
239 rollback;
240 return(null);
241 end UPDATE_TICKET;
242 --
243 function UPDATE_TICKET_STRING(P_TICKET in varchar2,
244 P_OPERATION in varchar2,
245 P_ARGUMENT in varchar2)
246 return boolean
247 is
248 begin
249 return(UPDATE_TICKET(FND_CRYPTO.DECODE(P_TICKET, FND_CRYPTO.ENCODE_URL),
250 P_OPERATION, P_ARGUMENT));
251 end UPDATE_TICKET_STRING;
252 --
253 function CHECK_ONETIME_TICKET(P_TICKET in raw,
254 P_OPERATION out nocopy varchar2,
255 P_ARGUMENT out nocopy varchar2)
256 return boolean
257 is
258 pragma AUTONOMOUS_TRANSACTION;
259 X_END_DATE date;
260 X_TICKET raw(16);
261 begin
262 delete from FND_HTTP_TICKETS
263 where TICKET = P_TICKET
264 returning TICKET, OPERATION, ARGUMENT, END_DATE
265 into X_TICKET, P_OPERATION, P_ARGUMENT, X_END_DATE;
266 commit;
267 if (X_TICKET is null) then
268 return(null); -- matching ticket was not found
269 end if;
270 if (X_END_DATE is not null) then
271 if (X_END_DATE < SYSDATE) then
272 return(false);
273 end if;
274 end if;
275 return(true);
276 exception when OTHERS then
277 rollback;
278 return(null);
279 end CHECK_ONETIME_TICKET;
280 --
281 function CHECK_ONETIME_TICKET_STRING(P_TICKET in varchar2,
282 P_OPERATION out nocopy varchar2,
283 P_ARGUMENT out nocopy varchar2)
284 return boolean
285 is
286 begin
287 return(CHECK_ONETIME_TICKET(FND_CRYPTO.DECODE(P_TICKET,
288 FND_CRYPTO.ENCODE_URL),
289 P_OPERATION, P_ARGUMENT));
290 end CHECK_ONETIME_TICKET_STRING;
291 --
292 procedure DESTROY_TICKET(P_TICKET in raw)
293 is
294 pragma AUTONOMOUS_TRANSACTION;
295 begin
296 delete from FND_HTTP_TICKETS where TICKET = P_TICKET;
297 commit;
298 exception when OTHERS then
299 rollback; -- ignore failures
300 end DESTROY_TICKET;
301 --
302 procedure DESTROY_TICKET_STRING(P_TICKET in varchar2)
303 is
304 begin
305 DESTROY_TICKET(FND_CRYPTO.DECODE(P_TICKET, FND_CRYPTO.ENCODE_URL));
306 end DESTROY_TICKET_STRING;
307 --
308 procedure PURGE_TICKETS(P_MAX_LIFESPAN in number default null)
309 is
310 pragma AUTONOMOUS_TRANSACTION;
311 begin
312 if (P_MAX_LIFESPAN is not null) then
313 delete from FND_HTTP_TICKETS
314 where SYSDATE > END_DATE
315 or (SYSDATE - START_DATE) > (P_MAX_LIFESPAN/C_SECS_PER_DAY);
316 else
317 delete from FND_HTTP_TICKETS where SYSDATE > END_DATE;
318 end if;
319 commit;
320 exception when OTHERS then
321 rollback; -- ignore failures
322 end PURGE_TICKETS;
323 --
324 end FND_HTTP_TICKET;