Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
903d3e47d5 |
@@ -17,7 +17,7 @@ require_once('config.php');
|
|||||||
* Check whether the cURL module supports SSL
|
* Check whether the cURL module supports SSL
|
||||||
*/
|
*/
|
||||||
if (!curl_version()['features'] & CURL_VERSION_SSL) {
|
if (!curl_version()['features'] & CURL_VERSION_SSL) {
|
||||||
print 'SSL is not supported with this cURL installation!' . PHP_EOL;
|
print PHP_EOL . 'SSL is not supported with this cURL installation!' . PHP_EOL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -25,44 +25,48 @@ if (!curl_version()['features'] & CURL_VERSION_SSL) {
|
|||||||
*/
|
*/
|
||||||
$ch = curl_init();
|
$ch = curl_init();
|
||||||
|
|
||||||
/**
|
if (is_resource($ch)) {
|
||||||
* Set the required cURL options
|
/**
|
||||||
*/
|
* If we have a resource, we proceed and set the required cURL options
|
||||||
curl_setopt($ch, CURLOPT_URL, $controllerurl);
|
*/
|
||||||
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
|
curl_setopt($ch, CURLOPT_URL, $controllerurl);
|
||||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
|
||||||
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||||||
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This cURL option can have a value of 0-6
|
* This cURL option can have a value of 0-6
|
||||||
* see this URL for more details:
|
* see this URL for more details:
|
||||||
* http://php.net/manual/en/function.curl-setopt.php
|
* http://php.net/manual/en/function.curl-setopt.php
|
||||||
* 0 is the default value and is used by the PHP API client class
|
* 0 is the default value and is used by the PHP API client class
|
||||||
*/
|
*/
|
||||||
curl_setopt($ch, CURLOPT_SSLVERSION, 0);
|
curl_setopt($ch, CURLOPT_SSLVERSION, 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Be more verbose
|
* Be more verbose
|
||||||
*/
|
*/
|
||||||
curl_setopt($ch, CURLOPT_VERBOSE, true);
|
curl_setopt($ch, CURLOPT_VERBOSE, true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* $results contains the output as returned by the cURL request,
|
* $results contains the output as returned by the cURL request,
|
||||||
* returns true when successful, else returns false
|
* returns true when successful, else returns false
|
||||||
*/
|
*/
|
||||||
print 'verbose output from the cURL request:' . PHP_EOL;
|
print PHP_EOL . 'verbose output from the cURL request:' . PHP_EOL;
|
||||||
$results = curl_exec($ch);
|
$results = curl_exec($ch);
|
||||||
|
|
||||||
print PHP_EOL . 'curl_getinfo output:' . PHP_EOL;
|
print PHP_EOL . 'curl_getinfo output:' . PHP_EOL;
|
||||||
print_r(curl_getinfo($ch));
|
print_r(curl_getinfo($ch));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If we receive a cURL error, output it before the results
|
* If we receive a cURL error, output it before the results
|
||||||
*/
|
*/
|
||||||
if (curl_errno($ch)) {
|
if (curl_errno($ch)) {
|
||||||
print PHP_EOL . 'cURL error: ' . curl_error($ch) . PHP_EOL;
|
print PHP_EOL . 'cURL error: ' . curl_error($ch) . PHP_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
|
print PHP_EOL . '$results:' . PHP_EOL;
|
||||||
|
print_r($results);
|
||||||
|
print PHP_EOL;
|
||||||
|
} else {
|
||||||
|
print PHP_EOL . 'ERROR: cURL could not be initialized!' . PHP_EOL;
|
||||||
}
|
}
|
||||||
|
|
||||||
print PHP_EOL . '$results:' . PHP_EOL;
|
|
||||||
print_r($results);
|
|
||||||
print PHP_EOL;
|
|
||||||
132
src/Client.php
132
src/Client.php
@@ -84,7 +84,6 @@ class Client
|
|||||||
|
|
||||||
$this->check_base_url();
|
$this->check_base_url();
|
||||||
$this->check_site($this->site);
|
$this->check_site($this->site);
|
||||||
$this->update_unificookie();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -126,6 +125,12 @@ class Client
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($this->update_unificookie()) {
|
||||||
|
$this->is_loggedin = true;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* check whether we have a "regular" controller or one based on UniFi OS
|
* check whether we have a "regular" controller or one based on UniFi OS
|
||||||
*/
|
*/
|
||||||
@@ -205,9 +210,16 @@ class Client
|
|||||||
$this->cookies = implode(';', $results[1]);
|
$this->cookies = implode(';', $results[1]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* accept cookies from UniFi OS or from regular UNiFI controllers
|
* accept cookies from regular UniFI controllers or from UniFi OS
|
||||||
*/
|
*/
|
||||||
if (strpos($this->cookies, 'unifises') !== false || strpos($this->cookies, 'TOKEN') !== false) {
|
if (strpos($this->cookies, 'unifises') !== false || strpos($this->cookies, 'TOKEN') !== false) {
|
||||||
|
/**
|
||||||
|
* update the cookie value in $_SESSION['unificookie'], if it exists
|
||||||
|
*/
|
||||||
|
if (isset($_SESSION['unificookie'])) {
|
||||||
|
$_SESSION['unificookie'] = $this->cookies;
|
||||||
|
}
|
||||||
|
|
||||||
return $this->is_loggedin = true;
|
return $this->is_loggedin = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3921,13 +3933,12 @@ class Client
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the unificookie
|
* Update the unificookie if sessions are enabled
|
||||||
*/
|
*/
|
||||||
private function update_unificookie()
|
private function update_unificookie()
|
||||||
{
|
{
|
||||||
if (isset($_SESSION['unificookie']) && !empty($_SESSION['unificookie'])) {
|
if (session_status() === PHP_SESSION_ACTIVE && isset($_SESSION['unificookie']) && !empty($_SESSION['unificookie'])) {
|
||||||
$this->cookies = $_SESSION['unificookie'];
|
$this->cookies = $_SESSION['unificookie'];
|
||||||
$this->is_loggedin = true;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* if we have a JWT in our cookie we know we're dealing with a UniFi OS controller
|
* if we have a JWT in our cookie we know we're dealing with a UniFi OS controller
|
||||||
@@ -4039,76 +4050,63 @@ class Client
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* has the Cookie/Token expired? If so, we need to login again.
|
* an HTTP response code 401 (Unauthorized) indicates the Cookie/Token has expired in which case
|
||||||
|
* we need to login again.
|
||||||
*/
|
*/
|
||||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||||
|
|
||||||
if ($http_code == 401) {
|
if ($http_code == 401) {
|
||||||
$json_decoded_content = json_decode($content, true);
|
curl_close($ch);
|
||||||
|
if ($this->debug) {
|
||||||
if (isset($json_decoded_content['meta']['msg']) && $json_decoded_content['meta']['msg'] === 'api.err.LoginRequired') {
|
error_log('cURL debug: needed to reconnect to UniFi controller');
|
||||||
if ($this->debug) {
|
|
||||||
error_log('cURL debug: needed to reconnect to UniFi controller');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* explicitly clear the expired Cookie/Token now
|
|
||||||
*/
|
|
||||||
if (isset($_SESSION['unificookie'])) {
|
|
||||||
$_SESSION['unificookie'] = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* then login again
|
|
||||||
*/
|
|
||||||
$this->login();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* when login was successful, execute the same command again
|
|
||||||
*/
|
|
||||||
if ($this->is_loggedin) {
|
|
||||||
curl_close($ch);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* setup the cookie for the user within $_SESSION, if $_SESSION['unificookie'] does not exist
|
|
||||||
*/
|
|
||||||
if (!isset($_SESSION['unificookie']) && session_status() != PHP_SESSION_DISABLED) {
|
|
||||||
$_SESSION['unificookie'] = $this->cookies;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->exec_curl($path, $payload);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unset($json_decoded_content);
|
/**
|
||||||
}
|
* explicitly clear the expired Cookie/Token before logging in again
|
||||||
|
*/
|
||||||
if ($this->debug) {
|
if (isset($_SESSION['unificookie'])) {
|
||||||
print PHP_EOL . '<pre>';
|
$_SESSION['unificookie'] = '';
|
||||||
print PHP_EOL . '---------cURL INFO-----------' . PHP_EOL;
|
$this->is_loggedin = false;
|
||||||
print_r(curl_getinfo($ch));
|
|
||||||
print PHP_EOL . '-------URL & PAYLOAD---------' . PHP_EOL;
|
|
||||||
print $url . PHP_EOL;
|
|
||||||
if (empty($json_payload)) {
|
|
||||||
print 'empty payload';
|
|
||||||
} else {
|
|
||||||
print $json_payload;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
print PHP_EOL . '----------RESPONSE-----------' . PHP_EOL;
|
/**
|
||||||
print $content;
|
* then login again
|
||||||
print PHP_EOL . '-----------------------------' . PHP_EOL;
|
*/
|
||||||
print '</pre>' . PHP_EOL;
|
$this->login();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* when login was successful, execute the same command again
|
||||||
|
*/
|
||||||
|
if ($this->is_loggedin) {
|
||||||
|
return $this->exec_curl($path, $payload);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($this->debug) {
|
||||||
|
print PHP_EOL . '<pre>';
|
||||||
|
print PHP_EOL . '---------cURL INFO-----------' . PHP_EOL;
|
||||||
|
print_r(curl_getinfo($ch));
|
||||||
|
print PHP_EOL . '-------URL & PAYLOAD---------' . PHP_EOL;
|
||||||
|
print $url . PHP_EOL;
|
||||||
|
if (empty($json_payload)) {
|
||||||
|
print 'empty payload';
|
||||||
|
} else {
|
||||||
|
print $json_payload;
|
||||||
|
}
|
||||||
|
|
||||||
|
print PHP_EOL . '----------RESPONSE-----------' . PHP_EOL;
|
||||||
|
print $content;
|
||||||
|
print PHP_EOL . '-----------------------------' . PHP_EOL;
|
||||||
|
print '</pre>' . PHP_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
|
curl_close($ch);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set request_type value back to default, just in case
|
||||||
|
*/
|
||||||
|
$this->request_type = 'GET';
|
||||||
|
|
||||||
|
return $content;
|
||||||
}
|
}
|
||||||
|
|
||||||
curl_close($ch);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* set request_type value back to default, just in case
|
|
||||||
*/
|
|
||||||
$this->request_type = 'GET';
|
|
||||||
|
|
||||||
return $content;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user