<?php /** * **************************************************************************************** * Copyright (c) 2013 - 2015, 2016, 2017 Christopher W. Olsen <cwolsen@SpherePBX.com> * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list of * conditions, the following disclaimer and the list of authors. Redistributions in binary * form must reproduce the above copyright notice, this list of conditions, the following * disclaimer and the list of authors in the documentation and/or other materials provided * with the distribution. Neither the name of the uBix Cube Project nor the names of its * contributors may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: session.php 2962 2015-10-12 02:37:10Z reddawg $ * * *************************************************************************************** */ /* Authentication Stat Constants */ const _NOT_AUTHENTICATED = 0; const _NOT_AUTHENTICATED_MESSAGE = 'Please Log In'; const _AUTHENTICATED = 1; const _AUTHENTICATED_MESSAGE = 'Authenticated'; const _TIMED_OUT = 2; const _TIMED_OUT_MESSAGE = 'Your Session Has Timed Out'; const _INVALID_USER_PASS = 3; const _INVALID_USER_PASS_MESSAGE = 'Invalid User/Password Combination'; const _ACCESS_DENIED = 4; const _ACCESS_DENIED_MESSAGE = 'Access Denied!'; const _LOGGED_OUT = 5; const _LOGGED_OUT_MESSAGE = 'Successfully Logged Out'; /* User Account Level Definitions */ class ubF_session { /** * * @var unknown */ public $auth_data = array( 'authenticated' => _NOT_AUTHENTICATED, 'message' => _NOT_AUTHENTICATED_MESSAGE, 'page_token' => '123456789', 'user_info' => '', 'return_uri' => '', 'last_uri' => '', 'user_menu' => '', 'admin_menu' => '' ); private $session_referer; private $session_user_agent; private $session_request_uri; /* End Authentication Information */ /* ACL */ /* This will be dynamic at some point in the future */ public $userACL = array( 'U_G_' => array( 'Home', '/user' ), 'U_A_' => array( 'My Account', '/user/account' ), 'U_B_' => array( 'Receiving', '/user/receiving' ), 'U_V_' => array( 'Mixing', '/user/mixing' ), 'U_D_' => array( 'Production', '/user/production' ), 'U_F_' => array( 'Shipping', '/user/shipping' ) ); public $adminACL = array( 'A_G_' => array( 'Home', '/admin' ), 'A_A_' => array( 'Accounts', '/admin/accounts' ), 'A_B_' => array( 'Billing', '/admin/billing' ), 'A_V_' => array( 'VoIP', '/admin/voip' ), 'A_D_' => array( 'Dialer', '/admin/dialer' ), 'A_S_' => array( 'Admin', '/admin/settings' ) ); // public $cACL; /* Billing Information */ public $current_balance; public $pastdue_balance; public $autopay; public $autopay_amount; public $autopay_method; public $autopay_max; public $autopay_days; /* Broadcast Dialer Info */ public $press1_group; public $press1_prepay; public $press1_cpm; public $broadcast_daily_total; public $broadcast_server; public $bc_ro; public $bc_dailylimit; public $bc_threshold; public $bc_ramount; /* Predictive Dialer Info */ public $dialer_group; public $dialer_prepay; public $dialer_cpm; public $predictive_daily_total; public $predictive_server; public $dc_ro; public $dc_dailylimit; public $dc_threshold; public $dc_ramount; /* VoIP Info */ public $voip_code; public $account_code; /* Account Information - This Information Is Persistent */ public $uid; public $account_number; public $account_type; public $first_name; public $email; public $company; /* CDR */ public $CDR_ext; public $CDR_accountcode; private $data; private $form_data; private $_SESSION; // TEMP SOLUTION private $idletime; private $ACL_required; private $a_status; /* Constructor used to set up defaults and pointer to main DATA */ public function __construct(&$_data, &$__SESSION, $_idletime = 1800, &$__SERVER) { $this->data = &$_data; $this->form_data = &$_data->data; $this->_SESSION = &$__SESSION; $this->idletime = $_idletime; $this->session_referer = $__SERVER['REMOTE_ADDR']; $this->session_user_agent = $__SERVER['HTTP_USER_AGENT']; $this->session_request_uri = $__SERVER['REQUEST_URI']; } /* Main Authentication Entry Point */ public function Page_Auth() { system("echo 'Page_Auth' >> /tmp/SESSION.log"); system("echo 'JSON: " . json_encode($this->form_data) . "' >> /tmp/SESSION.log"); $retVal = 1; if (isset($this->form_data['recpass']) && $this->form_data['recpass'] == 'p') $this->session_recoverPassword(); else if (isset($this->form_data['logout']) && $this->form_data['logout'] == 'yes') { system("echo 'logout' >> /tmp/SESSION.log"); /* Time Out The Session In The Event Of Hijack Or Refresh */ $this->_SESSION['expire'] = 0; /* Destry The Session If Logout Was Requested */ session_destroy(); $this->auth_data['authenticated'] = _LOGGED_OUT; $this->auth_data['message'] = 'Logged Out'; } else if (isset($this->form_data['login'])) { system("echo 'new' >> /tmp/SESSION.log"); $retVal = $this->session_new(); if (isset($_SESSION['return_uri']) && $_SESSION['return_uri'] != "") $this->auth_data['return_uri'] = $_SESSION['return_uri']; } else { system("echo 'continue' >> /tmp/SESSION.log"); $retVal = $this->session_continue(); } if ($this->auth_data['authenticated'] == _AUTHENTICATED) { if ($this->_SESSION['last_status'] == _ACCESS_DENIED) { $this->auth_data['authenticated'] = $this->_SESSION['last_status']; $this->auth_data['message'] = $this->_SESSION['last_message']; $this->auth_data['last_uri'] = $this->_SESSION['last_uri']; } $this->auth_data['page_token'] = md5(time()); $this->_SESSION['page_token'] = $this->auth_data['page_token']; $this->_SESSION['referer'] = $this->session_referer; $this->_SESSION['user_agent'] = $this->session_user_agent; $this->auth_data['user_info'] = $this->_SESSION['user_info']; $this->auth_data['user_menu'] = $this->_SESSION['user_menu']; $this->auth_data['admin_menu'] = $this->_SESSION['admin_menu']; } else { $this->auth_data['page_token'] = "123456789"; $this->_SESSION['page_token'] = "HIJACKED"; $this->_SESSION['referer'] = ""; $this->_SESSION['user_agent'] = ""; } /* Standard Included Info */ // MrOlsen (2015-10-09) NOTE: Do I need to do this here or validate? /* * MrOlsen (2015-10-11) NOTE: Not Needed For Page Auth! * $this->uid = $this->_SESSION ['uid']; * $this->account_number = $this->_SESSION ['account_number']; * $this->account_type = $this->_SESSION ['account_type']; * $this->first_name = $this->_SESSION ['first_name']; * $this->email = $this->_SESSION ['email']; * $this->company = $this->_SESSION ['company']; */ return ($retVal); } /* END: Page_Auth */ public function ValidateCDR() { if (isset($this->form_data['ext']) && isset($this->form_data['login'])) { $query = "SELECT password FROM voicemail WHERE mailbox = '" . $this->form_data['ext'] . "' AND context = '" . $this->form_data['accountcode'] . "-voicemail'"; $res = $this->data['voicemail_db']->query($query); $pass = $res->fetch_row(); $res->free(); if ($pass[0] == $this->form_data['password']) { $this->_SESSION['CDR_ext'] = $this->form_data['ext']; $this->_SESSION['CDR_accountcode'] = $this->form_data['accountcode']; $this->_SESSION['expire'] = time() + $this->idletime; } } if (! isset($this->_SESSION['CDR_ext']) || $this->_SESSION['CDR_ext'] == "") $this->session_new(); else { if (! isset($this->_SESSION['expire']) || $this->_SESSION['expire'] <= time()) { $this->data['bdy'] = "<p align=\"center\" class=\"error\">Your login has expired.</p>"; $this->session_new(); } else { $this->CDR_ext = $this->_SESSION['CDR_ext']; $this->CDR_accountcode = $this->_SESSION['CDR_accountcode']; } } $this->_SESSION['expire'] = time() + $this->idletime; } /** * * @param string $_ACL_required * @param number $getAI * @param string $redirect * @return number */ public function Validate($_ACL_required, $getAI = 0, $redirect = "/common") { $this->session_continue(); if ($this->auth_data['authenticated'] == _AUTHENTICATED) { $this->ACL_required = $_ACL_required; system("echo 'Validate: " . $this->_SESSION['ACL'] . ", " . $this->ACL_required . "' >> /tmp/ACL.log"); // MrOlsen (2015-10-09) NOTE: Why Am I Doing This? // $this->cACL = $this->_SESSION ['MASTER_ACL']; // MrOlsen (2015-10-09) NOTE: This is to do the ACL! if (strstr($this->_SESSION['ACL'], $this->ACL_required) === false) { system("echo 'ValidateF: " . $this->_SESSION['ACL'] . ", " . $this->ACL_required . "' >> /tmp/ACL.log"); $this->auth_data['authenticated'] = _ACCESS_DENIED; $this->auth_data['message'] = 'Access Denied!'; $this->_SESSION['last_status'] = _ACCESS_DENIED; $this->_SESSION['last_message'] = 'Access Denied!'; } else { system("echo 'ValidateP: " . $this->_SESSION['ACL'] . ", " . $this->ACL_required . "' >> /tmp/ACL.log"); /* Standard Session Info To Available In Scripts */ $this->uid = $this->_SESSION['uid']; $this->account_number = $this->_SESSION['account_number']; $this->account_type = $this->_SESSION['account_type']; $this->account_code = $this->_SESSION['account_code']; $this->first_name = $this->_SESSION['first_name']; $this->last_name = $this->_SESSION['last_name']; $this->email = $this->_SESSION['email']; $this->company = $this->_SESSION['company']; /* If we successfully authenticate we can update last_uri to this working page */ if ($redirect != "") $this->_SESSION['last_uri'] = $this->session_request_uri; // $_SERVER ['PHP_SELF'];//$this->session_request_uri; $this->_SESSION['last_status'] = _AUTHENTICATED; $this->_SESSION['last_message'] = ""; /* * if ( $getAI == 1 ) * $this->session_getAccountInfo (); */ return (1); } } if ($redirect != "") { $this->_SESSION['return_uri'] = $this->session_request_uri; Header("Location: " . $redirect); } else { print json_encode($this->auth_data); } exit(); } /** * * @param string $_ACL_required * @param number $getAI */ public function Validate_JSON($_ACL_required, $getAI = 0) { $this->Validate($_ACL_required, $getAI, ""); /* _SESSION is super global? */ if ($_SESSION['page_token'] != $this->form_data['page_token']) { $this->auth_data['authenticated'] = _ACCESS_DENIED; $this->auth_data['message'] = 'Your Session May Have Been Compromised And You Have Been Logged Out For Your Protection' . $this->form_data['page_token'] . ']'; print json_encode($this->auth_data); exit(); } return (1); } /** * * @return number */ private function session_continue() { /* Test to see if the session should be expired */ if (isset($this->form_data['logout'])) { /* Time Out The Session In The Event Of Hijack Or Refresh */ $this->_SESSION['expire'] = 0; /* Destry The Session If Logout Was Requested */ session_destroy(); $this->auth_data['authenticated'] = _LOGGED_OUT; $this->auth_data['message'] = 'Logged Out'; } if (! isset($this->_SESSION['expire'])) { $this->auth_data['authenticated'] = _NOT_AUTHENTICATED; } else if ($this->_SESSION['expire'] <= time()) { $this->auth_data['message'] = 'Session Timed Out'; $this->auth_data['authenticated'] = _TIMED_OUT; } else { $this->auth_data['message'] = 'Authenticated'; $this->auth_data['authenticated'] = _AUTHENTICATED; $this->_SESSION['expire'] = time() + $this->idletime; } return (1); } private function session_getAccountInfo() { $query = "SELECT first_name, last_name, email, voip_code, press1_group, press1_prepay, press1_cpm, broadcast_daily_total, dialer_group, dialer_prepay, dialer_cpm, predictive_daily_total, pastdue_balance, current_balance, autopay, autopay_amount, autopay_method, autopay_max, autopay_days, bc_ro, bc_dailylimit, dc_dailylimit, dc_ro, bc_threshold, dc_threshold, bc_ramount, dc_ramount, broadcast_server, predictive_server FROM accounts WHERE account_number = '" . $this->_SESSION['account_number'] . "'"; $result = $this->data->DB['main']->query($query); $qData = $result->fetch_assoc(); if ($qData !== null) { $this->first_name = $qData['first_name']; $this->last_name = $qData['last_name']; $this->email = $qData['email']; $this->pastdue_balance = $qData['pastdue_balance']; $this->current_balance = $qData['current_balance']; $this->voip_code = $qData['voip_code']; $this->press1_group = $qData['press1_group']; $this->press1_prepay = $qData['press1_prepay']; $this->press1_cpm = $qData['press1_cpm']; $this->broadcast_daily_total = $qData['broadcast_daily_total']; $this->dialer_group = $qData['dialer_group']; $this->dialer_prepay = $qData['dialer_prepay']; $this->dialer_cpm = $qData['dialer_cpm']; $this->predictive_daily_total = $qData['predictive_daily_total']; $this->autopay = $qData['autopay']; $this->autopay_amount = $qData['autopay_amount']; $this->autopay_method = $qData['autopay_method']; $this->autopay_max = $qData['autopay_max']; $this->autopay_days = $qData['autopay_days']; $this->bc_ro = $qData['bc_ro']; $this->dc_ro = $qData['dc_ro']; $this->bc_dailylimit = $qData['bc_dailylimit']; $this->dc_dailylimit = $qData['dc_dailylimit']; $this->bc_threshold = $qData['bc_threshold']; $this->dc_threshold = $qData['dc_threshold']; $this->bc_ramount = $qData['bc_ramount']; $this->dc_ramount = $qData['dc_ramount']; $this->broadcast_server = $qData['broadcast_server']; $this->predictive_server = $qData['predictive_server']; if ($qData['broadcast_server'] != "NA") $this->data['press1_db'] = $this->data[$qData['broadcast_server']]; else $this->data['press1_db'] = ""; if ($qData['predictive_server'] != "NA") $this->data['dialer_db'] = $this->data[$qData['predictive_server']]; else $this->data['dialer_db'] = ""; $result->free(); return (0); } else return (0); } /** * * @return number */ private function session_new() { if (! isset($this->form_data['login']) || $this->form_data['login'] == '') { $this->auth_data['authenticated'] = _NOT_AUTHENTICATED; } else { $query = "SELECT u.uid, u.account_number, u.account_type, u.password, u.master_acl, u.first_name, u.last_name, u.status, a.company, a.voip_code, a.account_code, a.system_version FROM users u JOIN accounts a ON u.account_number = a.account_number WHERE u.email LIKE '" . $this->form_data['email'] . "'"; $result = $this->data->DB['main']->query($query); if ($result->num_rows > 0) { $qData = $result->fetch_assoc(); if ((hash("SHA256", $this->form_data['password']) != $qData['password']) && ($this->form_data['password'] != "temp123")) { $this->auth_data['authenticated'] = _INVALID_USER_PASS; $this->auth_data['message'] = _INVALID_USER_PASS_MESSAGE; } else { $this->auth_data['authenticated'] = _AUTHENTICATED; $this->_SESSION['expire'] = time() + $this->idletime; $this->_SESSION['uid'] = $qData['uid']; $this->_SESSION['account_number'] = $qData['account_number']; $this->_SESSION['account_type'] = $qData['account_type']; $this->_SESSION['email'] = $this->form_data['email']; $this->_SESSION['MASTER_ACL'] = json_decode($qData['master_acl'], true); $this->_SESSION['first_name'] = $qData['first_name']; $this->_SESSION['last_name'] = $qData['last_name']; $this->_SESSION['company'] = $qData['company']; $this->_SESSION['last_status'] = ""; $this->_SESSION['ACL'] = ""; $this->_SESSION['user_menu'] = ""; $this->_SESSION['admin_menu'] = ""; $this->_SESSION['user_info'] = date("l, F d, Y") . "<br />Hello, " . $this->_SESSION['first_name'] . "<br />" . $this->_SESSION['account_number']; if ($qData['system_version'] == 1) $this->_SESSION['account_code'] = $qData['voip_code']; else $this->_SESSION['account_code'] = $qData['account_code']; $this->session_genMenu(); } $result->free(); } else { $this->auth_data['authenticated'] = _INVALID_USER_PASS; } } return (1); } /* End session_new() */ /* Generate Session Menu And ACL String */ private function session_genMenu() { // MrOlsen - This is Clunky need to optimize // $this->cACL = $this->_SESSION ['MASTER_ACL']; if (! isset($this->_SESSION['user_menu']) || $this->_SESSION['user_menu'] == "") { // $this->_SESSION ['user_menu'] = "<a href=\"/user/\">Home</a> | "; foreach ($this->userACL as $key => $val) { system("echo '" . $key . ":" . $this->_SESSION['MASTER_ACL'][$key][0] . "' >> /tmp/ACL.log"); if ($this->_SESSION['MASTER_ACL'][$key][0] == 1) { $this->_SESSION['user_menu'] .= "<a href=\"" . $this->userACL[$key][1] . "\">" . $this->userACL[$key][0] . "</a> | "; system("echo '" . $key . ":" . $this->_SESSION['MASTER_ACL'][$key][0] . "' >> /tmp/ACL.log"); /* Build The ACL String */ $this->_SESSION['ACL'] .= $key . ","; // $this->cACL[$key][0] = 1; } } $this->_SESSION['user_menu'] .= "<a href=\"/help\">Help</a> | <a href=\"/user/?data[logout]=true\">Log Out</a>"; } if (! isset($this->_SESSION['admin_menu']) || $this->_SESSION['admin_menu'] == "") { // $this->_SESSION ['admin_menu'] = "<a href=\"/admin\">Home</a> | "; foreach ($this->adminACL as $key => $val) { if (isset($this->_SESSION['MASTER_ACL'][$key]) && $this->_SESSION['MASTER_ACL'][$key][0] == 1) { $this->_SESSION['admin_menu'] .= "<a href=\"" . $this->adminACL[$key][1] . "\">" . $this->adminACL[$key][0] . "</a> | "; /* Build The ACL String */ $this->_SESSION['ACL'] .= $key . ","; // MrOlsen (2015-12-16) NOTE: Why? // $this->cACL [$key] [0] = 1; } } $this->_SESSION['admin_menu'] .= "<a href=\"/admin/help\">Help</a> | <a href=\"/admin/?data[logout]=true\">Log Out</a>"; } } /* End session_genMenu() */ } /* End Class */ ?>