Merge branch 'master' of github.com:shish/shimmie2
This commit is contained in:
commit
b12872d75e
@ -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.
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user