372 lines
14 KiB
Plaintext
372 lines
14 KiB
Plaintext
CREATE OR REPLACE PACKAGE BODY EFT_NOM.role_access IS
|
|
--
|
|
g_header CONSTANT VARCHAR2(160) := '$Header: /Isle Of Grain/database/PLSQL/role_access.pck 1 7/01/05 12:54 Gilberta $';
|
|
g_revision CONSTANT VARCHAR2(160) := '$Revision: 1 $';
|
|
--
|
|
FUNCTION lineage(p_syop_id system_options.syop_id%TYPE) RETURN VARCHAR2 IS
|
|
v_parent_syop_id system_options.syop_id_the_parent_of%TYPE;
|
|
v_name system_options.NAME%TYPE;
|
|
BEGIN
|
|
SELECT syop_id_the_parent_of
|
|
,NAME || p_syop_id
|
|
INTO v_parent_syop_id
|
|
,v_name
|
|
FROM system_options
|
|
WHERE syop_id = p_syop_id;
|
|
|
|
IF v_parent_syop_id IS NULL THEN
|
|
RETURN(v_name);
|
|
ELSE
|
|
RETURN(lineage(v_parent_syop_id) || '-' || v_name);
|
|
END IF;
|
|
EXCEPTION
|
|
WHEN no_data_found THEN
|
|
RETURN(NULL);
|
|
END lineage;
|
|
--
|
|
FUNCTION f_get_syop_module(p_syop_id IN NUMBER) RETURN VARCHAR2 IS
|
|
--
|
|
CURSOR cur_syop(p_syop_id IN NUMBER) IS
|
|
SELECT syop.module_name
|
|
FROM system_options syop
|
|
WHERE syop.syop_id = p_syop_id;
|
|
--
|
|
v_module VARCHAR2(100);
|
|
v_dot_pos NUMBER;
|
|
--
|
|
BEGIN
|
|
--
|
|
caco_debug.putline('Looking for ' || p_syop_id);
|
|
FOR v_syop_rec IN (SELECT module_name
|
|
FROM system_options
|
|
WHERE syop_id = p_syop_id) LOOP
|
|
caco_debug.putline('Found ' || v_syop_rec.module_name);
|
|
v_module := v_syop_rec.module_name;
|
|
v_dot_pos := instr(v_module
|
|
,'.'
|
|
,1);
|
|
caco_debug.putline('Dot found at ' || v_dot_pos);
|
|
IF v_dot_pos > 0 THEN
|
|
v_module := substr(v_module
|
|
,1
|
|
,v_dot_pos - 1);
|
|
END IF;
|
|
END LOOP;
|
|
--
|
|
caco_debug.putline('Module is ' || v_module);
|
|
RETURN v_module;
|
|
--
|
|
END f_get_syop_module;
|
|
|
|
FUNCTION f_get_sypr_role(p_sypr_id IN NUMBER) RETURN VARCHAR2 IS
|
|
--
|
|
CURSOR cur_sypr(p_sypr_id IN NUMBER) IS
|
|
SELECT sypr.role_name
|
|
FROM system_profiles sypr
|
|
WHERE sypr.sypr_id = p_sypr_id;
|
|
--
|
|
v_role VARCHAR2(100);
|
|
--
|
|
BEGIN
|
|
--
|
|
OPEN cur_sypr(p_sypr_id);
|
|
FETCH cur_sypr
|
|
INTO v_role;
|
|
CLOSE cur_sypr;
|
|
--
|
|
RETURN v_role;
|
|
--
|
|
END f_get_sypr_role;
|
|
|
|
PROCEDURE update_profile_options(p_add_option IN BOOLEAN DEFAULT TRUE
|
|
,p_syop_id IN system_options.syop_id%TYPE
|
|
,p_sypr_id IN system_profiles.sypr_id%TYPE) IS
|
|
v_syop_module system_options.module_name%TYPE;
|
|
v_sypr_role system_profiles.role_name%TYPE;
|
|
v_grant_or_revoke VARCHAR2(6);
|
|
BEGIN
|
|
caco_debug.putline('Enter');
|
|
IF p_add_option THEN
|
|
caco_debug.putline('add');
|
|
BEGIN
|
|
INSERT INTO profile_options
|
|
(syop_id
|
|
,sypr_id)
|
|
VALUES
|
|
(p_syop_id
|
|
,p_sypr_id);
|
|
--
|
|
EXCEPTION
|
|
WHEN dup_val_on_index THEN
|
|
NULL;
|
|
caco_debug.putline('Duplicate');
|
|
WHEN OTHERS THEN
|
|
caco_debug.putline(SQLERRM);
|
|
RAISE;
|
|
END;
|
|
ELSE
|
|
caco_debug.putline('delete');
|
|
BEGIN
|
|
DELETE profile_options
|
|
WHERE syop_id = p_syop_id AND sypr_id = p_sypr_id;
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
caco_debug.putline(SQLERRM);
|
|
RAISE;
|
|
END;
|
|
END IF;
|
|
/*
|
|
not required for lightweight users
|
|
v_syop_module := upper(f_get_syop_module(p_syop_id));
|
|
v_sypr_role := upper(f_get_sypr_role(p_sypr_id));
|
|
caco_debug.putline('Module is ' || v_syop_module);
|
|
IF v_syop_module IS NOT NULL THEN
|
|
IF p_add_option THEN
|
|
v_grant_or_revoke := 'GRANT';
|
|
ELSE
|
|
v_grant_or_revoke := 'REVOKE';
|
|
END IF;
|
|
caco_debug.putline(v_grant_or_revoke || ' execute on ' || v_syop_module || ' TO ' || v_sypr_role);
|
|
EXECUTE IMMEDIATE v_grant_or_revoke || ' EXECUTE ON ' || v_syop_module || ' TO ' || v_sypr_role;
|
|
|
|
FOR v_oppa_rec IN (SELECT oppa.package_name
|
|
FROM option_packages oppa
|
|
WHERE upper(package_name) LIKE v_syop_module || '%' AND
|
|
upper(package_name) <> upper(v_syop_module)) LOOP
|
|
|
|
caco_debug.putline(v_grant_or_revoke || ' execute on ' || v_oppa_rec.package_name || ' TO ' || v_sypr_role);
|
|
|
|
EXECUTE IMMEDIATE v_grant_or_revoke || ' EXECUTE ON ' || v_oppa_rec.package_name || ' TO ' || v_sypr_role;
|
|
--
|
|
END LOOP;
|
|
END IF;*/
|
|
caco_debug.putline('Finished');
|
|
END update_profile_options;
|
|
|
|
PROCEDURE startup(p_syop_id IN NUMBER DEFAULT NULL
|
|
,p_sypr_id IN NUMBER DEFAULT NULL
|
|
,p_function IN VARCHAR2 DEFAULT NULL
|
|
,p_readonly IN VARCHAR2 DEFAULT 'N') IS
|
|
--
|
|
v_dummy VARCHAR2(1);
|
|
v_prev_level NUMBER := 0;
|
|
v_max_levels NUMBER := 0;
|
|
v_number_columns NUMBER := 0;
|
|
--
|
|
CURSOR cur_sypr IS
|
|
SELECT sp.sypr_id
|
|
,sp.NAME
|
|
FROM system_profiles sp
|
|
WHERE role_name IS NOT NULL
|
|
ORDER BY sp.sypr_id;
|
|
--
|
|
CURSOR cur_prop(p_syop_id IN NUMBER, p_sypr_id IN NUMBER) IS
|
|
SELECT NULL
|
|
FROM profile_options po
|
|
WHERE po.syop_id = p_syop_id AND po.sypr_id = p_sypr_id;
|
|
--
|
|
--
|
|
--
|
|
BEGIN
|
|
--
|
|
IF NOT caco_security.security_check('role_access.startup') THEN
|
|
RETURN;
|
|
END IF;
|
|
--
|
|
IF p_function IS NOT NULL AND p_syop_id IS NOT NULL AND p_sypr_id IS NOT NULL THEN
|
|
--
|
|
-- Modify the system profile
|
|
--
|
|
IF p_function = 'N' THEN
|
|
--
|
|
update_profile_options(p_add_option => TRUE
|
|
,p_syop_id => p_syop_id
|
|
,p_sypr_id => p_sypr_id);
|
|
ELSIF p_function = 'Y' THEN
|
|
update_profile_options(p_add_option => FALSE
|
|
,p_syop_id => p_syop_id
|
|
,p_sypr_id => p_sypr_id);
|
|
END IF;
|
|
--
|
|
startup;
|
|
--
|
|
ELSE
|
|
--
|
|
-- Set document type
|
|
--
|
|
IF p_readonly = 'N' THEN
|
|
htp.p('<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><LINK REL=stylesheet HREF="caco_system.css?p_type=content" >');
|
|
ELSE
|
|
owa_util.mime_header(ccontent_type => 'application/vnd.ms-excel');
|
|
END IF;
|
|
--
|
|
htp.print(caco_system.menu);
|
|
--
|
|
htp.title(caco_utilities.GET_SYSTEM_NAME||' module security');
|
|
htp.p('<h1>'||caco_utilities.GET_SYSTEM_NAME||' module security</h1>');
|
|
--
|
|
IF p_readonly = 'N' THEN
|
|
--
|
|
htp.p('<P>Click on the Y or N to grant or revoke access to roles.</P>');
|
|
--
|
|
END IF;
|
|
--
|
|
htp.tableopen(cattributes => 'BORDER=1');
|
|
--
|
|
-- Set headings
|
|
--
|
|
htp.tablerowopen;
|
|
SELECT MAX(LEVEL)
|
|
INTO v_max_levels
|
|
FROM system_options t
|
|
START WITH syop_id_the_parent_of IS NULL
|
|
CONNECT BY PRIOR syop_id = syop_id_the_parent_of;
|
|
FOR v_index IN 1 .. v_max_levels LOOP
|
|
IF v_index != v_max_levels THEN
|
|
htp.tabledata(cvalue => htf.bold('Menu Level ' || v_index));
|
|
ELSE
|
|
htp.tabledata(cvalue => htf.bold('Screen'));
|
|
END IF;
|
|
END LOOP;
|
|
v_number_columns := v_max_levels;
|
|
--
|
|
-- Dynamic Headings
|
|
--
|
|
FOR cur_sypr_rec IN cur_sypr LOOP
|
|
--
|
|
htp.tabledata(cvalue => htf.bold(cur_sypr_rec.NAME));
|
|
v_number_columns := v_number_columns + 1;
|
|
--
|
|
END LOOP;
|
|
--
|
|
htp.tablerowclose;
|
|
--
|
|
-- Print body details
|
|
--
|
|
v_prev_level := 1;
|
|
FOR v_syop_rec IN (SELECT LEVEL
|
|
,syop_id
|
|
,NAME
|
|
,module_name
|
|
,syop_id_the_parent_of AS syop_syop_id
|
|
,role_access.lineage(syop_id)
|
|
,rownum
|
|
FROM system_options t
|
|
START WITH syop_id_the_parent_of IS NULL
|
|
CONNECT BY PRIOR syop_id = syop_id_the_parent_of
|
|
ORDER BY role_access.lineage(syop_id)) LOOP
|
|
--
|
|
htp.tablerowopen;
|
|
--
|
|
IF v_syop_rec.LEVEL < v_prev_level THEN
|
|
--
|
|
-- output a blank row
|
|
--
|
|
htp.tabledata(cvalue => htf.hr
|
|
,ccolspan => v_number_columns);
|
|
htp.tablerowclose;
|
|
htp.COMMENT('Place a blank row');
|
|
htp.tablerowopen;
|
|
ELSE
|
|
v_prev_level := v_syop_rec.LEVEL;
|
|
END IF;
|
|
|
|
FOR v_index IN 1 .. v_max_levels LOOP
|
|
IF v_index = v_syop_rec.LEVEL THEN
|
|
htp.tabledata(cvalue => v_syop_rec.NAME);
|
|
ELSE
|
|
htp.tabledata(cvalue => NULL);
|
|
END IF;
|
|
END LOOP;
|
|
--
|
|
FOR cur_sypr_rec IN cur_sypr LOOP
|
|
--
|
|
OPEN cur_prop(v_syop_rec.syop_id
|
|
,cur_sypr_rec.sypr_id);
|
|
FETCH cur_prop
|
|
INTO v_dummy;
|
|
--
|
|
IF cur_prop%FOUND THEN
|
|
--
|
|
IF p_readonly = 'N' THEN
|
|
--
|
|
htp.tabledata(cattributes => 'bgcolor="green"'
|
|
,calign => 'center'
|
|
,cvalue => htf.anchor2(curl => owa_util.get_cgi_env('SCRIPT_NAME') ||
|
|
owa_util.get_cgi_env('PATH_INFO') ||
|
|
'?p_syop_id=' || v_syop_rec.syop_id ||
|
|
'&p_sypr_id=' || cur_sypr_rec.sypr_id ||
|
|
' &p_function=Y'
|
|
,ctarget => '_self'
|
|
,ctext => 'Y'));
|
|
ELSE
|
|
--
|
|
htp.tabledata(cvalue => htf.paragraph(calign => 'center') || htf.bold(wsgfl.green('X')));
|
|
--
|
|
END IF;
|
|
--
|
|
ELSE
|
|
--
|
|
IF p_readonly = 'N' THEN
|
|
--
|
|
htp.tabledata(cattributes => 'bgcolor="red"'
|
|
,calign => 'center'
|
|
,cvalue => htf.anchor2(curl => owa_util.get_cgi_env('SCRIPT_NAME') ||
|
|
owa_util.get_cgi_env('PATH_INFO') ||
|
|
'?p_syop_id=' || v_syop_rec.syop_id ||
|
|
'&p_sypr_id=' || cur_sypr_rec.sypr_id ||
|
|
' &p_function=N'
|
|
,ctarget => '_self'
|
|
,ctext => 'N'));
|
|
--
|
|
ELSE
|
|
--
|
|
htp.tabledata(cvalue => htf.paragraph(calign => 'center') || htf.bold(wsgfl.red(' ')));
|
|
--
|
|
END IF;
|
|
--
|
|
END IF;
|
|
--
|
|
CLOSE cur_prop;
|
|
--
|
|
END LOOP;
|
|
--
|
|
htp.tablerowclose;
|
|
--
|
|
END LOOP;
|
|
--
|
|
htp.tableclose;
|
|
--
|
|
htp.br;
|
|
htp.p('Report Produced ' || to_char(SYSDATE
|
|
,'HH24:MI DD/MM/YYYY') || '.');
|
|
htp.br;
|
|
htp.br;
|
|
--
|
|
IF p_readonly = 'N' THEN
|
|
--
|
|
htp.p('To view a read only version of this screen click <A HREF ="' || owa_util.get_cgi_env('SCRIPT_NAME') ||
|
|
owa_util.get_cgi_env('PATH_INFO') || '?p_readonly=Y" TARGET="_self">here</A>.');
|
|
--
|
|
ELSE
|
|
--
|
|
htp.p('To view an updateable version of this screen click <A HREF ="' ||
|
|
owa_util.get_cgi_env('SCRIPT_NAME') || owa_util.get_cgi_env('PATH_INFO') ||
|
|
'?p_readonly=N" TARGET="_self">here</A>.');
|
|
--
|
|
END IF;
|
|
--
|
|
END IF;
|
|
--
|
|
EXCEPTION
|
|
--
|
|
WHEN OTHERS THEN
|
|
--
|
|
htp.p('ERROR!: ' || SQLERRM);
|
|
--
|
|
END startup;
|
|
--
|
|
END role_access;
|
|
/
|
|
|