Merge branch 'master' of github.com:shish/shimmie2

This commit is contained in:
Shish 2012-03-13 06:11:25 +00:00
commit b12872d75e
2 changed files with 133 additions and 132 deletions

View File

@ -20,39 +20,7 @@ class Tag_History extends Extension {
} }
public function onAdminBuilding(AdminBuildingEvent $event) { public function onAdminBuilding(AdminBuildingEvent $event) {
global $user; $this->theme->display_admin_block();
if(isset($_POST['revert_ip']) && $user->is_admin() && $user->check_auth_token()) {
$revert_ip = filter_var($_POST['revert_ip'], FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE);
if ($revert_ip === false) {
// invalid ip given.
$this->theme->display_admin_block('Invalid IP');
return;
}
if (isset($_POST['revert_date']) && !empty($_POST['revert_date'])) {
if (isValidDate($_POST['revert_date'])){
$revert_date = addslashes($_POST['revert_date']); // addslashes is really unnecessary since we just checked if valid, but better safe.
} else {
$this->theme->display_admin_block('Invalid Date');
return;
}
}
else {
$revert_date = null;
}
set_time_limit(0); // reverting changes can take a long time, disable php's timelimit if possible.
// Call the revert function.
$this->process_revert_all_changes_by_ip($revert_ip, $revert_date);
// output results
$this->theme->display_revert_ip_results();
}
else {
$this->theme->display_admin_block(); // add a block to the admin panel
}
} }
public function onPageRequest(PageRequestEvent $event) { public function onPageRequest(PageRequestEvent $event) {
@ -66,6 +34,11 @@ class Tag_History extends Extension {
} }
} }
} }
else if($event->page_matches("tag_history/bulk_revert")) {
if($user->is_admin() && $user->check_auth_token()) {
$this->process_bulk_revert_request();
}
}
else if($event->page_matches("tag_history/all")) { else if($event->page_matches("tag_history/all")) {
$page_id = int_escape($event->get_arg(0)); $page_id = int_escape($event->get_arg(0));
$this->theme->display_global_page($page, $this->get_global_tag_history($page_id), $page_id); $this->theme->display_global_page($page, $this->get_global_tag_history($page_id), $page_id);
@ -138,26 +111,22 @@ class Tag_History extends Extension {
/* /*
* this function is called when a revert request is received * this function is called when a revert request is received
*/ */
private function process_revert_request($revert_id) private function process_revert_request($revert_id) {
{
global $page; global $page;
$revert_id = int_escape($revert_id);
// check for the nothing case // check for the nothing case
if(empty($revert_id) || $revert_id=="nothing") if($revert_id < 1) {
{
// tried to set it too the same thing so ignore it (might be a bot)
// go back to the index page with you
$page->set_mode("redirect"); $page->set_mode("redirect");
$page->set_redirect(make_link()); $page->set_redirect(make_link());
return; return;
} }
$revert_id = int_escape($revert_id);
// lets get this revert id assuming it exists // lets get this revert id assuming it exists
$result = $this->get_tag_history_from_revert($revert_id); $result = $this->get_tag_history_from_revert($revert_id);
if(empty($result)) if(empty($result)) {
{
// there is no history entry with that id so either the image was deleted // there is no history entry with that id so either the image was deleted
// while the user was viewing the history, someone is playing with form // while the user was viewing the history, someone is playing with form
// variables or we have messed up in code somewhere. // variables or we have messed up in code somewhere.
@ -179,38 +148,49 @@ class Tag_History extends Extension {
$page->set_redirect(make_link('post/view/'.$stored_image_id)); $page->set_redirect(make_link('post/view/'.$stored_image_id));
} }
/* protected function process_bulk_revert_request() {
* This function is used by process_revert_all_changes_by_ip() if (isset($_POST['revert_name']) && !empty($_POST['revert_name'])) {
* to just revert an image's tag history. $revert_name = $_POST['revert_ip'];
*/ }
private function process_revert_request_only(/*int*/ $revert_id) else {
{ $revert_name = null;
if(empty($revert_id)) { }
if (isset($_POST['revert_ip']) && !empty($_POST['revert_ip'])) {
$revert_ip = filter_var($_POST['revert_ip'], FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE);
if ($revert_ip === false) {
// invalid ip given.
$this->theme->display_admin_block('Invalid IP');
return; return;
} }
$id = (int) $revert_id; }
$result = $this->get_tag_history_from_revert($id); else {
$revert_ip = null;
if(empty($result)) {
// there is no history entry with that id so either the image was deleted
// while the user was viewing the history, or something messed up
/* calling die() is probably not a good idea, we should throw an Exception */
die('Error: No tag history with specified id ('.$id.') was found in the database.'."\n\n".
'Perhaps the image was deleted while processing this request.');
} }
// lets get the values out of the result if (isset($_POST['revert_date']) && !empty($_POST['revert_date'])) {
$stored_result_id = $result['id']; if (isValidDate($_POST['revert_date']) ){
$stored_image_id = $result['image_id']; $revert_date = addslashes($_POST['revert_date']); // addslashes is really unnecessary since we just checked if valid, but better safe.
$stored_tags = $result['tags']; }
else {
log_debug("tag_history", 'Reverting tags of Image #'.$stored_image_id.' to ['.$stored_tags.']'); $this->theme->display_admin_block('Invalid Date');
// all should be ok so we can revert by firing the SetUserTags event. return;
send_event(new TagSetEvent(Image::by_id($stored_image_id), $stored_tags)); }
}
else {
$revert_date = null;
} }
public function get_tag_history_from_revert(/*int*/ $revert_id) set_time_limit(0); // reverting changes can take a long time, disable php's timelimit if possible.
{
// Call the revert function.
$this->process_revert_all_changes($revert_name, $revert_ip, $revert_date);
// output results
$this->theme->display_revert_ip_results();
}
public function get_tag_history_from_revert(/*int*/ $revert_id) {
global $database; global $database;
$row = $database->get_row(" $row = $database->get_row("
SELECT tag_histories.*, users.name SELECT tag_histories.*, users.name
@ -220,8 +200,7 @@ class Tag_History extends Extension {
return ($row ? $row : null); return ($row ? $row : null);
} }
public function get_tag_history_from_id(/*int*/ $image_id) public function get_tag_history_from_id(/*int*/ $image_id) {
{
global $database; global $database;
$row = $database->get_all(" $row = $database->get_all("
SELECT tag_histories.*, users.name SELECT tag_histories.*, users.name
@ -233,8 +212,7 @@ class Tag_History extends Extension {
return ($row ? $row : array()); return ($row ? $row : array());
} }
public function get_global_tag_history($page_id) public function get_global_tag_history($page_id) {
{
global $database; global $database;
$row = $database->get_all(" $row = $database->get_all("
SELECT tag_histories.*, users.name SELECT tag_histories.*, users.name
@ -246,73 +224,97 @@ class Tag_History extends Extension {
return ($row ? $row : array()); return ($row ? $row : array());
} }
/* This doesn't actually get _ALL_ IPs as it limits to 1000. */
public function get_all_user_ips()
{
global $database;
$row = $database->get_all("
SELECT DISTINCT user_ip
FROM tag_histories
ORDER BY tag_histories.user_ip DESC
LIMIT 1000");
return ($row ? $row : array());
}
/* /*
* This function attempts to revert all changes by a given IP within an (optional) timeframe. * This function attempts to revert all changes by a given IP within an (optional) timeframe.
*/ */
public function process_revert_all_changes_by_ip($ip, $date=null) public function process_revert_all_changes($name, $ip, $date) {
{
global $database; global $database;
$date_select = '';
if (!empty($date)) { $select_code = array();
$date_select = 'and date_set >= '.$date; $select_args = array();
} else {
$date = 'forever'; if(!is_null($name)) {
$duser = User::by_name($name);
if(is_null($duser)) {
return;
}
else {
$select_code[] = 'user_id = ?';
$select_args[] = $duser->id;
}
} }
log_info("tag_history", 'Attempting to revert edits by ip='.$ip.' (from '.$date.' to now).'); if(!is_null($date)) {
$select_code[] = 'date_set >= ?';
$select_args[] = $date;
}
if(!is_null($ip)) {
$select_code[] = 'user_ip = ?';
$select_args[] = $ip;
}
if(count($select_code) == 0) {
return;
}
log_info("tag_history", 'Attempting to revert edits where '.implode(" and ", $select_code)." / ".implode(" and ", $select_args));
// Get all the images that the given IP has changed tags on (within the timeframe) that were last editied by the given IP // Get all the images that the given IP has changed tags on (within the timeframe) that were last editied by the given IP
$result = $database->get_all(' $result = $database->get_col('
SELECT t1.image_id FROM tag_histories t1 LEFT JOIN tag_histories t2 SELECT t1.image_id
ON (t1.image_id = t2.image_id AND t1.date_set < t2.date_set) FROM tag_histories t1
WHERE t2.image_id IS NULL AND t1.user_ip="'.$ip.'" AND t1.image_id IN LEFT JOIN tag_histories t2 ON (t1.image_id = t2.image_id AND t1.date_set < t2.date_set)
( select image_id from `tag_histories` where user_ip="'.$ip.'" '.$date_select.') WHERE t2.image_id IS NULL
ORDER BY t1.image_id;'); AND t1.image_id IN ( select image_id from tag_histories where '.implode(" AND ", $select_code).')
ORDER BY t1.image_id
if (empty($result)) { ', $select_args);
log_info("tag_history", 'Nothing to revert! for ip='.$ip.' (from '.$date.' to now).');
$this->theme->add_status('Nothing to Revert','Nothing to revert for ip='.$ip.' (from '.$date.' to now)');
return; // nothing to do.
}
for ($i = 0 ; $i < count($result) ; $i++)
{
$image_id = (int) $result[$i]['image_id'];
foreach($result as $image_id) {
// Get the first tag history that was done before the given IP edit // Get the first tag history that was done before the given IP edit
$row = $database->get_row(' $row = $database->get_row('
SELECT id,tags FROM `tag_histories` WHERE image_id="'.$image_id.'" AND user_ip!="'.$ip.'" '.$date_select.' ORDER BY date_set DESC LIMIT 1'); SELECT id, tags
FROM tag_histories
WHERE image_id='.$image_id.'
AND NOT ('.implode(" AND ", $select_code).')
ORDER BY date_set DESC LIMIT 1
', $select_args);
if (empty($row)) { if (empty($row)) {
// we can not revert this image based on the date restriction. // we can not revert this image based on the date restriction.
// Output a message perhaps? // Output a message perhaps?
} else { }
$id = (int) $row['id']; else {
$this->process_revert_request_only($id); $revert_id = $row['id'];
$result = $this->get_tag_history_from_revert($revert_id);
if(empty($result)) {
// there is no history entry with that id so either the image was deleted
// while the user was viewing the history, or something messed up
/* calling die() is probably not a good idea, we should throw an Exception */
die('Error: No tag history with specified id ('.$revert_id.') was found in the database.'."\n\n".
'Perhaps the image was deleted while processing this request.');
}
// lets get the values out of the result
$stored_result_id = $result['id'];
$stored_image_id = $result['image_id'];
$stored_tags = $result['tags'];
log_debug("tag_history", 'Reverting tags of Image #'.$stored_image_id.' to ['.$stored_tags.']');
// all should be ok so we can revert by firing the SetTags event.
send_event(new TagSetEvent(Image::by_id($stored_image_id), $stored_tags));
$this->theme->add_status('Reverted Change','Reverted Image #'.$image_id.' to Tag History #'.$id.' ('.$row['tags'].')'); $this->theme->add_status('Reverted Change','Reverted Image #'.$image_id.' to Tag History #'.$id.' ('.$row['tags'].')');
} }
} }
log_info("tag_history", 'Reverted '.count($result).' edits by ip='.$ip.' (from '.$date.' to now).');
log_info("tag_history", 'Reverted '.count($result).' edits.');
} }
/* /*
* this function is called just before an images tag are changed * this function is called just before an images tag are changed
*/ */
private function add_tag_history($image, $tags) private function add_tag_history($image, $tags) {
{
global $database, $config, $user; global $database, $config, $user;
$new_tags = Tag::implode($tags); $new_tags = Tag::implode($tags);
@ -323,7 +325,8 @@ class Tag_History extends Extension {
if(empty($old_tags)) { if(empty($old_tags)) {
/* no old tags, so we are probably adding the image for the first time */ /* no old tags, so we are probably adding the image for the first time */
log_debug("tag_history", "adding new tag history: [$new_tags]"); log_debug("tag_history", "adding new tag history: [$new_tags]");
} else { }
else {
log_debug("tag_history", "adding tag history: [$old_tags] -> [$new_tags]"); log_debug("tag_history", "adding tag history: [$old_tags] -> [$new_tags]");
} }
@ -333,12 +336,10 @@ class Tag_History extends Extension {
// if the image has no history, make one with the old tags // if the image has no history, make one with the old tags
$entries = $database->get_one("SELECT COUNT(*) FROM tag_histories WHERE image_id = ?", array($image->id)); $entries = $database->get_one("SELECT COUNT(*) FROM tag_histories WHERE image_id = ?", array($image->id));
if($entries == 0 && !empty($old_tags)) { if($entries == 0 && !empty($old_tags)) {
/* We have no tag history for this image, so we will use the old_tags as the starting tags for this image. */
/* these two queries could probably be combined */
$database->execute(" $database->execute("
INSERT INTO tag_histories(image_id, tags, user_id, user_ip, date_set) INSERT INTO tag_histories(image_id, tags, user_id, user_ip, date_set)
VALUES (?, ?, ?, ?, now())", VALUES (?, ?, ?, ?, now())",
array($image->id, $old_tags, 1, '127.0.0.1')); // TODO: Pick appropriate user id array($image->id, $old_tags, $config->get_int('anon_id'), '127.0.0.1'));
$entries++; $entries++;
} }
@ -351,8 +352,7 @@ class Tag_History extends Extension {
// if needed remove oldest one // if needed remove oldest one
if($allowed == -1) return; if($allowed == -1) return;
if($entries > $allowed) if($entries > $allowed) {
{
// TODO: Make these queries better // TODO: Make these queries better
/* /*
MySQL does NOT allow you to modify the same table which you use in the SELECT part. MySQL does NOT allow you to modify the same table which you use in the SELECT part.

View File

@ -113,11 +113,12 @@ class Tag_HistoryTheme extends Themelet {
<br>(Date format: 2011-10-23) <br>(Date format: 2011-10-23)
'.$validation_msg.' '.$validation_msg.'
<br><br>'.make_form(make_link("admin/revert_ip"),'POST',false,'revert_ip_form')." <br><br>'.make_form(make_link("admin/bulk_revert"),'POST',false,'revert_ip_form')."
IP Address: <input type='text' id='revert_ip' name='revert_ip' size='15'><br> Username: <input type='text' name='revert_name' size='15'><br>
Date range: <input type='text' id='revert_date' name='revert_date' size='15'><br><br> IP Address: <input type='text' name='revert_ip' size='15'><br>
Date range: <input type='text' name='revert_date' size='15'><br><br>
<input type='submit' value='Revert' onclick='return confirm(\"Revert all edits by this IP?\");'> <input type='submit' value='Revert' onclick='return confirm(\"Revert all edits by this IP?\");'>
</form><br> </form>
"; ";
$page->add_block(new Block("Revert By IP", $html)); $page->add_block(new Block("Revert By IP", $html));
} }