<?php
#BEGIN_LICENSE
#-------------------------------------------------------------------------
# Module: MAMS (c) 2020-2021 by CMS Made Simple Foundation
#  An add-on module for CMS Made Simple to provide useful functions
#  and commonly used gui capabilities to other modules.
#-------------------------------------------------------------------------
# A fork of:
#
# Module: FrontEndUsers (c) 2008-2014 by Robert Campbell
#         (calguy1000@cmsmadesimple.org)
#
#-------------------------------------------------------------------------
#
# CMSMS - CMS Made Simple is (c) 2006 - 2021 by CMS Made Simple Foundation
# CMSMS - CMS Made Simple is (c) 2005 by Ted Kulp (wishy@cmsmadesimple.org)
# Visit the CMSMS Homepage at: http://www.cmsmadesimple.org
#
#-------------------------------------------------------------------------
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# However, as a special exception to the GPL, this software is distributed
# as an addon module to CMS Made Simple.  You may not use this software
# in any Non GPL version of CMS Made simple, or in any version of CMS
# Made simple that does not indicate clearly and obviously in its admin
# section that the site was built with CMS Made simple.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# Or read it online: http://www.gnu.org/licenses/licenses.html#GPL
#
#-------------------------------------------------------------------------
#END_LICENSE

class MAMSForcedLogoutTask implements CmsRegularTask
{
  public function get_name()  { return __CLASS__; }
  
  
  public function get_description()
  {
    return cms_utils::get_module('MAMS')->Lang('forcedlogouttask_desc');
  }
  
  
  public function test($time = 0)
  {
    if(!$time) { $time = time(); }
    
    $mod     = cms_utils::get_module('MAMS');
    $lastrun = $mod->GetPreference('forcelogout_lastrun');
    
    $times = $mod->GetPreference('forcelogout_times'); // like: 18:30,20:30,08:00, etc.
    
    if('' == $times) { return FALSE; }
    
    $tmp   = [];
    $times = explode(',', $times);
    
    foreach($times as $ikey => $iValue)
    {
      $t_h = '';
      $t_m = '';
      
      //if(startswith($times[$i], '*'))
      if(startswith($iValue, '*'))
      {
        [$junk, $minutes] = explode('/', $iValue, 2);
        $minutes = (int)$minutes;
        $minutes = max($minutes, 1);   // minimum 2 minutes
        $minutes = min($minutes, 180); // maximum 180 minutes.
        
        for($i = 0; $i < 60 * 24; $i += $minutes)
        {
          $t_h   = (int)($i / 60);
          $t_m   = (int)($i % 60);
          $tmp[] = mktime((int)$t_h, (int)$t_m, 0, (int)date('m', $time), (int)date('d', $time), (int)date('Y', $time));
        }
      }
      else
      {
        [$t_h, $t_m] = explode(':', trim($iValue), 2);
      }
    }
    
    rsort($tmp);
    
    $fi = '';
    $ft = '';
    // find the closest entry.
    
    $db = cmsms()->GetDb();
    foreach($tmp as $i => $iValue)
    {
      if($time > $iValue) { break; } // nothing to do..
      
      
      $dt = $iValue - $time;
      if('' == $ft || $dt < ($ft - $time))
      {
        $fi = $i;
        $ft = $iValue;
      }
      
    }
    if('' != $ft && '' != $fi && ($time - $ft) < 60)
    {
      // we found something that can execute.
      $_SESSION[get_class() . '_runtime'] = $tmp[$i];
      
      return TRUE;
    }
    
    return FALSE;
  }
  
  
  public function execute($time = 0)
  {
    if(!$time) { $time = time(); }
    
    $index = __CLASS__ . '_runtime';
    
    if(!isset($_SESSION[$index])) { return FALSE; }
    
    $the_time = $_SESSION[$index];
    unset($_SESSION[$index]);
    
    // now find all the uid's that are logged in but not active since $the_time
    $mams        = cms_utils::get_module('MAMS');
    $forgiveness = (int)$mams->GetPreference('forcelogout_sessionage');
    $forgiveness = max(0, $forgiveness) * 60;
    $the_time    -= $forgiveness;
    $uids        = $mams->GetLoggedInUsers($the_time);
    
    if(!is_array($uids) || 0 == count($uids))
    {
      return TRUE; // nothing to do.
    }
    
    foreach($uids as $i => $iValue)
    {
      $mams->Logout($uids[$i], 'forced logout');
    }
    
    $mams->Audit(
      '', $mams->GetName(), 'Forced logout of ' . count($uids) . ' users at ' . strftime('%H:%M', $the_time)
    );
    
    return TRUE;
  }
  
  
  public function on_success($time = 0)
  {
    if(!$time) { $time = time(); }
    
    $mams = cms_utils::get_module('MAMS');
    $mams->SetPreference('forcelogout_lastrun', $time);
  }
  
  public function on_failure($time = 0)
  {
    if(!$time) { $time = time(); }
  }
  
} // end of class

#
# EOF
#
?>