39 lines
1.8 KiB
SQL
39 lines
1.8 KiB
SQL
-- MijnBesluit - onthouden welke inlogcode ECHT is gebruikt
|
|
--
|
|
-- Er zit een rem op het aanvragen van codes: niet meer dan vijf per uur voor hetzelfde adres.
|
|
-- Die rem is er tegen één ding: iemand die het postvak van een ander volgooit door steeds
|
|
-- opnieuw een code voor dat adres aan te vragen.
|
|
--
|
|
-- Die telling keek naar alle codes van het afgelopen uur, ook de codes die gewoon zijn gebruikt
|
|
-- om in te loggen. Wie vijf keer in een uur inlogde, sloot zichzelf dus een uur buiten - en dat
|
|
-- gebeurt precies wanneer er íéts anders aan de hand is en je het een paar keer opnieuw
|
|
-- probeert. Dat is de verkeerde kant om te falen: de rem hoort een vreemde te stoppen, niet de
|
|
-- eigenaar.
|
|
--
|
|
-- Waarom daar een nieuwe kolom voor nodig is: `consumed_at` betekent "deze code werkt niet
|
|
-- meer", en dat wordt ook gezet als een nieuwe aanvraag de vorige ongeldig maakt, en als een
|
|
-- code te vaak fout is ingevuld. Precies die twee gevallen MOETEN meetellen - anders kan een
|
|
-- vreemde de rem leegtrekken door codes aan te vragen of expres fout in te vullen.
|
|
--
|
|
-- `signed_in_at` staat alleen gevuld als de code goed is ingevuld en er iemand mee is
|
|
-- binnengekomen. Alleen dát is het bewijs dat de aanvrager zelf in dat postvak zit, en alleen
|
|
-- die codes tellen niet mee voor de rem.
|
|
--
|
|
-- Draaien met:
|
|
-- mysql -u root -p mijnbesluit < db\14_inlogcode_gebruikt.sql
|
|
--
|
|
-- Opnieuw draaien mag: er gebeurt dan niets.
|
|
|
|
USE `mijnbesluit`;
|
|
|
|
SET @bestaat := (
|
|
SELECT COUNT(*) FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'login_codes' AND COLUMN_NAME = 'signed_in_at');
|
|
|
|
SET @sql := IF(@bestaat = 0,
|
|
'ALTER TABLE `login_codes` ADD COLUMN `signed_in_at` DATETIME(3) NULL',
|
|
'SELECT "signed_in_at bestaat al" AS melding');
|
|
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
|
|
|
SELECT 'Klaar.' AS melding;
|