Limit scope of cron job using vessel.client_id

Ensure all queries to api.metrics are limited to a specific vessel using client_id
This commit is contained in:
xbgmsharp
2022-10-19 13:25:49 +02:00
parent be27618dac
commit 7b7aae7dfe

View File

@@ -145,8 +145,8 @@ AS $send_email_py$
email_content = rv[0]['email_content'] email_content = rv[0]['email_content']
# Replace fields using input jsonb obj # Replace fields using input jsonb obj
plpy.notice('Parameters [{}] [{}]'.format(_user, app))
if not _user or not app: if not _user or not app:
plpy.notice('send_email_py_fn Parameters [{}] [{}]'.format(_user, app))
plpy.error('Error missing parameters') plpy.error('Error missing parameters')
return None return None
if 'logbook_name' in _user and _user['logbook_name']: if 'logbook_name' in _user and _user['logbook_name']:
@@ -307,8 +307,9 @@ CREATE OR REPLACE FUNCTION logbook_update_avg_fn(
SELECT AVG(speedOverGround), MAX(speedOverGround), MAX(windspeedapparent) INTO SELECT AVG(speedOverGround), MAX(speedOverGround), MAX(windspeedapparent) INTO
avg_speed, max_speed, max_wind_speed avg_speed, max_speed, max_wind_speed
FROM api.metrics FROM api.metrics
WHERE time >= _start::TIMESTAMP WITHOUT TIME ZONE AND WHERE time >= _start::TIMESTAMP WITHOUT TIME ZONE
time <= _end::TIMESTAMP WITHOUT TIME ZONE; AND time <= _end::TIMESTAMP WITHOUT TIME ZONE
AND client_id = current_setting('vessel.client_id', false);
RAISE NOTICE '-> Updated avg for logbook id=%, avg_speed:%, max_speed:%, max_wind_speed:%', _id, avg_speed, max_speed, max_wind_speed; RAISE NOTICE '-> Updated avg for logbook id=%, avg_speed:%, max_speed:%, max_wind_speed:%', _id, avg_speed, max_speed, max_wind_speed;
END; END;
$logbook_update_avg$ LANGUAGE plpgsql; $logbook_update_avg$ LANGUAGE plpgsql;
@@ -334,6 +335,7 @@ CREATE FUNCTION logbook_update_geom_distance_fn(IN _id integer, IN _start text,
AND m.longitude IS NOT NULL AND m.longitude IS NOT NULL
AND m.time >= _start::TIMESTAMP WITHOUT TIME ZONE AND m.time >= _start::TIMESTAMP WITHOUT TIME ZONE
AND m.time <= _end::TIMESTAMP WITHOUT TIME ZONE AND m.time <= _end::TIMESTAMP WITHOUT TIME ZONE
AND client_id = current_setting('vessel.client_id', false)
ORDER BY m.time ASC ORDER BY m.time ASC
) )
) INTO _track_geom; ) INTO _track_geom;
@@ -380,6 +382,7 @@ CREATE FUNCTION logbook_update_geojson_fn(IN _id integer, IN _start text, IN _en
AND m.longitude IS NOT NULL AND m.longitude IS NOT NULL
AND time >= _start::TIMESTAMP WITHOUT TIME ZONE AND time >= _start::TIMESTAMP WITHOUT TIME ZONE
AND time <= _end::TIMESTAMP WITHOUT TIME ZONE AND time <= _end::TIMESTAMP WITHOUT TIME ZONE
AND client_id = current_setting('vessel.client_id', false)
ORDER BY m.time asc ORDER BY m.time asc
) )
) AS t; ) AS t;
@@ -413,6 +416,7 @@ CREATE OR REPLACE FUNCTION process_logbook_queue_fn(IN _id integer) RETURNS void
log_settings jsonb; log_settings jsonb;
user_settings jsonb; user_settings jsonb;
app_settings jsonb; app_settings jsonb;
vessel_settings jsonb;
geojson jsonb; geojson jsonb;
BEGIN BEGIN
-- If _id is not NULL -- If _id is not NULL
@@ -424,6 +428,9 @@ CREATE OR REPLACE FUNCTION process_logbook_queue_fn(IN _id integer) RETURNS void
WHERE active IS false WHERE active IS false
AND id = _id; AND id = _id;
PERFORM set_config('vessel.client_id', logbook_rec.client_id, false);
RAISE WARNING 'public.process_logbook_queue_fn() scheduler vessel.client_id %', current_setting('vessel.client_id', false);
-- geo reverse _from_lng _from_lat -- geo reverse _from_lng _from_lat
-- geo reverse _to_lng _to_lat -- geo reverse _to_lng _to_lat
from_name := reverse_geocode_py_fn('nominatim', logbook_rec._from_lng::NUMERIC, logbook_rec._from_lat::NUMERIC); from_name := reverse_geocode_py_fn('nominatim', logbook_rec._from_lng::NUMERIC, logbook_rec._from_lat::NUMERIC);
@@ -602,10 +609,19 @@ CREATE OR REPLACE FUNCTION process_account_queue_fn(IN _email TEXT) RETURNS void
user_settings jsonb; user_settings jsonb;
app_settings jsonb; app_settings jsonb;
BEGIN BEGIN
-- If _email is not NULL IF _email IS NULL OR _email = '' THEN
RAISE EXCEPTION 'Invalid email'
USING HINT = 'Unkown email';
RETURN;
END IF;
SELECT * INTO account_rec SELECT * INTO account_rec
FROM auth.accounts FROM auth.accounts
WHERE email = _email; WHERE email = _email;
IF account_rec.email IS NULL OR account_rec.email = '' THEN
RAISE EXCEPTION 'Invalid email'
USING HINT = 'Unkown email';
RETURN;
END IF;
-- Gather email and pushover app settings -- Gather email and pushover app settings
app_settings := get_app_settings_fn(); app_settings := get_app_settings_fn();
-- Gather user settings -- Gather user settings
@@ -629,10 +645,19 @@ CREATE OR REPLACE FUNCTION process_vessel_queue_fn(IN _email TEXT) RETURNS void
user_settings jsonb; user_settings jsonb;
app_settings jsonb; app_settings jsonb;
BEGIN BEGIN
-- If _email is not NULL IF _email IS NULL OR _email = '' THEN
RAISE EXCEPTION 'Invalid email'
USING HINT = 'Unkown email';
RETURN;
END IF;
SELECT * INTO vessel_rec SELECT * INTO vessel_rec
FROM auth.vessels FROM auth.vessels
WHERE owner_email = _email; WHERE owner_email = _email;
IF vessel_rec.owner_email IS NULL OR vessel_rec.owner_email = '' THEN
RAISE EXCEPTION 'Invalid email'
USING HINT = 'Unkown email';
RETURN;
END IF;
-- Gather user_settings from -- Gather user_settings from
-- if notification email -- if notification email
-- -- Send email -- -- Send email
@@ -737,6 +762,38 @@ COMMENT ON FUNCTION
public.get_user_settings_from_clientid_fn public.get_user_settings_from_clientid_fn
IS 'get user settings details from a clientid, initiate for notifications'; IS 'get user settings details from a clientid, initiate for notifications';
DROP FUNCTION IF EXISTS set_vessel_settings_from_clientid_fn;
CREATE OR REPLACE FUNCTION set_vessel_settings_from_clientid_fn(
IN clientid TEXT,
OUT vessel_settings JSONB
) RETURNS JSONB
AS $set_vessel_settings_from_clientid$
DECLARE
BEGIN
-- If client_id is not NULL
IF clientid IS NULL OR clientid = '' THEN
RAISE WARNING '-> set_vessel_settings_from_clientid_fn invalid input %', clientid;
END IF;
SELECT
json_build_object(
'name' , v.name,
'mmsi', v.mmsi,
'client_id', m.client_id
) INTO vessel_settings
FROM auth.accounts a, auth.vessels v, api.metadata m
WHERE m.mmsi = v.mmsi
AND m.client_id = clientid;
PERFORM set_config('vessel.mmsi', vessel_rec.mmsi, false);
PERFORM set_config('vessel.name', vessel_rec.name, false);
PERFORM set_config('vessel.client_id', vessel_rec.client_id, false);
END;
$set_vessel_settings_from_clientid$ LANGUAGE plpgsql;
-- Description
COMMENT ON FUNCTION
public.set_vessel_settings_from_clientid_fn
IS 'set_vessel settings details from a clientid, initiate for process queue functions';
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
-- Queue handling -- Queue handling
-- --