Merge pull request #523 from DakuTree/patch-tagevent
Move tag sanitization, alias resolving & tag parsing from set_tags > TagSetEvent
This commit is contained in:
		
						commit
						ac9dc1b8d8
					
				| @ -576,9 +576,6 @@ class Image { | |||||||
| 		assert('is_array($tags) && count($tags) > 0', var_export($tags, true)); | 		assert('is_array($tags) && count($tags) > 0', var_export($tags, true)); | ||||||
| 		global $database; | 		global $database; | ||||||
| 
 | 
 | ||||||
| 		$tags = array_map(array('Tag', 'sanitise'), $tags); |  | ||||||
| 		$tags = Tag::resolve_aliases($tags); |  | ||||||
| 
 |  | ||||||
| 		if(count($tags) <= 0) { | 		if(count($tags) <= 0) { | ||||||
| 			throw new SCoreException('Tried to set zero tags'); | 			throw new SCoreException('Tried to set zero tags'); | ||||||
| 		} | 		} | ||||||
| @ -588,12 +585,6 @@ class Image { | |||||||
| 			$this->delete_tags_from_image(); | 			$this->delete_tags_from_image(); | ||||||
| 			// insert each new tags
 | 			// insert each new tags
 | ||||||
| 			foreach($tags as $tag) { | 			foreach($tags as $tag) { | ||||||
| 				$ttpe = new TagTermParseEvent($tag, $this->id); |  | ||||||
| 				send_event($ttpe); |  | ||||||
| 				if($ttpe->is_metatag()) { |  | ||||||
| 					continue; |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				if(mb_strlen($tag, 'UTF-8') > 255){ | 				if(mb_strlen($tag, 'UTF-8') > 255){ | ||||||
| 					flash_message("The tag below is longer than 255 characters, please use a shorter tag.\n$tag\n"); | 					flash_message("The tag below is longer than 255 characters, please use a shorter tag.\n$tag\n"); | ||||||
| 					continue; | 					continue; | ||||||
| @ -632,6 +623,19 @@ class Image { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Send list of metatags to be parsed. | ||||||
|  | 	 * | ||||||
|  | 	 * @param [] $metatags | ||||||
|  | 	 * @param int $image_id | ||||||
|  | 	 */ | ||||||
|  | 	public function parse_metatags($metatags, $image_id) { | ||||||
|  | 		foreach($metatags as $tag) { | ||||||
|  | 			$ttpe = new TagTermParseEvent($tag, $image_id, TRUE); | ||||||
|  | 			send_event($ttpe); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * Delete this image from the database and disk | 	 * Delete this image from the database and disk | ||||||
| 	 */ | 	 */ | ||||||
| @ -1156,6 +1160,8 @@ class Tag { | |||||||
| 			$tag_array = array("tagme"); | 			$tag_array = array("tagme"); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		$tag_array = array_iunique($tag_array); //remove duplicate tags
 | ||||||
|  | 
 | ||||||
| 		sort($tag_array); | 		sort($tag_array); | ||||||
| 
 | 
 | ||||||
| 		return $tag_array; | 		return $tag_array; | ||||||
| @ -1254,7 +1260,7 @@ class Tag { | |||||||
| 		$i = 0; | 		$i = 0; | ||||||
| 		$tag_count = count($tags); | 		$tag_count = count($tags); | ||||||
| 		while($i<$tag_count) { | 		while($i<$tag_count) { | ||||||
| 			$aliases = explode(' ', Tag::resolve_alias($tags[$i])); | 			$aliases = Tag::explode(Tag::resolve_alias($tags[$i]), FALSE); | ||||||
| 			foreach($aliases as $alias){ | 			foreach($aliases as $alias){ | ||||||
| 				if(!in_array($alias, $new)){ | 				if(!in_array($alias, $new)){ | ||||||
| 					if($tags[$i] == $alias){ | 					if($tags[$i] == $alias){ | ||||||
|  | |||||||
| @ -247,9 +247,9 @@ class NumericScore extends Extension { | |||||||
| 				"images.id in (SELECT image_id FROM numeric_score_votes WHERE user_id=:ns_user_id AND score=-1)", | 				"images.id in (SELECT image_id FROM numeric_score_votes WHERE user_id=:ns_user_id AND score=-1)", | ||||||
| 				array("ns_user_id"=>$iid))); | 				array("ns_user_id"=>$iid))); | ||||||
| 		} | 		} | ||||||
| 		else if(preg_match("/^order[=|:](numeric_)?(score)[_]?(desc|asc)?$/i", $event->term, $matches)){ | 		else if(preg_match("/^order[=|:](?:numeric_)?(score)(?:_(desc|asc))?$/i", $event->term, $matches)){ | ||||||
| 			$default_order_for_column = "DESC"; | 			$default_order_for_column = "DESC"; | ||||||
| 			$sort = isset($matches[3]) ? strtoupper($matches[3]) : $default_order_for_column; | 			$sort = isset($matches[2]) ? strtoupper($matches[2]) : $default_order_for_column; | ||||||
| 			Image::$order_sql = "images.numeric_score $sort"; | 			Image::$order_sql = "images.numeric_score $sort"; | ||||||
| 			$event->add_querylet(new Querylet("1=1")); //small hack to avoid metatag being treated as normal tag
 | 			$event->add_querylet(new Querylet("1=1")); //small hack to avoid metatag being treated as normal tag
 | ||||||
| 		} | 		} | ||||||
| @ -258,7 +258,7 @@ class NumericScore extends Extension { | |||||||
| 	public function onTagTermParse(TagTermParseEvent $event) { | 	public function onTagTermParse(TagTermParseEvent $event) { | ||||||
| 		$matches = array(); | 		$matches = array(); | ||||||
| 
 | 
 | ||||||
| 		if(preg_match("/^vote[=|:](up|down|remove)$/", $event->term, $matches)) { | 		if(preg_match("/^vote[=|:](up|down|remove)$/", $event->term, $matches) && $event->parse) { | ||||||
| 			global $user; | 			global $user; | ||||||
| 			$score = ($matches[1] == "up" ? 1 : ($matches[1] == "down" ? -1 : 0)); | 			$score = ($matches[1] == "up" ? 1 : ($matches[1] == "down" ? -1 : 0)); | ||||||
| 			if(!$user->is_anonymous()) { | 			if(!$user->is_anonymous()) { | ||||||
|  | |||||||
| @ -58,7 +58,7 @@ class Relationships extends Extension { | |||||||
| 	public function onTagTermParse(TagTermParseEvent $event) { | 	public function onTagTermParse(TagTermParseEvent $event) { | ||||||
| 		$matches = array(); | 		$matches = array(); | ||||||
| 
 | 
 | ||||||
| 		if(preg_match("/^parent[=|:]([0-9]+|none)$/", $event->term, $matches)) { | 		if(preg_match("/^parent[=|:]([0-9]+|none)$/", $event->term, $matches) && $event->parse) { | ||||||
| 			$parentID = $matches[1]; | 			$parentID = $matches[1]; | ||||||
| 
 | 
 | ||||||
| 			if($parentID == "none" || $parentID == "0"){ | 			if($parentID == "none" || $parentID == "0"){ | ||||||
| @ -67,7 +67,7 @@ class Relationships extends Extension { | |||||||
| 				$this->set_parent($event->id, $parentID); | 				$this->set_parent($event->id, $parentID); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		else if(preg_match("/^child[=|:]([0-9]+)$/", $event->term, $matches)) { | 		else if(preg_match("/^child[=|:]([0-9]+)$/", $event->term, $matches) && $event->parse) { | ||||||
| 			$childID = $matches[1]; | 			$childID = $matches[1]; | ||||||
| 
 | 
 | ||||||
| 			$this->set_child($event->id, $childID); | 			$this->set_child($event->id, $childID); | ||||||
|  | |||||||
| @ -95,11 +95,38 @@ class SourceSetEvent extends Event { | |||||||
| class TagSetEvent extends Event { | class TagSetEvent extends Event { | ||||||
| 	/** @var \Image */ | 	/** @var \Image */ | ||||||
| 	public $image; | 	public $image; | ||||||
| 	var $tags; | 	public $tags; | ||||||
|  | 	public $metatags; | ||||||
| 
 | 
 | ||||||
| 	public function __construct(Image $image, $tags) { | 	public function __construct(Image $image, $tags) { | ||||||
| 		$this->image = $image; | 		$this->image    = $image; | ||||||
| 		$this->tags = Tag::explode($tags); | 
 | ||||||
|  | 		$this->tags     = array(); | ||||||
|  | 		$this->metatags = array(); | ||||||
|  | 
 | ||||||
|  | 		//tags need to be sanitised, alias checked & have metatags removed before being passed to onTagSet
 | ||||||
|  | 		$tag_array = Tag::explode($tags); | ||||||
|  | 		$tag_array = array_map(array('Tag', 'sanitise'), $tag_array); | ||||||
|  | 		$tag_array = Tag::resolve_aliases($tag_array); | ||||||
|  | 
 | ||||||
|  | 		foreach($tag_array as $tag) { | ||||||
|  | 			if((strpos($tag, ':') === FALSE) && (strpos($tag, '=') === FALSE)) { | ||||||
|  | 				//Tag doesn't contain : or =, meaning it can't possibly be a metatag.
 | ||||||
|  | 				//This should help speed wise, as it avoids running every single tag through a bunch of preg_match instead.
 | ||||||
|  | 				array_push($this->tags, $tag); | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			$ttpe = new TagTermParseEvent($tag, $this->image->id, FALSE); //Only check for metatags, don't parse. Parsing is done after set_tags.
 | ||||||
|  | 			send_event($ttpe); | ||||||
|  | 
 | ||||||
|  | 			//seperate tags from metatags
 | ||||||
|  | 			if(!$ttpe->is_metatag()) { | ||||||
|  | 				array_push($this->tags, $tag); | ||||||
|  | 			}else{ | ||||||
|  | 				array_push($this->metatags, $tag); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -131,14 +158,17 @@ class LockSetEvent extends Event { | |||||||
|  * Signal that a tag term needs parsing |  * Signal that a tag term needs parsing | ||||||
|  */ |  */ | ||||||
| class TagTermParseEvent extends Event { | class TagTermParseEvent extends Event { | ||||||
| 	var $term = null; | 	public $term = NULL; //tag
 | ||||||
| 	var $id = null; | 	public $id   = NULL; //image_id
 | ||||||
| 	/** @var bool */ | 	/** @var bool */ | ||||||
| 	public $metatag = false; | 	public $metatag = FALSE; | ||||||
|  | 	/** @var bool */ | ||||||
|  | 	public $parse  = TRUE; //marks the tag to be parsed, and not just checked if valid metatag
 | ||||||
| 
 | 
 | ||||||
| 	public function __construct($term, $id) { | 	public function __construct($term, $id, $parse) { | ||||||
| 		$this->term = $term; | 		$this->term  = $term; | ||||||
| 		$this->id = $id; | 		$this->id    = $id; | ||||||
|  | 		$this->parse = $parse; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
| @ -215,6 +245,7 @@ class TagEdit extends Extension { | |||||||
| 		if($user->can("edit_image_tag") && (!$event->image->is_locked() || $user->can("edit_image_lock"))) { | 		if($user->can("edit_image_tag") && (!$event->image->is_locked() || $user->can("edit_image_lock"))) { | ||||||
| 			$event->image->set_tags($event->tags); | 			$event->image->set_tags($event->tags); | ||||||
| 		} | 		} | ||||||
|  | 		$event->image->parse_metatags($event->metatags, $event->image->id); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public function onSourceSet(SourceSetEvent $event) { | 	public function onSourceSet(SourceSetEvent $event) { | ||||||
| @ -257,7 +288,7 @@ class TagEdit extends Extension { | |||||||
| 	public function onTagTermParse(TagTermParseEvent $event) { | 	public function onTagTermParse(TagTermParseEvent $event) { | ||||||
| 		$matches = array(); | 		$matches = array(); | ||||||
| 
 | 
 | ||||||
| 		if(preg_match("/^source[=|:](.*)$/i", $event->term, $matches)) { | 		if(preg_match("/^source[=|:](.*)$/i", $event->term, $matches) && $event->parse) { | ||||||
| 			$source = ($matches[1] !== "none" ? $matches[1] : null); | 			$source = ($matches[1] !== "none" ? $matches[1] : null); | ||||||
| 			send_event(new SourceSetEvent(Image::by_id($event->id), $source)); | 			send_event(new SourceSetEvent(Image::by_id($event->id), $source)); | ||||||
| 		} | 		} | ||||||
|  | |||||||
| @ -313,8 +313,8 @@ class UserPage extends Extension { | |||||||
| 		global $user; | 		global $user; | ||||||
| 
 | 
 | ||||||
| 		$matches = array(); | 		$matches = array(); | ||||||
| 		if(preg_match("/^(poster|user)[=|:](.*)$/i", $event->term, $matches)) { | 		if(preg_match("/^(?:poster|user)[=|:](.*)$/i", $event->term, $matches)) { | ||||||
| 			$duser = User::by_name($matches[2]); | 			$duser = User::by_name($matches[1]); | ||||||
| 			if(!is_null($duser)) { | 			if(!is_null($duser)) { | ||||||
| 				$user_id = $duser->id; | 				$user_id = $duser->id; | ||||||
| 			} | 			} | ||||||
| @ -323,12 +323,12 @@ class UserPage extends Extension { | |||||||
| 			} | 			} | ||||||
| 			$event->add_querylet(new Querylet("images.owner_id = $user_id")); | 			$event->add_querylet(new Querylet("images.owner_id = $user_id")); | ||||||
| 		} | 		} | ||||||
| 		else if(preg_match("/^(poster|user)_id[=|:]([0-9]+)$/i", $event->term, $matches)) { | 		else if(preg_match("/^(?:poster|user)_id[=|:]([0-9]+)$/i", $event->term, $matches)) { | ||||||
| 			$user_id = int_escape($matches[2]); | 			$user_id = int_escape($matches[1]); | ||||||
| 			$event->add_querylet(new Querylet("images.owner_id = $user_id")); | 			$event->add_querylet(new Querylet("images.owner_id = $user_id")); | ||||||
| 		} | 		} | ||||||
| 		else if($user->can("view_ip") && preg_match("/^(poster|user)_ip[=|:]([0-9\.]+)$/i", $event->term, $matches)) { | 		else if($user->can("view_ip") && preg_match("/^(?:poster|user)_ip[=|:]([0-9\.]+)$/i", $event->term, $matches)) { | ||||||
| 			$user_ip = $matches[2]; // FIXME: ip_escape?
 | 			$user_ip = $matches[1]; // FIXME: ip_escape?
 | ||||||
| 			$event->add_querylet(new Querylet("images.owner_ip = '$user_ip'")); | 			$event->add_querylet(new Querylet("images.owner_ip = '$user_ip'")); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user