diff --git a/internal/db/schema/migrations/oss/postgres/99/01_credential_static_password_credential.up.sql b/internal/db/schema/migrations/oss/postgres/99/01_credential_static_password_credential.up.sql index a9ab5401bf..3ce6a865c4 100644 --- a/internal/db/schema/migrations/oss/postgres/99/01_credential_static_password_credential.up.sql +++ b/internal/db/schema/migrations/oss/postgres/99/01_credential_static_password_credential.up.sql @@ -115,4 +115,98 @@ begin; create index credential_static_password_credential_deleted_delete_time_idx on credential_static_password_credential_deleted (delete_time); + create view credential_static_password_credential_hst_aggregate as + select + rsc.recording_id, + spc.public_id, + spc.name, + spc.description, + spc.password_hmac, + css.public_id as store_public_id, + css.project_id as store_project_id, + css.name as store_name, + css.description as store_description, + string_agg(distinct rsc.credential_purpose, '|') as purposes + from + credential_static_password_credential_hst as spc + left join recording_static_credential as rsc on spc.history_id = rsc.credential_static_hst_id + join credential_static_store_hst as css on rsc.credential_static_store_hst_id = css.history_id + group by spc.history_id, rsc.recording_id, css.history_id; + comment on view credential_static_password_credential_hst_aggregate is + 'credential_static_password_credential_hst_aggregate contains the password credential history data along with its store and purpose data.'; + + -- This constraint replaces the previous constraint created in 98/01_credential_static_username_password_domain_credential.up.sql + alter table credential_type_enm + drop constraint only_predefined_credential_types_allowed; + + alter table credential_type_enm + add constraint only_predefined_credential_types_allowed + check ( + name in ( + 'unspecified', + 'username_password', + 'ssh_private_key', + 'ssh_certificate', + 'username_password_domain', + 'password' + ) + ); + + insert into credential_type_enm (name) + values ('password'); + + -- This function replaces the previous function created in 98/01_credential_static_username_password_domain_credential.up.sql + create or replace function insert_recording_static_credentials() returns trigger + as $$ + begin + with + session_recording(session_id, recording_id) as ( + select session_id, public_id + from recording_session + where session_id = new.session_id + ), + session_static_creds(cred_id, purpose, recording_id) as ( + select credential_static_id, credential_purpose, recording_id + from session_credential_static + join session_recording using (session_id) + ), + static_cred_history(public_id, store_id, cred_hst_id, valid_range) as ( + select public_id, store_id, history_id, valid_range + from credential_static_json_credential_hst + union + select public_id, store_id, history_id, valid_range + from credential_static_ssh_private_key_credential_hst + union + select public_id, store_id, history_id, valid_range + from credential_static_username_password_credential_hst + union + select public_id, store_id, history_id, valid_range + from credential_static_username_password_domain_credential_hst + union + select public_id, store_id, history_id, valid_range + from credential_static_password_credential_hst + ), + final(recording_id, cred_id, store_id, cred_hst_id, store_hst_id, cred_purpose) as ( + select ssc.recording_id, sc.public_id, sc.store_id, sc.cred_hst_id, store_hst.history_id, ssc.purpose + from static_cred_history as sc + join credential_static_store_hst as store_hst on sc.store_id = store_hst.public_id + and store_hst.valid_range @> current_timestamp + join session_static_creds as ssc on sc.public_id = ssc.cred_id + where sc.public_id in (select cred_id from session_static_creds) + and sc.valid_range @> current_timestamp + ) + insert into recording_static_credential + (recording_id, credential_static_store_hst_id, credential_static_hst_id, credential_purpose) + select recording_id, store_hst_id, cred_hst_id, cred_purpose + from final; + + return new; + end; + $$ language plpgsql; + + comment on function insert_recording_static_credentials is + 'insert_recording_static_credentials is an after insert trigger for the recording_session table.'; + + insert into oplog_ticket (name, version) + values ('credential_static_password_credential', 1); commit;