-- ───────────────────────────────────────────────────────────────────────────── -- ic-web | IC-Webhosting – Datenbankschema -- Einmalig gegen die Spieldatenbank ausfuehren. Wiederholbar. -- -- Die DOMAENE selbst steht nicht hier, sondern in ic_mail_realms: ic-mail ist -- die einzige Domaenenverwaltung, eine Webseite ist nur ein zweiter Dienst -- darauf. Referenziert wird ueber den Domaenennamen, nicht ueber einen -- Fremdschluessel – Fremdschluessel ueber Resource-Grenzen hinweg koppeln zwei -- Lebenszyklen aneinander, die unabhaengig voneinander installiert werden. -- ───────────────────────────────────────────────────────────────────────────── -- Eine Webseite je Domaene. CREATE TABLE IF NOT EXISTS `ic_web_sites` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `domain` VARCHAR(80) NOT NULL, `title` VARCHAR(120) NOT NULL DEFAULT '', `theme` VARCHAR(40) NOT NULL DEFAULT 'clean', `owner_type` ENUM('job','faction') NOT NULL DEFAULT 'job', `owner_id` VARCHAR(80) NOT NULL, `published` TINYINT(1) NOT NULL DEFAULT 0, `blocked` TINYINT(1) NOT NULL DEFAULT 0, `created_by` VARCHAR(120) NULL DEFAULT NULL, `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uq_domain` (`domain`), KEY `idx_owner` (`owner_type`, `owner_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- Seiten einer Webseite. slug 'home' ist die Startseite. CREATE TABLE IF NOT EXISTS `ic_web_pages` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `site_id` INT UNSIGNED NOT NULL, `slug` VARCHAR(60) NOT NULL, `title` VARCHAR(120) NOT NULL DEFAULT '', `blocks` LONGTEXT NOT NULL, -- JSON-Liste, serverseitig geprueft `sort_order` INT NOT NULL DEFAULT 0, `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uq_site_slug` (`site_id`, `slug`), CONSTRAINT `fk_page_site` FOREIGN KEY (`site_id`) REFERENCES `ic_web_sites` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- Zugaenge zum Verwaltungsbereich. -- -- superadmin – der Anbieter selbst. Legt Domaenen an und setzt je Domaene -- einen Admin ein. Nicht an eine Domaene gebunden. -- admin – Domaenenadmin. Pflegt die Seiten seiner Domaene und legt dort -- weitere Zugaenge an. -- editor – darf nur die Seiten seiner Domaene pflegen. -- -- Das Passwort steht nirgends im Klartext: gespeichert wird SHA2(salt||passwort). -- Gerechnet wird das in der Datenbank, damit das Passwort den Server nur als -- Abfrageparameter durchlaeuft und nie in einer Lua-Variable liegen bleibt. -- -- Das ist ein IC-Passwort, keine Sicherheitsgrenze gegen Serveradmins – wer -- Datenbankzugriff hat, kann jeden Zugang zuruecksetzen. Es soll verhindern, -- dass Mitspieler fremde Seiten aendern, nicht Angriffe von aussen abwehren. CREATE TABLE IF NOT EXISTS `ic_web_accounts` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `username` VARCHAR(200) NOT NULL, -- z. B. admin@liveinvader.ls `domain` VARCHAR(80) NULL DEFAULT NULL, -- NULL nur beim superadmin `role` ENUM('superadmin','admin','editor') NOT NULL DEFAULT 'editor', `display_name` VARCHAR(120) NOT NULL DEFAULT '', `salt` CHAR(32) NOT NULL, `password_hash` CHAR(64) NOT NULL, `active` TINYINT(1) NOT NULL DEFAULT 1, `must_change` TINYINT(1) NOT NULL DEFAULT 0, `created_by` VARCHAR(200) NULL DEFAULT NULL, `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `last_login` TIMESTAMP NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uq_username` (`username`), KEY `idx_domain` (`domain`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- Fehlgeschlagene Anmeldungen. Ohne diese Bremse ist ein vierstelliges -- IC-Passwort in Sekunden durchprobiert. CREATE TABLE IF NOT EXISTS `ic_web_login_fails` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `username` VARCHAR(200) NOT NULL, `identifier` VARCHAR(120) NULL DEFAULT NULL, `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_user_time` (`username`, `created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- Meldungen. Bilder werden extern verlinkt, deshalb braucht es einen Weg, -- unpassende Inhalte zu melden, ohne dass ein Admin staendig mitliest. CREATE TABLE IF NOT EXISTS `ic_web_reports` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `site_id` INT UNSIGNED NOT NULL, `page_slug` VARCHAR(60) NULL DEFAULT NULL, `reason` VARCHAR(500) NOT NULL DEFAULT '', `reported_by` VARCHAR(120) NOT NULL, `status` ENUM('open','reviewed','dismissed') NOT NULL DEFAULT 'open', `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_status` (`status`), CONSTRAINT `fk_report_site` FOREIGN KEY (`site_id`) REFERENCES `ic_web_sites` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;