View source
<?php
function instapage_cms_plugin_permission() {
return array(
'administer instapage_cms_plugin settings' => array(
'title' => t('Administer Instapage settings'),
'description' => t('Allow users to administer Instapage settings.'),
),
);
}
function instapage_cms_plugin_menu() {
$items = array();
$items['admin/structure/instapage_cms_plugin'] = array(
'title' => 'Instapage Plugin',
'description' => 'The best way for Drupal to seamlessly publish landing pages as a natural extension of your website.',
'page callback' => 'load_instapage_cms_plugin_dashboard',
'access arguments' => array(
'administer instapage_cms_plugin settings',
),
'type' => MENU_NORMAL_ITEM,
);
return $items;
}
function instapage_cms_plugin_init() {
if (!menu_get_item($_GET['q'])) {
InstapageCmsPluginConnector::getSelectedConnector()
->check404();
}
}
function instapage_cms_plugin_install() {
user_role_grant_permissions(DRUPAL_AUTHENTICATED_RID, array(
'administer instapage_cms_plugin settings',
));
}
function instapage_cms_plugin_uninstall() {
InstapageCmsPluginConnector::getSelectedConnector()
->removePlugin();
}
function load_instapage_cms_plugin_dashboard() {
$jsDir = base_path() . drupal_get_path('module', InstapageCmsPluginConnector::getPluginDirectoryName()) . '/core/assets/js';
$knockoutDir = base_path() . drupal_get_path('module', InstapageCmsPluginConnector::getPluginDirectoryName()) . '/core/knockout';
$languageFile = base_path() . drupal_get_path('module', InstapageCmsPluginConnector::getPluginDirectoryName()) . '/core/assets/lang/' . InstapageCmsPluginConnector::getSelectedLanguage() . '.js';
$options = array(
'scope' => 'footer',
'group' => JS_LIBRARY,
'weight' => 1,
'cache' => false,
'defer' => false,
'preprocess' => false,
);
drupal_add_js('var INSTAPAGE_AJAXURL = \'' . InstapageCmsPluginConnector::getAjaxURL() . '\';', array(
'type' => 'inline',
'scope' => 'header',
));
$options['weight']++;
drupal_add_js($languageFile, $options);
$options['weight']++;
drupal_add_js($jsDir . '/InstapageCmsPluginLang.js', $options);
$options['weight']++;
drupal_add_js($knockoutDir . '/core/knockout-3.4.0.js', $options);
$options['weight']++;
drupal_add_js($jsDir . '/knockout-no-conflict.js', $options);
$options['weight']++;
drupal_add_js($knockoutDir . '/core/knockout.simpleGrid.3.0.js', $options);
$options['weight']++;
drupal_add_js($jsDir . '/download.js', $options);
$options['weight']++;
drupal_add_js($jsDir . '/InstapageCmsPluginAjax.js', $options);
$options['weight']++;
drupal_add_js($knockoutDir . '/view_models/InstapageCmsPluginPagedGridModel.js', $options);
$options['weight']++;
drupal_add_js($knockoutDir . '/view_models/InstapageCmsPluginEditModel.js', $options);
$options['weight']++;
drupal_add_js($knockoutDir . '/view_models/InstapageCmsPluginSettingsModel.js', $options);
$options['weight']++;
drupal_add_js($knockoutDir . '/view_models/InstapageCmsPluginMessagesModel.js', $options);
$options['weight']++;
drupal_add_js($knockoutDir . '/view_models/InstapageCmsPluginToolbarModel.js', $options);
$options['weight']++;
drupal_add_js($knockoutDir . '/view_models/InstapageCmsPluginMasterModel.js', $options);
$options['weight']++;
drupal_add_js('https://code.jquery.com/jquery-2.2.4.min.js', $options);
$options['weight']++;
drupal_add_js($jsDir . '/mrwhite.js', $options);
$options['weight']++;
drupal_add_js($jsDir . '/dropdowns.js', $options);
$options['weight']++;
drupal_add_js($jsDir . '/expand-collapse.js', $options);
$options['weight']++;
drupal_add_js($jsDir . '/input.js', $options);
$options['weight']++;
drupal_add_js($jsDir . '/jq.hoverintent.js', $options);
$options['weight']++;
drupal_add_js($jsDir . '/jquery.tmpl.min.js', $options);
$options['weight']++;
drupal_add_js($jsDir . '/ripple.js', $options);
$options['weight']++;
drupal_add_js($jsDir . '/select2.min.js', $options);
$options['weight']++;
drupal_add_js($jsDir . '/snack-bars.js', $options);
$options['weight']++;
drupal_add_js($jsDir . '/tabs.js', $options);
$options = array(
'preprocess' => 'false',
);
$cssDir = drupal_get_path('module', InstapageCmsPluginConnector::getPluginDirectoryName()) . '/core/assets/css';
drupal_add_css($cssDir . '/mrwhite-reset.css', $options);
drupal_add_css($cssDir . '/mrwhite-ui-kit.css', $options);
drupal_add_css($cssDir . '/general.css', $options);
ob_start();
InstapageCmsPluginConnector::getSelectedConnector()
->loadPluginDashboard();
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
class InstapageCmsPluginDrupal7Connector {
public $name = 'drupal';
public function getPluginDirectoryName() {
return 'instapage_cms_plugin';
}
public function getCMSName() {
return 'Drupal';
}
public function getCMSVersion() {
return 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() {
$sql = "SELECT value FROM variable WHERE name = '%s' LIMIT 1";
$row = $this
->getRow($sql, 'clean_url');
return unserialize($row->value) == 1;
}
public function currentUserCanManage() {
return true;
}
private function prepareFunctionArgs($args = array()) {
if (isset($args[0]) && is_array($args[0])) {
$args = $args[0];
}
return $args;
}
private function prepare($sql) {
$sql = str_replace(array(
'\'%s\'',
'%s',
), '?', $sql);
return $sql;
}
public function query($sql) {
$args = func_get_args();
array_shift($args);
$args = $this
->prepareFunctionArgs($args);
$sql = $this
->prepare($sql);
try {
db_query($sql, $args);
return true;
} 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 getRow($sql) {
$args = func_get_args();
array_shift($args);
$args = $this
->prepareFunctionArgs($args);
$sql = $this
->prepare($sql);
try {
$result = db_query($sql, $args);
return $result
->fetchObject();
} catch (Exception $e) {
$this
->logDbError($e, $sql);
return false;
}
}
public function getResults($sql) {
$args = func_get_args();
array_shift($args);
$args = $this
->prepareFunctionArgs($args);
$sql = $this
->prepare($sql);
try {
$result = db_query($sql, $args);
$resultArray = $result
->fetchAll(PDO::FETCH_OBJ);
if (!is_array($resultArray)) {
return array();
}
return $resultArray;
} catch (Exception $e) {
$this
->logDbError($e, $sql);
return false;
}
}
public function getDBPrefix() {
global $databases;
$connectionKey = Database::getConnection()
->getKey();
$settings = isset($databases[$connectionKey]) ? $databases[$connectionKey] : null;
if (!$settings) {
return null;
}
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() {
global $databases;
$connectionKey = Database::getConnection()
->getKey();
$settings = isset($databases[$connectionKey]) ? $databases[$connectionKey] : null;
if (!$settings) {
return null;
}
if (!isset($settings['collation']) && is_array($settings)) {
$settings = array_pop($settings);
}
if (isset($settings['collation']) && is_array($settings['collation'])) {
$settings['collation'] = array_pop($settings['collation']);
}
$collation = isset($settings['collation']) ? $settings['collation'] : 'utf8mb4_general_ci';
return 'COLLATE ' . $collation;
}
public function remoteRequest($url, $data, $headers = array(), $method = 'POST') {
$dataString = '';
if (!isset($headers['Content-type'])) {
$headers['Content-Type'] = 'application/x-www-form-urlencoded';
InstapageCmsPluginHelper::writeDiagnostics($data, 'Request (' . $method . ') data empty. Ping added.');
}
if ($method == 'POST' && (!is_array($data) || !count($data))) {
$data = array(
'ping' => true,
);
}
$dataString = http_build_query($data, '', '&');
if ($method == 'GET') {
$url .= '?' . urldecode($dataString);
$dataString = '';
}
$cookies = isset($data['cookies']) ? $data['cookies'] : array();
$cookieString = '';
foreach ($cookies as $key => $cookie) {
$cookieString .= $key . '=' . urlencode($cookie) . ';';
}
if ($cookieString) {
$headers['Cookie'] = $cookieString;
}
$options = array(
'headers' => $headers,
'method' => $method,
'data' => $dataString,
'max_redirects' => 5,
'timeout' => 45,
);
$request = drupal_http_request($url, $options);
if (isset($request->code) && $request->code == 200) {
return $this
->prepareResponse($request);
}
else {
return [
'body' => json_encode([
'status' => 'ERROR',
'message' => InstapageCmsPluginConnector::lang('Request failed with status %s.', $request->code),
]),
];
}
}
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');
}
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() . '/?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 || $_GET['q'] == 'user') {
return true;
}
return false;
}
public function isAdmin() {
$requestUrl = $_SERVER['REQUEST_URI'];
if (strpos($requestUrl, '/admin') === 0 || $_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);
}
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() {
$this
->checkPage('404');
}
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 = variable_get('site_name');
if ($sanitized) {
return mb_strtolower(str_replace(' ', '-', $sitename), 'UTF-8');
}
return $sitename;
}
public function mail($to, $subject, $message, $headers = '', $attachments = array()) {
global $language_object;
$module = 'instapage_cms_plugin';
$key = 'custom_email';
$params['message'] = $message;
$params['subject'] = $subject;
$langcode = $language_object->language;
$send = true;
return drupal_mail($module, $key, $to, $langcode, $params, NULL, $send);
}
public function getDeprecatedData() {
$pages = variable_get('instapage_pages', NULL);
$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 : Connector::getHomeURL();
$results[] = $pageObj;
}
return $results;
}
public function escapeHTML($html) {
return htmlspecialchars($html);
}
public function isHtmlReplaceNecessary() {
if ($this
->isAdmin() || $this
->isLoginPage() || InstapageCmsPluginHelper::isCustomParamPresent()) {
InstapageCmsPluginHelper::writeDiagnostics('is_admin || 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(), '7.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;
}
private function prepareResponse($request) {
return array(
'body' => (string) isset($request->data) ? $request->data : '',
'status' => (string) isset($request->status_message) ? $request->status_message : '',
'code' => isset($request->code) ? $request->code : '0',
'headers' => isset($request->headers) ? $request->headers : '',
);
}
}