'run_every_minute',
'daily_wpcore_update' => 'check_wpcore_update');
// init - Fires after WordPress has finished loading but before any headers are sent.
// wp_head - Is triggered within the
section of the user's template by the wp_head() function
// admin_head - https://codex.wordpress.org/Plugin_API/Action_Reference/admin_head
// login_form - This action hook fires following the "password" field in the login form.
// admin_init - Is triggered before any other hook when a user accesses the admin area.
// wp_login - Is triggered when a user logs in by the wp_signon() function.
// wp_login_failed - Is triggered when a user login fails
// wp_logout - Is triggered when a user logs out using the wp_logout() function.
// upgrader_process_complete - Is run when the download process for a plugin install or update finishes.
// switch_theme - It fires after the theme has been switched
// check_wpcore_update - https://codex.wordpress.org/Plugin_API/Action_Reference/check_wpcore_update
// activated_plugin - Is run immediately after any plugin is activated
// deactivated_plugin - Is run immediately after any plugin is deactivated
public static $actifend_actions = array(
'wp_head' => 'AccessLogs', //Start event capturing
'admin_head' => 'AccessLogs',
'login_form' => 'AccessLogs',
'init' => 'Actifend::enable_actifend_crons', // ensure cron events are scheduled
'activated_plugin' => 'pluginUpdatelog', // send plugin activated log
'deactivated_plugin' => 'pluginUpdatelog', // send plugin deactivated log
'wp_login' => array('logInSuccess', 'getBlockedIPList'), // login success, list of IPs blocked
'admin_init' => 'actifend_dismiss_usage_notice', // dismiss usage admin notice for that session
'wp_logout' => 'reset_dismiss_usage_notice', // resets dismiss usage admin notice
'wp_login_failed' => 'loginFailureAccess', // login failure
'switch_theme' => 'actifendUpdatetheme', // when theme is changed
'upgrader_process_complete' => 'updateInstallationLogs', // when a theme, plugin or core update is done
'check_wpcore_update' => 'availableWordPressUpdates', // wordpress update available
'run_every_minute' => 'processes_running_every_minute');
/**
* initTmpDir
* Function create the temp directory to create the log files.
*/
public static function initTmpDir() {
try {
$tmp_dir = trailingslashit( WP_CONTENT_DIR ) . "actifend_tmp";
if (!file_exists($tmp_dir)) @mkdir($tmp_dir, 0750);
@file_put_contents(trailingslashit( $tmp_dir ) . ".htaccess", "deny from all");
ini_set('error_log', trailingslashit( $tmp_dir ) . 'debug_tmp.log');
} catch (Exception $e) {
throw new Exception("Exception 1x01: " . $e->getMessage());
}
} // end initTmpDir
/**
* isAdmin
* return true if user is admin
* @param user
*/
public static function isAdmin($user = false) {
if($user){
if(user_can($user, 'manage_options')){
return true;
}
}
return false;
}
/**
* activation_warning
* Displays any errors occured during activation
*
*/
public static function activation_warning() {
$activationError = get_option('actifend_plugin_act_error', '');
if (strlen($activationError) > 400) {
$activationError = substr($activationError, 0, 500) . '...[output truncated]';
}
if ($activationError) {
echo 'Actifend generated an error during activation. The output received was: ' . wp_kses($activationError, array()) . '
';
}
delete_option('actifend_plugin_act_error');
// Actifend::actifend_dropTable();
deactivate_plugins( dirname(__FILE__) . '/actifend.php');
exit;
}
/**
* actifend_crons
* sets the schedule for the actifend crons
*
*/
public static function actifend_crons( $schedules ) {
$everyMinute = array('interval' => 60,
'display' => __('Every Minute'));
$onceDaily = array('interval' => 86400,
'display' => __('Once Daily'));
// foreach (self::$actifendSchedules as $schedule) {
// if (substr($schedule, 0, 5) == 'daily') {
// $schedules[$schedule] = $onceDaily;
// }else {
// $schedules[$schedule] = $everyMinute;
// }
// }
$schedules['min_all_processes'] = $everyMinute;
$schedules['daily_wpcore_update'] = $onceDaily;
return $schedules;
}
/**
* enable_actifend_crons
* Enables cron jobs related to this plugin
*/
public static function enable_actifend_crons() {
// cron jobs
foreach (self::$scheduleHooks as $schedule => $hook) {
if (! wp_next_scheduled ( $hook )) {
wp_schedule_event(current_time( 'timestamp', 1 ), $schedule, $hook);
debug_log("$schedule cron job scheduled.");
}
}
// debug_log("Actifend cron jobs scheduled.");
}
/**
* clear_actifend_crons
* Disables / clears cron jobs related to this plugin
*/
public static function clear_actifend_crons() {
foreach (self::$scheduleHooks as $schedule => $hook) {
wp_clear_scheduled_hook($hook);
}
debug_log("Actifend cron schedules cleared!");
}
/**
* add_actifend_actions
* adds various actions required for functioning of the plugin
*/
public static function add_actifend_actions() {
foreach (self::$actifend_actions as $action => $hook) {
if (is_array( $hook )) {
foreach ($hook as $eachHook) {
add_action($action, $eachHook);
}
}else {
add_action($action, $hook);
}
}
}
/**
* remove_actifend_actions
* remove various actions required for functioning of the plugin
*/
public static function remove_actifend_actions() {
foreach (self::$actifend_actions as $action => $hook) {
if (is_array($hook)) {
foreach ($hook as $eachHook) {
remove_action($action, $eachHook);
}
}else {
remove_action($action, $hook);
}
}
}
/**
* actifend_deletedPlugins
* Function check if any of the plugin deleted then update the plugin table in database.
*/
public static function actifend_deletedPlugins() {
try {
$utiObj = new Utility;
$result =$utiObj->getActifendInfo();
if (isset($result->asset_id) && !empty($result->asset_id)) {
$reportObj = new report;
$new_plugin_version = $reportObj->new_version_table();
$old_plugin_version = $reportObj->old_version_table("plugin");
// $del_name = '';
if (!empty($old_plugin_version)) {
foreach ($old_plugin_version as $key1 => $value1) {
if (!in_array($value1, $new_plugin_version)) {
// $del_name = $value1['name'];
// $del_version = $value1['version'];
global $wpdb;
$plugin_detail_table = $wpdb->prefix . ACTIFEND_TABLE_VERSION;
$wpdb->delete($plugin_detail_table, array( 'name' => $value1['name'] ));
}
}
}
}
debug_log("actifend_deletedPlugins executed!");
} catch (Exception $e) {
debug_log($e->getMessage());
throw new Exception("Exception 1x05: " . $e->getMessage());
}
}
/**
* actifend_update_check
* Function check if the actifend updated then create the database tables.
*/
public static function actifend_update_check() {
try {
$utiObj = new Utility;
$result = $utiObj->getActifendInfo();
date_default_timezone_set("UTC");
$timeNow = date("Y-m-d H:i:s");
if (isset($result->asset_id) && !empty($result->asset_id)) {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
$actifend_ip_table = $wpdb->prefix . ACTIFEND_TABLE_IP_BLOCKED;
$actifend_sql_command = "
CREATE TABLE IF NOT EXISTS `" . $actifend_ip_table . "` (
`id` tinyint unsigned NOT NULL AUTO_INCREMENT,
`ips` longtext NOT NULL,
`entry_time` datetime NULL,
PRIMARY KEY (id)
) $charset_collate;";
dbDelta($actifend_sql_command);
$actifend_theme_table = $wpdb->prefix . ACTIFEND_THEMES_TABLE;
$actifend_theme_sql = "
CREATE TABLE IF NOT EXISTS `" . $actifend_theme_table . "` (
`pid` tinyint unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`version` varchar(100) NOT NULL,
`author` varchar(100) NOT NULL,
`update_last_time` datetime NULL,
`status` varchar(2) NULL DEFAULT '0',
PRIMARY KEY (pid)
) $charset_collate;";
dbDelta($actifend_theme_sql);
$installed_plugin_table = $wpdb->prefix . ACTIFEND_TABLE_VERSION;
$install_sql_query = "
CREATE TABLE IF NOT EXISTS `" . $installed_plugin_table . "` (
`pid` tinyint unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`version` varchar(100) NOT NULL,
`author` varchar(100) NOT NULL,
`update_last_time` datetime NULL,
`status` varchar(2) NULL DEFAULT '0',
PRIMARY KEY (pid)
) $charset_collate;";
dbDelta($install_sql_query);
$actifend_table_name = $wpdb->prefix . ACTIFEND_TABLE_VERSION;
$data = $wpdb->get_results("SELECT name,version FROM `" . $actifend_table_name . "`;");
if (empty($data)) {
$all_plugins = get_plugins();
foreach ($all_plugins as $plugin) {
$wpdb->insert($installed_plugin_table,
array(
"name" => $plugin['Name'],
"version" => $plugin['Version'],
"author" => $plugin['Author'],
"update_last_time" => $timeNow
));
}
}
$actifend_table_name = $wpdb->prefix . ACTIFEND_THEMES_TABLE;
$themedata = $wpdb->get_results("SELECT name,version FROM `" . $actifend_table_name . "`;");
if (empty($themedata)) {
$themes = wp_get_themes();
foreach ($themes as $name => $theme) {
$wpdb->insert($actifend_theme_table,
array(
"name" => $theme->get('Name'),
"version" => $theme->get('Version'),
"author" => $theme->get('Author'),
"update_last_time" => $timeNow
));
}
}
}
debug_log("actifend_update_check executed!");
} catch (Exception $e) {
debug_log($e->getMessage());
throw new Exception("Exception 1x06: " . $e->getMessage());
}
}
/**
* actifend_deletedThemes
* Function check if any of the theme deleted then update the theme table in database.
*/
public static function actifend_deletedThemes() {
try {
// self::actifend_update_check();
$utiObj = new Utility;
$result = $utiObj->getActifendInfo();
if (isset($result->asset_id) && !empty($result->asset_id)) {
// $asset_id = $result->asset_id;
// $default_end_point = $result->default_end_point;
// $path = plugin_dir_path(__FILE__);
$reportObj = new report;
$new_theme_version = $reportObj->theme_new_version();
$old_theme_version = $reportObj->old_version_table("theme");
// $del_name = '';
if (!empty($old_theme_version))
foreach ($old_theme_version as $key1 => $value1) {
if (!in_array($value1, $new_theme_version)) {
// $del_name = $value1['name'];
// $del_version = $value1['version'];
global $wpdb;
$theme_detail_table = $wpdb->prefix . ACTIFEND_THEMES_TABLE;
$wpdb->delete($theme_detail_table, array( 'name' => $value1['name'] ));
}
}
}
debug_log("actifend_deletedThemes executed!");
} catch (Exception $e) {
debug_log($e->getMessage());
throw new Exception("Exception 1x08: " . $e->getMessage());
}
}
/**
* actifend_createTables
* Function create the table in wordpress database for the plugin when plugin is activated.
*/
public static function actifend_createTables() {
try {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
$timeNow = current_time('mysql', true);
$actifend_table_name = $wpdb->prefix . ACTIFEND_TABLE_NAME;
$actifend_sql = "CREATE TABLE IF NOT EXISTS`" . $actifend_table_name . "` (
`aid` tinyint unsigned NOT NULL AUTO_INCREMENT,
`asset_id` varchar(16) NOT NULL,
`default_end_point` text NULL,
`actifend_email` varchar(1024) NOT NULL,
`actifend_optin` tinyint(1) unsigned NOT NULL,
`last_checked` datetime NULL,
PRIMARY KEY (aid)
) $charset_collate; ";
dbDelta($actifend_sql);
$actifend_ip_table = $wpdb->prefix . ACTIFEND_TABLE_IP_BLOCKED;
$actifend_sql_command = "CREATE TABLE IF NOT EXISTS `" . $actifend_ip_table . "` (
`id` tinyint unsigned NOT NULL AUTO_INCREMENT,
`ips` longtext NOT NULL,
`entry_time` datetime NULL,
`set_number` varchar(12) NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
dbDelta($actifend_sql_command);
$actifend_theme_table = $wpdb->prefix . ACTIFEND_THEMES_TABLE;
$actifend_theme_sql = "CREATE TABLE IF NOT EXISTS `" . $actifend_theme_table . "` (
`pid` tinyint unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`version` varchar(100) NOT NULL,
`author` varchar(100) NOT NULL,
`update_last_time` datetime NULL,
`status` varchar(2) NULL DEFAULT '0',
PRIMARY KEY (pid)
) $charset_collate;";
dbDelta($actifend_theme_sql);
$installed_plugin_table = $wpdb->prefix . ACTIFEND_TABLE_VERSION;
$install_sql_query = "CREATE TABLE IF NOT EXISTS `" . $installed_plugin_table . "` (
`pid` tinyint unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`version` varchar(100) NOT NULL,
`author` varchar(100) NOT NULL,
`update_last_time` datetime NULL,
`status` varchar(2) NULL DEFAULT '0',
PRIMARY KEY (pid)
) $charset_collate;";
dbDelta($install_sql_query);
$actifend_integrity_files = $wpdb->prefix . ACTIFEND_INTEGRITY_FILES_TABLE;
$create_ifiles_Table = "CREATE TABLE IF NOT EXISTS `" . $actifend_integrity_files . "` (
`file_path` VARCHAR(191) NOT NULL,
`file_size` INT NOT NULL,
`file_mtime` INT(10) UNSIGNED NOT NULL,
`file_type` VARCHAR(4) NOT NULL) $charset_collate;";
dbDelta($create_ifiles_Table);
$actifend_integrity_hashes = $wpdb->prefix . ACTIFEND_INTEGRITY_HASHES_TABLE;
$create_iHashes_Table = "CREATE TABLE IF NOT EXISTS `" . $actifend_integrity_hashes . "` (
`file_path` VARCHAR(191) NOT NULL,
`file_hash` CHAR(40) NOT NULL) $charset_collate;";
dbDelta($create_iHashes_Table);
$all_plugins = get_plugins();
foreach ($all_plugins as $plugin) {
$wpdb->insert($installed_plugin_table,
array(
"name" => $plugin['Name'],
"version" => $plugin['Version'],
"author" => $plugin['Author'],
"update_last_time" => $timeNow
));
}
$themes = wp_get_themes();
foreach ($themes as $name => $theme) {
$wpdb->insert($actifend_theme_table,
array(
"name" => $theme->get('Name'),
"version" => $theme->get('Version'),
"author" => $theme->get('Author'),
"update_last_time" => $timeNow
));
}
debug_log("actifend_createTables executed!");
} catch (Exception $e) {
debug_log($e->getMessage());
throw new Exception("Exception 1x18: " . $e->getMessage());
}
}
/**
* actifend_dropTable
* Function drop the table in wordpress database that associate with plugin when plugin is deactivate.
*/
public static function actifend_dropTable() {
try {
global $wpdb;
$actifend_table_name = $wpdb->prefix . ACTIFEND_TABLE_NAME;
$del = "DROP TABLE IF EXISTS " . $actifend_table_name . "; ";
$wpdb->query($del);
$installed_plugin_table = $wpdb->prefix . ACTIFEND_TABLE_VERSION;
$del_query = "DROP TABLE IF EXISTS " . $installed_plugin_table . "; ";
$wpdb->query($del_query);
$theme_table = $wpdb->prefix . ACTIFEND_THEMES_TABLE;
$drop_theme_table = "DROP TABLE IF EXISTS " . $theme_table . "; ";
$wpdb->query($drop_theme_table);
$blocked_ip_list = $wpdb->prefix . ACTIFEND_TABLE_IP_BLOCKED;
$drop_blocked_ip = "DROP TABLE IF EXISTS " . $blocked_ip_list . "; ";
$wpdb->query($drop_blocked_ip);
// drop actifend file integrity tables
$integrity_files_table = $wpdb->prefix . ACTIFEND_INTEGRITY_FILES_TABLE;
$drop_integrity_files = "DROP TABLE IF EXISTS {$integrity_files_table};";
$wpdb->query($drop_integrity_files);
$integrity_hashes_table = $wpdb->prefix . ACTIFEND_INTEGRITY_HASHES_TABLE;
$drop_integrity_hashes = "DROP TABLE IF EXISTS {$integrity_hashes_table};";
$wpdb->query($drop_integrity_hashes);
debug_log("actifend_dropTable executed!");
} catch (Exception $e) {
debug_log($e->getMessage());
throw new Exception("Exception 1x22: " . $e->getMessage());
}
}
/**
* actifend_portTest
* Function Used to test the outbound ports by send the request to url and then check the response.
* @param string $test_url request url
*/
public static function actifend_portTest($test_url, $port) {
try {
$response = wp_remote_get($test_url);
$response_code = wp_remote_retrieve_response_code($response);
if (($response_code != 301) && ($response_code != 302) && ($response_code != 200)) {
echo 'This plugin require outbound port ' . $port . ' open. Please allow permission and try again';
update_option('actifend_plugin_act_error', ob_get_contents());
add_action('admin_notices', 'Actifend::activation_warning');
}
debug_log("actifend_portTest executed!");
} catch (Exception $e) {
debug_log($e->getMessage());
throw new Exception("Exception 1x26: " . $e->getMessage());
}
}
/**
* actifend_prerequisiteTest
* Function prerequisite test when plugin is activated without this plugin can't activate.
*/
public static function actifend_prerequisiteTest() {
try {
$utilObj = new Utility;
//PHP Version Check
if (version_compare(PHP_VERSION, '5.4.0') < 0) {
echo 'This plugin requires at least PHP version 5.4.0. The Current PHP version is ' . PHP_VERSION;
update_option('actifend_plugin_act_error', ob_get_contents());
add_action('admin_notices', 'Actifend::activation_warning');
}
// Removed in v1.3.7 inform backend about this so mobile app can in turn inform the user.
// this check will now be done when backup is initiated
if (!extension_loaded('zip')) {
// wp_die('This plugin requires zip extention. Please enable it and try again.');
debug_log("Zip extension is NOT enabled!");
}
$htaccess_path = trailingslashit( ABSPATH ) . '.htaccess';
if (file_exists($htaccess_path) && !is_writable($htaccess_path)) {
echo 'This plugin require writable permission for .htaccess file. Please allow permission and try again.';
update_option('actifend_plugin_act_error', ob_get_contents());
add_action('admin_notices', 'Actifend::activation_warning');
}
// Out bound 80 and 443 check
$port1 = 443;
$port2 = 80;
$url1 = "https://www.wordpress.com";
$url2 = "http://www.example.org";
//Check for the Directory Writable permission
$plugin_dir = plugin_dir_path(__FILE__);
if (!is_writable($plugin_dir)) {
echo __('This plugin require directory writable permission. Please allow permission and try again');
update_option('actifend_plugin_act_error', ob_get_contents());
// add_action('admin_notices', 'Actifend::activation_warning');
Actifend::activation_warning();
}
//Out Bound connection and port check
$hostname = "example.com";
$ip = gethostbyname($hostname);
$long = ip2long($ip);
if ($long == -1 || $long === false) {
echo __('This plugin requires outbound connection. Please enable it and try again');
update_option('actifend_plugin_act_error', ob_get_contents());
// add_action('admin_notices', 'Actifend::activation_warning');
Actifend::activation_warning();
}
// check if the URL has IP address in it
$siteURL = get_site_url();
if ( stristr($siteURL, 'localhost') !== false
|| Actifend::filter_ip_in_url( $siteURL ) ) {
echo __('Cannot have localhost / IP addresses in the site url.');
update_option('actifend_plugin_act_error', ob_get_contents());
// add_action('admin_notices', 'Actifend::activation_warning');
Actifend::activation_warning();
}
debug_log("actifend_prerequisiteTest executed!");
} catch (Exception $e) {
debug_log($e->getMessage());
throw new Exception("Exception 1x27: " . $e->getMessage());
}
}
/**
* pluginDeactivationLog
* Will be executed when Actiend is deactivated by the admin for some reason
*/
public static function pluginDeactivationLog() {
try{
$utilObj = new Utility;
$result = $utilObj->getActifendInfo();
if (isset($result->asset_id) && !empty($result->asset_id)) {
$asset_id = $result->asset_id;
$deactivationArray = array('deactivated' => 'True');
$final_end_point = ACTIFEND_WP_UPDATES_END_POINT . $asset_id . "/wpupdate";
if (isset($default_end_point) && !empty($default_end_point)) {
$final_end_point = $default_end_point;
}
$json_data = json_encode($deactivationArray);
$res = $utilObj->actifend_postViaCurl($final_end_point, $json_data);
$res_json = json_decode($res);
if (empty($res_json) || !isset($res_json->headers)) {
if (ACTIFEND_DEBUG_MODE_ON) {
$res = "EXCEPTION: While opening " . $final_end_point . "
Response: = " . json_encode($res_json);
} else {
$res = "EXCEPTION: While opening " . $final_end_point;
}
debug_log($res);
} else {
$res = "ASSET ID: " . $asset_id;
}
}
debug_log("pluginDeactivationLog function executed.");
} catch(Exception $e) {
throw new Exception("Exception 1x09:" .$e->getMessage());
}
}
// Filters IP address from url
public static function filter_ip_in_url( $url ) {
$x = strpos($url, "://");
if (! $x ) {
$x = strpos($url, "/");
if ( $x )
$url = substr($url, 0, $x);
} else {
$pos = strpos($url, "://");
$url = substr($url, $pos+3);
$x = strpos($url, "/");
if ( $x )
$url = substr($url, 0, $x);
}
$res = ( filter_var($url, FILTER_VALIDATE_IP) ? true : false );
return( $res );
}
}
?>