View source
<?php
use Drupal\Core\Database\Database;
class InstapageCmsPluginDrupal8Connector {
public $name = 'drupal';
public function getPluginDirectoryName() {
return 'instapage_cms_plugin';
}
public function getCMSName() {
return 'Drupal';
}
public function getCMSVersion() {
return Drupal::VERSION;
}
public function isAPIAccessible() {
$response = $this
->remoteGet(INSTAPAGE_ENTERPRISE_ENDPOINT, array());
$body = is_string($response['body']) && is_object(json_decode($response['body'])) ? json_decode($response['body']) : null;
return is_object($body) && isset($body->status) && $body->status === 'ERROR' && isset($body->message) && stripos($body->message, 'Request failed') !== false;
}
public function areSEOFriendlyUrlsEnabled() {
return true;
}
public function currentUserCanManage() {
return true;
}
private function prepareFunctionArgs($args = array()) {
if (isset($args[0]) && is_array($args[0])) {
$args = $args[0];
}
return $args;
}
public function query($sql) {
$args = func_get_args();
array_shift($args);
$args = $this
->prepareFunctionArgs($args);
try {
$statement = $this
->prepare($sql);
if (count($args)) {
return $statement
->execute($args);
}
else {
return $statement
->execute();
}
} catch (Exception $e) {
$this
->logDbError($e, $sql);
return false;
}
}
public function lastInsertId() {
$sql = 'SELECT LAST_INSERT_ID() as last_insert_id';
$result = $this
->getRow($sql);
return isset($result->last_insert_id) ? $result->last_insert_id : false;
}
public function prepare($sql) {
$sql = str_replace(array(
'\'%s\'',
'%s',
), '?', $sql);
$connection = Database::getConnection();
return $connection
->prepare($sql);
}
public function getRow($sql) {
$args = func_get_args();
array_shift($args);
$args = $this
->prepareFunctionArgs($args);
try {
$statement = $this
->prepare($sql);
if (count($args)) {
$statement
->execute($args);
}
else {
$statement
->execute();
}
return $statement
->fetch(PDO::FETCH_OBJ);
} catch (Exception $e) {
$this
->logDbError($e, $sql);
return false;
}
}
public function getResults($sql) {
$args = func_get_args();
array_shift($args);
$args = $this
->prepareFunctionArgs($args);
try {
$statement = $this
->prepare($sql);
if (count($args)) {
$statement
->execute($args);
}
else {
$statement
->execute();
}
return $statement
->fetchAll(PDO::FETCH_OBJ);
} catch (Exception $e) {
$this
->logDbError($e, $sql);
return false;
}
}
public function getDBPrefix() {
$connectionKey = Database::getConnection()
->getKey();
$settings = Database::getConnectionInfo($connectionKey);
if (!isset($settings['prefix']) && is_array($settings)) {
$settings = array_pop($settings);
}
if (isset($settings['prefix']) && is_array($settings['prefix'])) {
$settings['prefix'] = array_pop($settings['prefix']);
}
return isset($settings['prefix']) ? $settings['prefix'] : '';
}
public function getCharsetCollate() {
return 'COLLATE utf8mb4_general_ci';
}
public function remoteRequest($url, $data, $headers = array(), $method = 'POST') {
try {
if ($method == 'POST' && (!is_array($data) || !count($data))) {
$data = array(
'ping' => true,
);
InstapageCmsPluginHelper::writeDiagnostics($data, 'Request (' . $method . ') data empty. Ping added.');
}
$formParams = $data;
if ($method == 'GET' && is_array($data)) {
$dataString = http_build_query($data, '', '&');
$url .= '?' . urldecode($dataString);
$formParams = array();
}
$cookies = isset($data['cookies']) ? $data['cookies'] : array();
$cookieJar = false;
if (!empty($cookies)) {
$domain = parse_url($url, PHP_URL_HOST);
$cookieJar = \GuzzleHttp\Cookie\CookieJar::fromArray($cookies, $domain);
}
$client = \Drupal::httpClient();
$request = $client
->request($method, $url, array(
'allow_redirects' => array(
'max' => 5,
),
'connect_timeout' => 45,
'synchronous' => true,
'cookies' => $cookieJar,
'version' => '1.0',
'form_params' => $formParams,
'headers' => $headers,
));
if ($request
->getStatusCode() === 200) {
return $this
->prepareResponse($request);
}
else {
return [
'body' => json_encode([
'status' => 'ERROR',
'message' => InstapageCmsPluginConnector::lang('Request failed with status %s.', $request
->getStatusCode()),
]),
];
}
} catch (Exception $e) {
return [
'body' => json_encode([
'status' => 'ERROR',
'message' => InstapageCmsPluginConnector::lang('Request failed. ') . $e
->getMessage(),
]),
];
}
}
public function remotePost($url, $data, $headers = array()) {
return $this
->remoteRequest($url, $data, $headers, 'POST');
}
public function remoteGet($url, $data, $headers = array()) {
$url = InstapageCmsPluginConnector::getURLWithSelectedProtocol($url);
return $this
->remoteRequest($url, $data, $headers, 'GET');
}
private function prepareResponse($request) {
$headers = $request
->getHeaders();
$headers['set-cookie'] = isset($headers['Set-Cookie'][0]) ? $headers['Set-Cookie'][0] : '';
return array(
'body' => (string) $request
->getBody(),
'status' => $request
->getReasonPhrase(),
'code' => $request
->getStatusCode(),
'headers' => $headers,
);
}
public function getSiteURL($protocol = true) {
$url = $_SERVER['HTTP_HOST'];
if ($protocol) {
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') {
$url = 'https://' . $url;
}
else {
$url = 'http://' . $url;
}
}
if (isset($_SERVER['PHP_SELF'])) {
$directory = ltrim(dirname($_SERVER['PHP_SELF']), DIRECTORY_SEPARATOR);
if (!empty($directory)) {
$url .= $directory;
}
}
return $url;
}
public function getHomeURL($protocol = true) {
$url = $this
->getSiteURL($protocol);
return $url;
}
public function getAjaxURL() {
return $this
->getSiteURL() . '/index.php?action=instapage_ajax_call';
}
public function lang() {
$arguments = func_get_arg(0);
if (!count($arguments)) {
return null;
}
$text = $arguments[0];
$variables = array_slice($arguments, 1);
if (!count($variables)) {
return $text;
}
return vsprintf($text, $variables);
}
public function initPlugin() {
$action = filter_input(INPUT_GET, 'action');
if ($action == 'instapage_ajax_call') {
$this
->ajaxCallback();
}
else {
InstapageCmsPluginHelper::writeDiagnostics($_SERVER['REQUEST_URI'], 'Instapage plugin initiated. REQUEST_URI');
InstapageCmsPluginHelper::writeDiagnostics($this
->getCMSName() . ' ' . $this
->getCMSVersion(), 'CMS name/version');
$this
->checkProxy();
$this
->checkHomepage();
$this
->checkCustomUrl();
}
}
public function removePlugin() {
$subaccount = InstapageCmsPluginSubaccountModel::getInstance();
$db = InstapageCmsPluginDBModel::getInstance();
$subaccount
->disconnectAccountBoundSubaccounts(true);
$db
->removePluginTables();
}
public function loadPluginDashboard() {
InstapageCmsPluginHelper::loadTemplate('messages');
InstapageCmsPluginHelper::loadTemplate('toolbar');
InstapageCmsPluginHelper::loadTemplate('base');
}
public function ajaxCallback() {
InstapageCmsPluginConnector::ajaxCallback();
}
public function isLoginPage() {
$requestUrl = $_SERVER['REQUEST_URI'];
if (strpos($requestUrl, '/user') === 0 || isset($_GET['q']) && $_GET['q'] == 'user') {
return true;
}
return false;
}
public function isAdmin() {
$requestUrl = $_SERVER['REQUEST_URI'];
if (strpos($requestUrl, '/admin') === 0 || isset($_GET['q']) && $_GET['q'] == 'admin') {
return true;
}
return false;
}
public function checkPage($type, $slug = '') {
$page = InstapageCmsPluginPageModel::getInstance();
$result = $page
->check($type, $slug);
if (!$result) {
return;
}
if ($type === '404') {
$page
->display($result, '404 Not Found');
}
else {
$page
->display($result);
}
}
public function checkHomepage() {
$homeUrl = str_replace(array(
'http://',
'https://',
), '', rtrim($this
->getHomeURL(), '/'));
$homeUrlSegments = explode('/', $homeUrl);
$uriSegments = explode('?', $_SERVER['REQUEST_URI']);
$uriSegments = explode('/', rtrim($uriSegments[0], '/'));
if (count($uriSegments) !== count($homeUrlSegments) || count($homeUrlSegments) > 1 && $homeUrlSegments[1] != $uriSegments[1]) {
return false;
}
$this
->checkPage('home');
return true;
}
public function check404() {
if (is_404()) {
$this
->checkPage('404');
return true;
}
return false;
}
public function checkCustomUrl() {
$slug = InstapageCmsPluginHelper::extractSlug($this
->getHomeURL());
if ($slug) {
$this
->checkPage('page', $slug);
}
return true;
}
public function checkProxy() {
$services = InstapageCmsPluginServicesModel::getInstance();
if ($services
->isServicesRequest()) {
try {
$services
->processProxyServices();
return;
} catch (Exception $e) {
echo $e
->getMessage();
}
}
}
public function getProhibitedSlugs() {
$result = array_merge($this
->getPostSlugs(), InstapageCmsPluginConnector::getLandingPageSlugs());
return $result;
}
public function isProhibitedSlug($slug) {
$postSlug = $this
->isProhibitedPostSlug($slug);
if ($postSlug) {
return $postSlug;
}
$landingPageSlug = InstapageCmsPluginConnector::isProhibitedLandingPageSlug($slug);
if ($landingPageSlug) {
return $landingPageSlug;
}
return false;
}
public function getOptionsDebugHTML() {
return '';
}
public function getPluginsDebugHTML() {
return '';
}
public function getSitename($sanitized = false) {
$sitename = \Drupal::config('system.site')
->get('name');
if ($sanitized) {
return mb_strtolower(str_replace(' ', '-', $sitename), 'UTF-8');
}
return $sitename;
}
public function mail($to, $subject, $message, $headers = '', $attachments = array()) {
$mailManager = \Drupal::service('plugin.manager.mail');
$module = 'instapage_cms_plugin';
$key = 'custom_email';
$params['message'] = $message;
$params['subject'] = $subject;
$langcode = \Drupal::currentUser()
->getPreferredLangcode();
$send = true;
return $mailManager
->mail($module, $key, $to, $langcode, $params, NULL, $send);
}
public function getDeprecatedData() {
$config = \Drupal::config('instapage.pages');
$pages = $config
->get('instapage_pages');
$results = array();
foreach ($pages as $key => $slug) {
$pageObj = new stdClass();
$pageObj->id = 0;
$pageObj->landingPageId = $key;
$pageObj->slug = $slug;
$pageObj->type = 'page';
$pageObj->enterprise_url = $pageObj->slug ? InstapageCmsPluginConnector::getHomeURL() . '/' . $pageObj->slug : InstapageCmsPluginConnector::getHomeURL();
$results[] = $pageObj;
}
return $results;
}
public function escapeHTML($html) {
return \Drupal\Component\Utility\Html::escape($html);
}
public function isHtmlReplaceNecessary() {
if ($this
->isAdmin() || $this
->isLoginPage() || InstapageCmsPluginHelper::isCustomParamPresent()) {
InstapageCmsPluginHelper::writeDiagnostics('isAdmin || isLoginPage || isCustomParamPresent', 'HTML Replace is not necessary');
return false;
}
return true;
}
public function getSettingsModule() {
return InstapageCmsPluginConnector::getPluginRequirements(array(
array(
'label' => InstapageCmsPluginConnector::lang('Drupal 7.x+'),
'condition' => version_compare(InstapageCmsPluginConnector::getCMSVersion(), '8.0', '>='),
),
));
}
private function logDbError($e, $sql) {
$db = InstapageCmsPluginDBModel::getInstance();
$errorMessage = $e
->getMessage();
if (strpos($sql, $db->debugTable) === false && $errorMessage !== '') {
$messages = array(
'Query: ' . $sql,
'Error: ' . $errorMessage,
);
InstapageCmsPluginHelper::writeDiagnostics(implode("\n", $messages), 'DB Error');
}
}
private function getPostSlugs() {
$editUrl = $this
->getSiteURL();
$dbPrefix = $this
->getDBPrefix();
$sql = 'SELECT pid AS id, SUBSTRING(alias, 2) AS slug, CONCAT(\'' . $editUrl . '\', source, \'/edit\') AS editUrl FROM ' . $dbPrefix . 'url_alias';
$results = $this
->getResults($sql);
return $results;
}
private function isProhibitedPostSlug($slug) {
$editUrl = $this
->getSiteURL();
$dbPrefix = $this
->getDBPrefix();
$sql = 'SELECT pid AS id, SUBSTRING(alias, 2) AS slug, CONCAT(\'' . $editUrl . '\', source, \'/edit\') AS editUrl FROM ' . $dbPrefix . 'url_alias WHERE SUBSTRING(alias, 2) = \'%s\' LIMIT 1';
$results = $this
->getResults($sql, $slug);
return $results;
}
}