-- File: get_applied_network_rule.eex.sql
-- Location: musebms/database/components/system/mscmp_syst_authn/ms_syst_priv/functions/get_applied_network_rule.eex.sql
-- Project: Muse Systems Business Management System
--
-- Copyright © Lima Buttgereit Holdings LLC d/b/a Muse Systems
-- This file may include content copyrighted and licensed from third parties.
--
-- See the LICENSE file in the project root for license terms and conditions.
-- See the NOTICE file in the project root for copyright ownership information.
--
-- muse.information@musesystems.com :: https://muse.systems
SELECT
rule.precedence
, rule.network_rule_id
, rule.functional_type
, rule.ip_host_or_network
, rule.ip_host_range_lower
, rule.ip_host_range_upper
FROM ( SELECT
1 AS precedence_sort
, 'disallowed' AS precedence
, 1 AS ordering
, id AS network_rule_id
, 'deny' AS functional_type
, host_address AS ip_host_or_network
, NULL AS ip_host_range_lower
, NULL AS ip_host_range_upper
FROM ms_syst_data.syst_disallowed_hosts
WHERE host_address = p_host_addr
UNION
SELECT
2 AS precedence_sort
, 'global' AS precedence
, ordering
, id AS network_rule_id
, functional_type
, ip_host_or_network
, ip_host_range_lower
, ip_host_range_upper
FROM ms_syst_data.syst_global_network_rules
WHERE
( ip_host_or_network >>= p_host_addr OR
p_host_addr BETWEEN ip_host_range_lower AND ip_host_range_upper )
UNION
SELECT
3 AS precedence_sort
, 'instance' AS precedence
, ordering
, id AS network_rule_id
, functional_type
, ip_host_or_network
, ip_host_range_lower
, ip_host_range_upper
FROM ms_syst_data.syst_instance_network_rules
WHERE
instance_id = p_instance_id
AND ( ip_host_or_network >>= p_host_addr OR
p_host_addr BETWEEN ip_host_range_lower AND ip_host_range_upper )
UNION
SELECT
4 AS precedence_sort
, 'instance_owner' AS precedence
, ordering
, id AS network_rule_id
, functional_type
, ip_host_or_network
, ip_host_range_lower
, ip_host_range_upper
FROM ms_syst_data.syst_owner_network_rules
WHERE
owner_id = coalesce( p_instance_owner_id, ( SELECT owner_id
FROM ms_syst_data.syst_instances
WHERE id = p_instance_id ) )
AND ( ip_host_or_network >>= p_host_addr OR
p_host_addr BETWEEN ip_host_range_lower AND ip_host_range_upper )
UNION
SELECT
5 AS precedence_sort
, 'implied' AS precedence
, 1 AS ordering
, NULL AS network_rule_id
, 'allow' AS functional_type
, '0.0.0.0/0'::inet AS ip_host_or_network
, NULL AS ip_host_range_lower
, NULL AS ip_host_range_upper
ORDER BY precedence_sort, ordering
LIMIT 1 ) rule;