-- MijnBesluit - kijklink voor een moment aan iemand zonder account -- -- Zet je een moment klaar voor iemand die (nog) geen MijnBesluit-account heeft, dan krijgt hij -- voortaan een e-mail met een link naar een landingspagina: daar is het bericht - tekst en een -- eventuele foto, video of document - te zien zonder in te loggen. Zelfde opzet als de -- uitnodigings- en bezwaarlink: alleen de hash van het token staat in de database, het token -- zelf staat uitsluitend in de e-mail. -- -- view_token_hash : SHA-256 van het token uit de link -- view_token_expires : tot wanneer die link werkt (30 dagen na het versturen) -- view_token_sent_at : wanneer de linkmail voor het eerst is verstuurd -- viewed_at : wanneer de landingspagina daadwerkelijk is geopend -- view_reminder_sent_at : wanneer de herinnering is verstuurd (nooit meer dan één keer) -- wrapped_content_key_for_token: de contentsleutel, ingepakt met een sleutel uit het token zelf -- wrapped_vault_key_for_token : dezelfde inpakslag, voor de bijlage bij dit bericht -- -- Draaien met: -- mysql -u root -p mijnbesluit < db\18_kijklink.sql -- -- Opnieuw draaien mag: er gebeurt dan niets. USE `mijnbesluit`; -- ---------------------------------------------------------------- view_token_hash SET @bestaat := ( SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'messages' AND COLUMN_NAME = 'view_token_hash'); SET @sql := IF(@bestaat = 0, 'ALTER TABLE `messages` ADD COLUMN `view_token_hash` VARBINARY(32) NULL', 'SELECT "view_token_hash bestaat al" AS melding'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ---------------------------------------------------------------- view_token_expires SET @bestaat := ( SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'messages' AND COLUMN_NAME = 'view_token_expires'); SET @sql := IF(@bestaat = 0, 'ALTER TABLE `messages` ADD COLUMN `view_token_expires` DATETIME(3) NULL', 'SELECT "view_token_expires bestaat al" AS melding'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ---------------------------------------------------------------- view_token_sent_at SET @bestaat := ( SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'messages' AND COLUMN_NAME = 'view_token_sent_at'); SET @sql := IF(@bestaat = 0, 'ALTER TABLE `messages` ADD COLUMN `view_token_sent_at` DATETIME(3) NULL', 'SELECT "view_token_sent_at bestaat al" AS melding'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ---------------------------------------------------------------- viewed_at SET @bestaat := ( SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'messages' AND COLUMN_NAME = 'viewed_at'); SET @sql := IF(@bestaat = 0, 'ALTER TABLE `messages` ADD COLUMN `viewed_at` DATETIME(3) NULL', 'SELECT "viewed_at bestaat al" AS melding'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ---------------------------------------------------------------- view_reminder_sent_at SET @bestaat := ( SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'messages' AND COLUMN_NAME = 'view_reminder_sent_at'); SET @sql := IF(@bestaat = 0, 'ALTER TABLE `messages` ADD COLUMN `view_reminder_sent_at` DATETIME(3) NULL', 'SELECT "view_reminder_sent_at bestaat al" AS melding'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ---------------------------------------------------------------- wrapped_content_key_for_token SET @bestaat := ( SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'messages' AND COLUMN_NAME = 'wrapped_content_key_for_token'); SET @sql := IF(@bestaat = 0, 'ALTER TABLE `messages` ADD COLUMN `wrapped_content_key_for_token` VARBINARY(96) NULL', 'SELECT "wrapped_content_key_for_token bestaat al" AS melding'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ---------------------------------------------------------------- wrapped_vault_key_for_token SET @bestaat := ( SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'messages' AND COLUMN_NAME = 'wrapped_vault_key_for_token'); SET @sql := IF(@bestaat = 0, 'ALTER TABLE `messages` ADD COLUMN `wrapped_vault_key_for_token` VARBINARY(96) NULL', 'SELECT "wrapped_vault_key_for_token bestaat al" AS melding'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ---------------------------------------------------------------- index -- De landingspagina zoekt het bericht op dit kenmerk op, dus zonder index is dat een tabelscan. SET @bestaat := ( SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'messages' AND INDEX_NAME = 'ix_messages_view_token'); SET @sql := IF(@bestaat = 0, 'CREATE INDEX `ix_messages_view_token` ON `messages` (`view_token_hash`)', 'SELECT "ix_messages_view_token bestaat al" AS melding'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SELECT 'Klaar. Momenten voor iemand zonder account krijgen vanaf nu een kijklink per e-mail.' AS melding;