added data recording for vandalism protection

This commit is contained in:
following
2013-03-08 22:44:19 +01:00
parent aa525c93ae
commit 7c785fcd6c
14 changed files with 173 additions and 11 deletions
+9
View File
@@ -33,3 +33,12 @@ date commit ID change
2013-02-16 06d832c3 new table data_licenses
added user.data_license
2013-02-17 b7b51eab added user.email_problems
2013-03-01 c5057c88 added caches.short2 und .short2_trans_id
2013-03-03 c5057c88 added profile_options.optionset
2013-03-04 df313402 new table helppages
2013-03-08 changes for vandalism archive-and-restore:
- added cache_logs_archived.deletion_date and deleted_by
- added tables caches_modified, cache_desc_modified,
caches_attributes_modified, cache_logs_restored,
cache_pictures_modified and listing_restored
+60
View File
@@ -639,6 +639,15 @@
INSERT IGNORE INTO `cache_countries` (`cache_id`, `date_created`, `country`)
VALUES (NEW.`cache_id`, NOW(), NEW.`country`);
END IF;
IF NEW.`cache_id` = OLD.`cache_id` AND
OLD.`status` <> 5 AND
OLD.`date_created` < LEFT(NOW(),10) AND
(NEW.`name` != OLD.`name` OR NEW.`type` != OLD.`type` OR NEW.`date_hidden` != OLD.`date_hidden` OR NEW.`size` != OLD.`size` OR NEW.`difficulty` != OLD.`difficulty` OR NEW.`terrain` != OLD.`terrain` OR NEW.`search_time` != OLD.`search_time` OR NEW.`way_length` != OLD.`way_length` OR NEW.`wp_gc` != OLD.`wp_gc` OR NEW.`wp_nc` != OLD.`wp_nc`)
THEN
INSERT IGNORE INTO `caches_modified` (`cache_id`, `date_modified`, `name`, `type`, `date_hidden`, `size`, `difficulty`, `terrain`, `search_time`, `way_length`, `wp_gc`, `wp_nc`) VALUES (OLD.`cache_id`, NOW(), OLD.`name`, OLD.`type`, OLD.`date_hidden`, OLD.`size`, OLD.`difficulty`, OLD.`terrain`, OLD.`search_time`, OLD.`way_length`, OLD.`wp_gc`, OLD.`wp_nc`);
/* logpw needs not to be saved */
/* for further explanation see restorecaches.php */
END IF;
IF NEW.`user_id`!=OLD.`user_id` THEN
CALL sp_update_hiddenstat(OLD.`user_id`, TRUE);
CALL sp_update_hiddenstat(NEW.`user_id`, FALSE);
@@ -655,6 +664,8 @@
DELETE FROM `cache_coordinates` WHERE `cache_id`=OLD.`cache_id`;
DELETE FROM `cache_countries` WHERE `cache_id`=OLD.`cache_id`;
DELETE FROM `cache_npa_areas` WHERE `cache_id`=OLD.`cache_id`;
DELETE FROM `caches_modified` WHERE `cache_id`=OLD.`cache_id`;
/* lots of things are missing here - descs, logs, pictures ... */
CALL sp_update_hiddenstat(OLD.`user_id`, TRUE);
INSERT IGNORE INTO `removed_objects` (`localId`, `uuid`, `type`, `node`) VALUES (OLD.`cache_id`, OLD.`uuid`, 2, OLD.`node`);
END;");
@@ -678,6 +689,10 @@
sql("CREATE TRIGGER `cacheDescAfterInsert` AFTER INSERT ON `cache_desc`
FOR EACH ROW
BEGIN
IF (SELECT `date_created` FROM `caches` WHERE `cache_id`=NEW.`cache_id`) < LEFT(NOW(),10) AND
(SELECT `status` FROM `caches` WHERE `caches`.`cache_id`=NEW.`cache_id`) != 5 THEN
INSERT IGNORE INTO `cache_desc_modified` (`cache_id`, `language`, `date_modified`, `desc`) VALUES (NEW.`cache_id`, NEW.`language`, NOW(), NULL);
END IF;
CALL sp_update_caches_descLanguages(NEW.`cache_id`);
END;");
@@ -701,6 +716,15 @@
END IF;
CALL sp_update_caches_descLanguages(NEW.`cache_id`);
END IF;
/* changes at date of creation are ignored to save archive space */
IF NEW.`cache_id`=OLD.`cache_id` AND
(OLD.`date_created` < LEFT(NOW(),10)) AND
(SELECT `status` FROM `caches` WHERE `caches`.`cache_id`=OLD.`cache_id`) != 5 THEN
INSERT IGNORE INTO `cache_desc_modified` (`cache_id`, `language`, `date_modified`, `date_created`, `desc`, `desc_html`, `desc_htmledit`, `hint`, `short_desc`) VALUES (OLD.`cache_id`, OLD.`language`, NOW(), OLD.`date_created`, OLD.`desc`, OLD.`desc_html`, OLD.`desc_htmledit`, OLD.`hint`, OLD.`short_desc`);
IF NEW.`language`!=OLD.`language` THEN
INSERT IGNORE INTO `cache_desc_modified` (`cache_id`, `language`, `date_modified`, `desc`) VALUES (NEW.`cache_id`, NEW.`language`, NOW(), NULL);
END IF;
END IF;
END;");
sql_dropTrigger('cacheDescAfterDelete');
@@ -708,6 +732,11 @@
FOR EACH ROW
BEGIN
INSERT IGNORE INTO `removed_objects` (`localId`, `uuid`, `type`, `node`) VALUES (OLD.`id`, OLD.`uuid`, 3, OLD.`node`);
/* changes at date of creation are ignored to save archive space */
IF (OLD.`date_created` < LEFT(NOW(),10)) AND
(SELECT `status` FROM `caches` WHERE `caches`.`cache_id`=OLD.`cache_id`) != 5 THEN
INSERT IGNORE INTO `cache_desc_modified` (`cache_id`, `language`, `date_modified`, `date_created`, `desc`, `desc_html`, `desc_htmledit`, `hint`, `short_desc`) VALUES (OLD.`cache_id`, OLD.`language`, NOW(), OLD.`date_created`, OLD.`desc`, OLD.`desc_html`, OLD.`desc_htmledit`, OLD.`hint`, OLD.`short_desc`);
END IF;
CALL sp_update_caches_descLanguages(OLD.`cache_id`);
END;");
@@ -937,6 +966,13 @@
sql("CREATE TRIGGER `picturesAfterInsert` AFTER INSERT ON `pictures`
FOR EACH ROW
BEGIN
IF @archive_picop AND
(NEW.`object_type`=1 OR /* re-insert of owner-deleted other user's logpic */
(NEW.`object_type`=2 AND
((SELECT `date_created` FROM `caches` WHERE `cache_id`=NEW.`object_id`) < LEFT(NOW(),10)) AND
(SELECT `status` FROM `caches` WHERE `caches`.`cache_id`=NEW.`object_id`) != 5)) THEN
INSERT IGNORE INTO `pictures_modified` (`id`, `date_modified`, `operation`, `object_type`, `object_id`, `title`, `original_id`) VALUES (NEW.`id`, NOW(), 'I', NEW.`object_type`, NEW.`object_id`, NEW.`title`, @original_picid);
END IF;
IF NEW.`object_type`=1 THEN
CALL sp_update_cachelog_picturestat(NEW.`object_id`, FALSE);
ELSEIF NEW.`object_type`=2 THEN
@@ -969,6 +1005,12 @@
ELSEIF NEW.`object_type`=2 THEN
CALL sp_update_cache_picturestat(NEW.`object_id`, FALSE);
END IF;
ELSEIF @archive_picop AND
NEW.`object_type`=2 AND
(OLD.`date_created` < LEFT(NOW(),10)) AND
(SELECT `status` FROM `caches` WHERE `caches`.`cache_id`=OLD.`object_id`) != 5 AND
(NEW.`title` != OLD.`title` OR NEW.`spoiler` != OLD.`spoiler` OR NEW.`display` != OLD.`display`) THEN
INSERT IGNORE INTO `pictures_modified` (`id`, `date_modified`, `operation`, `date_created`, `url`, `title`, `object_id`, `object_type`, `spoiler`, `unknown_format`, `display`) VALUES (OLD.`id`, NOW(), 'U', OLD.`date_created`, OLD.`url`, OLD.`title`, OLD.`object_id`, OLD.`object_type`, OLD.`spoiler`, OLD.`unknown_format`, OLD.`display`);
END IF;
END;");
@@ -977,6 +1019,15 @@
FOR EACH ROW
BEGIN
INSERT IGNORE INTO `removed_objects` (`localId`, `uuid`, `type`, `node`) VALUES (OLD.`id`, OLD.`uuid`, 6, OLD.`node`);
IF @archive_picop AND
(OLD.`object_type`=1 OR
/* @archive_picop ensures that type-1 pics here are non-cacheowner's pics */
(OLD.`object_type`=2 AND
(SELECT `date_created` FROM `caches` WHERE `cache_id`=OLD.`object_id`) < LEFT(NOW(),10) AND
(SELECT `status` FROM `caches` WHERE `caches`.`cache_id`=OLD.`object_id`) != 5
)) THEN
INSERT IGNORE INTO `pictures_modified` (`id`, `date_modified`, `operation`, `date_created`, `url`, `title`, `object_id`, `object_type`, `spoiler`, `unknown_format`, `display`) VALUES (OLD.`id`, NOW(), 'D', OLD.`date_created`, OLD.`url`, OLD.`title`, OLD.`object_id`, OLD.`object_type`, OLD.`spoiler`, OLD.`unknown_format`, OLD.`display`);
END IF;
IF OLD.`object_type`=1 THEN
CALL sp_update_cachelog_picturestat(OLD.`object_id`, TRUE);
ELSEIF OLD.`object_type`=2 THEN
@@ -1176,6 +1227,10 @@
FOR EACH ROW
BEGIN
UPDATE `caches` SET `last_modified`=NOW() WHERE `cache_id`=NEW.`cache_id`;
IF (SELECT `status` FROM `caches` WHERE `cache_id`=NEW.`cache_id`) != 5 AND
(SELECT `date_created` FROM `caches` WHERE `cache_id`=NEW.`cache_id`) < LEFT(NOW(),10) THEN
INSERT IGNORE INTO `caches_attributes_modified` (`cache_id`, `attrib_id`, `date_modified`, `was_set`) VALUES (NEW.`cache_id`, NEW.`attrib_id`, NOW(), 0);
END IF;
END;");
sql_dropTrigger('cacheAttributesAfterUpdate');
@@ -1186,6 +1241,7 @@
IF OLD.`cache_id`!=NEW.`cache_id` THEN
UPDATE `caches` SET `last_modified`=NOW() WHERE `cache_id`=OLD.`cache_id`;
END IF;
/* is not called, otherweise cache_attributes_modified would have to be updated */
END;");
sql_dropTrigger('cacheAttributesAfterDelete');
@@ -1193,6 +1249,10 @@
FOR EACH ROW
BEGIN
UPDATE `caches` SET `last_modified`=NOW() WHERE `cache_id`=OLD.`cache_id`;
IF (SELECT `status` FROM `caches` WHERE `cache_id`=OLD.`cache_id`) != 5 AND
(SELECT `date_created` FROM `caches` WHERE `cache_id`=OLD.`cache_id`) < LEFT(NOW(),10) THEN
INSERT IGNORE INTO `caches_attributes_modified` (`cache_id`, `attrib_id`, `date_modified`, `was_set`) VALUES (OLD.`cache_id`, OLD.`attrib_id`, NOW(), 1);
END IF;
END;");
sql_dropTrigger('map2resultAfterDelete');
@@ -0,0 +1,14 @@
SET NAMES 'utf8';
DROP TABLE IF EXISTS `cache_desc_modified`;
CREATE TABLE `cache_desc_modified` (
`cache_id` int(10) unsigned NOT NULL,
`language` char(2) NOT NULL,
`date_modified` date NOT NULL COMMENT 'no time! see restorecaches.php',
`date_created` datetime NOT NULL,
`desc` mediumtext,
`desc_html` tinyint(1) NOT NULL default '0',
`desc_htmledit` tinyint(1) NOT NULL default '0',
`hint` mediumtext,
`short_desc` varchar(120) NOT NULL,
UNIQUE KEY `cache_id` (`cache_id`,`date_modified`,`language`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
@@ -15,6 +15,8 @@ CREATE TABLE `cache_logs_archived` (
`text_htmledit` tinyint(1) NOT NULL,
`owner_notified` tinyint(1) NOT NULL,
`picture` smallint(5) unsigned NOT NULL,
`deletion_date` datetime default NULL,
`deleted_by` int(10) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `cache_id` (`cache_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
@@ -0,0 +1,11 @@
SET NAMES 'utf8';
DROP TABLE IF EXISTS `cache_logs_restored`;
CREATE TABLE `cache_logs_restored` (
`id` int(10) NOT NULL,
`date_modified` datetime NOT NULL,
`cache_id` int(10) unsigned NOT NULL,
`original_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `original_id` (`original_id`),
KEY `cache_id` (`cache_id`,`date_modified`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
+6 -4
View File
@@ -5,10 +5,12 @@ CREATE TABLE `cache_type` (
`name` varchar(80) NOT NULL,
`trans_id` int(10) NOT NULL,
`ordinal` tinyint(3) unsigned NOT NULL,
`short` varchar(10) NOT NULL COMMENT 'obsolete',
`de` varchar(60) NOT NULL COMMENT 'obsolete',
`en` varchar(60) NOT NULL COMMENT 'obsolete',
`icon_large` varchar(60) NOT NULL COMMENT 'obsolete',
`short` varchar(10) NOT NULL,
`de` varchar(60) NOT NULL,
`en` varchar(60) NOT NULL,
`icon_large` varchar(60) NOT NULL,
`short2` varchar(15) NOT NULL,
`short2_trans_id` int(10) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='static content' ;
@@ -0,0 +1,9 @@
SET NAMES 'utf8';
DROP TABLE IF EXISTS `caches_attributes_modified`;
CREATE TABLE `caches_attributes_modified` (
`cache_id` int(10) unsigned NOT NULL,
`attrib_id` tinyint(3) unsigned NOT NULL,
`date_modified` date NOT NULL COMMENT 'no time! see restorecaches.php',
`was_set` tinyint(1) unsigned NOT NULL,
UNIQUE KEY `cache_id` (`cache_id`,`date_modified`,`attrib_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
+17
View File
@@ -0,0 +1,17 @@
SET NAMES 'utf8';
DROP TABLE IF EXISTS `caches_modified`;
CREATE TABLE `caches_modified` (
`cache_id` int(10) unsigned NOT NULL auto_increment,
`date_modified` date NOT NULL COMMENT 'no time! see restorecaches.php',
`name` varchar(255) NOT NULL,
`type` tinyint(3) unsigned NOT NULL,
`date_hidden` date NOT NULL,
`size` tinyint(3) unsigned NOT NULL,
`difficulty` tinyint(3) unsigned NOT NULL,
`terrain` tinyint(3) unsigned NOT NULL,
`search_time` float unsigned NOT NULL default '0',
`way_length` float unsigned NOT NULL default '0',
`wp_gc` varchar(7) NOT NULL,
`wp_nc` varchar(6) NOT NULL,
UNIQUE KEY `cache_id` (`cache_id`,`date_modified`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
+8
View File
@@ -0,0 +1,8 @@
SET NAMES 'utf8';
DROP TABLE IF EXISTS `helppages`;
CREATE TABLE `helppages` (
`ocpage` varchar(60) NOT NULL,
`language` char(2) NOT NULL,
`helppage` varchar(120) NOT NULL,
UNIQUE KEY `ocpage` (`ocpage`,`language`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
@@ -0,0 +1,8 @@
SET NAMES 'utf8';
DROP TABLE IF EXISTS `listing_restored`;
CREATE TABLE `listing_restored` (
`cache_id` int(10) NOT NULL,
`date_modified` date NOT NULL,
`admin_id` int(10) NOT NULL,
UNIQUE KEY `cache_id` (`cache_id`,`date_modified`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
@@ -0,0 +1,18 @@
SET NAMES 'utf8';
DROP TABLE IF EXISTS `pictures_modified`;
CREATE TABLE `pictures_modified` (
`id` int(10) NOT NULL,
`date_modified` datetime NOT NULL COMMENT 'no time! see restorecaches.php',
`operation` char(1) NOT NULL,
`date_created` datetime NOT NULL,
`url` varchar(255) NOT NULL,
`title` varchar(250) NOT NULL,
`object_id` int(10) unsigned NOT NULL default '0',
`object_type` tinyint(3) unsigned NOT NULL default '0',
`spoiler` tinyint(1) NOT NULL default '0',
`unknown_format` tinyint(1) NOT NULL default '0',
`display` tinyint(1) NOT NULL default '1',
`original_id` int(10) NOT NULL,
UNIQUE KEY `id` (`id`,`operation`),
KEY `object_type` (`object_type`,`object_id`,`date_modified`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
@@ -9,5 +9,6 @@ CREATE TABLE `profile_options` (
`check_regex` varchar(255) default NULL,
`option_order` int(11) NOT NULL default '100',
`option_input` varchar(20) NOT NULL default 'text',
`optionset` tinyint(2) NOT NULL default '1',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='static content' ;
+9 -6
View File
@@ -453,18 +453,21 @@ function getWaypoints($cacheid)
// do not use slave server for the next time ...
db_slave_exclude();
// delete old cache-attributes
sql("DELETE FROM `caches_attributes` WHERE `cache_id`='&1'", $cache_id);
// insert new cache-attributes
for($i=0; $i<count($cache_attribs); $i++)
// update cache attributes
$attriblist = "999";
for ($i=0; $i<count($cache_attribs); $i++)
{
if(($cache_attribs[$i]+0) > 0)
if ($cache_attribs[$i]+0 > 0)
{
sql("INSERT IGNORE INTO `caches_attributes` (`cache_id`, `attrib_id`) VALUES('&1', '&2')", $cache_id, $cache_attribs[$i]+0);
$attriblist .= "," . ($cache_attribs[$i]+0);
}
}
sql("DELETE FROM `caches_attributes` WHERE `cache_id`='&1' AND `attrib_id` NOT IN (" . $attriblist . ")",
// SQL injections in $attriblist prevented by adding 0 above
$cache_id);
//call eventhandler
require_once($opt['rootpath'] . 'lib/eventhandler.inc.php');
event_edit_cache($cache_id, $usr['userid']+0);
+1 -1
View File
@@ -119,7 +119,7 @@
if ($commit == 1)
{
// move to archive
sql("INSERT INTO `cache_logs_archived` SELECT * FROM `cache_logs` WHERE `cache_logs`.`id`='&1' LIMIT 1", $log_id);
sql("INSERT IGNORE INTO `cache_logs_archived` SELECT *, NOW() AS `deletion_date`, '&2' AS `deleted_by` FROM `cache_logs` WHERE `cache_logs`.`id`='&1' LIMIT 1", $log_id, $usr['userid']);
//log entfernen
sql("DELETE FROM `cache_logs` WHERE `cache_logs`.`id`='&1' LIMIT 1", $log_id);