add_actions(); } // PRIVATE SITE public function aioi_template_redirect() { $options = $this->get_option_aioi(); if (!$options['aioi_privatesite']) { return; } $allow_access = false; if (substr($_SERVER['REQUEST_URI'], 0, 16) == '/wp-activate.php' || substr($_SERVER['REQUEST_URI'], 0, 11) == '/robots.txt') { $allow_access = true; } $allow_access = apply_filters('aioi_allow_public_access', $allow_access); if ($allow_access) { return; } // We do want a private site if (!is_user_logged_in()) { auth_redirect(); } else { if (is_multisite()) { $this->handle_private_loggedin_multisite($options); } else { // Bar access to users with no role $user = wp_get_current_user(); if (!$user || !is_array($user->roles) || count($user->roles) == 0) { wp_logout(); $output = '

'.esc_html__('You attempted to login to the site, but you do not have any permissions. If you believe you should have access, please contact your administrator.', 'all-in-one-intranet').'

'; wp_die($output); } } } } // Override to decide what to do for Multisite protected function handle_private_loggedin_multisite($options) { } // Handler for robots.txt - just disallow if private public function aioi_robots_txt($output, $public) { $options = $this->get_option_aioi(); if ($options['aioi_privatesite']) { return "Disallow: /\n"; } return $output; } // Don't allow ping backs if private public function aioi_option_ping_sites($sites) { $options = $this->get_option_aioi(); if ($options['aioi_privatesite']) { return ''; } return $sites; } // Disable REST API public function aioi_rest_pre_dispatch() { $options = $this->get_option_aioi(); $allow_access = !$options['aioi_privatesite'] || is_user_logged_in(); $allow_access = apply_filters('aioi_allow_public_access', $allow_access); if (!$allow_access) { return new WP_Error( 'not-logged-in', 'REST API Requests must be authenticated because All-In-One Intranet is active', array( 'status' => 401 ) ); } } // LOGIN REDIRECT public function aioi_login_redirect($redirect_to, $requested_redirect_to='', $user=null) { if (!is_null($user) && isset($user->user_login)) { $options = $this->get_option_aioi(); if ($options['aioi_loginredirect'] != '' && admin_url() == $redirect_to) { return $options['aioi_loginredirect']; } } return $redirect_to; } // AUTO-LOGOUT // Reset timer on login public function aioi_wp_login($username, $user) { try { if ($user->ID) { update_user_meta($user->ID, 'aioi_last_activity_time', time()); } } catch (Exception $ex) { } } // Check whether user should be auto-logged out this time public function aioi_check_activity() { if (is_user_logged_in()) { $user_id = get_current_user_id(); $last_activity_time = (int)get_user_meta($user_id, 'aioi_last_activity_time', true); $logout_time_in_sec = $this->get_autologout_time_in_seconds(); if ($logout_time_in_sec > 0 && $last_activity_time + $logout_time_in_sec < time()) { $current_url = 'http' . (isset($_SERVER['HTTPS']) ? 's' : '') . '://' . "{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"; wp_logout(); wp_redirect($current_url); // Should hit the Login wall if site is private exit; } else { update_user_meta($user_id, 'aioi_last_activity_time', time()); } } } protected function get_autologout_time_in_seconds() { $options = $this->get_option_aioi(); if ($options['aioi_autologout_time'] == 0) { return 0; } switch ($options['aioi_autologout_units']) { case 'days': return $options['aioi_autologout_time'] * 60 * 60 * 24; break; case 'hours': return $options['aioi_autologout_time'] * 60 * 60; break; case 'minutes': default: return $options['aioi_autologout_time'] * 60; break; } } // PUT SETTINGS MENU ON PLUGINS PAGE public function aioi_plugin_action_links( $links, $file ) { if ($file == $this->my_plugin_basename()) { $settings_link = ''.__('Settings', 'all-in-one-intranet').''; array_unshift( $links, $settings_link ); } return $links; } // ADMIN OPTIONS // ************* protected function get_options_menuname() { return 'aioi_list_options'; } protected function get_options_pagename() { return 'aioi_options'; } protected function get_settings_url() { return is_multisite() ? network_admin_url( 'settings.php?page='.$this->get_options_menuname() ) : admin_url( 'options-general.php?page='.$this->get_options_menuname() ); } // Add All-In-One Intranet to the Settings menu in admin panel public function aioi_admin_menu() { if (is_multisite()) { add_submenu_page( 'settings.php', __('All-In-One Intranet settings', 'all-in-one-intranet'), __('All-In-One Intranet', 'all-in-one-intranet'), 'manage_network_options', $this->get_options_menuname(), array($this, 'aioi_options_do_page')); } else { add_options_page( __('All-In-One Intranet settings', 'all-in-one-intranet'), __('All-In-One Intranet', 'all-in-one-intranet'), 'manage_options', $this->get_options_menuname(), array($this, 'aioi_options_do_page')); } } // Entry point of admin settings page public function aioi_options_do_page() { wp_enqueue_script( 'aioi_admin_js', $this->my_plugin_url().'js/aioi-admin.js', array('jquery') ); $submit_page = is_multisite() ? 'edit.php?action='.$this->get_options_menuname() : 'options.php'; if (is_multisite()) { $this->aioi_options_do_network_errors(); } ?>



get_options_pagename()); $this->aioi_privacysection_text(); $this->aioi_memberssection_text(); $this->aioi_loginredirectsection_text(); $this->aioi_autologoutsection_text(); $this->aioi_licensesection_text(); ?>

get_option_aioi(); echo "

".esc_html__('Privacy','all-in-one-intranet')."

"; echo ""; echo ''; echo "
"; if (is_multisite()) { echo ""; echo ''; echo "
"; } echo "

".esc_html__('Note that your media uploads (e.g. photos) will still be accessible to anyone who knows their direct URLs.', 'all-in-one-intranet')."

"; $this->display_registration_warning(); echo "
"; } protected function display_registration_warning() { if (get_option('users_can_register')) { echo '

' . ''.esc_html__('Warning:', 'all-in-one-intranet').' ' . esc_html__('Your site is set so that "Anyone can register" themselves. ', 'all-in-one-intranet'); echo ''.esc_html__('Turn off here', 'all-in-one-intranet').''; echo '

'; } } // Override to deal with members of sub-sites in a multisite protected function aioi_memberssection_text() { } protected function aioi_loginredirectsection_text() { $options = $this->get_option_aioi(); echo "

".esc_html__('Login Redirect', 'all-in-one-intranet')."

"; echo ''; echo ""; echo "
"; echo "

".esc_html__('Effective when users login via /wp-login.php directly. Otherwise, they will be taken to the page they were trying to access before being required to login.', 'all-in-one-intranet')."

"; echo "
"; echo "
"; } protected function aioi_autologoutsection_text() { $options = $this->get_option_aioi(); echo "

".esc_html('Auto Logout', 'all-in-one-intranet')."

"; echo ''; echo ""; echo " ".esc_html__("(leave blank to turn off auto-logout)", 'all-in-one-intranet'); echo "
"; echo "
"; } // Override in Premium protected function aioi_licensesection_text() { } protected function list_options($list, $current) { $output = ''; $trans_map = Array( 'minutes' => esc_html__('Minutes', 'all-in-one-intranet'), 'hours' => esc_html__('Hours', 'all-in-one-intranet'), 'days' => esc_html__('Days', 'all-in-one-intranet') ); foreach ($list as $opt) { $output .= ''; } return $output; } public function aioi_options_validate($input) { $newinput = Array(); $newinput['aioi_version'] = $this->PLUGIN_VERSION; $newinput['aioi_privatesite'] = isset($input['aioi_privatesite']) ? (boolean)$input['aioi_privatesite'] : false; $newinput['aioi_ms_requiremember'] = isset($input['aioi_ms_requiremember']) ? (boolean)$input['aioi_ms_requiremember'] : false; $newinput['aioi_autologout_time'] = isset($input['aioi_autologout_time']) ? trim($input['aioi_autologout_time']) : ''; if(!preg_match('/^[0-9]*$/i', $newinput['aioi_autologout_time'])) { add_settings_error( 'aioi_autologout_time', 'nan_texterror', self::get_error_string('aioi_autologout_time|nan_texterror'), 'error' ); $newinput['aioi_autologout_time'] = 0; } else { $newinput['aioi_autologout_time'] = intval($newinput['aioi_autologout_time']); } $newinput['aioi_autologout_units'] = isset($input['aioi_autologout_units']) ? $input['aioi_autologout_units'] : ''; if (!in_array($newinput['aioi_autologout_units'], Array('minutes', 'hours', 'days'))) { $newinput['aioi_autologout_units'] = 'minutes'; } $newinput['aioi_loginredirect'] = isset($input['aioi_loginredirect']) ? $input['aioi_loginredirect'] : ''; return $newinput; } protected function get_error_string($fielderror) { $local_error_strings = Array( 'aioi_autologout_time|nan_texterror' => __('Auto logout time should be blank or a whole number', 'all-in-one-intranet') ); if (isset($local_error_strings[$fielderror])) { return $local_error_strings[$fielderror]; } return __('Unspecified error', 'all-in-one-intranet'); } public function aioi_save_network_options() { check_admin_referer( $this->get_options_pagename().'-options' ); if (isset($_POST[$this->get_options_name()]) && is_array($_POST[$this->get_options_name()])) { $inoptions = $_POST[$this->get_options_name()]; $outoptions = $this->aioi_options_validate($inoptions); $error_code = Array(); $error_setting = Array(); foreach (get_settings_errors() as $e) { if (is_array($e) && isset($e['code']) && isset($e['setting'])) { $error_code[] = $e['code']; $error_setting[] = $e['setting']; } } update_site_option($this->get_options_name(), $outoptions); // redirect to settings page in network wp_redirect( add_query_arg( array( 'page' => $this->get_options_menuname(), 'updated' => true, 'error_setting' => $error_setting, 'error_code' => $error_code ), network_admin_url( 'admin.php' ) ) ); exit; } } protected function aioi_options_do_network_errors() { if (isset($_REQUEST['updated']) && $_REQUEST['updated']) { ?>

0 && count($error_code) == count($error_setting)) { for ($i=0; $i

get_error_string($error_setting[$i].'|'.$error_code[$i])); ?>

$this->PLUGIN_VERSION, 'aioi_privatesite' => true, 'aioi_ms_requiremember' => true, 'aioi_autologout_time' => 0, 'aioi_autologout_units' => 'minutes', 'aioi_loginredirect' => ''); } protected $aioi_options = null; protected function get_option_aioi() { if ($this->aioi_options != null) { return $this->aioi_options; } $option = get_site_option($this->get_options_name(), Array()); $default_options = $this->get_default_options(); foreach ($default_options as $k => $v) { if (!isset($option[$k])) { $option[$k] = $v; } } $this->aioi_options = $option; return $this->aioi_options; } // ADMIN public function aioi_admin_init() { register_setting( $this->get_options_pagename(), $this->get_options_name(), Array($this, 'aioi_options_validate') ); global $pagenow; } protected function add_actions() { add_action('plugins_loaded', array($this, 'aioi_plugins_loaded')); if (is_admin()) { add_action( 'admin_init', array($this, 'aioi_admin_init'), 5, 0 ); add_action(is_multisite() ? 'network_admin_menu' : 'admin_menu', array($this, 'aioi_admin_menu')); if (is_multisite()) { add_action('network_admin_edit_'.$this->get_options_menuname(), array($this, 'aioi_save_network_options')); add_filter('network_admin_plugin_action_links', array($this, 'aioi_plugin_action_links'), 10, 2 ); } else { add_filter( 'plugin_action_links', array($this, 'aioi_plugin_action_links'), 10, 2 ); } } add_action( 'template_redirect', array($this, 'aioi_template_redirect') ); add_filter( 'robots_txt', array($this, 'aioi_robots_txt'), 0, 2); add_filter( 'option_ping_sites', array($this, 'aioi_option_ping_sites'), 0, 1); add_filter( 'rest_pre_dispatch', array($this, 'aioi_rest_pre_dispatch'), 0, 1); add_filter( 'login_redirect', array($this, 'aioi_login_redirect'), 10, 3); add_action( 'wp_login', array($this, 'aioi_wp_login'), 10, 2); add_action( 'init', array($this, 'aioi_check_activity'), 1); } public function aioi_plugins_loaded() { load_plugin_textdomain( 'all-in-one-intranet', false, dirname($this->my_plugin_basename()).'/lang/' ); } } ?>