539 lines
13 KiB
Plaintext
539 lines
13 KiB
Plaintext
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('<h1>' || v_screen_name || '</h1>');
|
|
--
|
|
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('<SCRIPT><!--');
|
|
htp.p('frmLogon = open("saco_licensing.show_license_form","winLogon","scrollbars=no,resizable=yes,width=400,height=300");');
|
|
htp.p('if (frmLogon.opener == null) {');
|
|
htp.p('frmLogon.opener = self;');
|
|
htp.p('};');
|
|
htp.p('//-->');
|
|
htp.p('</SCRIPT>');
|
|
htp.p('<NOSCRIPT>');
|
|
display_header('Enter License Key');
|
|
htp.bodyopen(cattributes => 'onLoad="return License_OnLoad()"');
|
|
show_license_form(TRUE);
|
|
display_footer;
|
|
htp.p('</NOSCRIPT>');
|
|
--
|
|
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('<SCRIPT><!--');
|
|
htp.p('function License_OnLoad (ctl, index) {');
|
|
htp.p('document.LicenseForm.p_license_key.focus();');
|
|
htp.p('}');
|
|
htp.p('//-->');
|
|
htp.p('</SCRIPT>');
|
|
--
|
|
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('<I>' || 'License Key:' || ' </I>');
|
|
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('<!--
|
|
//opener.location.reload(true);
|
|
opener.location = "caco_home";
|
|
//-->');
|
|
htp.script('<!--
|
|
self.close();
|
|
//-->');
|
|
--
|
|
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;
|
|
/
|
|
|