CREATE OR REPLACE PACKAGE BODY EFT_NOM.saco_licensing IS
--
-- Private Declaration
--
FUNCTION get_license RETURN VARCHAR2 IS
--
CURSOR cur_lsng IS
SELECT lsng.license_key
FROM licensing lsng;
--
v_return licensing.license_key%TYPE;
--
BEGIN
--
OPEN cur_lsng;
FETCH cur_lsng
INTO v_return;
--
IF cur_lsng%NOTFOUND THEN
--
v_return := NULL;
--
END IF;
--
CLOSE cur_lsng;
--
RETURN v_return;
--
END get_license;
--
FUNCTION return_key RETURN VARCHAR2 IS
--
v_return VARCHAR2(2000);
v_key VARCHAR2(2000);
--
BEGIN
--
v_return := 'ENCKEY1234567890';
--
v_return := NULL;
v_return := v_return || CHR(87);
v_key := v_key || CHR(83);
v_key := v_key || CHR(97);
v_return := v_return || CHR(115);
v_return := v_return || CHR(73);
v_return := v_return || CHR(99);
v_key := v_key || CHR(112);
v_return := v_return || CHR(97);
v_return := v_return || CHR(97);
v_return := v_return || CHR(107);
v_key := v_key || CHR(255);
v_return := v_return || CHR(63);
--
RETURN v_return;
--
END return_key;
--
FUNCTION decrypt (p_license_key IN licensing.license_key%TYPE) RETURN VARCHAR2 IS
--
v_return LONG := NULL;
--
BEGIN
--
IF p_license_key IS NOT NULL THEN
--
-- Within it's own program unit to ignore bad conversion and decryption
--
BEGIN
--
dbms_obfuscation_toolkit.desdecrypt(input_string => utl_raw.cast_to_varchar2(hextoraw(p_license_key))
,key_string => return_key
,decrypted_string => v_return);
--
IF INSTR(v_return, CHR(0)) > 0 THEN
--
v_return := SUBSTR(v_return, 1, INSTR(v_return, CHR(0))-1);
--
END IF;
--
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
--
END IF;
--
RETURN v_return;
--
END decrypt;
--
FUNCTION get_item (p_license_key IN VARCHAR2
,p_item IN VARCHAR2) RETURN VARCHAR2 IS
--
v_return VARCHAR2(1000) := NULL;
v_delimiter VARCHAR2(1) := '!';
--
BEGIN
--
IF INSTR(UPPER(p_license_key),UPPER(p_item),1) > 0 THEN
--
v_return := SUBSTR(p_license_key
,INSTR(UPPER(p_license_key),UPPER(p_item))+LENGTH(p_item)+1
,INSTR(p_license_key,v_delimiter,INSTR(UPPER(p_license_key),UPPER(p_item))+LENGTH(p_item)+1)-(INSTR(UPPER(p_license_key),UPPER(p_item))+LENGTH(p_item)+1));
--
END IF;
--
RETURN v_return;
--
END get_item;
--
PROCEDURE display_header(v_screen_name IN VARCHAR2,
v_body_atts IN VARCHAR2 DEFAULT NULL) IS
BEGIN
--
htp.htmlopen;
htp.headopen;
--
htp.meta('Content-Type', 'SACO_LICENSING', 'text/html');
htp.meta('Expires', '', '0');
htp.meta('Pragma', '', 'no-cache');
--
htp.linkrel('stylesheet', 'caco_system.css?p_type=logon');
--
htp.headclose;
--
htp.bodyopen(cattributes => v_body_atts);
--
htp.title(v_screen_name);
--
htp.p('
' || v_screen_name || '
');
--
htp.br;
htp.br;
--
END display_header;
--
PROCEDURE display_footer IS
BEGIN
--
htp.bodyclose;
htp.htmlclose;
--
END display_footer;
--
FUNCTION check_valid RETURN BOOLEAN IS
--
v_return BOOLEAN := FALSE;
--
BEGIN
--
IF get_item(decrypt(get_license),'COMPANY NAME') IS NOT NULL THEN
--
v_return := TRUE;
--
END IF;
--
RETURN v_return;
--
END check_valid;
--
FUNCTION check_expired RETURN BOOLEAN IS
--
v_return BOOLEAN := FALSE;
--
BEGIN
--
-- Used NVL as the license key may NOT expire
--
IF NVL(get_item(decrypt(get_license),'EXPIRY DATE'),TRUNC(SYSDATE)) >= TRUNC(SYSDATE) THEN
--
v_return := TRUE;
--
END IF;
--
RETURN v_return;
--
END check_expired;
--
FUNCTION check_machine RETURN BOOLEAN IS
--
v_return BOOLEAN := FALSE;
--
BEGIN
--
IF get_item(decrypt(get_license),'SERVER NAME') IS NOT NULL THEN
--
IF INSTR(UPPER(get_item(decrypt(get_license),'SERVER NAME'))||','
,UPPER(owa_util.get_cgi_env('SERVER_NAME'))||',') > 0 THEN
--
v_return := TRUE;
--
END IF;
--
ELSE
--
v_return := TRUE;
--
END IF;
--
RETURN v_return;
--
END check_machine;
--
FUNCTION get_sessions RETURN NUMBER IS
--
v_return NUMBER;
--
BEGIN
--
-- Remove any expired sessions
--
caco_security.remove_expired_sessions;
--
-- Looping but only once!
--
FOR cur_sess_rec IN ( SELECT COUNT(sess.client_id) AS sessions FROM sessions sess ) LOOP
--
v_return := cur_sess_rec.sessions;
--
END LOOP;
--
RETURN v_return;
--
END get_sessions;
--
FUNCTION get_syus_count RETURN NUMBER IS
--
v_return NUMBER;
--
BEGIN
--
-- Looping but only once!
--
FOR cur_syus_rec IN ( SELECT COUNT(syus.syus_id) AS syus FROM system_users syus WHERE syus.syus_id <> caco_utilities.get_system_user ) LOOP
--
v_return := cur_syus_rec.syus;
--
END LOOP;
--
RETURN v_return;
--
END get_syus_count;
--
-- Public Declaration
--
PROCEDURE call_license_form IS
--
--
BEGIN
--
htp.p('');
htp.p('');
--
END call_license_form;
--
PROCEDURE show_license_form(p_embedded IN BOOLEAN
,p_license_key IN VARCHAR2 DEFAULT NULL) IS
--
CURSOR cur_lsng IS
SELECT NULL
FROM licensing lsng
FOR UPDATE OF lsng.license_key NOWAIT;
--
v_dummy VARCHAR2(10);
--
BEGIN
--
IF p_license_key IS NULL THEN
--
IF NOT p_embedded THEN
--
display_header('Enter License Key');
htp.bodyopen(cattributes => 'onLoad="return License_OnLoad()"');
--
END IF;
--
-- Output JavaScript for handling onLoad event for setting
-- the focus to the license key field upon invocation.
--
htp.p('');
--
htp.header(4
,'Please enter your license key.');
--
htp.formopen(curl => 'saco_licensing.show_license_form'
,ctarget => ''
,cattributes => 'NAME="LicenseForm"');
--
htp.tableopen;
htp.tablerowopen;
htp.tabledata('' || 'License Key:' || ' ');
htp.tabledata(htf.formtext(cname => 'p_license_key',csize => 40));
htp.tablerowclose;
htp.tabledata(NULL);
htp.tabledata(htf.paragraph(calign => 'Right')||htf.formsubmit(cvalue => 'Validate'));
htp.tablerowclose;
htp.tableclose;
htp.formclose;
--
IF NOT p_embedded THEN
--
display_footer;
--
END IF;
--
ELSE
--
IF NOT p_embedded THEN
--
display_header('Process License Key');
htp.bodyopen(cattributes => 'onLoad="return License_OnLoad()"');
--
END IF;
--
OPEN cur_lsng;
FETCH cur_lsng
INTO v_dummy;
--
IF cur_lsng%NOTFOUND THEN
--
INSERT INTO licensing (license_key)
VALUES (p_license_key);
--
ELSE
--
UPDATE licensing lsng
SET lsng.license_key = p_license_key
WHERE CURRENT OF cur_lsng;
--
END IF;
--
CLOSE cur_lsng;
--
IF NOT check_license THEN
--
-- License key is invalid, requires reentry
--
htp.bodyopen(cattributes => 'onLoad="return License_OnLoad()"');
htp.header(2
,'License key is invalid');
htp.hr;
--
show_license_form(TRUE);
--
ELSE
--
-- License key is valid, close pop-up
--
htp.bodyopen;
htp.header(2
,wsgl.msggettext(606
,wsglm.sec606_logon_success));
htp.header(4
,wsgl.msggettext(607
,wsglm.sec607_navigate_back));
htp.script('');
htp.script('');
--
END IF;
--
IF NOT p_embedded THEN
--
display_footer;
--
END IF;
--
END IF;
--
END show_license_form;
--
FUNCTION status_line (p_css_class IN VARCHAR2 DEFAULT 'splashtagline') RETURN VARCHAR2 IS
--
v_return VARCHAR2(1000);
--
BEGIN
--
v_return := v_return || htf.tableopen(cattributes => 'WIDTH=100% class="'||p_css_class||'" cellspacing="1" cellpadding="0"');
v_return := v_return || htf.tablerowopen;
--
IF NOT check_valid THEN
--
-- Key entered is not valid
--
v_return := v_return || htf.tabledata('Invalid License Key');
--
ELSE
--
IF NOT check_expired THEN
--
v_return := v_return || htf.tabledata('License key has expired');
--
ELSE
--
IF NOT check_machine THEN
--
v_return := v_return || htf.tabledata('Machine name is invalid');
--
ELSE
--
IF get_item(decrypt(get_license),'Company Name') IS NOT NULL THEN
--
v_return := v_return || htf.tabledata('Licensed to: ' || get_item(decrypt(get_license),'Company Name'));
--
END IF;
--
IF get_item(decrypt(get_license),'Serial Number') IS NOT NULL THEN
--
v_return := v_return || htf.tabledata('Serial Number: '|| get_item(decrypt(get_license),'Serial Number'));
--
END IF;
--
IF get_item(decrypt(get_license),'Expiry Date') IS NOT NULL THEN
--
v_return := v_return || htf.tabledata('License Expires: '|| get_item(decrypt(get_license),'Expiry Date'));
--
END IF;
--
IF get_item(decrypt(get_license),'Concurrent Users') IS NOT NULL THEN
--
v_return := v_return || htf.tabledata('Concurrent Users: '||get_sessions||' of '|| get_item(decrypt(get_license),'Concurrent Users'));
--
END IF;
--
IF get_item(decrypt(get_license),'Licensed Users') IS NOT NULL THEN
--
v_return := v_return || htf.tabledata('Licensed Users: '||get_syus_count||' of '|| get_item(decrypt(get_license),'Licensed Users'));
--
END IF;
--
END IF;
--
END IF;
--
END IF;
--
v_return := v_return || htf.tablerowclose;
v_return := v_return || htf.tableclose;
--
RETURN v_return;
--
END status_line;
--
FUNCTION check_license RETURN BOOLEAN IS
--
v_return BOOLEAN := FALSE;
--
BEGIN
--
IF check_valid
AND check_expired
AND check_machine THEN
--
v_return := TRUE;
--
END IF;
--
RETURN v_return;
--
END check_license;
--
FUNCTION check_users RETURN BOOLEAN IS
--
v_return BOOLEAN := FALSE;
--
BEGIN
--
IF get_item(decrypt(get_license),'Concurrent Users') IS NOT NULL THEN
--
IF get_sessions < get_item(decrypt(get_license),'Concurrent Users') THEN
--
v_return := TRUE;
--
END IF;
--
ELSE
--
v_return := TRUE;
--
END IF;
--
RETURN v_return;
--
END check_users;
--
FUNCTION create_syus_check RETURN BOOLEAN IS
--
v_return BOOLEAN := FALSE;
--
BEGIN
--
IF get_item(decrypt(get_license),'Licensed Users') IS NOT NULL THEN
--
IF get_syus_count < get_item(decrypt(get_license),'Licensed Users') THEN
--
v_return := TRUE;
--
END IF;
--
ELSE
--
v_return := TRUE;
--
END IF;
--
RETURN v_return;
--
END create_syus_check;
--
BEGIN
--
-- Initialization
--
NULL;
--
END saco_licensing;
/