mirror of
https://github.com/kcozens/OpenSimSearch.git
synced 2026-08-14 08:52:28 +00:00
- Check that CURL returned data before trying to parse it.
- Check that XML has region data before trying to parse it. - Code clean ups (possible memory leak, removed dead code, de-tabified file). git-svn-id: http://forge.opensimulator.org/svn/ossearch/trunk@133 109abde3-1f22-4c10-b5d7-b6b0135cd00c
This commit is contained in:
+217
-213
@@ -27,284 +27,288 @@ function GetURL($host, $port, $url)
|
||||
curl_close($ch);
|
||||
return $data;
|
||||
}
|
||||
return "";
|
||||
|
||||
curl_close($ch);
|
||||
return "";
|
||||
}
|
||||
|
||||
function CheckHost($hostname, $port)
|
||||
{
|
||||
$fp = fsockopen ($hostname, $port, $errno, $errstr, 10);
|
||||
$fp = fsockopen ($hostname, $port, $errno, $errstr, 10);
|
||||
|
||||
if(!$fp)
|
||||
{
|
||||
$sql = "UPDATE hostsregister set failcounter = failcounter + 1 ".
|
||||
"where host = '" . mysql_escape_string($hostname) . "' AND " .
|
||||
"port = '" . mysql_escape_string($port) . "'";
|
||||
|
||||
$check = mysql_query($sql);
|
||||
if ($fp == False)
|
||||
{
|
||||
$sql = "UPDATE hostsregister set failcounter = failcounter + 1 ".
|
||||
"where host = '" . mysql_escape_string($hostname) . "' AND " .
|
||||
"port = '" . mysql_escape_string($port) . "'";
|
||||
|
||||
$check = mysql_query($sql);
|
||||
|
||||
//Setting a "fake" update time so this host will have time
|
||||
//to get back online
|
||||
//Setting a "fake" update time so this host will have time
|
||||
//to get back online
|
||||
|
||||
$next = time() + 600; // 5 mins, so we don't get stuck
|
||||
$next = time() + 600; // 10 mins, so we don't get stuck
|
||||
|
||||
$updater = mysql_query("UPDATE hostsregister set lastcheck = $next " .
|
||||
"where host = '" . mysql_escape_string($hostname) . "' AND " .
|
||||
"port = '" . mysql_escape_string($port) . "'");
|
||||
}
|
||||
else
|
||||
{
|
||||
$sql = "UPDATE hostsregister set failcounter = 0 ".
|
||||
"where host = '" . mysql_escape_string($hostname) . "' AND " .
|
||||
"port = '" . mysql_escape_string($port) . "'";
|
||||
|
||||
$check = mysql_query($sql);
|
||||
$updater = mysql_query("UPDATE hostsregister set lastcheck = $next " .
|
||||
"where host = '" . mysql_escape_string($hostname) . "' AND " .
|
||||
"port = '" . mysql_escape_string($port) . "'");
|
||||
}
|
||||
else
|
||||
{
|
||||
$sql = "UPDATE hostsregister set failcounter = 0 ".
|
||||
"where host = '" . mysql_escape_string($hostname) . "' AND " .
|
||||
"port = '" . mysql_escape_string($port) . "'";
|
||||
|
||||
$check = mysql_query($sql);
|
||||
|
||||
parse($hostname, $port);
|
||||
}
|
||||
parse($hostname, $port);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function parse($hostname, $port)
|
||||
{
|
||||
global $now;
|
||||
global $now;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Search engine sim scanner
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Search engine sim scanner
|
||||
//
|
||||
|
||||
//
|
||||
// Read params
|
||||
//
|
||||
if ($hostname != "" && $port != "")
|
||||
{
|
||||
$next = time() + 600; // 5 mins, so we don't get stuck
|
||||
//
|
||||
// Read params
|
||||
//
|
||||
$next = time() + 600; // 10 mins, so we don't get stuck
|
||||
|
||||
$updater = mysql_query("UPDATE hostsregister set lastcheck = $next " .
|
||||
"where host = '" . mysql_escape_string($hostname) . "' AND " .
|
||||
"port = '" . mysql_escape_string($port) . "'");
|
||||
$updater = mysql_query("UPDATE hostsregister set lastcheck = $next " .
|
||||
"where host = '" . mysql_escape_string($hostname) . "' AND " .
|
||||
"port = '" . mysql_escape_string($port) . "'");
|
||||
|
||||
//
|
||||
// Load XML doc from URL
|
||||
//
|
||||
$objDOM = new DOMDocument();
|
||||
$objDOM->resolveExternals = false;
|
||||
$objDOM->loadXML(GetURL($hostname, $port, "?method=collector"));
|
||||
//
|
||||
// Load XML doc from URL
|
||||
//
|
||||
$objDOM = new DOMDocument();
|
||||
$objDOM->resolveExternals = false;
|
||||
$xml = GetURL($hostname, $port, "?method=collector");
|
||||
if ($xml == "") //Was any data retrieved? (CURL may have timed out)
|
||||
return; //No, so there is nothing to parse
|
||||
|
||||
//
|
||||
// Grabbing the expire to update
|
||||
//
|
||||
$regiondata = $objDOM->getElementsByTagName("regiondata")->item(0);
|
||||
$expire = $regiondata->getElementsByTagName("expire")->item(0)->nodeValue;
|
||||
$objDOM->loadXML($xml);
|
||||
|
||||
//
|
||||
// Calculate new expire
|
||||
//
|
||||
$next = time() + $expire;
|
||||
//
|
||||
// Get the region data to update
|
||||
//
|
||||
$regiondata = $objDOM->getElementsByTagName("regiondata");
|
||||
|
||||
$updater = mysql_query("UPDATE hostsregister set lastcheck = $next " .
|
||||
"where host = '" . mysql_escape_string($hostname) . "' AND " .
|
||||
"port = '" . mysql_escape_string($port) . "'");
|
||||
//If returned length is 0, collector method may have returned an error
|
||||
if ($regiondata->length == 0)
|
||||
return;
|
||||
|
||||
$regionlist = $regiondata->getElementsByTagName("region");
|
||||
$regiondata = $regiondata->item(0);
|
||||
$expire = $regiondata->getElementsByTagName("expire")->item(0)->nodeValue;
|
||||
|
||||
foreach( $regionlist as $region )
|
||||
{
|
||||
$regioncategory = $region->getAttributeNode("category")->nodeValue;
|
||||
//
|
||||
// Calculate new expire
|
||||
//
|
||||
$next = time() + $expire;
|
||||
|
||||
//
|
||||
// Start reading the Region info
|
||||
//
|
||||
$info = $region->getElementsByTagName("info")->item(0);
|
||||
$updater = mysql_query("UPDATE hostsregister set lastcheck = $next " .
|
||||
"where host = '" . mysql_escape_string($hostname) . "' AND " .
|
||||
"port = '" . mysql_escape_string($port) . "'");
|
||||
|
||||
$regionuuid = $info->getElementsByTagName("uuid")->item(0)->nodeValue;
|
||||
$regionlist = $regiondata->getElementsByTagName("region");
|
||||
|
||||
$regionname = $info->getElementsByTagName("name")->item(0)->nodeValue;
|
||||
foreach( $regionlist as $region )
|
||||
{
|
||||
$regioncategory = $region->getAttributeNode("category")->nodeValue;
|
||||
|
||||
$regionhandle = $info->getElementsByTagName("handle")->item(0)->nodeValue;
|
||||
//
|
||||
// Start reading the Region info
|
||||
//
|
||||
$info = $region->getElementsByTagName("info")->item(0);
|
||||
|
||||
$url = $info->getElementsByTagName("url")->item(0)->nodeValue;
|
||||
$regionuuid = $info->getElementsByTagName("uuid")->item(0)->nodeValue;
|
||||
|
||||
//
|
||||
// First, check if we already have a region that is the same
|
||||
//
|
||||
$check = mysql_query("SELECT * FROM regions WHERE regionuuid = '" .
|
||||
mysql_escape_string($regionuuid) . "'");
|
||||
$regionname = $info->getElementsByTagName("name")->item(0)->nodeValue;
|
||||
|
||||
if (mysql_num_rows($check) > 0)
|
||||
{
|
||||
mysql_query("DELETE FROM regions WHERE regionuuid = '" .
|
||||
mysql_escape_string($regionuuid) . "'");
|
||||
mysql_query("DELETE FROM parcels WHERE regionuuid = '" .
|
||||
mysql_escape_string($regionuuid) . "'");
|
||||
mysql_query("DELETE FROM allparcels WHERE regionUUID = '" .
|
||||
mysql_escape_string($regionuuid) . "'");
|
||||
mysql_query("DELETE FROM parcelsales WHERE regionUUID = '" .
|
||||
mysql_escape_string($regionuuid) . "'");
|
||||
mysql_query("DELETE FROM objects WHERE regionuuid = '" .
|
||||
mysql_escape_string($regionuuid) . "'");
|
||||
}
|
||||
$regionhandle = $info->getElementsByTagName("handle")->item(0)->nodeValue;
|
||||
|
||||
$data = $region->getElementsByTagName("data")->item(0);
|
||||
$estate = $data->getElementsByTagName("estate")->item(0);
|
||||
$url = $info->getElementsByTagName("url")->item(0)->nodeValue;
|
||||
|
||||
$username = $estate->getElementsByTagName("name")->item(0)->nodeValue;
|
||||
$useruuid = $estate->getElementsByTagName("uuid")->item(0)->nodeValue;
|
||||
//
|
||||
// First, check if we already have a region that is the same
|
||||
//
|
||||
$check = mysql_query("SELECT * FROM regions WHERE regionuuid = '" .
|
||||
mysql_escape_string($regionuuid) . "'");
|
||||
|
||||
$estateid = $estate->getElementsByTagName("id")->item(0)->nodeValue;
|
||||
if (mysql_num_rows($check) > 0)
|
||||
{
|
||||
mysql_query("DELETE FROM regions WHERE regionuuid = '" .
|
||||
mysql_escape_string($regionuuid) . "'");
|
||||
mysql_query("DELETE FROM parcels WHERE regionuuid = '" .
|
||||
mysql_escape_string($regionuuid) . "'");
|
||||
mysql_query("DELETE FROM allparcels WHERE regionUUID = '" .
|
||||
mysql_escape_string($regionuuid) . "'");
|
||||
mysql_query("DELETE FROM parcelsales WHERE regionUUID = '" .
|
||||
mysql_escape_string($regionuuid) . "'");
|
||||
mysql_query("DELETE FROM objects WHERE regionuuid = '" .
|
||||
mysql_escape_string($regionuuid) . "'");
|
||||
}
|
||||
|
||||
//
|
||||
// Second, add the new info to the database
|
||||
//
|
||||
$sql = "INSERT INTO regions VALUES('" .
|
||||
mysql_escape_string($regionname) . "','" .
|
||||
mysql_escape_string($regionuuid) . "','" .
|
||||
mysql_escape_string($regionhandle) . "','" .
|
||||
mysql_escape_string($url) . "','" .
|
||||
mysql_escape_string($username) ."','" .
|
||||
mysql_escape_string($useruuid) ."')";
|
||||
$data = $region->getElementsByTagName("data")->item(0);
|
||||
$estate = $data->getElementsByTagName("estate")->item(0);
|
||||
|
||||
mysql_query($sql);
|
||||
$username = $estate->getElementsByTagName("name")->item(0)->nodeValue;
|
||||
$useruuid = $estate->getElementsByTagName("uuid")->item(0)->nodeValue;
|
||||
|
||||
//
|
||||
// Start reading the parcel info
|
||||
//
|
||||
$parcel = $data->getElementsByTagName("parcel");
|
||||
$estateid = $estate->getElementsByTagName("id")->item(0)->nodeValue;
|
||||
|
||||
foreach( $parcel as $value )
|
||||
{
|
||||
$parcelname = $value->getElementsByTagName("name")->item(0)->nodeValue;
|
||||
//
|
||||
// Second, add the new info to the database
|
||||
//
|
||||
$sql = "INSERT INTO regions VALUES('" .
|
||||
mysql_escape_string($regionname) . "','" .
|
||||
mysql_escape_string($regionuuid) . "','" .
|
||||
mysql_escape_string($regionhandle) . "','" .
|
||||
mysql_escape_string($url) . "','" .
|
||||
mysql_escape_string($username) ."','" .
|
||||
mysql_escape_string($useruuid) ."')";
|
||||
|
||||
$parceluuid = $value->getElementsByTagName("uuid")->item(0)->nodeValue;
|
||||
mysql_query($sql);
|
||||
|
||||
$infouuid = $value->getElementsByTagName("infouuid")->item(0)->nodeValue;
|
||||
//
|
||||
// Start reading the parcel info
|
||||
//
|
||||
$parcel = $data->getElementsByTagName("parcel");
|
||||
|
||||
$parcellanding = $value->getElementsByTagName("location")->item(0)->nodeValue;
|
||||
foreach( $parcel as $value )
|
||||
{
|
||||
$parcelname = $value->getElementsByTagName("name")->item(0)->nodeValue;
|
||||
|
||||
$parceldescription = $value->getElementsByTagName("description")->item(0)->nodeValue;
|
||||
$parceluuid = $value->getElementsByTagName("uuid")->item(0)->nodeValue;
|
||||
|
||||
$parcelarea = $value->getElementsByTagName("area")->item(0)->nodeValue;
|
||||
$infouuid = $value->getElementsByTagName("infouuid")->item(0)->nodeValue;
|
||||
|
||||
$parcelcategory = $value->getAttributeNode("category")->nodeValue;
|
||||
$parcellanding = $value->getElementsByTagName("location")->item(0)->nodeValue;
|
||||
|
||||
$parcelsaleprice = $value->getAttributeNode("salesprice")->nodeValue;
|
||||
$parceldescription = $value->getElementsByTagName("description")->item(0)->nodeValue;
|
||||
|
||||
$dwell = $value->getElementsByTagName("dwell")->item(0)->nodeValue;
|
||||
$parcelarea = $value->getElementsByTagName("area")->item(0)->nodeValue;
|
||||
|
||||
$owner = $value->getElementsByTagName("owner")->item(0);
|
||||
$parcelcategory = $value->getAttributeNode("category")->nodeValue;
|
||||
|
||||
$owneruuid = $owner->getElementsByTagName("uuid")->item(0)->nodeValue;
|
||||
$parcelsaleprice = $value->getAttributeNode("salesprice")->nodeValue;
|
||||
|
||||
// Adding support for groups
|
||||
$dwell = $value->getElementsByTagName("dwell")->item(0)->nodeValue;
|
||||
|
||||
$group = $value->getElementsByTagName("group")->item(0);
|
||||
|
||||
if ($group != "")
|
||||
{
|
||||
$groupuuid = $group->getElementsByTagName("groupuuid")->item(0)->nodeValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
$groupuuid = "00000000-0000-0000-0000-000000000000";
|
||||
}
|
||||
$owner = $value->getElementsByTagName("owner")->item(0);
|
||||
|
||||
//
|
||||
// Check bits on Public, Build, Script
|
||||
//
|
||||
$parcelforsale = $value->getAttributeNode("forsale")->nodeValue;
|
||||
$parceldirectory = $value->getAttributeNode("showinsearch")->nodeValue;
|
||||
$parcelbuild = $value->getAttributeNode("build")->nodeValue;
|
||||
$parcelscript = $value->getAttributeNode("scripts")->nodeValue;
|
||||
$parcelpublic = $value->getAttributeNode("public")->nodeValue;
|
||||
$owneruuid = $owner->getElementsByTagName("uuid")->item(0)->nodeValue;
|
||||
|
||||
//
|
||||
// Save
|
||||
//
|
||||
$sql = "INSERT INTO allparcels VALUES('" .
|
||||
mysql_escape_string($regionuuid) . "','" .
|
||||
mysql_escape_string($parcelname) . "','" .
|
||||
mysql_escape_string($owneruuid) . "','" .
|
||||
mysql_escape_string($groupuuid) . "','" .
|
||||
mysql_escape_string($parcellanding) . "','" .
|
||||
mysql_escape_string($parceluuid) . "','" .
|
||||
mysql_escape_string($infouuid) . "','" .
|
||||
mysql_escape_string($parcelarea) . "' )";
|
||||
// Adding support for groups
|
||||
|
||||
mysql_query($sql);
|
||||
$group = $value->getElementsByTagName("group")->item(0);
|
||||
|
||||
if ($group != "")
|
||||
{
|
||||
$groupuuid = $group->getElementsByTagName("groupuuid")->item(0)->nodeValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
$groupuuid = "00000000-0000-0000-0000-000000000000";
|
||||
}
|
||||
|
||||
if ($parceldirectory == "true")
|
||||
{
|
||||
$sql = "INSERT INTO parcels VALUES('" .
|
||||
mysql_escape_string($regionuuid) . "','" .
|
||||
mysql_escape_string($parcelname) . "','" .
|
||||
mysql_escape_string($parceluuid) . "','" .
|
||||
mysql_escape_string($parcellanding) . "','" .
|
||||
mysql_escape_string($parceldescription) . "','" .
|
||||
mysql_escape_string($parcelcategory) . "','" .
|
||||
mysql_escape_string($parcelbuild) . "','" .
|
||||
mysql_escape_string($parcelscript) . "','" .
|
||||
mysql_escape_string($parcelpublic) . "','".
|
||||
mysql_escape_string($dwell) . "','".
|
||||
mysql_escape_string($infouuid) . "' )";
|
||||
//
|
||||
// Check bits on Public, Build, Script
|
||||
//
|
||||
$parcelforsale = $value->getAttributeNode("forsale")->nodeValue;
|
||||
$parceldirectory = $value->getAttributeNode("showinsearch")->nodeValue;
|
||||
$parcelbuild = $value->getAttributeNode("build")->nodeValue;
|
||||
$parcelscript = $value->getAttributeNode("scripts")->nodeValue;
|
||||
$parcelpublic = $value->getAttributeNode("public")->nodeValue;
|
||||
|
||||
mysql_query($sql);
|
||||
}
|
||||
//
|
||||
// Save
|
||||
//
|
||||
$sql = "INSERT INTO allparcels VALUES('" .
|
||||
mysql_escape_string($regionuuid) . "','" .
|
||||
mysql_escape_string($parcelname) . "','" .
|
||||
mysql_escape_string($owneruuid) . "','" .
|
||||
mysql_escape_string($groupuuid) . "','" .
|
||||
mysql_escape_string($parcellanding) . "','" .
|
||||
mysql_escape_string($parceluuid) . "','" .
|
||||
mysql_escape_string($infouuid) . "','" .
|
||||
mysql_escape_string($parcelarea) . "' )";
|
||||
|
||||
if ($parcelforsale == "true")
|
||||
{
|
||||
$sql = "INSERT INTO parcelsales VALUES('" .
|
||||
mysql_escape_string($regionuuid) . "','" .
|
||||
mysql_escape_string($parcelname) . "','" .
|
||||
mysql_escape_string($parceluuid) . "','" .
|
||||
mysql_escape_string($parcelarea) . "','" .
|
||||
mysql_escape_string($parcelsaleprice) . "','" .
|
||||
mysql_escape_string($parcellanding) . "','" .
|
||||
mysql_escape_string($infouuid) . "', '" .
|
||||
mysql_escape_string($dwell) . "', '" .
|
||||
mysql_escape_string($estateid) . "', '" .
|
||||
mysql_escape_string($regioncategory) . "')";
|
||||
mysql_query($sql);
|
||||
|
||||
mysql_query($sql);
|
||||
}
|
||||
}
|
||||
if ($parceldirectory == "true")
|
||||
{
|
||||
$sql = "INSERT INTO parcels VALUES('" .
|
||||
mysql_escape_string($regionuuid) . "','" .
|
||||
mysql_escape_string($parcelname) . "','" .
|
||||
mysql_escape_string($parceluuid) . "','" .
|
||||
mysql_escape_string($parcellanding) . "','" .
|
||||
mysql_escape_string($parceldescription) . "','" .
|
||||
mysql_escape_string($parcelcategory) . "','" .
|
||||
mysql_escape_string($parcelbuild) . "','" .
|
||||
mysql_escape_string($parcelscript) . "','" .
|
||||
mysql_escape_string($parcelpublic) . "','".
|
||||
mysql_escape_string($dwell) . "','".
|
||||
mysql_escape_string($infouuid) . "' )";
|
||||
|
||||
//
|
||||
// Handle objects
|
||||
//
|
||||
$objects = $data->getElementsByTagName("object");
|
||||
mysql_query($sql);
|
||||
}
|
||||
|
||||
foreach( $objects as $value )
|
||||
{
|
||||
$uuid = $value->getElementsByTagName("uuid")->item(0)->nodeValue;
|
||||
if ($parcelforsale == "true")
|
||||
{
|
||||
$sql = "INSERT INTO parcelsales VALUES('" .
|
||||
mysql_escape_string($regionuuid) . "','" .
|
||||
mysql_escape_string($parcelname) . "','" .
|
||||
mysql_escape_string($parceluuid) . "','" .
|
||||
mysql_escape_string($parcelarea) . "','" .
|
||||
mysql_escape_string($parcelsaleprice) . "','" .
|
||||
mysql_escape_string($parcellanding) . "','" .
|
||||
mysql_escape_string($infouuid) . "', '" .
|
||||
mysql_escape_string($dwell) . "', '" .
|
||||
mysql_escape_string($estateid) . "', '" .
|
||||
mysql_escape_string($regioncategory) . "')";
|
||||
|
||||
$regionuuid = $value->getElementsByTagName("regionuuid")->item(0)->nodeValue;
|
||||
mysql_query($sql);
|
||||
}
|
||||
}
|
||||
|
||||
$parceluuid = $value->getElementsByTagName("parceluuid")->item(0)->nodeValue;
|
||||
//
|
||||
// Handle objects
|
||||
//
|
||||
$objects = $data->getElementsByTagName("object");
|
||||
|
||||
$location = $value->getElementsByTagName("location")->item(0)->nodeValue;
|
||||
foreach( $objects as $value )
|
||||
{
|
||||
$uuid = $value->getElementsByTagName("uuid")->item(0)->nodeValue;
|
||||
|
||||
$title = $value->getElementsByTagName("title")->item(0)->nodeValue;
|
||||
$regionuuid = $value->getElementsByTagName("regionuuid")->item(0)->nodeValue;
|
||||
|
||||
$description = $value->getElementsByTagName("description")->item(0)->nodeValue;
|
||||
$parceluuid = $value->getElementsByTagName("parceluuid")->item(0)->nodeValue;
|
||||
|
||||
$flags = $value->getElementsByTagName("flags")->item(0)->nodeValue;
|
||||
$location = $value->getElementsByTagName("location")->item(0)->nodeValue;
|
||||
|
||||
mysql_query("INSERT INTO objects VALUES('" .
|
||||
mysql_escape_string($uuid) . "','" .
|
||||
mysql_escape_string($parceluuid) . "','" .
|
||||
mysql_escape_string($location) . "','" .
|
||||
mysql_escape_string($title) . "','" .
|
||||
mysql_escape_string($description) . "','" .
|
||||
mysql_escape_string($regionuuid) . "')");
|
||||
$title = $value->getElementsByTagName("title")->item(0)->nodeValue;
|
||||
|
||||
}
|
||||
}
|
||||
return True;
|
||||
}
|
||||
else
|
||||
{
|
||||
return False;
|
||||
}
|
||||
$description = $value->getElementsByTagName("description")->item(0)->nodeValue;
|
||||
|
||||
$flags = $value->getElementsByTagName("flags")->item(0)->nodeValue;
|
||||
|
||||
mysql_query("INSERT INTO objects VALUES('" .
|
||||
mysql_escape_string($uuid) . "','" .
|
||||
mysql_escape_string($parceluuid) . "','" .
|
||||
mysql_escape_string($location) . "','" .
|
||||
mysql_escape_string($title) . "','" .
|
||||
mysql_escape_string($description) . "','" .
|
||||
mysql_escape_string($regionuuid) . "')");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$jobsearch = mysql_query("SELECT host, port from hostsregister " .
|
||||
@@ -312,6 +316,6 @@ $jobsearch = mysql_query("SELECT host, port from hostsregister " .
|
||||
|
||||
while ($jobs = mysql_fetch_row($jobsearch))
|
||||
{
|
||||
CheckHost($jobs[0], $jobs[1]);
|
||||
CheckHost($jobs[0], $jobs[1]);
|
||||
}
|
||||
?>
|
||||
|
||||
Reference in New Issue
Block a user