From 551a2937a3df56260b6646cf079c7d51dce2c151 Mon Sep 17 00:00:00 2001 From: Jan Kvetina Date: Mon, 31 Jan 2022 21:18:31 +0100 Subject: [PATCH] Create authorization scheme on demand --- apex/f770/application/pages/page_00920.sql | 205 ++++++++++++++------- packages/app_actions.spec.sql | 14 ++ packages/app_actions.sql | 65 +++++++ views/roles_auth_schemes.sql | 16 +- 4 files changed, 227 insertions(+), 73 deletions(-) diff --git a/apex/f770/application/pages/page_00920.sql b/apex/f770/application/pages/page_00920.sql index a54fd6e..6d0a47d 100644 --- a/apex/f770/application/pages/page_00920.sql +++ b/apex/f770/application/pages/page_00920.sql @@ -3051,13 +3051,29 @@ wwv_flow_api.create_jet_chart( ,p_data_cursor_behavior=>'auto' ,p_hover_behavior=>'dim' ,p_stack=>'off' +,p_stack_label=>'off' +,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_fill_multi_series_gaps=>false ,p_zoom_and_scroll=>'off' ,p_tooltip_rendered=>'Y' ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'off' +,p_legend_position=>'auto' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(10893379331121642) @@ -3073,6 +3089,8 @@ wwv_flow_api.create_jet_chart_series( ,p_marker_shape=>'circle' ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>false +,p_items_label_display_as=>'PERCENT' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(13239592666910332) @@ -3088,6 +3106,8 @@ wwv_flow_api.create_jet_chart_series( ,p_marker_shape=>'circle' ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>false +,p_items_label_display_as=>'PERCENT' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(10893487984121643) @@ -3102,6 +3122,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_tick_label_rendered=>'on' ,p_tick_label_rotation=>'auto' ,p_tick_label_position=>'outside' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(10893570097121644) @@ -3119,6 +3147,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(19160020814813939) @@ -3357,6 +3393,18 @@ wwv_flow_api.create_ig_report( ,p_show_row_number=>false ,p_settings_area_expanded=>true ); +wwv_flow_api.component_end; +end; +/ +begin +wwv_flow_api.component_begin ( + p_version_yyyy_mm_dd=>'2021.04.15' +,p_release=>'21.1.7' +,p_default_workspace_id=>9014660246496943 +,p_default_application_id=>770 +,p_default_id_offset=>0 +,p_default_owner=>'CORE' +); wwv_flow_api.create_ig_report_view( p_id=>wwv_flow_api.id(19187082390432768) ,p_report_id=>wwv_flow_api.id(19186860186432768) @@ -3389,18 +3437,6 @@ wwv_flow_api.create_ig_report_column( ,p_is_visible=>true ,p_is_frozen=>false ); -wwv_flow_api.component_end; -end; -/ -begin -wwv_flow_api.component_begin ( - p_version_yyyy_mm_dd=>'2021.04.15' -,p_release=>'21.1.7' -,p_default_workspace_id=>9014660246496943 -,p_default_application_id=>770 -,p_default_id_offset=>0 -,p_default_owner=>'CORE' -); wwv_flow_api.create_ig_report_column( p_id=>wwv_flow_api.id(19191195748432782) ,p_view_id=>wwv_flow_api.id(19187082390432768) @@ -3715,6 +3751,8 @@ wwv_flow_api.create_region_column( ,p_enable_control_break=>true ,p_enable_hide=>true ,p_is_primary_key=>false +,p_default_type=>'STATIC' +,p_default_expression=>'Y' ,p_duplicate_value=>true ,p_include_in_export=>true ); @@ -4049,22 +4087,26 @@ wwv_flow_api.create_region_column( ,p_source_type=>'DB_COLUMN' ,p_source_expression=>'AUTH_SCHEME' ,p_data_type=>'VARCHAR2' -,p_is_query_only=>false -,p_item_type=>'NATIVE_HTML_EXPRESSION' +,p_is_query_only=>true +,p_item_type=>'NATIVE_DISPLAY_ONLY' ,p_heading=>'Auth Scheme' ,p_heading_alignment=>'LEFT' -,p_display_sequence=>30 +,p_display_sequence=>40 ,p_value_alignment=>'LEFT' ,p_group_id=>wwv_flow_api.id(9809200756099809) ,p_use_group_for=>'BOTH' -,p_attribute_01=>'&AUTH_SCHEME.' +,p_attribute_05=>'HTML' +,p_enable_filter=>true +,p_filter_operators=>'C:S:CASE_INSENSITIVE:REGEXP' ,p_filter_is_required=>false +,p_filter_text_case=>'MIXED' +,p_filter_exact_match=>true +,p_filter_lov_type=>'DISTINCT' ,p_use_as_row_header=>false ,p_enable_sort_group=>true ,p_enable_control_break=>true ,p_enable_hide=>true ,p_is_primary_key=>false -,p_duplicate_value=>true ,p_include_in_export=>true ); wwv_flow_api.create_region_column( @@ -4338,7 +4380,7 @@ wwv_flow_api.create_region_column( ,p_item_type=>'NATIVE_DISPLAY_ONLY' ,p_heading=>'Role Id' ,p_heading_alignment=>'LEFT' -,p_display_sequence=>10 +,p_display_sequence=>20 ,p_value_alignment=>'LEFT' ,p_group_id=>wwv_flow_api.id(10890534130121614) ,p_use_group_for=>'BOTH' @@ -4368,7 +4410,7 @@ wwv_flow_api.create_region_column( ,p_item_type=>'NATIVE_DISPLAY_ONLY' ,p_heading=>'Role Group' ,p_heading_alignment=>'LEFT' -,p_display_sequence=>20 +,p_display_sequence=>30 ,p_value_alignment=>'LEFT' ,p_group_id=>wwv_flow_api.id(10890534130121614) ,p_use_group_for=>'BOTH' @@ -4388,23 +4430,6 @@ wwv_flow_api.create_region_column( ,p_duplicate_value=>true ,p_include_in_export=>true ); -wwv_flow_api.create_region_column( - p_id=>wwv_flow_api.id(10890168607121610) -,p_name=>'AUTH_SCHEME_ICON' -,p_source_type=>'DB_COLUMN' -,p_source_expression=>'AUTH_SCHEME_ICON' -,p_data_type=>'VARCHAR2' -,p_is_query_only=>false -,p_item_type=>'NATIVE_HIDDEN' -,p_display_sequence=>40 -,p_attribute_01=>'Y' -,p_use_as_row_header=>false -,p_enable_sort_group=>true -,p_enable_control_break=>true -,p_is_primary_key=>false -,p_duplicate_value=>true -,p_include_in_export=>false -); wwv_flow_api.create_region_column( p_id=>wwv_flow_api.id(10890242854121611) ,p_name=>'AUTH_PROCEDURE_ICON' @@ -4475,6 +4500,35 @@ wwv_flow_api.create_region_column( ,p_duplicate_value=>true ,p_include_in_export=>true ); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(22085490768580622) +,p_name=>'APP_ID' +,p_source_type=>'DB_COLUMN' +,p_source_expression=>'APP_ID' +,p_data_type=>'NUMBER' +,p_is_query_only=>false +,p_item_type=>'NATIVE_HIDDEN' +,p_display_sequence=>10 +,p_attribute_01=>'Y' +,p_use_as_row_header=>false +,p_enable_sort_group=>true +,p_enable_control_break=>true +,p_is_primary_key=>false +,p_duplicate_value=>true +,p_include_in_export=>false +); +wwv_flow_api.component_end; +end; +/ +begin +wwv_flow_api.component_begin ( + p_version_yyyy_mm_dd=>'2021.04.15' +,p_release=>'21.1.7' +,p_default_workspace_id=>9014660246496943 +,p_default_application_id=>770 +,p_default_id_offset=>0 +,p_default_owner=>'CORE' +); wwv_flow_api.create_interactive_grid( p_id=>wwv_flow_api.id(9719050657455643) ,p_internal_uid=>9719050657455643 @@ -4503,18 +4557,6 @@ wwv_flow_api.create_interactive_grid( '}', '')) ); -wwv_flow_api.component_end; -end; -/ -begin -wwv_flow_api.component_begin ( - p_version_yyyy_mm_dd=>'2021.04.15' -,p_release=>'21.1.7' -,p_default_workspace_id=>9014660246496943 -,p_default_application_id=>770 -,p_default_id_offset=>0 -,p_default_owner=>'CORE' -); wwv_flow_api.create_ig_report( p_id=>wwv_flow_api.id(9814006082101179) ,p_interactive_grid_id=>wwv_flow_api.id(9719050657455643) @@ -4660,14 +4702,6 @@ wwv_flow_api.create_ig_report_column( ,p_break_sort_direction=>'ASC' ,p_break_sort_nulls=>'LAST' ); -wwv_flow_api.create_ig_report_column( - p_id=>wwv_flow_api.id(11018722417000645) -,p_view_id=>wwv_flow_api.id(9814223779101180) -,p_display_seq=>14 -,p_column_id=>wwv_flow_api.id(10890168607121610) -,p_is_visible=>true -,p_is_frozen=>false -); wwv_flow_api.create_ig_report_column( p_id=>wwv_flow_api.id(11019679764000648) ,p_view_id=>wwv_flow_api.id(9814223779101180) @@ -4685,6 +4719,14 @@ wwv_flow_api.create_ig_report_column( ,p_is_frozen=>false ,p_width=>280 ); +wwv_flow_api.create_ig_report_column( + p_id=>wwv_flow_api.id(22241762751807378) +,p_view_id=>wwv_flow_api.id(9814223779101180) +,p_display_seq=>16 +,p_column_id=>wwv_flow_api.id(22085490768580622) +,p_is_visible=>true +,p_is_frozen=>false +); wwv_flow_api.create_page_button( p_id=>wwv_flow_api.id(13501297262936495) ,p_button_sequence=>20 @@ -5591,6 +5633,18 @@ wwv_flow_api.create_page_item( ,p_attribute_04=>'TEXT' ,p_attribute_05=>'BOTH' ); +wwv_flow_api.component_end; +end; +/ +begin +wwv_flow_api.component_begin ( + p_version_yyyy_mm_dd=>'2021.04.15' +,p_release=>'21.1.7' +,p_default_workspace_id=>9014660246496943 +,p_default_application_id=>770 +,p_default_id_offset=>0 +,p_default_owner=>'CORE' +); wwv_flow_api.create_page_item( p_id=>wwv_flow_api.id(9901389709658805) ,p_name=>'P920_C038' @@ -5613,18 +5667,6 @@ wwv_flow_api.create_page_item( ,p_attribute_04=>'TEXT' ,p_attribute_05=>'BOTH' ); -wwv_flow_api.component_end; -end; -/ -begin -wwv_flow_api.component_begin ( - p_version_yyyy_mm_dd=>'2021.04.15' -,p_release=>'21.1.7' -,p_default_workspace_id=>9014660246496943 -,p_default_application_id=>770 -,p_default_id_offset=>0 -,p_default_owner=>'CORE' -); wwv_flow_api.create_page_item( p_id=>wwv_flow_api.id(9901427965658806) ,p_name=>'P920_C039' @@ -5926,6 +5968,14 @@ wwv_flow_api.create_page_item( ,p_attribute_09=>'N' ,p_attribute_11=>'Y' ); +wwv_flow_api.create_page_item( + p_id=>wwv_flow_api.id(22085604521580624) +,p_name=>'P920_CREATE_SCHEME' +,p_item_sequence=>10 +,p_item_plug_id=>wwv_flow_api.id(9612428039237510) +,p_display_as=>'NATIVE_HIDDEN' +,p_attribute_01=>'Y' +); wwv_flow_api.create_page_da_event( p_id=>wwv_flow_api.id(10170943324691484) ,p_name=>'SAVE_ROLES' @@ -6347,6 +6397,25 @@ wwv_flow_api.create_page_process( ,p_attribute_08=>'Y' ,p_error_display_location=>'INLINE_IN_NOTIFICATION' ); +wwv_flow_api.create_page_process( + p_id=>wwv_flow_api.id(22085775413580625) +,p_process_sequence=>10 +,p_process_point=>'BEFORE_HEADER' +,p_process_type=>'NATIVE_PLSQL' +,p_process_name=>'ACTION_CREATE_SCHEME' +,p_process_sql_clob=>wwv_flow_string.join(wwv_flow_t_varchar2( +'app_actions.create_auth_scheme (', +' in_app_id => app.get_app_id(),', +' in_name => :P920_AUTH_SCHEME', +');', +'--', +':P920_AUTH_SCHEME := NULL;', +'')) +,p_process_clob_language=>'PLSQL' +,p_error_display_location=>'INLINE_IN_NOTIFICATION' +,p_process_when=>'P920_CREATE_SCHEME' +,p_process_when_type=>'ITEM_IS_NOT_NULL' +); wwv_flow_api.component_end; end; / diff --git a/packages/app_actions.spec.sql b/packages/app_actions.spec.sql index e8d882a..a2eeedb 100644 --- a/packages/app_actions.spec.sql +++ b/packages/app_actions.spec.sql @@ -72,6 +72,20 @@ CREATE OR REPLACE PACKAGE app_actions AS + -- + -- Create AUTH scheme in APEX + -- + PROCEDURE create_auth_scheme ( + in_app_id apex_application_authorization.application_id%TYPE, + in_name apex_application_authorization.authorization_scheme_name%TYPE + ); + + + + + + + -- ### Navigation page -- diff --git a/packages/app_actions.sql b/packages/app_actions.sql index 0bce16e..24ae304 100644 --- a/packages/app_actions.sql +++ b/packages/app_actions.sql @@ -31,6 +31,71 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS + PROCEDURE create_auth_scheme ( + in_app_id apex_application_authorization.application_id%TYPE, + in_name apex_application_authorization.authorization_scheme_name%TYPE + ) + AS + out_statement VARCHAR2(32767); + BEGIN + app.log_module(in_app_id, in_name); + -- + FOR c IN ( + SELECT + a.owner AS p_owner, + a.workspace_id AS p_workspace_id, + a.application_id AS p_application_id, + in_name AS p_name, + r.api_compatibility AS p_version, + r.version_no AS p_release, + wwv_flow_id.next_val AS p_id, + -- + 'RETURN a' || a.application_id || '.' || LOWER(in_name) || '() = ''Y'';' AS p_body + FROM apex_release r + JOIN apex_applications a + ON a.application_id = in_app_id + LEFT JOIN apex_application_authorization z + ON z.application_id = a.application_id + AND z.authorization_scheme_name = in_name + WHERE z.authorization_scheme_name IS NULL + ) LOOP + out_statement := out_statement || 'BEGIN' || CHR(10); + out_statement := out_statement || ' wwv_flow_api.component_begin (' || CHR(10); + out_statement := out_statement || ' p_version_yyyy_mm_dd => ''' || c.p_version || '''' || CHR(10); + out_statement := out_statement || ' ,p_release => ''' || c.p_release || '''' || CHR(10); + out_statement := out_statement || ' ,p_default_workspace_id => ' || c.p_workspace_id || CHR(10); + out_statement := out_statement || ' ,p_default_application_id => ' || c.p_application_id || CHR(10); + out_statement := out_statement || ' ,p_default_id_offset => 0' || CHR(10); + out_statement := out_statement || ' ,p_default_owner => ''' || c.p_owner || '''' || CHR(10); + out_statement := out_statement || ' );' || CHR(10); + out_statement := out_statement || ' wwv_flow_api.create_security_scheme (' || CHR(10); + out_statement := out_statement || ' p_id => wwv_flow_api.id(' || c.p_id || ')' || CHR(10); + out_statement := out_statement || ' ,p_name => ''' || c.p_name || '''' || CHR(10); + out_statement := out_statement || ' ,p_scheme_type => ''NATIVE_FUNCTION_BODY''' || CHR(10); + out_statement := out_statement || ' ,p_attribute_01 => wwv_flow_string.join(wwv_flow_t_varchar2(''' || REPLACE(c.p_body, '''', '''''') || '''))' || CHR(10); + out_statement := out_statement || ' ,p_error_message => ''ACCESS_DENIED''' || CHR(10); + out_statement := out_statement || ' ,p_caching => ''BY_USER_BY_PAGE_VIEW''' || CHR(10); + out_statement := out_statement || ' );' || CHR(10); + out_statement := out_statement || ' wwv_flow_api.component_end;' || CHR(10); + out_statement := out_statement || 'END;' || CHR(10); + END LOOP; + -- + DBMS_OUTPUT.PUT_LINE(out_statement); + -- + IF out_statement IS NOT NULL THEN + EXECUTE IMMEDIATE out_statement; + END IF; + -- + app.log_success(); + EXCEPTION + WHEN app.app_exception THEN + RAISE; + WHEN OTHERS THEN + app.raise_error(); + END; + + + PROCEDURE nav_remove_pages ( in_page_id navigation.page_id%TYPE := NULL ) diff --git a/views/roles_auth_schemes.sql b/views/roles_auth_schemes.sql index 09e48f7..5446a8e 100644 --- a/views/roles_auth_schemes.sql +++ b/views/roles_auth_schemes.sql @@ -1,10 +1,9 @@ CREATE OR REPLACE VIEW roles_auth_schemes AS SELECT + a.application_id AS app_id, MAX(r.role_id) AS role_id, MAX(r.role_group) AS role_group, - -- a.authorization_scheme_name AS auth_scheme, - NULL AS auth_scheme_icon, -- MAX(LTRIM(s.object_name || '.' || s.procedure_name, '.')) AS auth_procedure, -- @@ -43,15 +42,22 @@ LEFT JOIN user_procedures s ON s.procedure_name = a.authorization_scheme_name AND UPPER(a.attribute_01) LIKE '%' || s.object_name || '.' || s.procedure_name || '%' WHERE a.application_id = app.get_app_id() -GROUP BY a.authorization_scheme_name +GROUP BY a.application_id, a.authorization_scheme_name UNION ALL -- SELECT + r.app_id, r.role_id, r.role_group, -- - NULL AS auth_scheme, - 'fa fa-warning' AS auth_scheme_icon, + app_actions.get_html_a( + app.get_page_link(920, + in_names => 'P920_CREATE_SCHEME,P920_AUTH_SCHEME', + in_values => 'Y,' || r.role_id + ), + app.get_icon('fa-plus-square', 'Create missing Authorization Scheme') + ) AS auth_scheme, + -- NULL AS auth_procedure, 'fa fa-warning' AS auth_procedure_icon, NULL AS auth_source_code,