From 2e21e7a490e6f1cbf7e3d9498fe76d01de5d9155 Mon Sep 17 00:00:00 2001 From: kristuff Date: Fri, 8 Jan 2021 10:15:18 +0100 Subject: [PATCH 01/18] v0.9.4 --- README.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 24a6ee8..ea5fd78 100644 --- a/README.md +++ b/README.md @@ -10,13 +10,15 @@ Features -------- -- **✓** Single IP check request -- **✓** Check IP block request -- **✓** Single report request -- **✓** Auto cleaning report comment from sensitive data -- **✓** Blacklist request -- *\[TODO\]* clear address block request -- *\[TODO\]* Bulk report request +- Single IP check request **✓** +- IP block check request **✓** +- Blacklist request **✓** +- Single report request **✓** +- Auto cleaning report comment from sensitive data **✓** + +TODO +- *\[TODO\] clear address request* +- *\[TODO\] Bulk report request* Requirements ------------ From ed9e4bd8fbdb3608086e160e8238827ec9c007e3 Mon Sep 17 00:00:00 2001 From: kristuff Date: Fri, 8 Jan 2021 15:51:29 +0100 Subject: [PATCH 02/18] v0.9.5 **Added** - Support for clear address request (remove own report for a given IP address) **Changed** - internal refactoring --- README.md | 8 ++-- lib/ApiDefintion.php | 15 +++++++- lib/ApiHandler.php | 62 +++++++++++++++++++++--------- lib/InvalidPermissionException.php | 2 +- 4 files changed, 61 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index ea5fd78..4d79cd1 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,11 @@ Features - IP block check request **✓** - Blacklist request **✓** - Single report request **✓** +- Clear address request (remove own reports) **✓** - Auto cleaning report comment from sensitive data **✓** -TODO -- *\[TODO\] clear address request* -- *\[TODO\] Bulk report request* +**Not implemented:** +- *\[TODO\] Bulk report Api request* Requirements ------------ @@ -34,7 +34,7 @@ Deploy with composer: ```json ... "require": { - "kristuff/abuseipdb": ">=0.9.4-stable" + "kristuff/abuseipdb": ">=0.9.5-stable" }, ``` diff --git a/lib/ApiDefintion.php b/lib/ApiDefintion.php index d692c38..620d8dc 100644 --- a/lib/ApiDefintion.php +++ b/lib/ApiDefintion.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.4 + * @version 0.9.5 * @copyright 2020-2021 Kristuff */ @@ -120,7 +120,18 @@ abstract class ApiDefintion // Abuse was targeted at an "Internet of Things" type device. Include // information about what type of device was targeted in the comments. ['oit' , '23', 'IoT Targeted', true], - ]; + ]; + + /** + * Get the list of report categories + * + * @access public + * @return array + */ + public function getCategories() + { + return $this->aipdbApiCategories; + } /** * Get the category id corresponding to given name diff --git a/lib/ApiHandler.php b/lib/ApiHandler.php index 25e5bd8..71465ff 100644 --- a/lib/ApiHandler.php +++ b/lib/ApiHandler.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.4 + * @version 0.9.5 * @copyright 2020-2021 Kristuff */ @@ -86,13 +86,13 @@ class ApiHandler extends ApiDefintion } /** - * Get a new instance of ApiManager with config stored in a Json file + * Get a new instance of ApiHandler with config stored in a Json file * * @access public * @static * @param string $configPath The configuration file path * - * @return \Kristuff\AbuseIPDB\ApiManager + * @return \Kristuff\AbuseIPDB\ApiHandler * @throws \InvalidArgumentException If the given file does not exist * @throws \Kristuff\AbuseIPDB\InvalidPermissionException If the given file is not readable */ @@ -123,17 +123,6 @@ class ApiHandler extends ApiDefintion return $app; } - /** - * Get the list of report categories - * - * @access public - * @return array - */ - public function getCategories() - { - return $this->aipdbApiCategories; - } - /** * Performs a 'report' api request * @@ -149,7 +138,7 @@ class ApiHandler extends ApiDefintion * @param string $ip The ip to report * @param string $categories The report categories * @param string $message The report message - * @param bool $returnArray True to return an indexed array instead of an object. Default is false. + * @param bool $returnArray True to return an indexed array instead of object. Default is false. * * @return object|array * @throws \InvalidArgumentException @@ -226,7 +215,7 @@ class ApiHandler extends ApiDefintion * @access public * @param string $network The network to check * @param int $maxAge Max age in days - * @param bool $returnArray True to return an indexed array instead of an object. Default is false. + * @param bool $returnArray True to return an indexed array instead of object. Default is false. * * @return object|array * @throws \InvalidArgumentException when maxAge is less than 1 or greater than 365, or when network value was not set. @@ -254,6 +243,42 @@ class ApiHandler extends ApiDefintion return json_decode($response, $returnArray); } + /** + * Perform a 'clear-address' api request + * + * Sample response: + * + * { + * "data": { + * "numReportsDeleted": 0 + * } + * } + * + * + * @access public + * @param string $ip The ip to check + * @param bool $returnArray True to return an indexed array instead of object. Default is false. + * + * @return object|array + * @throws \InvalidArgumentException When ip value was not set. + */ + public function clear(string $ip = null, bool $returnArray = false) + { + // ip must be set + if (empty($ip)){ + throw new \InvalidArgumentException('ip argument must be set (null given)'); + } + + // minimal data + $data = [ + 'ipAddress' => $ip, + ]; + + $response = $this->apiRequest('check', $data, 'DELETE', $returnArray) ; + + return json_decode($response, $returnArray); + } + /** * Perform a 'check' api request * @@ -261,7 +286,7 @@ class ApiHandler extends ApiDefintion * @param string $ip The ip to check * @param int $maxAge Max age in days * @param bool $verbose True to get the full response. Default is false - * @param bool $returnArray True to return an indexed array instead of an object. Default is false. + * @param bool $returnArray True to return an indexed array instead of object. Default is false. * * @return object|array * @throws \InvalidArgumentException when maxAge is less than 1 or greater than 365, or when ip value was not set. @@ -289,7 +314,6 @@ class ApiHandler extends ApiDefintion $data['verbose'] = true; } - // check AbuseIPDB request $response = $this->apiRequest('check', $data, 'GET', $returnArray) ; return json_decode($response, $returnArray); @@ -301,7 +325,7 @@ class ApiHandler extends ApiDefintion * @access public * @param int $limit The blacklist limit. Default is TODO (the api default limit) * @param bool $plainText True to get the response in plain text list. Default is false - * @param bool $returnArray True to return an indexed array instead of an object (when $plainText is set to false). Default is false. + * @param bool $returnArray True to return an indexed array instead of object (when $plainText is set to false). Default is false. * * @return object|array * @throws \InvalidArgumentException When maxAge is not a numeric value, when maxAge is less than 1 or diff --git a/lib/InvalidPermissionException.php b/lib/InvalidPermissionException.php index cb38e93..821731f 100644 --- a/lib/InvalidPermissionException.php +++ b/lib/InvalidPermissionException.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.4 + * @version 0.9.5 * @copyright 2020-2021 Kristuff */ From 1a882c01555c2d9441008787c7dc2ad883eb55cd Mon Sep 17 00:00:00 2001 From: kristuff Date: Fri, 8 Jan 2021 16:31:43 +0100 Subject: [PATCH 03/18] v0.9.6 **Fixed** - clear method is broken in 0.9.5. --- README.md | 2 +- lib/ApiDefintion.php | 2 +- lib/ApiHandler.php | 8 ++++---- lib/InvalidPermissionException.php | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 4d79cd1..e30b729 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Deploy with composer: ```json ... "require": { - "kristuff/abuseipdb": ">=0.9.5-stable" + "kristuff/abuseipdb": ">=0.9.6-stable" }, ``` diff --git a/lib/ApiDefintion.php b/lib/ApiDefintion.php index 620d8dc..66c8870 100644 --- a/lib/ApiDefintion.php +++ b/lib/ApiDefintion.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.5 + * @version 0.9.6 * @copyright 2020-2021 Kristuff */ diff --git a/lib/ApiHandler.php b/lib/ApiHandler.php index 71465ff..8af252e 100644 --- a/lib/ApiHandler.php +++ b/lib/ApiHandler.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.5 + * @version 0.9.6 * @copyright 2020-2021 Kristuff */ @@ -274,7 +274,7 @@ class ApiHandler extends ApiDefintion 'ipAddress' => $ip, ]; - $response = $this->apiRequest('check', $data, 'DELETE', $returnArray) ; + $response = $this->apiRequest('clear-address', $data, 'DELETE', $returnArray) ; return json_decode($response, $returnArray); } @@ -327,7 +327,7 @@ class ApiHandler extends ApiDefintion * @param bool $plainText True to get the response in plain text list. Default is false * @param bool $returnArray True to return an indexed array instead of object (when $plainText is set to false). Default is false. * - * @return object|array + * @return object|array|string * @throws \InvalidArgumentException When maxAge is not a numeric value, when maxAge is less than 1 or * greater than 365, or when ip value was not set. */ @@ -501,7 +501,7 @@ class ApiHandler extends ApiDefintion * @access public * @static * @param string $filePath The file's full path - * @param bool $trowError Throw error on true or silent process. Default is true + * @param bool $throwError Throw error on true or silent process. Default is true * * @return object|null * @throws \Exception diff --git a/lib/InvalidPermissionException.php b/lib/InvalidPermissionException.php index 821731f..f87ad24 100644 --- a/lib/InvalidPermissionException.php +++ b/lib/InvalidPermissionException.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.5 + * @version 0.9.6 * @copyright 2020-2021 Kristuff */ From cd48341f1bb291201b5c633c8aaa4c3a5656415f Mon Sep 17 00:00:00 2001 From: kristuff Date: Fri, 8 Jan 2021 19:12:48 +0100 Subject: [PATCH 04/18] v0.9.6 **Fixed** - clear method is broken in 0.9.5. --- lib/ApiHandler.php | 86 +++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/lib/ApiHandler.php b/lib/ApiHandler.php index 8af252e..bce5b5e 100644 --- a/lib/ApiHandler.php +++ b/lib/ApiHandler.php @@ -164,14 +164,14 @@ class ApiHandler extends ApiDefintion $cats = $this->validateReportCategories($categories); $msg = $this->cleanMessage($message); - // report AbuseIPDB request + // AbuseIPDB request $response = $this->apiRequest( 'report', [ 'ip' => $ip, 'categories' => $cats, 'comment' => $msg ], - 'POST', $returnArray + 'POST' ); return json_decode($response, $returnArray); @@ -238,47 +238,11 @@ class ApiHandler extends ApiDefintion 'maxAgeInDays' => $maxAge, ]; - $response = $this->apiRequest('check-block', $data, 'GET', $returnArray) ; + $response = $this->apiRequest('check-block', $data, 'GET') ; return json_decode($response, $returnArray); } - /** - * Perform a 'clear-address' api request - * - * Sample response: - * - * { - * "data": { - * "numReportsDeleted": 0 - * } - * } - * - * - * @access public - * @param string $ip The ip to check - * @param bool $returnArray True to return an indexed array instead of object. Default is false. - * - * @return object|array - * @throws \InvalidArgumentException When ip value was not set. - */ - public function clear(string $ip = null, bool $returnArray = false) - { - // ip must be set - if (empty($ip)){ - throw new \InvalidArgumentException('ip argument must be set (null given)'); - } - - // minimal data - $data = [ - 'ipAddress' => $ip, - ]; - - $response = $this->apiRequest('clear-address', $data, 'DELETE', $returnArray) ; - - return json_decode($response, $returnArray); - } - /** * Perform a 'check' api request * @@ -314,11 +278,46 @@ class ApiHandler extends ApiDefintion $data['verbose'] = true; } - $response = $this->apiRequest('check', $data, 'GET', $returnArray) ; + $response = $this->apiRequest('check', $data, 'GET') ; return json_decode($response, $returnArray); } + /** + * Perform a 'clear-address' api request + * + * Sample response: + * + * { + * "data": { + * "numReportsDeleted": 0 + * } + * } + * + * + * @access public + * @param string $ip The ip to check + * @param bool $returnArray True to return an indexed array instead of object. Default is false. + * + * @return object|array + * @throws \InvalidArgumentException When ip value was not set. + */ + public function clear(string $ip = null, bool $returnArray = false) + { + // ip must be set + if (empty($ip)){ + throw new \InvalidArgumentException('ip argument must be set (null given)'); + } + + // minimal data + $data = [ + 'ipAddress' => $ip, + ]; + + $response = $this->apiRequest('clear-address', $data, "DELETE") ; + return json_decode($response, $returnArray); + } + /** * Perform a 'blacklist' api request * @@ -430,7 +429,7 @@ class ApiHandler extends ApiDefintion * * @return mixed */ - protected function apiRequest(string $path, array $data, string $method = 'GET', bool $returnArray = false) + protected function apiRequest(string $path, array $data, string $method = 'GET') { // set api url $url = $this->aipdbApiEndpoint . $path; @@ -439,13 +438,14 @@ class ApiHandler extends ApiDefintion $ch = curl_init(); // set the method and data to send + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); if ($method == 'POST') { curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } else { $url .= '?' . http_build_query($data); } - + // set the url to call curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); @@ -463,7 +463,7 @@ class ApiHandler extends ApiDefintion // close connection curl_close($ch); - // return response as JSON data + // return response as is (JSON or plain text) return $result; } From 60d42db74cb4a005f5fba13cffb6f7c1902f61e5 Mon Sep 17 00:00:00 2001 From: kristuff Date: Fri, 8 Jan 2021 19:33:24 +0100 Subject: [PATCH 05/18] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e30b729..c7a42d2 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,8 @@ Features - Single IP check request **✓** - IP block check request **✓** - Blacklist request **✓** -- Single report request **✓** -- Clear address request (remove own reports) **✓** +- Single IP report request **✓** +- Clear IP address request (remove own reports) **✓** - Auto cleaning report comment from sensitive data **✓** **Not implemented:** From 1e7e1eb87b8a59a164ea9b4a19d386f3252b8d10 Mon Sep 17 00:00:00 2001 From: kristuff Date: Sat, 9 Jan 2021 11:26:58 +0100 Subject: [PATCH 06/18] v0.9.7 **Added** - support for bulk-report request (send cvs file) --- README.md | 6 +- composer.json | 2 +- lib/{ApiDefintion.php => ApiBase.php} | 83 +++++- lib/ApiHandler.php | 349 +++++++++++++------------- lib/CurlTrait.php | 44 ++++ lib/InvalidPermissionException.php | 5 +- 6 files changed, 297 insertions(+), 192 deletions(-) rename lib/{ApiDefintion.php => ApiBase.php} (74%) create mode 100644 lib/CurlTrait.php diff --git a/README.md b/README.md index c7a42d2..fd5ba1e 100644 --- a/README.md +++ b/README.md @@ -14,12 +14,10 @@ Features - IP block check request **✓** - Blacklist request **✓** - Single IP report request **✓** +- Bulk report request (send cvs file) **✓** - Clear IP address request (remove own reports) **✓** - Auto cleaning report comment from sensitive data **✓** -**Not implemented:** -- *\[TODO\] Bulk report Api request* - Requirements ------------ - PHP >= 7.1 @@ -34,7 +32,7 @@ Deploy with composer: ```json ... "require": { - "kristuff/abuseipdb": ">=0.9.6-stable" + "kristuff/abuseipdb": ">=0.9.7-stable" }, ``` diff --git a/composer.json b/composer.json index 3c8397c..61b0af6 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "kristuff/abuseipdb", - "description": "A wrapper for AbuseIPDB API v2", + "description": "A PHP wrapper for AbuseIPDB API v2", "type": "library", "license": "MIT", "authors": [ diff --git a/lib/ApiDefintion.php b/lib/ApiBase.php similarity index 74% rename from lib/ApiDefintion.php rename to lib/ApiBase.php index 66c8870..6d0e188 100644 --- a/lib/ApiDefintion.php +++ b/lib/ApiBase.php @@ -14,19 +14,19 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.6 + * @version 0.9.7 * @copyright 2020-2021 Kristuff */ namespace Kristuff\AbuseIPDB; /** - * Class ApiDefintion + * Class ApiBase * - * Abstract base class for ApiManager + * Abstract base class for ApiHanlder * Contains main hard coded api settings */ -abstract class ApiDefintion +abstract class ApiBase { /** * AbuseIPDB API v2 Endpoint @@ -34,6 +34,22 @@ abstract class ApiDefintion */ protected $aipdbApiEndpoint = 'https://api.abuseipdb.com/api/v2/'; + /** + * AbuseIPDB API key + * + * @access protected + * @var string $aipdbApiKey + */ + protected $aipdbApiKey = null; + + /** + * AbuseIPDB user id + * + * @access protected + * @var string $aipdbUserId + */ + protected $aipdbUserId = null; + /** * AbuseIPDB API v2 categories * shorname, id (string), long name @@ -196,4 +212,63 @@ abstract class ApiDefintion return false; } + /** + * Check if the category(ies) given is/are valid + * Check for shortname or id, and categories that can't be used alone + * + * @access protected + * @param array $categories The report categories list + * + * @return string Formatted string id list ('18,2,3...') + * @throws \InvalidArgumentException + */ + protected function validateReportCategories(string $categories) + { + // the return categories string + $catsString = ''; + + // used when cat that can't be used alone + $needAnother = null; + + // parse given categories + $cats = explode(',', $categories); + + foreach ($cats as $cat) { + + // get index on our array of categories + $catIndex = is_numeric($cat) ? $this->getCategoryIndex($cat, 1) : $this->getCategoryIndex($cat, 0); + + // check if found + if ($catIndex === false ){ + throw new \InvalidArgumentException('Invalid report category was given : ['. $cat . ']'); + } + + // get Id + $catId = $this->aipdbApiCategories[$catIndex][1]; + + // need another ? + if ($needAnother !== false){ + + // is a standalone cat ? + if ($this->aipdbApiCategories[$catIndex][3] === false) { + $needAnother = true; + + } else { + // ok, continue with other at least one given + // no need to reperform this check + $needAnother = false; + } + } + + // set or add to cats list + $catsString = ($catsString === '') ? $catId : $catsString .','.$catId; + } + + if ($needAnother !== false){ + throw new \InvalidArgumentException('Invalid report category paremeter given: some categories can\'t be used alone'); + } + + // if here that ok + return $catsString; + } } \ No newline at end of file diff --git a/lib/ApiHandler.php b/lib/ApiHandler.php index bce5b5e..d4b77c3 100644 --- a/lib/ApiHandler.php +++ b/lib/ApiHandler.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.6 + * @version 0.9.7 * @copyright 2020-2021 Kristuff */ @@ -25,23 +25,12 @@ namespace Kristuff\AbuseIPDB; * * The main class to work with the AbuseIPDB API v2 */ -class ApiHandler extends ApiDefintion +class ApiHandler extends ApiBase { /** - * AbuseIPDB API key - * - * @access protected - * @var string $aipdbApiKey + * Curl helper functions */ - protected $aipdbApiKey = null; - - /** - * AbuseIPDB user id - * - * @access protected - * @var string $aipdbUserId - */ - protected $aipdbUserId = null; + use CurlTrait; /** * The ips to remove from message @@ -80,7 +69,6 @@ class ApiHandler extends ApiDefintion 'userId' => $this->aipdbUserId, 'apiKey' => $this->aipdbApiKey, 'selfIps' => $this->selfIps, - // TODO default report cat ); } @@ -177,6 +165,134 @@ class ApiHandler extends ApiDefintion return json_decode($response, $returnArray); } + /** + * Performs a 'bulk-report' api request + * + * Result, in json format will be something like this: + * { + * "data": { + * "savedReports": 60, + * "invalidReports": [ + * { + * "error": "Duplicate IP", + * "input": "41.188.138.68", + * "rowNumber": 5 + * }, + * { + * "error": "Invalid IP", + * "input": "127.0.foo.bar", + * "rowNumber": 6 + * }, + * { + * "error": "Invalid Category", + * "input": "189.87.146.50", + * "rowNumber": 8 + * } + * ] + * } + * } + * + * @access public + * @param string $ip The ip to report + * @param string $categories The report categories + * @param string $message The report message + * @param bool $returnArray True to return an indexed array instead of object. Default is false. + * + * @return object|array + * @throws \InvalidArgumentException + */ + public function bulkReport(string $filePath, bool $returnArray = false) + { + // check file exists + if (!file_exists($filePath) || !is_file($filePath)){ + throw new \InvalidArgumentException('The file [' . $filePath . '] does not exist.'); + } + + // check file is readable + if (!is_readable($filePath)){ + throw new InvalidPermissionException('The file [' . $filePath . '] is not readable.'); + } + + // AbuseIPDB request + $response = $this->apiRequest('bulk-report', [], 'POST', $filePath); + + return json_decode($response, $returnArray); + } + + /** + * Perform a 'clear-address' api request + * + * Sample response: + * + * { + * "data": { + * "numReportsDeleted": 0 + * } + * } + * + * @access public + * @param string $ip The ip to check + * @param bool $returnArray True to return an indexed array instead of object. Default is false. + * + * @return object|array + * @throws \InvalidArgumentException When ip value was not set. + */ + public function clear(string $ip = null, bool $returnArray = false) + { + // ip must be set + if (empty($ip)){ + throw new \InvalidArgumentException('ip argument must be set (null given)'); + } + + // minimal data + $data = [ + 'ipAddress' => $ip, + ]; + + $response = $this->apiRequest('clear-address', $data, "DELETE") ; + return json_decode($response, $returnArray); + } + + /** + * Perform a 'check' api request + * + * @access public + * @param string $ip The ip to check + * @param int $maxAge Max age in days + * @param bool $verbose True to get the full response. Default is false + * @param bool $returnArray True to return an indexed array instead of object. Default is false. + * + * @return object|array + * @throws \InvalidArgumentException when maxAge is less than 1 or greater than 365, or when ip value was not set. + */ + public function check(string $ip = null, int $maxAge = 30, bool $verbose = false, bool $returnArray = false) + { + // max age must be less or equal to 365 + if ($maxAge > 365 || $maxAge < 1){ + throw new \InvalidArgumentException('maxAge must be at least 1 and less than 365 (' . $maxAge . ' was given)'); + } + + // ip must be set + if (empty($ip)){ + throw new \InvalidArgumentException('ip argument must be set (null given)'); + } + + // minimal data + $data = [ + 'ipAddress' => $ip, + 'maxAgeInDays' => $maxAge, + ]; + + // option + if ($verbose){ + $data['verbose'] = true; + } + + $response = $this->apiRequest('check', $data, 'GET') ; + + return json_decode($response, $returnArray); + } + /** * Perform a 'check-block' api request * @@ -242,81 +358,6 @@ class ApiHandler extends ApiDefintion return json_decode($response, $returnArray); } - - /** - * Perform a 'check' api request - * - * @access public - * @param string $ip The ip to check - * @param int $maxAge Max age in days - * @param bool $verbose True to get the full response. Default is false - * @param bool $returnArray True to return an indexed array instead of object. Default is false. - * - * @return object|array - * @throws \InvalidArgumentException when maxAge is less than 1 or greater than 365, or when ip value was not set. - */ - public function check(string $ip = null, int $maxAge = 30, bool $verbose = false, bool $returnArray = false) - { - // max age must be less or equal to 365 - if ($maxAge > 365 || $maxAge < 1){ - throw new \InvalidArgumentException('maxAge must be at least 1 and less than 365 (' . $maxAge . ' was given)'); - } - - // ip must be set - if (empty($ip)){ - throw new \InvalidArgumentException('ip argument must be set (null given)'); - } - - // minimal data - $data = [ - 'ipAddress' => $ip, - 'maxAgeInDays' => $maxAge, - ]; - - // option - if ($verbose){ - $data['verbose'] = true; - } - - $response = $this->apiRequest('check', $data, 'GET') ; - - return json_decode($response, $returnArray); - } - - /** - * Perform a 'clear-address' api request - * - * Sample response: - * - * { - * "data": { - * "numReportsDeleted": 0 - * } - * } - * - * - * @access public - * @param string $ip The ip to check - * @param bool $returnArray True to return an indexed array instead of object. Default is false. - * - * @return object|array - * @throws \InvalidArgumentException When ip value was not set. - */ - public function clear(string $ip = null, bool $returnArray = false) - { - // ip must be set - if (empty($ip)){ - throw new \InvalidArgumentException('ip argument must be set (null given)'); - } - - // minimal data - $data = [ - 'ipAddress' => $ip, - ]; - - $response = $this->apiRequest('clear-address', $data, "DELETE") ; - return json_decode($response, $returnArray); - } /** * Perform a 'blacklist' api request @@ -357,67 +398,7 @@ class ApiHandler extends ApiDefintion return json_decode($response, $returnArray); } - - /** - * Check if the category(ies) given is/are valid - * Check for shortname or id, and categories that can't be used alone - * - * @access protected - * @param array $categories The report categories list - * - * @return string Formatted string id list ('18,2,3...') - * @throws \InvalidArgumentException - */ - protected function validateReportCategories(string $categories) - { - // the return categories string - $catsString = ''; - - // used when cat that can't be used alone - $needAnother = null; - - // parse given categories - $cats = explode(',', $categories); - - foreach ($cats as $cat) { - - // get index on our array of categories - $catIndex = is_numeric($cat) ? $this->getCategoryIndex($cat, 1) : $this->getCategoryIndex($cat, 0); - - // check if found - if ($catIndex === false ){ - throw new \InvalidArgumentException('Invalid report category was given : ['. $cat . ']'); - } - - // get Id - $catId = $this->aipdbApiCategories[$catIndex][1]; - - // need another ? - if ($needAnother !== false){ - - // is a standalone cat ? - if ($this->aipdbApiCategories[$catIndex][3] === false) { - $needAnother = true; - - } else { - // ok, continue with other at least one given - // no need to reperform this check - $needAnother = false; - } - } - - // set or add to cats list - $catsString = ($catsString === '') ? $catId : $catsString .','.$catId; - } - - if ($needAnother !== false){ - throw new \InvalidArgumentException('Invalid report category paremeter given: some categories can\'t be used alone'); - } - - // if here that ok - return $catsString; - } - + /** * Perform a cURL request * @@ -425,46 +406,56 @@ class ApiHandler extends ApiDefintion * @param string $path The api end path * @param array $data The request data * @param string $method The request method. Default is 'GET' - * @param bool $returnArray True to return an indexed array instead of an object. Default is false. + * @param bool $csvFilePath The file path for csv file. When not empty, $data parameter is ignored and in place, + * the content of the given file if passed as csv. Default is empty string. * * @return mixed + * @throws \RuntimeException */ - protected function apiRequest(string $path, array $data, string $method = 'GET') + protected function apiRequest(string $path, array $data, string $method = 'GET', string $csvFilePath = '') { // set api url $url = $this->aipdbApiEndpoint . $path; + // set the wanted format, JSON (required to prevent having full html page on error) + // and the AbuseIPDB API Key as a header + $headers = [ + 'Accept: application/json;', + 'Key: ' . $this->aipdbApiKey, + ]; + // open curl connection $ch = curl_init(); + // for csv + if (!empty($csvFilePath)){ + $cfile = new \CurlFile($csvFilePath, 'text/csv', 'csv'); + //curl file itself return the realpath with prefix of @ + $data = array('csv' => $cfile); + } + // set the method and data to send - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); if ($method == 'POST') { - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + $this->setCurlOption($ch, CURLOPT_POST, true); + $this->setCurlOption($ch, CURLOPT_POSTFIELDS, $data); } else { + $this->setCurlOption($ch, CURLOPT_CUSTOMREQUEST, $method); $url .= '?' . http_build_query($data); } // set the url to call - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - - // set the wanted format, JSON (required to prevent having full html page on error) - // and the AbuseIPDB API Key as a header - curl_setopt($ch, CURLOPT_HTTPHEADER, [ - 'Accept: application/json;', - 'Key: ' . $this->aipdbApiKey, - ]); + $this->setCurlOption($ch, CURLOPT_URL, $url); + $this->setCurlOption($ch, CURLOPT_RETURNTRANSFER, 1); + $this->setCurlOption($ch, CURLOPT_HTTPHEADER, $headers); + + // execute curl call + $result = curl_exec($ch); + + // close connection + curl_close($ch); - // execute curl call - $result = curl_exec($ch); - - // close connection - curl_close($ch); - - // return response as is (JSON or plain text) - return $result; + // return response as is (JSON or plain text) + return $result; } /** @@ -518,14 +509,12 @@ class ApiHandler extends ApiDefintion } // get and parse content - $content = file_get_contents($filePath); - $json = json_decode(utf8_encode($content)); + $content = utf8_encode(file_get_contents($filePath)); + $json = json_decode($content); // check for errors - if ($json == null && json_last_error() != JSON_ERROR_NONE){ - if ($throwError) { - throw new \LogicException(sprintf("Failed to parse config file Error: '%s'", json_last_error_msg())); - } + if ($json == null && json_last_error() != JSON_ERROR_NONE && $throwError) { + throw new \LogicException(sprintf("Failed to parse config file Error: '%s'", json_last_error_msg())); } return $json; diff --git a/lib/CurlTrait.php b/lib/CurlTrait.php new file mode 100644 index 0000000..8ea29cc --- /dev/null +++ b/lib/CurlTrait.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @version 0.9.7 + * @copyright 2020-2021 Kristuff + */ + +namespace Kristuff\AbuseIPDB; + +/** + * cURL helper functions + */ +trait CurlTrait +{ + /** + * helper to configure cURL option + * + * @access protected + * @param resource $ch + * @param int $option + * @param mixed $value + * + * @return void + * @throws \RuntimeException + */ + protected function setCurlOption($ch,int $option,$value){ + if(!curl_setopt($ch,$option,$value)){ + throw new \RuntimeException('curl_setopt failed! '.curl_error($ch)); + } + } +} diff --git a/lib/InvalidPermissionException.php b/lib/InvalidPermissionException.php index f87ad24..407ff83 100644 --- a/lib/InvalidPermissionException.php +++ b/lib/InvalidPermissionException.php @@ -14,16 +14,15 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.6 + * @version 0.9.7 * @copyright 2020-2021 Kristuff */ namespace Kristuff\AbuseIPDB; /** - * Custom Exception for non redable file + * Custom Exception for not readable file */ class InvalidPermissionException extends \Exception { - } \ No newline at end of file From fa42dafc36f0ba4c959dde351b59eeba36ffd102 Mon Sep 17 00:00:00 2001 From: kristuff Date: Sat, 16 Jan 2021 18:28:11 +0100 Subject: [PATCH 07/18] v0.9.8 **Added** - ApiResponse class is now the return type for all API endpoint methods **break change** - New parameter confidenceScore in blacklist() method (suscribers feature) **Changed** - method loadFromConfig and json helper removed (moved to client) **break change** - field userId removed (not used). ApiHandler constructor changed **break change** - `clear()` and `getBlacklist()` method renamed to `clearAddress()` and `blacklist()` (all method names match now api endpoint in camel case) **break change** - scrict types --- README.md | 18 +-- lib/ApiBase.php | 31 ++-- lib/ApiHandler.php | 239 +++++++++-------------------- lib/ApiResponse.php | 83 ++++++++++ lib/CurlTrait.php | 7 +- lib/InvalidPermissionException.php | 4 +- 6 files changed, 181 insertions(+), 201 deletions(-) create mode 100644 lib/ApiResponse.php diff --git a/README.md b/README.md index fd5ba1e..f300358 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,9 @@ Features - IP block check request **✓** - Blacklist request **✓** - Single IP report request **✓** -- Bulk report request (send cvs file) **✓** -- Clear IP address request (remove own reports) **✓** -- Auto cleaning report comment from sensitive data **✓** +- Bulk report request (send `csv` file) **✓** +- Clear IP address request (remove your own reports) **✓** +- Auto cleaning report comments from sensitive data (email, custom ip/domain names list) **✓** Requirements ------------ @@ -32,18 +32,18 @@ Deploy with composer: ```json ... "require": { - "kristuff/abuseipdb": ">=0.9.7-stable" + "kristuff/abuseipdb": ">=0.9.8-stable" }, ``` -Usage +More infos ----- -```php -aipdbApiKey = $apiKey; - $this->aipdbUserId = $userId; $this->selfIps = $myIps; } /** * Get the current configuration in a indexed array * - * @access public + * @access public + * * @return array */ - public function getConfig() + public function getConfig(): array { return array( - 'userId' => $this->aipdbUserId, 'apiKey' => $this->aipdbApiKey, 'selfIps' => $this->selfIps, - // TODO default report cat ); } - /** - * Get a new instance of ApiHandler with config stored in a Json file - * - * @access public - * @static - * @param string $configPath The configuration file path - * - * @return \Kristuff\AbuseIPDB\ApiHandler - * @throws \InvalidArgumentException If the given file does not exist - * @throws \Kristuff\AbuseIPDB\InvalidPermissionException If the given file is not readable - */ - public static function fromConfigFile(string $configPath) - { - - // check file exists - if (!file_exists($configPath) || !is_file($configPath)){ - throw new \InvalidArgumentException('The file [' . $configPath . '] does not exist.'); - } - - // check file is readable - if (!is_readable($configPath)){ - throw new InvalidPermissionException('The file [' . $configPath . '] is not readable.'); - } - - $keyConfig = self::loadJsonFile($configPath); - $selfIps = []; - - // Look for other optional config files in the same directory - $selfIpsConfigPath = pathinfo($configPath, PATHINFO_DIRNAME) . DIRECTORY_SEPARATOR . 'self_ips.json'; - if (file_exists($selfIpsConfigPath)){ - $selfIps = self::loadJsonFile($selfIpsConfigPath)->self_ips; - } - - $app = new self($keyConfig->api_key, $keyConfig->user_id, $selfIps); - - return $app; - } - /** * Performs a 'report' api request * @@ -124,14 +83,14 @@ class ApiHandler extends ApiBase * * @access public * @param string $ip The ip to report - * @param string $categories The report categories + * @param string $categories The report category(es) * @param string $message The report message - * @param bool $returnArray True to return an indexed array instead of object. Default is false. * - * @return object|array + * @return ApiResponse + * @throws \RuntimeException * @throws \InvalidArgumentException */ - public function report(string $ip = '', string $categories = '', string $message = '', bool $returnArray = false) + public function report(string $ip, string $categories, string $message): ApiResponse { // ip must be set if (empty($ip)){ @@ -140,29 +99,27 @@ class ApiHandler extends ApiBase // categories must be set if (empty($categories)){ - throw new \InvalidArgumentException('categories list was empty'); + throw new \InvalidArgumentException('Categories list was empty'); } // message must be set - if (empty($message)){ - throw new \InvalidArgumentException('report message was empty'); + if (empty($message)){ + throw new \InvalidArgumentException('Report message was empty'); } // validates categories, clean message $cats = $this->validateReportCategories($categories); - $msg = $this->cleanMessage($message); + $msg = $this->cleanMessage($message); // AbuseIPDB request - $response = $this->apiRequest( + return $this->apiRequest( 'report', [ - 'ip' => $ip, - 'categories' => $cats, - 'comment' => $msg + 'ip' => $ip, + 'categories' => $cats, + 'comment' => $msg ], 'POST' ); - - return json_decode($response, $returnArray); } /** @@ -193,15 +150,13 @@ class ApiHandler extends ApiBase * } * * @access public - * @param string $ip The ip to report - * @param string $categories The report categories - * @param string $message The report message - * @param bool $returnArray True to return an indexed array instead of object. Default is false. + * @param string $filePath The CSV file path. Could be an absolute or relative path. * - * @return object|array + * @return ApiResponse + * @throws \RuntimeException * @throws \InvalidArgumentException */ - public function bulkReport(string $filePath, bool $returnArray = false) + public function bulkReport(string $filePath): ApiResponse { // check file exists if (!file_exists($filePath) || !is_file($filePath)){ @@ -213,10 +168,7 @@ class ApiHandler extends ApiBase throw new InvalidPermissionException('The file [' . $filePath . '] is not readable.'); } - // AbuseIPDB request - $response = $this->apiRequest('bulk-report', [], 'POST', $filePath); - - return json_decode($response, $returnArray); + return $this->apiRequest('bulk-report', [], 'POST', $filePath); } /** @@ -231,26 +183,20 @@ class ApiHandler extends ApiBase * } * * @access public - * @param string $ip The ip to check - * @param bool $returnArray True to return an indexed array instead of object. Default is false. + * @param string $ip The IP to clear reports * - * @return object|array + * @return ApiResponse + * @throws \RuntimeException * @throws \InvalidArgumentException When ip value was not set. */ - public function clear(string $ip = null, bool $returnArray = false) + public function clearAddress(string $ip): ApiResponse { // ip must be set if (empty($ip)){ - throw new \InvalidArgumentException('ip argument must be set (null given)'); + throw new \InvalidArgumentException('IP argument must be set.'); } - // minimal data - $data = [ - 'ipAddress' => $ip, - ]; - - $response = $this->apiRequest('clear-address', $data, "DELETE") ; - return json_decode($response, $returnArray); + return $this->apiRequest('clear-address', ['ipAddress' => $ip ], "DELETE") ; } /** @@ -258,29 +204,29 @@ class ApiHandler extends ApiBase * * @access public * @param string $ip The ip to check - * @param int $maxAge Max age in days - * @param bool $verbose True to get the full response. Default is false - * @param bool $returnArray True to return an indexed array instead of object. Default is false. + * @param int $maxAgeInDays Max age in days. Default is 30. + * @param bool $verbose True to get the full response (last reports and countryName). Default is false * - * @return object|array + * @return ApiResponse + * @throws \RuntimeException * @throws \InvalidArgumentException when maxAge is less than 1 or greater than 365, or when ip value was not set. */ - public function check(string $ip = null, int $maxAge = 30, bool $verbose = false, bool $returnArray = false) + public function check(string $ip, int $maxAgeInDays = 30, bool $verbose = false): ApiResponse { // max age must be less or equal to 365 - if ($maxAge > 365 || $maxAge < 1){ - throw new \InvalidArgumentException('maxAge must be at least 1 and less than 365 (' . $maxAge . ' was given)'); + if ($maxAgeInDays > 365 || $maxAgeInDays < 1){ + throw new \InvalidArgumentException('maxAgeInDays must be between 1 and 365 (' . $maxAgeInDays . ' was given)'); } // ip must be set if (empty($ip)){ - throw new \InvalidArgumentException('ip argument must be set (null given)'); + throw new \InvalidArgumentException('ip argument must be set (empty value given)'); } // minimal data $data = [ 'ipAddress' => $ip, - 'maxAgeInDays' => $maxAge, + 'maxAgeInDays' => $maxAgeInDays, ]; // option @@ -288,9 +234,7 @@ class ApiHandler extends ApiBase $data['verbose'] = true; } - $response = $this->apiRequest('check', $data, 'GET') ; - - return json_decode($response, $returnArray); + return $this->apiRequest('check', $data, 'GET') ; } /** @@ -330,57 +274,56 @@ class ApiHandler extends ApiBase * * @access public * @param string $network The network to check - * @param int $maxAge Max age in days - * @param bool $returnArray True to return an indexed array instead of object. Default is false. + * @param int $maxAgeInDays The Max age in days, must * - * @return object|array - * @throws \InvalidArgumentException when maxAge is less than 1 or greater than 365, or when network value was not set. + * @return ApiResponse + * @throws \RuntimeException + * @throws \InvalidArgumentException when $maxAgeInDays is less than 1 or greater than 365, or when $network value was not set. */ - public function checkBlock(string $network = null, int $maxAge = 30, bool $returnArray = false) + public function checkBlock(string $network, int $maxAgeInDays = 30): ApiResponse { - // max age must be less or equal to 365 - if ($maxAge > 365 || $maxAge < 1){ - throw new \InvalidArgumentException('maxAge must be at least 1 and less than 365 (' . $maxAge . ' was given)'); + // max age must be between 1 and 365 + if ($maxAgeInDays > 365 || $maxAgeInDays < 1){ + throw new \InvalidArgumentException('maxAgeInDays must be between 1 and 365 (' . $maxAgeInDays . ' was given)'); } // ip must be set if (empty($network)){ - throw new \InvalidArgumentException('network argument must be set (null given)'); + throw new \InvalidArgumentException('network argument must be set (empty value given)'); } // minimal data $data = [ 'network' => $network, - 'maxAgeInDays' => $maxAge, + 'maxAgeInDays' => $maxAgeInDays, ]; - $response = $this->apiRequest('check-block', $data, 'GET') ; - - return json_decode($response, $returnArray); + return $this->apiRequest('check-block', $data, 'GET'); } /** * Perform a 'blacklist' api request * * @access public - * @param int $limit The blacklist limit. Default is TODO (the api default limit) - * @param bool $plainText True to get the response in plain text list. Default is false - * @param bool $returnArray True to return an indexed array instead of object (when $plainText is set to false). Default is false. + * @param int $limit The blacklist limit. Default is 10000 (the api default limit) + * @param bool $plainText True to get the response in plaintext list. Default is false + * @param int $confidenceMinimum The abuse confidence score minimum (subscribers feature). Default is 100. + * The confidence minimum must be between 25 and 100. + * This parameter is subscriber feature (not honored otherwise). * - * @return object|array|string - * @throws \InvalidArgumentException When maxAge is not a numeric value, when maxAge is less than 1 or - * greater than 365, or when ip value was not set. + * @return ApiResponse + * @throws \RuntimeException + * @throws \InvalidArgumentException When maxAge is not a numeric value, when $limit is less than 1. */ - public function getBlacklist(int $limit = 10000, bool $plainText = false, bool $returnArray = false) + public function blacklist(int $limit = 10000, bool $plainText = false, int $confidenceMinimum = 100): ApiResponse { - if ($limit < 1){ throw new \InvalidArgumentException('limit must be at least 1 (' . $limit . ' was given)'); } // minimal data $data = [ - 'confidenceMinimum' => 100, // The abuseConfidenceScore parameter is a subscriber feature. + 'confidenceMinimum' => $confidenceMinimum, 'limit' => $limit, ]; @@ -390,13 +333,7 @@ class ApiHandler extends ApiBase $data['plaintext'] = $plainText; } - $response = $this->apiRequest('blacklist', $data, 'GET'); - - if ($plainText){ - return $response; - } - - return json_decode($response, $returnArray); + return $this->apiRequest('blacklist', $data, 'GET'); } /** @@ -406,13 +343,13 @@ class ApiHandler extends ApiBase * @param string $path The api end path * @param array $data The request data * @param string $method The request method. Default is 'GET' - * @param bool $csvFilePath The file path for csv file. When not empty, $data parameter is ignored and in place, + * @param string $csvFilePath The file path for csv file. When not empty, $data parameter is ignored and in place, * the content of the given file if passed as csv. Default is empty string. * - * @return mixed + * @return ApiResponse * @throws \RuntimeException */ - protected function apiRequest(string $path, array $data, string $method = 'GET', string $csvFilePath = '') + protected function apiRequest(string $path, array $data, string $method = 'GET', string $csvFilePath = ''): ApiResponse { // set api url $url = $this->aipdbApiEndpoint . $path; @@ -438,6 +375,7 @@ class ApiHandler extends ApiBase if ($method == 'POST') { $this->setCurlOption($ch, CURLOPT_POST, true); $this->setCurlOption($ch, CURLOPT_POSTFIELDS, $data); + } else { $this->setCurlOption($ch, CURLOPT_CUSTOMREQUEST, $method); $url .= '?' . http_build_query($data); @@ -454,8 +392,7 @@ class ApiHandler extends ApiBase // close connection curl_close($ch); - // return response as is (JSON or plain text) - return $result; + return new ApiResponse($result !== false ? $result : ''); } /** @@ -468,7 +405,7 @@ class ApiHandler extends ApiBase * * @return string */ - protected function cleanMessage(string $message) + public function cleanMessage(string $message): string { // Remove backslashes $message = str_replace('\\', '', $message); @@ -485,38 +422,4 @@ class ApiHandler extends ApiBase // Make sure message is less 1024 chars return substr($message, 0, 1024); } - - /** - * Load and returns decoded Json from given file - * - * @access public - * @static - * @param string $filePath The file's full path - * @param bool $throwError Throw error on true or silent process. Default is true - * - * @return object|null - * @throws \Exception - * @throws \LogicException - */ - protected static function loadJsonFile(string $filePath, bool $throwError = true) - { - // check file exists - if (!file_exists($filePath) || !is_file($filePath)){ - if ($throwError) { - throw new \Exception('Config file not found'); - } - return null; - } - - // get and parse content - $content = utf8_encode(file_get_contents($filePath)); - $json = json_decode($content); - - // check for errors - if ($json == null && json_last_error() != JSON_ERROR_NONE && $throwError) { - throw new \LogicException(sprintf("Failed to parse config file Error: '%s'", json_last_error_msg())); - } - - return $json; - } } \ No newline at end of file diff --git a/lib/ApiResponse.php b/lib/ApiResponse.php new file mode 100644 index 0000000..1b9a232 --- /dev/null +++ b/lib/ApiResponse.php @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @version 0.9.8 + * @copyright 2020-2021 Kristuff + */ + +namespace Kristuff\AbuseIPDB; + +/** + * Class ApiResponse + * + */ +class ApiResponse +{ + /** + * + * @access protected + * @var string + */ + protected $curlResponse; + + /** + * Constructor + * + * @access public + * @param string $plaintext AbuseIPDB response in plaintext + * + */ + public function __construct(?string $plaintext = null) + { + $this->curlResponse = $plaintext; + } + + /** + * Get response as array. May return null + * + * @access public + * + * @return array|null + */ + public function getArray(): ?array + { + return json_decode($this->curlResponse, true); + } + + /** + * Get response as object. May return null + * + * @access public + * + * @return object|null + */ + public function getObject(): ?object + { + return json_decode($this->curlResponse, false); + } + + /** + * Get response as plaintext. May return null + * + * @access public + * + * @return string|null + */ + public function getPlaintext(): ?string + { + return $this->curlResponse; + } +} \ No newline at end of file diff --git a/lib/CurlTrait.php b/lib/CurlTrait.php index 8ea29cc..53758d6 100644 --- a/lib/CurlTrait.php +++ b/lib/CurlTrait.php @@ -1,4 +1,4 @@ - Date: Sun, 17 Jan 2021 19:09:15 +0100 Subject: [PATCH 08/18] v0.9.9 **Added** - better exception handling with new class `SilentApiHandler`: to not raise any exception during API request but instead return an `ApiResponse` with errors - version constant - `ApiReponse` has new `errors()` and `hasError()` methods --- README.md | 2 +- lib/ApiBase.php | 2 +- lib/ApiHandler.php | 11 +- lib/ApiResponse.php | 36 ++++++- lib/CurlTrait.php | 2 +- lib/InvalidPermissionException.php | 2 +- lib/SilentApiHandler.php | 164 +++++++++++++++++++++++++++++ 7 files changed, 210 insertions(+), 9 deletions(-) create mode 100644 lib/SilentApiHandler.php diff --git a/README.md b/README.md index f300358..23ee560 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Deploy with composer: ```json ... "require": { - "kristuff/abuseipdb": ">=0.9.8-stable" + "kristuff/abuseipdb": ">=0.9.9-stable" }, ``` diff --git a/lib/ApiBase.php b/lib/ApiBase.php index 0a4edd2..e35a348 100644 --- a/lib/ApiBase.php +++ b/lib/ApiBase.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.8 + * @version 0.9.9 * @copyright 2020-2021 Kristuff */ diff --git a/lib/ApiHandler.php b/lib/ApiHandler.php index b8eadd2..549c985 100644 --- a/lib/ApiHandler.php +++ b/lib/ApiHandler.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.8 + * @version 0.9.9 * @copyright 2020-2021 Kristuff */ @@ -32,6 +32,11 @@ class ApiHandler extends ApiBase */ use CurlTrait; + /** + * @var string $version + */ + const VERSION = 'v0.9.9'; + /** * The ips to remove from report messages * Generally you will add to this list yours ipv4 and ipv6, hostname, domain names @@ -214,8 +219,8 @@ class ApiHandler extends ApiBase public function check(string $ip, int $maxAgeInDays = 30, bool $verbose = false): ApiResponse { // max age must be less or equal to 365 - if ($maxAgeInDays > 365 || $maxAgeInDays < 1){ - throw new \InvalidArgumentException('maxAgeInDays must be between 1 and 365 (' . $maxAgeInDays . ' was given)'); + if ( $maxAgeInDays > 365 || $maxAgeInDays < 1 ){ + throw new \InvalidArgumentException('maxAgeInDays must be between 1 and 365.'); } // ip must be set diff --git a/lib/ApiResponse.php b/lib/ApiResponse.php index 1b9a232..1231c00 100644 --- a/lib/ApiResponse.php +++ b/lib/ApiResponse.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.8 + * @version 0.9.9 * @copyright 2020-2021 Kristuff */ @@ -33,6 +33,13 @@ class ApiResponse */ protected $curlResponse; + /** + * + * @access protected + * @var object + */ + protected $decodedResponse; + /** * Constructor * @@ -43,6 +50,7 @@ class ApiResponse public function __construct(?string $plaintext = null) { $this->curlResponse = $plaintext; + $this->decodedResponse = json_decode($plaintext, false); } /** @@ -66,7 +74,7 @@ class ApiResponse */ public function getObject(): ?object { - return json_decode($this->curlResponse, false); + return $this->decodedResponse; } /** @@ -80,4 +88,28 @@ class ApiResponse { return $this->curlResponse; } + + /** + * Get whether the response contains error(s) + * + * @access public + * + * @return bool + */ + public function hasError(): bool + { + return count($this->errors()) > 0; + } + + /** + * Get an array of errors (object) contained is response + * + * @access public + * + * @return array + */ + public function errors(): array + { + return ($this->decodedResponse && $this->decodedResponse->errors) ? $this->decodedResponse->errors : []; + } } \ No newline at end of file diff --git a/lib/CurlTrait.php b/lib/CurlTrait.php index 53758d6..bf73b1e 100644 --- a/lib/CurlTrait.php +++ b/lib/CurlTrait.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.8 + * @version 0.9.9 * @copyright 2020-2021 Kristuff */ diff --git a/lib/InvalidPermissionException.php b/lib/InvalidPermissionException.php index 7290792..bdf6ead 100644 --- a/lib/InvalidPermissionException.php +++ b/lib/InvalidPermissionException.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.8 + * @version 0.9.9 * @copyright 2020-2021 Kristuff */ diff --git a/lib/SilentApiHandler.php b/lib/SilentApiHandler.php new file mode 100644 index 0000000..dd45bc2 --- /dev/null +++ b/lib/SilentApiHandler.php @@ -0,0 +1,164 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @version 0.9.9 + * @copyright 2020-2021 Kristuff + */ + +namespace Kristuff\AbuseIPDB; + +/** + * Class SilentApiHandler + * + * Overwrite ApiHandler with Exception handling + * Instead of Exception, all method return an ApiResponse that may + * contains errors from the AbuseIPDB API, or internal errors + */ +class SilentApiHandler extends ApiHandler +{ + /** + * Get an internal error message in an ApiResponse object + * + * @access public + * @param string $message The error message + * + * @return ApiResponse + */ + public function getErrorResponse(string $message): ApiResponse + { + $response = [ + "errors" => [ + [ + "title" => "Internal Error", + "detail" => $message + ] + ] + ]; + + return new ApiResponse(json_encode($response)); + } + + /** + * Performs a 'report' api request, with Exception handling + * + * @access public + * @param string $ip The ip to report + * @param string $categories The report category(es) + * @param string $message The report message + * + * @return ApiResponse + */ + public function report(string $ip, string $categories, string $message): ApiResponse + { + try { + return parent::report($ip,$categories,$message); + } catch (\Exception $e) { + return $this->getErrorResponse($e->getMessage()); + } + } + + /** + * Performs a 'bulk-report' api request, with Exception handling + * + * @access public + * @param string $filePath The CSV file path. Could be an absolute or relative path. + * + * @return ApiResponse + */ + public function bulkReport(string $filePath): ApiResponse + { + try { + return parent::bulkReport($filePath); + } catch (\Exception $e) { + return $this->getErrorResponse($e->getMessage()); + } + } + + /** + * Perform a 'clear-address' api request, with Exception handling + * + * @access public + * @param string $ip The IP to clear reports + * + * @return ApiResponse + */ + public function clearAddress(string $ip): ApiResponse + { + try { + return parent::clearAddress($ip); + } catch (\Exception $e) { + return $this->getErrorResponse($e->getMessage()); + } + } + + /** + * Perform a 'check' api request, with Exception handling + * + * @access public + * @param string $ip The ip to check + * @param int $maxAgeInDays Max age in days. Default is 30. + * @param bool $verbose True to get the full response (last reports and countryName). Default is false + * + * @return ApiResponse + */ + public function check(string $ip, int $maxAgeInDays = 30, bool $verbose = false): ApiResponse + { + try { + return parent::check($ip, $maxAgeInDays, $verbose); + } catch (\Exception $e) { + return $this->getErrorResponse($e->getMessage()); + } + } + + /** + * Perform a 'check-block' api request, with Exception handling + * + * @access public + * @param string $network The network to check + * @param int $maxAgeInDays The Max age in days, must + * + * @return ApiResponse + */ + public function checkBlock(string $network, int $maxAgeInDays = 30): ApiResponse + { + try { + return parent::checkBlock($network, $maxAgeInDays); + } catch (\Exception $e) { + return $this->getErrorResponse($e->getMessage()); + } + } + + /** + * Perform a 'blacklist' api request, with Exception handling + * + * @access public + * @param int $limit The blacklist limit. Default is 10000 (the api default limit) + * @param bool $plainText True to get the response in plaintext list. Default is false + * @param int $confidenceMinimum The abuse confidence score minimum (subscribers feature). Default is 100. + * The confidence minimum must be between 25 and 100. + * This parameter is subscriber feature (not honored otherwise). + * + * @return ApiResponse + */ + public function blacklist(int $limit = 10000, bool $plainText = false, int $confidenceMinimum = 100): ApiResponse + { + try { + return parent::blacklist($limit, $plainText, $confidenceMinimum); + } catch (\Exception $e) { + return $this->getErrorResponse($e->getMessage()); + } + } +} \ No newline at end of file From 77c2857eb87d2fbf895a2a03fece60c81b368efd Mon Sep 17 00:00:00 2001 From: kristuff Date: Fri, 29 Jan 2021 20:30:12 +0100 Subject: [PATCH 09/18] v0.9.10 **Changed** - report categories methods related now static - `SilentApiHandler` class renamed `QuietApiHandler` **break change** - new static method `ApiResponse::createErrorResponse` --- README.md | 2 +- composer.json | 1 + lib/ApiBase.php | 33 ++++++++------ lib/ApiHandler.php | 8 ++-- lib/ApiResponse.php | 27 +++++++++++- lib/CurlTrait.php | 2 +- lib/InvalidPermissionException.php | 2 +- ...lentApiHandler.php => QuietApiHandler.php} | 44 +++++-------------- 8 files changed, 63 insertions(+), 56 deletions(-) rename lib/{SilentApiHandler.php => QuietApiHandler.php} (77%) diff --git a/README.md b/README.md index 23ee560..1763b8a 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Deploy with composer: ```json ... "require": { - "kristuff/abuseipdb": ">=0.9.9-stable" + "kristuff/abuseipdb": ">=0.9.10-stable" }, ``` diff --git a/composer.json b/composer.json index 61b0af6..860a576 100644 --- a/composer.json +++ b/composer.json @@ -2,6 +2,7 @@ "name": "kristuff/abuseipdb", "description": "A PHP wrapper for AbuseIPDB API v2", "type": "library", + "keywords": ["abuseIPDB", "API"], "license": "MIT", "authors": [ { diff --git a/lib/ApiBase.php b/lib/ApiBase.php index e35a348..c0d029e 100644 --- a/lib/ApiBase.php +++ b/lib/ApiBase.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.9 + * @version 0.9.10 * @copyright 2020-2021 Kristuff */ @@ -47,9 +47,10 @@ abstract class ApiBase * shorname, id (string), long name * last paramter is false when the category cant' be used alone * + * @static * @var array */ - protected $aipdbApiCategories = [ + protected static $aipdbApiCategories = [ // Altering DNS records resulting in improper redirection. ['dns-c' , '1', 'DNS Compromise', true], @@ -134,25 +135,27 @@ abstract class ApiBase * Get the list of report categories * * @access public + * @static * * @return array */ - public function getCategories() + public static function getCategories(): array { - return $this->aipdbApiCategories; + return self::$aipdbApiCategories; } /** * Get the category id corresponding to given name * * @access public - * @param string $categoryName The report categoriy name + * @static + * @param string $categoryName The report category name * * @return string|bool The category id in string format if found, otherwise false */ - public function getCategoryIdbyName(string $categoryName) + public static function getCategoryIdbyName(string $categoryName) { - foreach ($this->aipdbApiCategories as $cat){ + foreach (self::$aipdbApiCategories as $cat){ if ($cat[0] === $categoryName) { return $cat; } @@ -166,13 +169,14 @@ abstract class ApiBase * Get the category name corresponding to given id * * @access public + * @static * @param string $categoryId The report category id * * @return string|bool The category name if found, otherwise false */ - public function getCategoryNameById(string $categoryId) + public static function getCategoryNameById(string $categoryId) { - foreach ($this->aipdbApiCategories as $cat){ + foreach (self::$aipdbApiCategories as $cat){ if ($cat[1] === $categoryId) { return $cat; } @@ -186,15 +190,16 @@ abstract class ApiBase * Get the index of category corresponding to given value * * @access protected + * @static * @param string $value The report category id or name * @param string $index The index in value array * * @return int|bool The category index if found, otherwise false */ - protected function getCategoryIndex(string $value, int $index) + protected static function getCategoryIndex(string $value, int $index) { $i = 0; - foreach ($this->aipdbApiCategories as $cat){ + foreach (self::$aipdbApiCategories as $cat){ if ($cat[$index] === $value) { return $i; } @@ -229,7 +234,7 @@ abstract class ApiBase foreach ($cats as $cat) { // get index on our array of categories - $catIndex = is_numeric($cat) ? $this->getCategoryIndex($cat, 1) : $this->getCategoryIndex($cat, 0); + $catIndex = is_numeric($cat) ? self::getCategoryIndex($cat, 1) : self::getCategoryIndex($cat, 0); // check if found if ($catIndex === false ){ @@ -237,13 +242,13 @@ abstract class ApiBase } // get Id - $catId = $this->aipdbApiCategories[$catIndex][1]; + $catId = self::$aipdbApiCategories[$catIndex][1]; // need another ? if ($needAnother !== false){ // is a standalone cat ? - if ($this->aipdbApiCategories[$catIndex][3] === false) { + if (self::$aipdbApiCategories[$catIndex][3] === false) { $needAnother = true; } else { diff --git a/lib/ApiHandler.php b/lib/ApiHandler.php index 549c985..7f93857 100644 --- a/lib/ApiHandler.php +++ b/lib/ApiHandler.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.9 + * @version 0.9.10 * @copyright 2020-2021 Kristuff */ @@ -33,9 +33,9 @@ class ApiHandler extends ApiBase use CurlTrait; /** - * @var string $version + * @var string */ - const VERSION = 'v0.9.9'; + const VERSION = 'v0.9.10'; /** * The ips to remove from report messages @@ -314,7 +314,7 @@ class ApiHandler extends ApiBase * @param bool $plainText True to get the response in plaintext list. Default is false * @param int $confidenceMinimum The abuse confidence score minimum (subscribers feature). Default is 100. * The confidence minimum must be between 25 and 100. - * This parameter is subscriber feature (not honored otherwise). + * This parameter is a subscriber feature (not honored otherwise). * * @return ApiResponse * @throws \RuntimeException diff --git a/lib/ApiResponse.php b/lib/ApiResponse.php index 1231c00..8fa3e3c 100644 --- a/lib/ApiResponse.php +++ b/lib/ApiResponse.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.9 + * @version 0.9.10 * @copyright 2020-2021 Kristuff */ @@ -50,7 +50,7 @@ class ApiResponse public function __construct(?string $plaintext = null) { $this->curlResponse = $plaintext; - $this->decodedResponse = json_decode($plaintext, false); + $this->decodedResponse = !empty($plaintext) ? json_decode($plaintext, false) : null; } /** @@ -112,4 +112,27 @@ class ApiResponse { return ($this->decodedResponse && $this->decodedResponse->errors) ? $this->decodedResponse->errors : []; } + + /** + * Get an internal error message in an ApiResponse object + * + * @access public + * @static + * @param string $message The error message + * + * @return ApiResponse + */ + public static function createErrorResponse(string $message): ApiResponse + { + $response = [ + "errors" => [ + [ + "title" => "Internal Error", + "detail" => $message + ] + ] + ]; + + return new ApiResponse(json_encode($response)); + } } \ No newline at end of file diff --git a/lib/CurlTrait.php b/lib/CurlTrait.php index bf73b1e..ba44556 100644 --- a/lib/CurlTrait.php +++ b/lib/CurlTrait.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.9 + * @version 0.9.10 * @copyright 2020-2021 Kristuff */ diff --git a/lib/InvalidPermissionException.php b/lib/InvalidPermissionException.php index bdf6ead..fd5b75c 100644 --- a/lib/InvalidPermissionException.php +++ b/lib/InvalidPermissionException.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.9 + * @version 0.9.10 * @copyright 2020-2021 Kristuff */ diff --git a/lib/SilentApiHandler.php b/lib/QuietApiHandler.php similarity index 77% rename from lib/SilentApiHandler.php rename to lib/QuietApiHandler.php index dd45bc2..0bea1ee 100644 --- a/lib/SilentApiHandler.php +++ b/lib/QuietApiHandler.php @@ -14,43 +14,21 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.9 + * @version 0.9.10 * @copyright 2020-2021 Kristuff */ namespace Kristuff\AbuseIPDB; /** - * Class SilentApiHandler + * Class QuietApiHandler * * Overwrite ApiHandler with Exception handling - * Instead of Exception, all method return an ApiResponse that may + * Instead of Exception, all methods return an ApiResponse that may * contains errors from the AbuseIPDB API, or internal errors */ -class SilentApiHandler extends ApiHandler +class QuietApiHandler extends ApiHandler { - /** - * Get an internal error message in an ApiResponse object - * - * @access public - * @param string $message The error message - * - * @return ApiResponse - */ - public function getErrorResponse(string $message): ApiResponse - { - $response = [ - "errors" => [ - [ - "title" => "Internal Error", - "detail" => $message - ] - ] - ]; - - return new ApiResponse(json_encode($response)); - } - /** * Performs a 'report' api request, with Exception handling * @@ -66,7 +44,7 @@ class SilentApiHandler extends ApiHandler try { return parent::report($ip,$categories,$message); } catch (\Exception $e) { - return $this->getErrorResponse($e->getMessage()); + return ApiResponse::createErrorResponse($e->getMessage()); } } @@ -83,7 +61,7 @@ class SilentApiHandler extends ApiHandler try { return parent::bulkReport($filePath); } catch (\Exception $e) { - return $this->getErrorResponse($e->getMessage()); + return ApiResponse::createErrorResponse($e->getMessage()); } } @@ -100,7 +78,7 @@ class SilentApiHandler extends ApiHandler try { return parent::clearAddress($ip); } catch (\Exception $e) { - return $this->getErrorResponse($e->getMessage()); + return ApiResponse::createErrorResponse($e->getMessage()); } } @@ -119,7 +97,7 @@ class SilentApiHandler extends ApiHandler try { return parent::check($ip, $maxAgeInDays, $verbose); } catch (\Exception $e) { - return $this->getErrorResponse($e->getMessage()); + return ApiResponse::createErrorResponse($e->getMessage()); } } @@ -137,7 +115,7 @@ class SilentApiHandler extends ApiHandler try { return parent::checkBlock($network, $maxAgeInDays); } catch (\Exception $e) { - return $this->getErrorResponse($e->getMessage()); + return ApiResponse::createErrorResponse($e->getMessage()); } } @@ -149,7 +127,7 @@ class SilentApiHandler extends ApiHandler * @param bool $plainText True to get the response in plaintext list. Default is false * @param int $confidenceMinimum The abuse confidence score minimum (subscribers feature). Default is 100. * The confidence minimum must be between 25 and 100. - * This parameter is subscriber feature (not honored otherwise). + * This parameter is a subscriber feature (not honored otherwise). * * @return ApiResponse */ @@ -158,7 +136,7 @@ class SilentApiHandler extends ApiHandler try { return parent::blacklist($limit, $plainText, $confidenceMinimum); } catch (\Exception $e) { - return $this->getErrorResponse($e->getMessage()); + return ApiResponse::createErrorResponse($e->getMessage()); } } } \ No newline at end of file From adff27d86db674b2ccdcfc0a2f42b38b2084bef6 Mon Sep 17 00:00:00 2001 From: kristuff Date: Tue, 23 Feb 2021 20:31:53 +0100 Subject: [PATCH 10/18] v0.9.11 **Fixed** - getCategoryIdByName and getCategoryNameById now return string (instead array) - IoT Targeted report category now named iot (instead of oit) --- README.md | 2 +- lib/ApiBase.php | 10 +++++----- lib/ApiHandler.php | 4 ++-- lib/ApiResponse.php | 2 +- lib/CurlTrait.php | 2 +- lib/InvalidPermissionException.php | 2 +- lib/QuietApiHandler.php | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 1763b8a..b9df5c3 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Deploy with composer: ```json ... "require": { - "kristuff/abuseipdb": ">=0.9.10-stable" + "kristuff/abuseipdb": ">=0.9.11-stable" }, ``` diff --git a/lib/ApiBase.php b/lib/ApiBase.php index c0d029e..2be1bd9 100644 --- a/lib/ApiBase.php +++ b/lib/ApiBase.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.10 + * @version 0.9.11 * @copyright 2020-2021 Kristuff */ @@ -128,7 +128,7 @@ abstract class ApiBase // Abuse was targeted at an "Internet of Things" type device. Include // information about what type of device was targeted in the comments. - ['oit' , '23', 'IoT Targeted', true], + ['iot' , '23', 'IoT Targeted', true], ]; /** @@ -153,11 +153,11 @@ abstract class ApiBase * * @return string|bool The category id in string format if found, otherwise false */ - public static function getCategoryIdbyName(string $categoryName) + public static function getCategoryIdByName(string $categoryName) { foreach (self::$aipdbApiCategories as $cat){ if ($cat[0] === $categoryName) { - return $cat; + return $cat[1]; } } @@ -178,7 +178,7 @@ abstract class ApiBase { foreach (self::$aipdbApiCategories as $cat){ if ($cat[1] === $categoryId) { - return $cat; + return $cat[0]; } } diff --git a/lib/ApiHandler.php b/lib/ApiHandler.php index 7f93857..2bf2d43 100644 --- a/lib/ApiHandler.php +++ b/lib/ApiHandler.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.10 + * @version 0.9.11 * @copyright 2020-2021 Kristuff */ @@ -35,7 +35,7 @@ class ApiHandler extends ApiBase /** * @var string */ - const VERSION = 'v0.9.10'; + const VERSION = 'v0.9.11'; /** * The ips to remove from report messages diff --git a/lib/ApiResponse.php b/lib/ApiResponse.php index 8fa3e3c..099e705 100644 --- a/lib/ApiResponse.php +++ b/lib/ApiResponse.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.10 + * @version 0.9.11 * @copyright 2020-2021 Kristuff */ diff --git a/lib/CurlTrait.php b/lib/CurlTrait.php index ba44556..18ce4f1 100644 --- a/lib/CurlTrait.php +++ b/lib/CurlTrait.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.10 + * @version 0.9.11 * @copyright 2020-2021 Kristuff */ diff --git a/lib/InvalidPermissionException.php b/lib/InvalidPermissionException.php index fd5b75c..27becac 100644 --- a/lib/InvalidPermissionException.php +++ b/lib/InvalidPermissionException.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.10 + * @version 0.9.11 * @copyright 2020-2021 Kristuff */ diff --git a/lib/QuietApiHandler.php b/lib/QuietApiHandler.php index 0bea1ee..96211d7 100644 --- a/lib/QuietApiHandler.php +++ b/lib/QuietApiHandler.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.10 + * @version 0.9.11 * @copyright 2020-2021 Kristuff */ From 37b0a2eaa99daf065957b0f2f57da5c32b824e56 Mon Sep 17 00:00:00 2001 From: kristuff Date: Sun, 4 Jul 2021 13:09:24 +0200 Subject: [PATCH 11/18] v0.9.12 **Fixed** - Incorrect return type in `ApiResponse::getObject()` method (bug introduced in v0.9.8 with PHP strict types) - cleaning, typos --- .gitignore | 2 -- README.md | 5 ++--- composer.json | 4 +++- lib/ApiBase.php | 10 +++++----- lib/ApiHandler.php | 8 ++++---- lib/ApiResponse.php | 10 +++++----- lib/CurlTrait.php | 6 +++--- lib/InvalidPermissionException.php | 6 +++--- lib/QuietApiHandler.php | 6 +++--- 9 files changed, 28 insertions(+), 29 deletions(-) diff --git a/.gitignore b/.gitignore index 25d109d..208a599 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1 @@ -_* -.old* vendor/* \ No newline at end of file diff --git a/README.md b/README.md index b9df5c3..bcb3ae3 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Deploy with composer: ```json ... "require": { - "kristuff/abuseipdb": ">=0.9.11-stable" + "kristuff/abuseipdb": "^0.9.12-stable" }, ``` @@ -41,8 +41,7 @@ More infos - [Project website](https://kristuff.fr/projects/abuseipdb) - [Api documentation](https://kristuff.fr/projects/abuseipdb/doc) -- [Config/Install guide](https://kristuff.fr/projects/abuseipdb/technical#configuration) -- [CLI version](https://kristuff.fr/projects/abuseipdbcli) +- CLI version: [github](https://github.com/kristuff/abuseipdb-cli) | [website](https://kristuff.fr/projects/abuseipdbcli) License diff --git a/composer.json b/composer.json index 860a576..d473e9d 100644 --- a/composer.json +++ b/composer.json @@ -7,7 +7,9 @@ "authors": [ { "name": "Kristuff", - "homepage": "https://github.com/kristuff" + "homepage": "https://github.com/kristuff", + "email": "kristuff@kristuff.fr", + "role": "Developer" } ], "require": { diff --git a/lib/ApiBase.php b/lib/ApiBase.php index 2be1bd9..366d606 100644 --- a/lib/ApiBase.php +++ b/lib/ApiBase.php @@ -7,14 +7,14 @@ * / ___ \| |_) | |_| \__ \ __/| || __/| |_| | |_) | * /_/ \_\_.__/ \__,_|___/\___|___|_| |____/|____/ * - * This file is part of Kristuff\AbsuseIPDB. + * This file is part of Kristuff\AbuseIPDB. * - * (c) Kristuff + * (c) Kristuff * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.11 + * @version 0.9.12 * @copyright 2020-2021 Kristuff */ @@ -44,8 +44,8 @@ abstract class ApiBase /** * AbuseIPDB API v2 categories - * shorname, id (string), long name - * last paramter is false when the category cant' be used alone + * shortname, id (string), long name + * last parameter is false when the category can't be used alone * * @static * @var array diff --git a/lib/ApiHandler.php b/lib/ApiHandler.php index 2bf2d43..6b800bd 100644 --- a/lib/ApiHandler.php +++ b/lib/ApiHandler.php @@ -7,14 +7,14 @@ * / ___ \| |_) | |_| \__ \ __/| || __/| |_| | |_) | * /_/ \_\_.__/ \__,_|___/\___|___|_| |____/|____/ * - * This file is part of Kristuff\AbsuseIPDB. + * This file is part of Kristuff\AbuseIPDB. * - * (c) Kristuff + * (c) Kristuff * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.11 + * @version 0.9.12 * @copyright 2020-2021 Kristuff */ @@ -35,7 +35,7 @@ class ApiHandler extends ApiBase /** * @var string */ - const VERSION = 'v0.9.11'; + const VERSION = 'v0.9.12'; /** * The ips to remove from report messages diff --git a/lib/ApiResponse.php b/lib/ApiResponse.php index 099e705..0a7b50a 100644 --- a/lib/ApiResponse.php +++ b/lib/ApiResponse.php @@ -7,14 +7,14 @@ * / ___ \| |_) | |_| \__ \ __/| || __/| |_| | |_) | * /_/ \_\_.__/ \__,_|___/\___|___|_| |____/|____/ * - * This file is part of Kristuff\AbsuseIPDB. + * This file is part of Kristuff\AbuseIPDB. * - * (c) Kristuff + * (c) Kristuff * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.11 + * @version 0.9.12 * @copyright 2020-2021 Kristuff */ @@ -70,9 +70,9 @@ class ApiResponse * * @access public * - * @return object|null + * @return \stdClass|null */ - public function getObject(): ?object + public function getObject(): ?\stdClass { return $this->decodedResponse; } diff --git a/lib/CurlTrait.php b/lib/CurlTrait.php index 18ce4f1..683c5e5 100644 --- a/lib/CurlTrait.php +++ b/lib/CurlTrait.php @@ -7,14 +7,14 @@ * / ___ \| |_) | |_| \__ \ __/| || __/| |_| | |_) | * /_/ \_\_.__/ \__,_|___/\___|___|_| |____/|____/ * - * This file is part of Kristuff\AbsuseIPDB. + * This file is part of Kristuff\AbuseIPDB. * - * (c) Kristuff + * (c) Kristuff * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.11 + * @version 0.9.12 * @copyright 2020-2021 Kristuff */ diff --git a/lib/InvalidPermissionException.php b/lib/InvalidPermissionException.php index 27becac..9183df9 100644 --- a/lib/InvalidPermissionException.php +++ b/lib/InvalidPermissionException.php @@ -7,14 +7,14 @@ * / ___ \| |_) | |_| \__ \ __/| || __/| |_| | |_) | * /_/ \_\_.__/ \__,_|___/\___|___|_| |____/|____/ * - * This file is part of Kristuff\AbsuseIPDB. + * This file is part of Kristuff\AbuseIPDB. * - * (c) Kristuff + * (c) Kristuff * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.11 + * @version 0.9.12 * @copyright 2020-2021 Kristuff */ diff --git a/lib/QuietApiHandler.php b/lib/QuietApiHandler.php index 96211d7..8995c33 100644 --- a/lib/QuietApiHandler.php +++ b/lib/QuietApiHandler.php @@ -7,14 +7,14 @@ * / ___ \| |_) | |_| \__ \ __/| || __/| |_| | |_) | * /_/ \_\_.__/ \__,_|___/\___|___|_| |____/|____/ * - * This file is part of Kristuff\AbsuseIPDB. + * This file is part of Kristuff\AbuseIPDB. * - * (c) Kristuff + * (c) Kristuff * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.11 + * @version 0.9.12 * @copyright 2020-2021 Kristuff */ From c4b5c655981577f5fe106b53812791dd6ea840b6 Mon Sep 17 00:00:00 2001 From: kristuff Date: Sat, 18 Sep 2021 21:41:42 +0200 Subject: [PATCH 12/18] Fix #3 Check *properly* if property exists to prevent PHP notice. --- lib/ApiResponse.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ApiResponse.php b/lib/ApiResponse.php index 0a7b50a..d1393b6 100644 --- a/lib/ApiResponse.php +++ b/lib/ApiResponse.php @@ -110,7 +110,7 @@ class ApiResponse */ public function errors(): array { - return ($this->decodedResponse && $this->decodedResponse->errors) ? $this->decodedResponse->errors : []; + return ($this->decodedResponse && property_exists($this->decodedResponse, 'errors')) ? $this->decodedResponse->errors : []; } /** From 3ab67950a1e7ee1e9b23f9afc45a1f553a79b3c8 Mon Sep 17 00:00:00 2001 From: kristuff Date: Sat, 18 Sep 2021 21:42:24 +0200 Subject: [PATCH 13/18] v0.9.13 --- README.md | 2 +- lib/ApiBase.php | 2 +- lib/ApiHandler.php | 4 ++-- lib/ApiResponse.php | 2 +- lib/CurlTrait.php | 2 +- lib/InvalidPermissionException.php | 2 +- lib/QuietApiHandler.php | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index bcb3ae3..a924182 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Deploy with composer: ```json ... "require": { - "kristuff/abuseipdb": "^0.9.12-stable" + "kristuff/abuseipdb": "^0.9.13-stable" }, ``` diff --git a/lib/ApiBase.php b/lib/ApiBase.php index 366d606..30f5002 100644 --- a/lib/ApiBase.php +++ b/lib/ApiBase.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.12 + * @version 0.9.13 * @copyright 2020-2021 Kristuff */ diff --git a/lib/ApiHandler.php b/lib/ApiHandler.php index 6b800bd..69255ef 100644 --- a/lib/ApiHandler.php +++ b/lib/ApiHandler.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.12 + * @version 0.9.13 * @copyright 2020-2021 Kristuff */ @@ -35,7 +35,7 @@ class ApiHandler extends ApiBase /** * @var string */ - const VERSION = 'v0.9.12'; + const VERSION = 'v0.9.13'; /** * The ips to remove from report messages diff --git a/lib/ApiResponse.php b/lib/ApiResponse.php index d1393b6..c5e7210 100644 --- a/lib/ApiResponse.php +++ b/lib/ApiResponse.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.12 + * @version 0.9.13 * @copyright 2020-2021 Kristuff */ diff --git a/lib/CurlTrait.php b/lib/CurlTrait.php index 683c5e5..3effad8 100644 --- a/lib/CurlTrait.php +++ b/lib/CurlTrait.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.12 + * @version 0.9.13 * @copyright 2020-2021 Kristuff */ diff --git a/lib/InvalidPermissionException.php b/lib/InvalidPermissionException.php index 9183df9..57e4a14 100644 --- a/lib/InvalidPermissionException.php +++ b/lib/InvalidPermissionException.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.12 + * @version 0.9.13 * @copyright 2020-2021 Kristuff */ diff --git a/lib/QuietApiHandler.php b/lib/QuietApiHandler.php index 8995c33..d06d835 100644 --- a/lib/QuietApiHandler.php +++ b/lib/QuietApiHandler.php @@ -14,7 +14,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.12 + * @version 0.9.13 * @copyright 2020-2021 Kristuff */ From d1d9cf9ad0fcac083e4c24aa009850e43e83cf24 Mon Sep 17 00:00:00 2001 From: kristuff Date: Mon, 6 Dec 2021 21:40:39 +0100 Subject: [PATCH 14/18] v0.9.14 **Changes** - **New**: the `ApiHandler` (and `QuietApiHandler`) constructor takes now a **timeout** in third parameter. The timeout is expressed in **milliseconds** . The timeout will apply to all API request methods (will raise exception if reached out). Default is **0** (no timeout). - Formatting --- README.md | 2 +- lib/ApiBase.php | 13 +++--- lib/ApiHandler.php | 65 ++++++++++++++++++++++-------- lib/ApiResponse.php | 13 +++--- lib/CurlTrait.php | 13 +++--- lib/InvalidPermissionException.php | 13 +++--- lib/QuietApiHandler.php | 13 +++--- 7 files changed, 80 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index a924182..451e100 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Deploy with composer: ```json ... "require": { - "kristuff/abuseipdb": "^0.9.13-stable" + "kristuff/abuseipdb": "^0.9.14-stable" }, ``` diff --git a/lib/ApiBase.php b/lib/ApiBase.php index 30f5002..238237a 100644 --- a/lib/ApiBase.php +++ b/lib/ApiBase.php @@ -1,12 +1,11 @@ @@ -14,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.13 + * @version 0.9.14 * @copyright 2020-2021 Kristuff */ diff --git a/lib/ApiHandler.php b/lib/ApiHandler.php index 69255ef..b878010 100644 --- a/lib/ApiHandler.php +++ b/lib/ApiHandler.php @@ -1,12 +1,11 @@ @@ -14,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.13 + * @version 0.9.14 * @copyright 2020-2021 Kristuff */ @@ -35,7 +34,7 @@ class ApiHandler extends ApiBase /** * @var string */ - const VERSION = 'v0.9.13'; + const VERSION = 'v0.9.14'; /** * The ips to remove from report messages @@ -46,18 +45,31 @@ class ApiHandler extends ApiBase */ protected $selfIps = []; + /** + * The maximum number of milliseconds to allow cURL functions to execute. If libcurl is + * built to use the standard system name resolver, that portion of the connect will still + * use full-second resolution for timeouts with a minimum timeout allowed of one second. + * + * @access protected + * @var int + */ + protected $timeout = 0; + /** * Constructor * * @access public * @param string $apiKey The AbuseIPDB api key * @param array $myIps The Ips/domain name you don't want to display in report messages + * @param int $timeout The maximum number of milliseconds to allow internal cURL functions + * to execute. Default is 0, no timeout * */ - public function __construct(string $apiKey, array $myIps = []) + public function __construct(string $apiKey, array $myIps = [], int $timeout = 0) { $this->aipdbApiKey = $apiKey; $this->selfIps = $myIps; + $this->timeout = $timeout; } /** @@ -72,6 +84,7 @@ class ApiHandler extends ApiBase return array( 'apiKey' => $this->aipdbApiKey, 'selfIps' => $this->selfIps, + 'timeout' => $this->timeout, ); } @@ -160,6 +173,7 @@ class ApiHandler extends ApiBase * @return ApiResponse * @throws \RuntimeException * @throws \InvalidArgumentException + * @throws InvalidPermissionException */ public function bulkReport(string $filePath): ApiResponse { @@ -356,9 +370,10 @@ class ApiHandler extends ApiBase */ protected function apiRequest(string $path, array $data, string $method = 'GET', string $csvFilePath = ''): ApiResponse { - // set api url - $url = $this->aipdbApiEndpoint . $path; - + $curlErrorNumber = -1; // will be used later to check curl execution + $curlErrorMessage = ''; + $url = $this->aipdbApiEndpoint . $path; // api url + // set the wanted format, JSON (required to prevent having full html page on error) // and the AbuseIPDB API Key as a header $headers = [ @@ -386,17 +401,35 @@ class ApiHandler extends ApiBase $url .= '?' . http_build_query($data); } - // set the url to call + // set url and options $this->setCurlOption($ch, CURLOPT_URL, $url); $this->setCurlOption($ch, CURLOPT_RETURNTRANSFER, 1); $this->setCurlOption($ch, CURLOPT_HTTPHEADER, $headers); - + + /** + * set timeout + * + * @see https://curl.se/libcurl/c/CURLOPT_TIMEOUT_MS.html + * @see https://curl.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html + * If libcurl is built to use the standard system name resolver, that portion of the transfer + * will still use full-second resolution for timeouts with a minimum timeout allowed of one second. + * In unix-like systems, this might cause signals to be used unless CURLOPT_NOSIGNAL is set. + */ + $this->setCurlOption($ch, CURLOPT_NOSIGNAL, 1); + $this->setCurlOption($ch, CURLOPT_TIMEOUT_MS, $this->timeout); + // execute curl call $result = curl_exec($ch); - + $curlErrorNumber = curl_errno($ch); + $curlErrorMessage = curl_error($ch); + // close connection curl_close($ch); - + + if ($curlErrorNumber !== 0){ + throw new \RuntimeException($curlErrorMessage); + } + return new ApiResponse($result !== false ? $result : ''); } diff --git a/lib/ApiResponse.php b/lib/ApiResponse.php index c5e7210..d4abd1b 100644 --- a/lib/ApiResponse.php +++ b/lib/ApiResponse.php @@ -1,12 +1,11 @@ @@ -14,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.13 + * @version 0.9.14 * @copyright 2020-2021 Kristuff */ diff --git a/lib/CurlTrait.php b/lib/CurlTrait.php index 3effad8..cbacf0f 100644 --- a/lib/CurlTrait.php +++ b/lib/CurlTrait.php @@ -1,12 +1,11 @@ @@ -14,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.13 + * @version 0.9.14 * @copyright 2020-2021 Kristuff */ diff --git a/lib/InvalidPermissionException.php b/lib/InvalidPermissionException.php index 57e4a14..14e34aa 100644 --- a/lib/InvalidPermissionException.php +++ b/lib/InvalidPermissionException.php @@ -1,12 +1,11 @@ @@ -14,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.13 + * @version 0.9.14 * @copyright 2020-2021 Kristuff */ diff --git a/lib/QuietApiHandler.php b/lib/QuietApiHandler.php index d06d835..2c69d81 100644 --- a/lib/QuietApiHandler.php +++ b/lib/QuietApiHandler.php @@ -1,12 +1,11 @@ @@ -14,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.13 + * @version 0.9.14 * @copyright 2020-2021 Kristuff */ From dc30007818db41e37c587225e74ae87bf3e1bf1b Mon Sep 17 00:00:00 2001 From: kristuff Date: Wed, 8 Dec 2021 20:42:33 +0100 Subject: [PATCH 15/18] v0.9.15 **Changes** - **New** `ApiHandler::setTimeout(int $timeout)` method allows to change default timeout before any API request. Timeout is expressed in milliseconds. Overwrites the value passed in constructor, useful when performing multiple queries with same handler but different timeout. --- README.md | 5 +++-- lib/ApiBase.php | 2 +- lib/ApiHandler.php | 19 +++++++++++++++++-- lib/ApiResponse.php | 2 +- lib/CurlTrait.php | 2 +- lib/InvalidPermissionException.php | 2 +- lib/QuietApiHandler.php | 2 +- 7 files changed, 25 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 451e100..411be3d 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,8 @@ Features - Single IP report request **✓** - Bulk report request (send `csv` file) **✓** - Clear IP address request (remove your own reports) **✓** -- Auto cleaning report comments from sensitive data (email, custom ip/domain names list) **✓** +- Auto cleaning report comments from sensitive data (email, custom ip/domain names list) **✓** +- Define timeout for cURL internal requests **✓** Requirements ------------ @@ -32,7 +33,7 @@ Deploy with composer: ```json ... "require": { - "kristuff/abuseipdb": "^0.9.14-stable" + "kristuff/abuseipdb": "^0.9.15-stable" }, ``` diff --git a/lib/ApiBase.php b/lib/ApiBase.php index 238237a..78c83eb 100644 --- a/lib/ApiBase.php +++ b/lib/ApiBase.php @@ -13,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.14 + * @version 0.9.15 * @copyright 2020-2021 Kristuff */ diff --git a/lib/ApiHandler.php b/lib/ApiHandler.php index b878010..a6326c2 100644 --- a/lib/ApiHandler.php +++ b/lib/ApiHandler.php @@ -13,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.14 + * @version 0.9.15 * @copyright 2020-2021 Kristuff */ @@ -34,7 +34,7 @@ class ApiHandler extends ApiBase /** * @var string */ - const VERSION = 'v0.9.14'; + const VERSION = 'v0.9.15'; /** * The ips to remove from report messages @@ -72,6 +72,21 @@ class ApiHandler extends ApiBase $this->timeout = $timeout; } + /** + * Sets the cURL timeout (apply then to any API request). Overwrites the value passed in + * constructor, useful when performing multiple queries with same handler but different timeout. + * + * @access public + * @param int $timeout The maximum number of milliseconds to allow internal cURL functions + * to execute. + * + * @return void + */ + public function setTimeout(int $timeout): void + { + $this->timeout = $timeout; + } + /** * Get the current configuration in a indexed array * diff --git a/lib/ApiResponse.php b/lib/ApiResponse.php index d4abd1b..8b184f0 100644 --- a/lib/ApiResponse.php +++ b/lib/ApiResponse.php @@ -13,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.14 + * @version 0.9.15 * @copyright 2020-2021 Kristuff */ diff --git a/lib/CurlTrait.php b/lib/CurlTrait.php index cbacf0f..abce7bd 100644 --- a/lib/CurlTrait.php +++ b/lib/CurlTrait.php @@ -13,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.14 + * @version 0.9.15 * @copyright 2020-2021 Kristuff */ diff --git a/lib/InvalidPermissionException.php b/lib/InvalidPermissionException.php index 14e34aa..f0b6acb 100644 --- a/lib/InvalidPermissionException.php +++ b/lib/InvalidPermissionException.php @@ -13,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.14 + * @version 0.9.15 * @copyright 2020-2021 Kristuff */ diff --git a/lib/QuietApiHandler.php b/lib/QuietApiHandler.php index 2c69d81..650df31 100644 --- a/lib/QuietApiHandler.php +++ b/lib/QuietApiHandler.php @@ -13,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.14 + * @version 0.9.15 * @copyright 2020-2021 Kristuff */ From 5639f1813a7be889c9028f722e9fe252bac34df1 Mon Sep 17 00:00:00 2001 From: kristuff Date: Wed, 26 Jan 2022 22:24:24 +0100 Subject: [PATCH 16/18] v1.0 --- LICENSE | 2 +- README.md | 4 ++-- lib/ApiBase.php | 4 ++-- lib/ApiHandler.php | 6 +++--- lib/ApiResponse.php | 4 ++-- lib/CurlTrait.php | 4 ++-- lib/InvalidPermissionException.php | 4 ++-- lib/QuietApiHandler.php | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/LICENSE b/LICENSE index 007d465..933b544 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020-2021 kristuff +Copyright (c) 2020-2022 kristuff Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 411be3d..0a12038 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Deploy with composer: ```json ... "require": { - "kristuff/abuseipdb": "^0.9.15-stable" + "kristuff/abuseipdb": "^1.0-stable" }, ``` @@ -50,7 +50,7 @@ License The MIT License (MIT) -Copyright (c) 2020-2021 Kristuff +Copyright (c) 2020-2022 Kristuff Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/lib/ApiBase.php b/lib/ApiBase.php index 78c83eb..e48440b 100644 --- a/lib/ApiBase.php +++ b/lib/ApiBase.php @@ -13,8 +13,8 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.15 - * @copyright 2020-2021 Kristuff + * @version 1.0 + * @copyright 2020-2022 Kristuff */ namespace Kristuff\AbuseIPDB; diff --git a/lib/ApiHandler.php b/lib/ApiHandler.php index a6326c2..9549260 100644 --- a/lib/ApiHandler.php +++ b/lib/ApiHandler.php @@ -13,8 +13,8 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.15 - * @copyright 2020-2021 Kristuff + * @version 1.0 + * @copyright 2020-2022 Kristuff */ namespace Kristuff\AbuseIPDB; @@ -34,7 +34,7 @@ class ApiHandler extends ApiBase /** * @var string */ - const VERSION = 'v0.9.15'; + const VERSION = 'v1.0'; /** * The ips to remove from report messages diff --git a/lib/ApiResponse.php b/lib/ApiResponse.php index 8b184f0..92f866a 100644 --- a/lib/ApiResponse.php +++ b/lib/ApiResponse.php @@ -13,8 +13,8 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.15 - * @copyright 2020-2021 Kristuff + * @version 1.0 + * @copyright 2020-2022 Kristuff */ namespace Kristuff\AbuseIPDB; diff --git a/lib/CurlTrait.php b/lib/CurlTrait.php index abce7bd..ee71cf0 100644 --- a/lib/CurlTrait.php +++ b/lib/CurlTrait.php @@ -13,8 +13,8 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.15 - * @copyright 2020-2021 Kristuff + * @version 1.0 + * @copyright 2020-2022 Kristuff */ namespace Kristuff\AbuseIPDB; diff --git a/lib/InvalidPermissionException.php b/lib/InvalidPermissionException.php index f0b6acb..dcc6157 100644 --- a/lib/InvalidPermissionException.php +++ b/lib/InvalidPermissionException.php @@ -13,8 +13,8 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.15 - * @copyright 2020-2021 Kristuff + * @version 1.0 + * @copyright 2020-2022 Kristuff */ namespace Kristuff\AbuseIPDB; diff --git a/lib/QuietApiHandler.php b/lib/QuietApiHandler.php index 650df31..a272d58 100644 --- a/lib/QuietApiHandler.php +++ b/lib/QuietApiHandler.php @@ -13,8 +13,8 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 0.9.15 - * @copyright 2020-2021 Kristuff + * @version 1.0 + * @copyright 2020-2022 Kristuff */ namespace Kristuff\AbuseIPDB; From af62240932bc54461702f96146a1e5feb77493f0 Mon Sep 17 00:00:00 2001 From: kristuff Date: Thu, 6 Oct 2022 00:14:00 +0200 Subject: [PATCH 17/18] Update email pattern in `cleanMessage()` method Update email pattern to handle local addresses without TLD and to allow using the caracter `@` in custom message. Close #4 --- lib/ApiHandler.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ApiHandler.php b/lib/ApiHandler.php index 9549260..a096706 100644 --- a/lib/ApiHandler.php +++ b/lib/ApiHandler.php @@ -469,8 +469,8 @@ class ApiHandler extends ApiBase } // If we're reporting spam, further munge any email addresses in the report - $emailPattern = "/[^@\s]*@[^@\s]*\.[^@\s]*/"; - $message = preg_replace($emailPattern, "*", $message); + $emailPattern = "/\b[A-Z0-9!#$%&'*`\/?^{|}~=+_.-]+@[A-Z0-9.-]+\b/i"; + $message = preg_replace($emailPattern, "*", $message); // Make sure message is less 1024 chars return substr($message, 0, 1024); From d7b635875a27efe72967ae031dcc8f79b8aa42d5 Mon Sep 17 00:00:00 2001 From: kristuff Date: Thu, 6 Oct 2022 00:16:16 +0200 Subject: [PATCH 18/18] v1.1 - Fixed: Update email pattern in `cleanMessage()` method to handle local addresses without TLD and to allow using the caracter `@` in custom message. Close #4 --- README.md | 2 +- lib/ApiBase.php | 2 +- lib/ApiHandler.php | 4 ++-- lib/ApiResponse.php | 2 +- lib/CurlTrait.php | 2 +- lib/InvalidPermissionException.php | 2 +- lib/QuietApiHandler.php | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 0a12038..d7946f1 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Deploy with composer: ```json ... "require": { - "kristuff/abuseipdb": "^1.0-stable" + "kristuff/abuseipdb": "^1.1-stable" }, ``` diff --git a/lib/ApiBase.php b/lib/ApiBase.php index e48440b..9adf14c 100644 --- a/lib/ApiBase.php +++ b/lib/ApiBase.php @@ -13,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 1.0 + * @version 1.1 * @copyright 2020-2022 Kristuff */ diff --git a/lib/ApiHandler.php b/lib/ApiHandler.php index a096706..2cee02c 100644 --- a/lib/ApiHandler.php +++ b/lib/ApiHandler.php @@ -13,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 1.0 + * @version 1.1 * @copyright 2020-2022 Kristuff */ @@ -34,7 +34,7 @@ class ApiHandler extends ApiBase /** * @var string */ - const VERSION = 'v1.0'; + const VERSION = 'v1.1'; /** * The ips to remove from report messages diff --git a/lib/ApiResponse.php b/lib/ApiResponse.php index 92f866a..3e451f0 100644 --- a/lib/ApiResponse.php +++ b/lib/ApiResponse.php @@ -13,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 1.0 + * @version 1.1 * @copyright 2020-2022 Kristuff */ diff --git a/lib/CurlTrait.php b/lib/CurlTrait.php index ee71cf0..667fdda 100644 --- a/lib/CurlTrait.php +++ b/lib/CurlTrait.php @@ -13,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 1.0 + * @version 1.1 * @copyright 2020-2022 Kristuff */ diff --git a/lib/InvalidPermissionException.php b/lib/InvalidPermissionException.php index dcc6157..8ec9bc1 100644 --- a/lib/InvalidPermissionException.php +++ b/lib/InvalidPermissionException.php @@ -13,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 1.0 + * @version 1.1 * @copyright 2020-2022 Kristuff */ diff --git a/lib/QuietApiHandler.php b/lib/QuietApiHandler.php index a272d58..632b140 100644 --- a/lib/QuietApiHandler.php +++ b/lib/QuietApiHandler.php @@ -13,7 +13,7 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * - * @version 1.0 + * @version 1.1 * @copyright 2020-2022 Kristuff */