Skip to content
Snippets Groups Projects
Commit e64ddd58 authored by Michal Zander's avatar Michal Zander
Browse files

Add missing parameters to keyauth test, use new table in the test

parent 23a2783d
No related branches found
No related tags found
6 merge requests!627merge in fix for get_current_block_age,!626Fix get_current_block_age function to avoid healthcheck fails,!622merge develop to master,!599merge ( with merge commit) develop to master,!597Merge develop to master for release,!569Add missing parameters to keyauth test
......@@ -34,14 +34,21 @@ BEGIN
END
$BODY$;
CREATE TABLE IF NOT EXISTS keyauth_live.keys (
account text,
owner_key text[] DEFAULT '{}',
active_key text[] DEFAULT '{}',
posting_key text[] DEFAULT '{}',
memo text[] DEFAULT '{}',
owner_acc text[] DEFAULT '{}',
active_acc text[] DEFAULT '{}',
posting_acc text[] DEFAULT '{}',
account TEXT,
owner_key JSONB DEFAULT '[]',
owner_acc JSONB DEFAULT '[]',
owner_threshold INT DEFAULT 1,
posting_key JSONB DEFAULT '[]',
posting_acc JSONB DEFAULT '[]',
posting_threshold INT DEFAULT 1,
active_key JSONB DEFAULT '[]',
active_acc JSONB DEFAULT '[]',
active_threshold INT DEFAULT 1,
memo TEXT DEFAULT '',
CONSTRAINT pk_keyauth_comparison PRIMARY KEY (account)
);
......@@ -55,53 +62,92 @@ RETURNS SETOF keyauth_live.keys -- noqa: LT01
LANGUAGE 'plpgsql' STABLE
AS
$$
DECLARE
-- temp is that has threshold 0 without using an operation to set it
_account_id INT := (SELECT id FROM hive.accounts_view WHERE name = _account);
_default_threshold INT := 1;
BEGIN
RETURN QUERY
SELECT
_account,
COALESCE(key_subquery.owner_key,'{}'),
COALESCE(key_subquery.active_key,'{}'),
COALESCE(key_subquery.posting_key,'{}'),
COALESCE(key_subquery.memo,'{}'),
COALESCE(acc_subquery.owner_acc,'{}'),
COALESCE(acc_subquery.active_acc,'{}'),
COALESCE(acc_subquery.posting_acc,'{}')
COALESCE(key_subquery.owner_key,'[]'),
COALESCE(acc_subquery.owner_acc,'[]'),
COALESCE(weight_threshold_subquery.owner_threshold, _default_threshold),
COALESCE(key_subquery.posting_key,'[]'),
COALESCE(acc_subquery.posting_acc,'[]'),
COALESCE(weight_threshold_subquery.posting_threshold, _default_threshold),
COALESCE(key_subquery.active_key,'[]'),
COALESCE(acc_subquery.active_acc,'[]'),
COALESCE(weight_threshold_subquery.active_threshold, _default_threshold),
COALESCE(key_subquery.memo,'')
FROM
(
SELECT
MAX(CASE WHEN key_kind = 'OWNER' THEN key_agg END) AS owner_key,
MAX(CASE WHEN key_kind = 'MEMO' THEN key_agg END) AS memo,
MAX(CASE WHEN key_kind = 'POSTING' THEN key_agg END) AS posting_key,
MAX(CASE WHEN key_kind = 'ACTIVE' THEN key_agg END) AS active_key
MAX(CASE WHEN key_kind = 'OWNER' THEN weight_threshold::INT END)::INT AS owner_threshold,
MAX(CASE WHEN key_kind = 'POSTING' THEN weight_threshold::INT END)::INT AS posting_threshold,
MAX(CASE WHEN key_kind = 'ACTIVE' THEN weight_threshold::INT END::INT) AS active_threshold
FROM (
WITH selected AS (
SELECT
a.key_kind,
hive.public_key_to_string(c.key) as key_string
FROM hafd.keyauth_live_keyauth_a a
JOIN hive.accounts_view b ON a.account_id = b.id
JOIN hafd.keyauth_live_keyauth_k c ON a.key_serial_id = c.key_id
WHERE b.name = _account AND a.key_kind != 'WITNESS_SIGNING'
ORDER BY key_string)
SELECT key_kind, array_agg(key_string) as key_agg FROM selected GROUP BY key_kind
a.weight_threshold
FROM hafd.keyauth_live_weight_threshold a
WHERE a.account_id = _account_id
) AS key_agg_subquery
) AS weight_threshold_subquery,
(
SELECT
MAX(CASE WHEN key_kind = 'OWNER' THEN key_agg::TEXT END)::JSONB AS owner_key,
MAX(CASE WHEN key_kind = 'POSTING' THEN key_agg::TEXT END)::JSONB AS posting_key,
MAX(CASE WHEN key_kind = 'ACTIVE' THEN key_agg::TEXT END)::JSONB AS active_key,
MAX(CASE WHEN key_kind = 'MEMO' THEN (key_agg::JSONB -> 0 ->> 0)::TEXT END)::TEXT AS memo
FROM (
WITH selected AS
(
SELECT
a.key_kind,
jsonb_build_array(
hive.public_key_to_string(c.key),
a.w
) AS key_string
FROM hafd.keyauth_live_keyauth_a a
JOIN hafd.keyauth_live_keyauth_k c ON a.key_serial_id = c.key_id
WHERE a.account_id = _account_id AND a.key_kind != 'WITNESS_SIGNING'
ORDER BY key_string
)
SELECT
key_kind,
jsonb_agg(key_string) AS key_agg
FROM selected
GROUP BY key_kind
) AS key_agg_subquery
) AS key_subquery,
(
SELECT
MAX(CASE WHEN key_kind = 'OWNER' THEN acc_agg::TEXT[] END) AS owner_acc,
MAX(CASE WHEN key_kind = 'POSTING' THEN acc_agg::TEXT[] END) AS posting_acc,
MAX(CASE WHEN key_kind = 'ACTIVE' THEN acc_agg::TEXT[] END) AS active_acc
MAX(CASE WHEN key_kind = 'OWNER' THEN acc_agg::TEXT END)::JSONB AS owner_acc,
MAX(CASE WHEN key_kind = 'POSTING' THEN acc_agg::TEXT END)::JSONB AS posting_acc,
MAX(CASE WHEN key_kind = 'ACTIVE' THEN acc_agg::TEXT END)::JSONB AS active_acc
FROM (
WITH selected AS (
SELECT
a.key_kind,
c.name
FROM hafd.keyauth_live_accountauth_a a
JOIN hive.accounts_view b ON a.account_id = b.id
JOIN hive.accounts_view c ON a.account_auth_id = c.id
WHERE b.name = _account
ORDER BY c.name)
SELECT key_kind, array_agg(name) as acc_agg FROM selected GROUP BY key_kind
WITH selected AS
(
SELECT
a.key_kind,
jsonb_build_array(
c.name,
a.w
) AS name_array
FROM hafd.keyauth_live_accountauth_a a
JOIN hive.accounts_view c ON a.account_auth_id = c.id
WHERE a.account_id = _account_id
ORDER BY c.name
)
SELECT
key_kind,
jsonb_agg(name_array) as acc_agg
FROM selected
GROUP BY key_kind
) AS acc_agg_subquery
) AS acc_subquery;
......@@ -123,42 +169,69 @@ SELECT * FROM keyauth_live.current_state(_account);
END
$$;
CREATE OR REPLACE FUNCTION keyauth_live.filter_key(_key_array JSONB)
RETURNS TEXT[] -- noqa: LT01, CP05
CREATE OR REPLACE FUNCTION keyauth_live.dump_current_account_stats(account_data jsonb)
RETURNS void
LANGUAGE 'plpgsql'
STABLE
VOLATILE
AS
$$
BEGIN
RETURN (
WITH selected AS MATERIALIZED (
SELECT jsonb_array_elements(_key_array) as key_column
)
SELECT array_agg(key_column->>0) FROM selected
);
INSERT INTO keyauth_live.keys
SELECT
(account_data->>'name')::TEXT,
COALESCE((account_data->'owner'->'key_auths'),'[]'),
COALESCE((account_data->'owner'->'account_auths'),'[]'),
COALESCE((account_data->'owner'->>'weight_threshold')::INT, 1),
COALESCE((account_data->'posting'->'key_auths'),'[]'),
COALESCE((account_data->'posting'->'account_auths'),'[]'),
COALESCE((account_data->'posting'->>'weight_threshold')::INT, 1),
COALESCE((account_data->'active'->'key_auths'),'[]'),
COALESCE((account_data->'active'->'account_auths'),'[]'),
COALESCE((account_data->'active'->>'weight_threshold')::INT, 1),
account_data->>'memo_key';
END
$$;
CREATE OR REPLACE FUNCTION keyauth_live.dump_current_account_stats(account_data jsonb)
RETURNS void
CREATE OR REPLACE FUNCTION keyauth_live.compare_keys(_hived_keys JSONB, _state_provider_keys JSONB)
RETURNS BOOLEAN
LANGUAGE 'plpgsql'
VOLATILE
AS
$$
BEGIN
INSERT INTO keyauth_live.keys
SELECT
account_data->>'name' as account,
COALESCE((SELECT keyauth_live.filter_key(account_data->'owner'->'key_auths')),'{}') AS owner_key,
COALESCE((SELECT keyauth_live.filter_key(account_data->'active'->'key_auths')),'{}') AS active_key,
COALESCE((SELECT keyauth_live.filter_key(account_data->'posting'->'key_auths')),'{}') AS posting_key,
ARRAY[account_data->>'memo_key'] AS memo,
COALESCE((SELECT keyauth_live.filter_key(account_data->'owner'->'account_auths')),'{}') AS owner_acc,
COALESCE((SELECT keyauth_live.filter_key(account_data->'active'->'account_auths')),'{}') AS active_acc,
COALESCE((SELECT keyauth_live.filter_key(account_data->'posting'->'account_auths')),'{}') AS posting_acc;
RETURN (
WITH json1 AS (
SELECT jsonb_array_elements(SUB.arr) AS element
FROM (
SELECT _hived_keys::jsonb AS arr
) AS SUB
),
json2 AS (
SELECT jsonb_array_elements(SUB.arr) AS element
FROM (
SELECT _state_provider_keys::jsonb AS arr
) AS SUB
)
SELECT NOT EXISTS (
SELECT 1
FROM (
SELECT element FROM json1
EXCEPT
SELECT element FROM json2
) AS diff1
)
AND NOT EXISTS (
SELECT 1
FROM (
SELECT element FROM json2
EXCEPT
SELECT element FROM json1
) AS diff2
) AS arrays_are_equal
);
END
$$;
......@@ -179,20 +252,18 @@ FROM account_balances
JOIN keyauth_live.current_state(account_balances.account) AS _current_account_stats
ON _current_account_stats.account = account_balances.account
WHERE
account_balances.memo != _current_account_stats.memo
OR NOT account_balances.owner_key @> _current_account_stats.owner_key
OR NOT account_balances.active_key @> _current_account_stats.active_key
OR NOT account_balances.posting_key @> _current_account_stats.posting_key
OR NOT account_balances.owner_acc @> _current_account_stats.owner_acc
OR NOT account_balances.active_acc @> _current_account_stats.active_acc
OR NOT account_balances.posting_acc @> _current_account_stats.posting_acc
OR NOT account_balances.owner_key <@ _current_account_stats.owner_key
OR NOT account_balances.active_key <@ _current_account_stats.active_key
OR NOT account_balances.posting_key <@ _current_account_stats.posting_key
OR NOT account_balances.owner_acc <@ _current_account_stats.owner_acc
OR NOT account_balances.active_acc <@ _current_account_stats.active_acc
OR NOT account_balances.posting_acc <@ _current_account_stats.posting_acc;
account_balances.memo != _current_account_stats.memo
OR NOT keyauth_live.compare_keys(account_balances.owner_key, _current_account_stats.owner_key)
OR NOT keyauth_live.compare_keys(account_balances.active_key, _current_account_stats.active_key)
OR NOT keyauth_live.compare_keys(account_balances.posting_key, _current_account_stats.posting_key)
OR NOT keyauth_live.compare_keys(account_balances.owner_acc, _current_account_stats.owner_acc)
OR NOT keyauth_live.compare_keys(account_balances.active_acc, _current_account_stats.active_acc)
OR NOT keyauth_live.compare_keys(account_balances.posting_acc, _current_account_stats.posting_acc)
OR account_balances.owner_threshold != _current_account_stats.owner_threshold
OR account_balances.posting_threshold != _current_account_stats.posting_threshold
OR account_balances.active_threshold != _current_account_stats.active_threshold;
END
$$;
\ No newline at end of file
$$;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment