mirror of
https://github.com/lucaspalomodevelop/core.git
synced 2026-03-14 16:44:39 +00:00
This code unfortunately is utterly broken, the plain Javascript code is lenghty and buggy, this only tries to solve the escape issue, but it would be much better if all of this would be replaced with some simple jQuery constructtions.
1140 lines
46 KiB
PHP
1140 lines
46 KiB
PHP
<?php
|
|
|
|
/*
|
|
* Copyright (C) 2018 Fabian Franz
|
|
* Copyright (C) 2014-2015 Deciso B.V.
|
|
* Copyright (C) 2004 Scott Ullrich <sullrich@gmail.com>
|
|
* Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
*
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED ``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
|
|
* AUTHOR 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.
|
|
*/
|
|
|
|
require_once("guiconfig.inc");
|
|
require_once("filter.inc");
|
|
|
|
/****f* legacy/is_schedule_inuse
|
|
* NAME
|
|
* checks to see if a schedule is currently in use by a rule
|
|
* INPUTS
|
|
*
|
|
* RESULT
|
|
* true or false
|
|
* NOTES
|
|
*
|
|
******/
|
|
function is_schedule_inuse($schedule)
|
|
{
|
|
global $config;
|
|
|
|
if ($schedule == '') {
|
|
return false;
|
|
}
|
|
|
|
/* loop through firewall rules looking for schedule in use */
|
|
if (isset($config['filter']['rule'])) {
|
|
foreach ($config['filter']['rule'] as $rule) {
|
|
if ($rule['sched'] == $schedule) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function schedule_sort()
|
|
{
|
|
global $config;
|
|
|
|
if (!isset($config['schedules']['schedule'])) {
|
|
return;
|
|
}
|
|
|
|
usort($config['schedules']['schedule'], function ($a, $b) {
|
|
return strcmp($a['name'], $b['name']);
|
|
});
|
|
}
|
|
|
|
$dayArray = array (gettext('Mon'),gettext('Tues'),gettext('Wed'),gettext('Thur'),gettext('Fri'),gettext('Sat'),gettext('Sun'));
|
|
$monthArray = array (gettext('January'),gettext('February'),gettext('March'),gettext('April'),gettext('May'),gettext('June'),gettext('July'),gettext('August'),gettext('September'),gettext('October'),gettext('November'),gettext('December'));
|
|
|
|
$a_schedules = &config_read_array('schedules', 'schedule');
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
|
|
// input record id, if valid
|
|
if (!empty($_GET['name'])) {
|
|
foreach ($a_schedules as $i => $sched) {
|
|
if ($sched['name'] == $_GET['name']) {
|
|
$id = $i;
|
|
$configId = $id;
|
|
break;
|
|
}
|
|
}
|
|
} elseif (isset($_GET['dup']) && isset($a_schedules[$_GET['dup']])) {
|
|
$configId = $_GET['dup'];
|
|
} elseif (isset($_GET['id']) && isset($a_schedules[$_GET['id']])) {
|
|
$id = $_GET['id'];
|
|
$configId = $id;
|
|
}
|
|
$pconfig['name'] = $a_schedules[$configId]['name'];
|
|
$pconfig['descr'] = $a_schedules[$configId]['descr'];
|
|
$pconfig['timerange'] = isset($a_schedules[$configId]['timerange']) ? $a_schedules[$configId]['timerange'] : array();
|
|
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$input_errors = array();
|
|
if (isset($_POST['id']) && isset($a_schedules[$_POST['id']])) {
|
|
$id = $_POST['id'];
|
|
}
|
|
$pconfig = $_POST;
|
|
|
|
// validate
|
|
if (strtolower($pconfig['name']) == 'lan') {
|
|
$input_errors[] = gettext('Schedule may not be named LAN.');
|
|
}
|
|
if (strtolower($pconfig['name']) == 'wan') {
|
|
$input_errors[] = gettext('Schedule may not be named WAN.');
|
|
}
|
|
if (empty($pconfig['name'])) {
|
|
$input_errors[] = gettext('Schedule may not use a blank name.');
|
|
}
|
|
|
|
if (!preg_match('/^[a-zA-Z0-9_\-]{1,32}$/', $pconfig['name'])) {
|
|
$input_errors[] = sprintf(gettext('The schedule name must be less than 32 characters long and may only consist of the following characters: %s'), 'a-z, A-Z, 0-9, _');
|
|
}
|
|
|
|
/* check for name conflicts */
|
|
foreach ($a_schedules as $schedId => $schedule) {
|
|
if ((!isset($id) || $schedId != $id) && $schedule['name'] == $pconfig['name']) {
|
|
$input_errors[] = gettext("A Schedule with this name already exists.");
|
|
break;
|
|
}
|
|
}
|
|
|
|
// parse time ranges
|
|
$pconfig['timerange'] = array();
|
|
|
|
$timerangeFound = false;
|
|
for ($x=0; $x<99; $x++){
|
|
if($pconfig['schedule' . $x]) {
|
|
if (!preg_match('/^[0-9]+:[0-9]+$/', $pconfig['starttime' . $x])) {
|
|
$input_errors[] = sprintf(gettext("Invalid start time - '%s'"), $pconfig['starttime' . $x]);
|
|
continue;
|
|
}
|
|
if (!preg_match('/^[0-9]+:[0-9]+$/', $pconfig['stoptime' . $x])) {
|
|
$input_errors[] = sprintf(gettext("Invalid stop time - '%s'"), $pconfig['stoptime' . $x]);
|
|
continue;
|
|
}
|
|
$timerangeFound = true;
|
|
$timeparts = array();
|
|
$firstprint = false;
|
|
$timestr = $pconfig['schedule' . $x];
|
|
$timehourstr = $pconfig['starttime' . $x];
|
|
$timehourstr .= "-";
|
|
$timehourstr .= $pconfig['stoptime' . $x];
|
|
$timedescrstr = $pconfig['timedescr' . $x];
|
|
$dashpos = strpos($timestr, '-');
|
|
if ($dashpos === false) {
|
|
$timeparts['position'] = $timestr;
|
|
} else {
|
|
$tempindarray = array();
|
|
$monthstr = "";
|
|
$daystr = "";
|
|
$tempindarray = explode(",", $timestr);
|
|
foreach ($tempindarray as $currentselection) {
|
|
if ($currentselection){
|
|
if ($firstprint) {
|
|
$monthstr .= ",";
|
|
$daystr .= ",";
|
|
}
|
|
$tempstr = "";
|
|
$monthpos = strpos($currentselection, "m");
|
|
$daypos = strpos($currentselection, "d");
|
|
$monthstr .= substr($currentselection, $monthpos+1, $daypos-$monthpos-1);
|
|
$daystr .= substr($currentselection, $daypos+1);
|
|
$firstprint = true;
|
|
}
|
|
}
|
|
$timeparts['month'] = $monthstr;
|
|
$timeparts['day'] = $daystr;
|
|
}
|
|
$timeparts['hour'] = $timehourstr;
|
|
$timeparts['rangedescr'] = $timedescrstr;
|
|
$pconfig['timerange'][$x] = $timeparts;
|
|
}
|
|
}
|
|
|
|
if (count($pconfig['timerange']) == 0) {
|
|
$input_errors[] = gettext("The schedule must have at least one time range configured.");
|
|
}
|
|
|
|
if (count($input_errors) == 0) {
|
|
$schedule = array();
|
|
$schedule['name'] = $pconfig['name'];
|
|
$schedule['descr'] = $pconfig['descr'];
|
|
$schedule['timerange'] = $pconfig['timerange'];
|
|
|
|
if (isset($id)) {
|
|
$a_schedules[$id] = $schedule;
|
|
} else {
|
|
$a_schedules[] = $schedule;
|
|
}
|
|
|
|
schedule_sort();
|
|
write_config();
|
|
filter_configure();
|
|
|
|
header(url_safe('Location: /firewall_schedule.php'));
|
|
exit;
|
|
}
|
|
}
|
|
|
|
legacy_html_escape_form_data($pconfig);
|
|
|
|
include("head.inc");
|
|
|
|
?>
|
|
<body>
|
|
<script>
|
|
//<![CDATA[
|
|
var daysSelected = "";
|
|
var month_array = <?= json_encode($monthArray) ?>;
|
|
var day_array = <?= json_encode($dayArray) ?>;
|
|
var schCounter = 0;
|
|
|
|
function repeatExistingDays(){
|
|
var tempstr, tempstrdaypos, week, daypos, dayposdone = "";
|
|
|
|
var dayarray = daysSelected.split(",");
|
|
for (let i=0; i<=dayarray.length; i++){
|
|
tempstr = dayarray[i];
|
|
tempstrdaypos = tempstr.search("p");
|
|
week = tempstr.substring(1,tempstrdaypos);
|
|
week = parseInt(week);
|
|
const dashpos = tempstr.search("-");
|
|
daypos = tempstr.substring(tempstrdaypos+1, dashpos);
|
|
daypos = parseInt(daypos);
|
|
|
|
const daydone = dayposdone.search(daypos);
|
|
tempstr = 'w' + week + 'p' + daypos;
|
|
const daycell = document.getElementById(tempstr);
|
|
if (daydone == "-1"){
|
|
if (daycell.dataset['state'] == "lightcoral")
|
|
daytogglerepeating(week,daypos,true);
|
|
else
|
|
daytogglerepeating(week,daypos,false);
|
|
dayposdone += daypos + ",";
|
|
}
|
|
}
|
|
}
|
|
|
|
function daytogglerepeating(week,daypos,bExists){
|
|
var tempstr, daycell, dayoriginal = "";
|
|
for (let j=1; j<=53; j++)
|
|
{
|
|
tempstr = 'w' + j + 'p' + daypos;
|
|
daycell = document.getElementById(tempstr);
|
|
const dayoriginalpos = daysSelected.indexOf(tempstr);
|
|
|
|
//if bExists set to true, means cell is already select it
|
|
//unselect it and remove original day from daysSelected string
|
|
|
|
if (daycell != null)
|
|
{
|
|
if (bExists){
|
|
daycell.dataset['state'] = "white";
|
|
}
|
|
else
|
|
{
|
|
daycell.dataset['state'] = "lightcoral";
|
|
}
|
|
|
|
if (dayoriginalpos != "-1")
|
|
{
|
|
const dayoriginalend = daysSelected.indexOf(',', dayoriginalpos);
|
|
tempstr = daysSelected.substring(dayoriginalpos, dayoriginalend+1);
|
|
daysSelected = daysSelected.replace(tempstr, "");
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function daytoggle(id) {
|
|
var runrepeat, tempstr = "";
|
|
var bFoundValid = false;
|
|
|
|
const iddashpos = id.search("-");
|
|
var tempstrdaypos = id.search("p");
|
|
var week = id.substring(1,tempstrdaypos);
|
|
week = parseInt(week);
|
|
|
|
let idmod;
|
|
if (iddashpos == "-1")
|
|
{
|
|
idmod = id;
|
|
runrepeat = true;
|
|
var daypos = id.substring(tempstrdaypos+1);
|
|
}
|
|
else
|
|
{
|
|
idmod = id.substring(0,iddashpos);
|
|
var daypos = id.substring(tempstrdaypos+1,iddashpos);
|
|
}
|
|
|
|
daypos = parseInt(daypos);
|
|
|
|
while (!bFoundValid){
|
|
var daycell = document.getElementById(idmod);
|
|
|
|
if (daycell != null){
|
|
if (daycell.dataset['state'] == "red"){ // red
|
|
daycell.dataset['state'] = "white";
|
|
let str = id + ",";
|
|
daysSelected = daysSelected.replace(str, "");
|
|
}
|
|
else if (daycell.dataset['state'] == "lightcoral")
|
|
{
|
|
daytogglerepeating(week,daypos,true);
|
|
}
|
|
else //color is white cell
|
|
{
|
|
if (!runrepeat)
|
|
{
|
|
daycell.dataset['state'] = "red"; // red
|
|
}
|
|
else
|
|
{
|
|
daycell.dataset['state'] = "lightcoral";
|
|
daytogglerepeating(week,daypos,false);
|
|
}
|
|
daysSelected += id + ",";
|
|
}
|
|
bFoundValid = true;
|
|
}
|
|
else
|
|
{
|
|
//we found an invalid cell when column was clicked, move up to the next week
|
|
week++;
|
|
tempstr = "w" + week + "p" + daypos;
|
|
idmod = tempstr;
|
|
}
|
|
}
|
|
}
|
|
|
|
function update_month(){
|
|
var indexNum = document.iform.monthsel.selectedIndex;
|
|
var selected = document.iform.monthsel.options[indexNum].text;
|
|
|
|
for (let month = 0; month < 12; month++){
|
|
let option = document.iform.monthsel.options[month].text;
|
|
document.popupMonthLayer = document.getElementById(option);
|
|
|
|
if(selected == option) {
|
|
document.popupMonthLayer.style.display="block";
|
|
}
|
|
else
|
|
document.popupMonthLayer.style.display="none";
|
|
}
|
|
}
|
|
|
|
function checkForRanges(){
|
|
if (daysSelected !== '')
|
|
{
|
|
alert("You have not saved the specified time range. Please click 'Add Time' button to save the time range.");
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function processEntries(){
|
|
var tempstr, starttimehour, starttimemin, stoptimehour, stoptimemin, errors = "";
|
|
var passedValidation = true;
|
|
|
|
//get time specified
|
|
starttimehour = parseInt(document.getElementById("starttimehour").value);
|
|
starttimemin = parseInt(document.getElementById("starttimemin").value);
|
|
stoptimehour = parseInt(document.getElementById("stoptimehour").value);
|
|
stoptimemin = parseInt(document.getElementById("stoptimemin").value);
|
|
|
|
|
|
//do time checks
|
|
if (starttimehour > stoptimehour)
|
|
{
|
|
errors = "Error: Start Hour cannot be greater than Stop Hour.";
|
|
passedValidation = false;
|
|
|
|
}
|
|
else if (starttimehour == stoptimehour)
|
|
{
|
|
if (starttimemin > stoptimemin){
|
|
errors = "Error: Start Minute cannot be greater than Stop Minute.";
|
|
passedValidation = false;
|
|
}
|
|
}
|
|
|
|
if (passedValidation){
|
|
addTimeRange();
|
|
}
|
|
else {
|
|
if (errors != "")
|
|
alert(errors);
|
|
}
|
|
}
|
|
|
|
function addTimeRange(){
|
|
var tempdayarray = daysSelected.split(","),
|
|
tempstr,
|
|
nrtempFriendlyTime = '',
|
|
rtempFriendlyTime = '',
|
|
nrtempID = '',
|
|
rtempID = "",
|
|
tempstrdaypos,
|
|
week,
|
|
daypos,
|
|
day,
|
|
month,
|
|
dashpos,
|
|
monthstr = '',
|
|
daystr = "",
|
|
rtempFriendlyDay = "",
|
|
findCurrentCounter,
|
|
nonrepeatingfound;
|
|
tempdayarray.sort();
|
|
|
|
//check for existing entries
|
|
for (var u=0; u<99; u++){
|
|
findCurrentCounter = document.getElementById("schedule" + u);
|
|
if (!findCurrentCounter)
|
|
{
|
|
schCounter = u;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (daysSelected != ""){
|
|
//get days selected
|
|
for (let i=0; i<tempdayarray.length; i++)
|
|
{
|
|
tempstr = tempdayarray[i];
|
|
if (tempstr != "")
|
|
{
|
|
tempstrdaypos = tempstr.search("p");
|
|
week = parseInt(tempstr.substring(1, tempstrdaypos));
|
|
dashpos = tempstr.search("-");
|
|
|
|
if (dashpos != "-1")
|
|
{
|
|
nonrepeatingfound = true;
|
|
daypos = tempstr.substring(tempstrdaypos+1, dashpos);
|
|
daypos = parseInt(daypos);
|
|
let monthpos = tempstr.search("m");
|
|
tempstrdaypos = tempstr.search("d");
|
|
month = tempstr.substring(monthpos+1, tempstrdaypos);
|
|
month = parseInt(month);
|
|
day = tempstr.substring(tempstrdaypos+1);
|
|
day = parseInt(day);
|
|
monthstr += month + ",";
|
|
daystr += day + ",";
|
|
nrtempID += tempstr + ",";
|
|
}
|
|
else
|
|
{
|
|
var repeatingfound = true;
|
|
daypos = tempstr.substring(tempstrdaypos+1);
|
|
daypos = parseInt(daypos);
|
|
rtempFriendlyDay += daypos + ",";
|
|
rtempID += daypos + ",";
|
|
}
|
|
}
|
|
}
|
|
|
|
//code below spits out friendly look format for nonrepeating schedules
|
|
var firstDayFound = false;
|
|
var firstprint = false;
|
|
var tempFriendlyMonthArray = monthstr.split(",");
|
|
var tempFriendlyDayArray = daystr.split(",");
|
|
var currentDay, firstDay, nextDay, firstMonth = 0;
|
|
for (var k=0; k<tempFriendlyMonthArray.length; k++){
|
|
tempstr = tempFriendlyMonthArray[k];
|
|
if (tempstr != ""){
|
|
if (!firstDayFound)
|
|
{
|
|
firstDay = parseInt(tempFriendlyDayArray[k]);
|
|
firstMonth = parseInt(tempFriendlyMonthArray[k]);
|
|
firstDayFound = true;
|
|
}
|
|
currentDay = parseInt(tempFriendlyDayArray[k]);
|
|
//get next day
|
|
nextDay = parseInt(tempFriendlyDayArray[k+1]);
|
|
//get next month
|
|
|
|
currentDay++;
|
|
if ((currentDay != nextDay) || (tempFriendlyMonthArray[k] != tempFriendlyMonthArray[k+1])){
|
|
if (firstprint)
|
|
nrtempFriendlyTime += ", ";
|
|
currentDay--;
|
|
if (currentDay != firstDay) {
|
|
nrtempFriendlyTime += month_array[firstMonth-1] + " " + firstDay + "-" + currentDay;
|
|
}
|
|
else {
|
|
nrtempFriendlyTime += month_array[firstMonth-1] + " " + currentDay;
|
|
}
|
|
firstDayFound = false;
|
|
firstprint = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
//code below spits out friendly look format for repeating schedules
|
|
firstDayFound = false;
|
|
firstprint = false;
|
|
tempFriendlyDayArray = rtempFriendlyDay.split(",");
|
|
tempFriendlyDayArray.sort();
|
|
currentDay, firstDay, nextDay = "";
|
|
for (k=0; k<tempFriendlyDayArray.length; k++){
|
|
tempstr = tempFriendlyDayArray[k];
|
|
if (tempstr != ""){
|
|
if (!firstDayFound)
|
|
{
|
|
firstDay = parseInt(tempFriendlyDayArray[k]);
|
|
firstDayFound = true;
|
|
}
|
|
currentDay = parseInt(tempFriendlyDayArray[k]);
|
|
//get next day
|
|
nextDay = parseInt(tempFriendlyDayArray[k+1]);
|
|
currentDay++;
|
|
if (currentDay != nextDay){
|
|
if (firstprint) {
|
|
rtempFriendlyTime += ", ";
|
|
}
|
|
currentDay--;
|
|
if (currentDay != firstDay) {
|
|
rtempFriendlyTime += day_array[firstDay-1] + " - " + day_array[currentDay-1];
|
|
}
|
|
else {
|
|
rtempFriendlyTime += day_array[firstDay-1];
|
|
}
|
|
firstDayFound = false;
|
|
firstprint = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
//sort the tempID
|
|
var tempsortArray = rtempID.split(",");
|
|
var isFirstdone = false;
|
|
tempsortArray.sort();
|
|
//clear tempID
|
|
rtempID = "";
|
|
for (let t=0; t<tempsortArray.length; t++)
|
|
{
|
|
if (tempsortArray[t] !== ''){
|
|
if (!isFirstdone){
|
|
rtempID += tempsortArray[t];
|
|
isFirstdone = true;
|
|
}
|
|
else
|
|
rtempID += "," + tempsortArray[t];
|
|
}
|
|
}
|
|
|
|
|
|
//get time specified
|
|
const starttimehour = $('#starttimehour').val();
|
|
const starttimemin = $('#starttimemin').val();
|
|
const stoptimehour = $('#stoptimehour').val();
|
|
const stoptimemin = $('#stoptimemin').val();
|
|
|
|
//get description for time range
|
|
const time_description = $('#timerangedescr').val();
|
|
|
|
if (nonrepeatingfound){
|
|
insertElements(
|
|
nrtempFriendlyTime,
|
|
starttimehour,
|
|
starttimemin,
|
|
stoptimehour,
|
|
stoptimemin,
|
|
time_description,
|
|
nrtempID
|
|
);
|
|
}
|
|
|
|
if (repeatingfound){
|
|
insertElements(
|
|
rtempFriendlyTime,
|
|
starttimehour,
|
|
starttimemin,
|
|
stoptimehour,
|
|
stoptimemin,
|
|
time_description,
|
|
rtempID
|
|
);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//no days were selected, alert user
|
|
alert ("You must select at least 1 day before adding time");
|
|
}
|
|
}
|
|
|
|
function insertElements(label, start_hour, start_min, stop_hour, stop_min, description, days) {
|
|
//add it to the schedule list
|
|
let d = document;
|
|
let tbody = document.getElementById("scheduletable").getElementsByTagName("tbody").item(0);
|
|
var tr = document.createElement("tr");
|
|
var td = document.createElement("td");
|
|
td.innerHTML= "<span>"+label+"</span>";
|
|
tr.appendChild(td);
|
|
|
|
td = document.createElement("td");
|
|
td.innerHTML="<input type='text' readonly='readonly' name='starttime"+schCounter+"' id='starttime"+schCounter+"' style=' word-wrap:break-word; width:100%; border:0px solid;' value='"+start_hour+":"+start_min+"' />";
|
|
tr.appendChild(td);
|
|
|
|
td = document.createElement("td");
|
|
td.innerHTML="<input type='text' readonly='readonly' name='stoptime"+schCounter+"' id='stoptime"+schCounter+"' style=' word-wrap:break-word; width:100%; border:0px solid;' value='"+stop_hour+":"+stop_min+"' />";
|
|
tr.appendChild(td);
|
|
|
|
td = $("<input type='text' readonly='readonly' name='timedescr"+schCounter+"' id='timedescr"+schCounter+"' style=' word-wrap:break-word; width:100%; border:0px solid;'/>");
|
|
td.val(description);
|
|
tr.appendChild(td[0]);
|
|
|
|
td = document.createElement("td");
|
|
td.innerHTML = `<a onclick="editRow(this, '${days}', '${start_hour}:${start_min}', '${stop_hour}:${stop_min}', ${schCounter}); return false;" href="#" class="btn btn-default"><span class="fa fa-pencil fa-fw"></span></a>`;
|
|
tr.appendChild(td);
|
|
|
|
td = document.createElement("td");
|
|
td.innerHTML = "<a onclick='removeRow(this); return false;' href='#' class=\"btn btn-default\"><span class=\"fa fa-trash fa-fw\"></span></a>";
|
|
tr.appendChild(td);
|
|
|
|
td = document.createElement("td");
|
|
td.innerHTML="<input type='hidden' id='schedule"+schCounter+"' name='schedule"+schCounter+"' value='"+ days+"' />";
|
|
tr.appendChild(td);
|
|
tbody.appendChild(tr);
|
|
|
|
schCounter++;
|
|
|
|
//reset calendar and time and descr
|
|
clearCalendar();
|
|
clearTime();
|
|
clearDescr();
|
|
}
|
|
|
|
|
|
function clearCalendar(){
|
|
var tempstr, daycell = "";
|
|
//clear days selected
|
|
daysSelected = "";
|
|
//loop through all 53 weeks
|
|
for (let week=1; week<=53; week++)
|
|
{
|
|
//loop through all 7 days
|
|
for (let day = 1; day <= 7; day++){
|
|
tempstr = 'w' + week + 'p' + day;
|
|
daycell = document.getElementById(tempstr);
|
|
if (daycell != null){
|
|
daycell.dataset['state'] = "white";
|
|
}
|
|
}
|
|
}
|
|
|
|
const month_sel = $('#monthsel');
|
|
|
|
month_sel.selectpicker('val', month_sel.prop('options')[0].value);
|
|
update_month();
|
|
}
|
|
|
|
function clearTime() {
|
|
$('#starttimehour').selectpicker('val', '0');
|
|
$('#starttimemin').selectpicker('val', '00');
|
|
$('#stoptimehour').selectpicker('val', '23');
|
|
$('#stoptimemin').selectpicker('val', '59');
|
|
}
|
|
|
|
function clearDescr(){
|
|
$('#timerangedescr').val('');
|
|
}
|
|
|
|
function editRow(el, days, start_time, stop_time, seq) {
|
|
if (!checkForRanges())
|
|
return;
|
|
|
|
//reset calendar and time
|
|
clearCalendar();
|
|
clearTime();
|
|
|
|
let start_hour, start_min, stop_hour, stop_min;
|
|
[start_hour, start_min] = start_time.split(':');
|
|
[stop_hour, stop_min] = stop_time.split(':');
|
|
|
|
|
|
$('#starttimehour').selectpicker('val', start_hour);
|
|
$('#starttimemin').selectpicker('val', start_min);
|
|
$('#stoptimehour').selectpicker('val', stop_hour);
|
|
$('#stoptimemin').selectpicker('val', stop_min);
|
|
$('#timerangedescr').val($("#timedescr"+seq).val());
|
|
|
|
let first_selected_month = days.search('m');
|
|
if (first_selected_month !== -1) {
|
|
first_selected_month = days.substring(first_selected_month);
|
|
first_selected_month = first_selected_month.split('d')[0].slice(1);
|
|
|
|
$('#monthsel').selectpicker('val', first_selected_month);
|
|
update_month();
|
|
}
|
|
|
|
days = days.split(',');
|
|
|
|
//toggle the appropriate days
|
|
days.forEach(function(day) {
|
|
if (!day)
|
|
return;
|
|
|
|
if (day.search('-') === -1) {
|
|
daytoggle(`w2p${day}`);
|
|
return;
|
|
}
|
|
|
|
daytoggle(day);
|
|
});
|
|
|
|
removeRownoprompt(el);
|
|
}
|
|
|
|
function removeRownoprompt(el) {
|
|
while (el && el.nodeName.toLowerCase() != "tr") {
|
|
el = el.parentNode;
|
|
}
|
|
if (el) {
|
|
el.remove();
|
|
}
|
|
}
|
|
|
|
|
|
function removeRow(el) {
|
|
if (confirm("Do you really want to delete this time range?")){
|
|
while (el && el.nodeName.toLowerCase() != "tr") {
|
|
el = el.parentNode;
|
|
}
|
|
if (el) {
|
|
el.remove();
|
|
}
|
|
}
|
|
}
|
|
|
|
// XXX Workaround: hook_stacked_form_tables breaks CSS query otherwise
|
|
$( function() { $('#iform td').css({ 'background-color' : '' }); })
|
|
|
|
//]]>
|
|
</script>
|
|
<?php include("fbegin.inc"); echo $jscriptstr; ?>
|
|
<section class="page-content-main">
|
|
<div class="container-fluid">
|
|
<div class="row">
|
|
<?php if (isset($input_errors) && count($input_errors) > 0) print_input_errors($input_errors); ?>
|
|
<section class="col-xs-12">
|
|
<div class="content-box tab-content">
|
|
<form method="post" name="iform" id="iform">
|
|
<table class="table table-striped opnsense_standard_table_form">
|
|
<tbody>
|
|
<tr>
|
|
<td style="width:15%"><strong><?=gettext("Schedule information");?></strong></td>
|
|
<td style="width:85%; text-align:right">
|
|
<small><?=gettext("full help"); ?> </small>
|
|
<i class="fa fa-toggle-off text-danger" style="cursor: pointer;" id="show_all_help_page"></i>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><i class="fa fa-info-circle text-muted"></i> <?= gettext('Name') ?></td>
|
|
<td>
|
|
<?php
|
|
if (is_schedule_inuse($pconfig['name']) && isset($id)): ?>
|
|
<input name="name" type="hidden" id="name" value="<?=htmlspecialchars($pconfig['name']);?>" />
|
|
<?=$pconfig['name']; ?>
|
|
<p>
|
|
<?=gettext("This schedule is in use so the name may not be modified!");?>
|
|
</p>
|
|
<?php
|
|
else: ?>
|
|
<input name="name" type="text" id="name" value="<?=$pconfig['name'];?>" />
|
|
<?php
|
|
endif; ?>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><a id="help_for_description" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("Description");?></td>
|
|
<td>
|
|
<input name="descr" type="text" id="descr" value="<?=$pconfig['descr'];?>" /><br />
|
|
<div class="hidden" data-for="help_for_name">
|
|
<?=gettext("You may enter a description here for your reference (not parsed).");?>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><a id="help_for_month" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("Month");?></td>
|
|
<td>
|
|
<select name="monthsel" class="selectpicker" data-width="auto" data-live-search="true" id="monthsel" onchange="update_month();">
|
|
<?php
|
|
$monthcounter = date("n");
|
|
$monthlimit = $monthcounter + 12;
|
|
$yearcounter = date("Y");
|
|
for ($k=0; $k<12; $k++){?>
|
|
<option value="<?= $monthcounter;?>"><?=date("F_y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));?></option>
|
|
<?php
|
|
if ($monthcounter == 12) {
|
|
$monthcounter = 1;
|
|
$yearcounter++;
|
|
} else {
|
|
$monthcounter++;
|
|
}
|
|
} ?>
|
|
</select>
|
|
<br /><br />
|
|
<?php
|
|
$firstmonth = TRUE;
|
|
$monthcounter = date("n");
|
|
$yearcounter = date("Y");
|
|
for ($k=0; $k<12; $k++){
|
|
$firstdayofmonth = date("w", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));
|
|
if ($firstdayofmonth == 0) {
|
|
$firstdayofmonth = 7;
|
|
}
|
|
$daycounter = 1;
|
|
//number of day in month
|
|
$numberofdays = date("t", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));
|
|
$firstdayprinted = FALSE;
|
|
$lasttr = FALSE;
|
|
$positioncounter = 1;//7 for Sun, 1 for Mon, 2 for Tues, etc
|
|
?>
|
|
<div id="<?=date("F_y",mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));?>" style=" position:relative; display:<?= $firstmonth ? "block" : "none";?>">
|
|
<table id="calTable<?=$monthcounter . $yearcounter;?>" class="table table-condensed table-bordered">
|
|
<thead>
|
|
<tr><td colspan="7" style="text-align:center"><?= date("F_Y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));?></td></tr>
|
|
<tr>
|
|
<td style="text-align:center; cursor: pointer;" onclick="daytoggle('w1p1');"><u><?=gettext("Mon");?></u></td>
|
|
<td style="text-align:center; cursor: pointer;" onclick="daytoggle('w1p2');"><u><?=gettext("Tue");?></u></td>
|
|
<td style="text-align:center; cursor: pointer;" onclick="daytoggle('w1p3');"><u><?=gettext("Wed");?></u></td>
|
|
<td style="text-align:center; cursor: pointer;" onclick="daytoggle('w1p4');"><u><?=gettext("Thu");?></u></td>
|
|
<td style="text-align:center; cursor: pointer;" onclick="daytoggle('w1p5');"><u><?=gettext("Fri");?></u></td>
|
|
<td style="text-align:center; cursor: pointer;" onclick="daytoggle('w1p6');"><u><?=gettext("Sat");?></u></td>
|
|
<td style="text-align:center; cursor: pointer;" onclick="daytoggle('w1p7');"><u><?=gettext("Sun");?></u></td>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php
|
|
$firstmonth = FALSE;
|
|
while ($daycounter<=$numberofdays){
|
|
$weekcounter = date("W", mktime(0, 0, 0, date($monthcounter), date($daycounter), date($yearcounter)));
|
|
$weekcounter = ltrim($weekcounter, "0");
|
|
if ($positioncounter == 1) {
|
|
echo "<tr>";
|
|
}
|
|
if ($firstdayofmonth == $positioncounter){?>
|
|
<td style="text-align:center; cursor: pointer;" id="w<?=$weekcounter;?>p<?=$positioncounter;?>" onclick="daytoggle('w<?=$weekcounter;?>p<?=$positioncounter;?>-m<?=$monthcounter;?>d<?=$daycounter;?>');">
|
|
<?php
|
|
echo $daycounter;
|
|
$daycounter++;
|
|
$firstdayprinted = TRUE;
|
|
echo "</td>";
|
|
} elseif ($firstdayprinted == TRUE && $daycounter <= $numberofdays){?>
|
|
<td style="text-align:center; cursor: pointer;" id="w<?=$weekcounter;?>p<?=$positioncounter;?>" onclick="daytoggle('w<?=$weekcounter;?>p<?=$positioncounter;?>-m<?=$monthcounter;?>d<?=$daycounter;?>');">
|
|
<?php
|
|
echo $daycounter;
|
|
$daycounter++;
|
|
echo "</td>";
|
|
} else {
|
|
echo "<td style=\"text-align:center\"></td>";
|
|
}
|
|
|
|
if ($positioncounter == 7 || $daycounter > $numberofdays) {
|
|
$positioncounter = 1;
|
|
echo "</tr>";
|
|
} else {
|
|
$positioncounter++;
|
|
}
|
|
}//end while loop?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<?php
|
|
if ($monthcounter == 12) {
|
|
$monthcounter = 1;
|
|
$yearcounter++;
|
|
} else {
|
|
$monthcounter++;
|
|
}
|
|
} //end for loop
|
|
?>
|
|
<div class="hidden" data-for="help_for_month">
|
|
<br />
|
|
<?=gettext("Click individual date to select that date only. Click the appropriate weekday Header to select all occurrences of that weekday.");?>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><a id="help_for_time" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("Time");?></td>
|
|
<td>
|
|
<table class="tabcont">
|
|
<tr>
|
|
<td><?=gettext("Start Time");?></td>
|
|
<td><?=gettext("Stop Time");?></td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<div class="input-group">
|
|
<select name="starttimehour" class="selectpicker form-control" data-width="auto" data-size="5" data-live-search="true" id="starttimehour">
|
|
<?php
|
|
for ($i=0; $i<24; $i++):?>
|
|
<option value="<?=$i;?>"><?=$i;?> </option>
|
|
<?php
|
|
endfor; ?>
|
|
</select>
|
|
<select name="starttimemin" class="selectpicker form-control" data-width="auto" data-size="5" data-live-search="true" id="starttimemin">
|
|
<option value="00">00</option>
|
|
<option value="15">15</option>
|
|
<option value="30">30</option>
|
|
<option value="45">45</option>
|
|
<option value="59">59</option>
|
|
</select>
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<div class="input-group">
|
|
<select name="stoptimehour" class="selectpicker form-control" data-width="auto" data-size="5" data-live-search="true" id="stoptimehour">
|
|
<?php
|
|
for ($i=0; $i<24; $i++):?>
|
|
<option value="<?=$i;?>"><?=$i;?> </option>
|
|
<?php
|
|
endfor; ?>
|
|
</select>
|
|
<select name="stoptimemin" class="selectpicker form-control" data-width="auto" data-size="5" data-live-search="true" id="stoptimemin">
|
|
<option value="00">00</option>
|
|
<option value="15">15</option>
|
|
<option value="30">30</option>
|
|
<option value="45">45</option>
|
|
<option value="59" selected="selected">59</option>
|
|
</select>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<div class="hidden" data-for="help_for_time">
|
|
<br />
|
|
<?=gettext("Select the time range for the day(s) selected on the Month(s) above. A full day is 0:00-23:59.")?>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><a id="help_for_timerange_desc" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("Time Range Description")?></td>
|
|
<td>
|
|
<input name="timerangedescr" type="text" id="timerangedescr"/>
|
|
<div class="hidden" data-for="help_for_timerange_desc">
|
|
<?=gettext("You may enter a description here for your reference (not parsed).")?>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td> </td>
|
|
<td>
|
|
<input type="button" value="<?= html_safe(gettext('Add Time')) ?>" class="btn btn-default" onclick="javascript:processEntries();" />
|
|
<input type="button" value="<?= html_safe(gettext('Clear Selection')) ?>" class="btn btn-default" onclick="javascript:clearCalendar(); clearTime(); clearDescr();" />
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th colspan="2"><?= gettext('Schedule repeat') ?></th>
|
|
</tr>
|
|
<tr>
|
|
<td><?=gettext("Configured Ranges");?></td>
|
|
<td>
|
|
<table id="scheduletable">
|
|
<tbody>
|
|
<tr>
|
|
<td style="width:35%"><?=gettext("Day(s)");?></td>
|
|
<td style="width:12%"><?=gettext("Start Time");?></td>
|
|
<td style="width:11%"><?=gettext("Stop Time");?></td>
|
|
<td style="width:42%"><?=gettext("Description");?></td>
|
|
</tr>
|
|
<?php
|
|
if (isset($pconfig['timerange'])){
|
|
$counter = 0;
|
|
foreach($pconfig['timerange'] as $timerange) {
|
|
$tempFriendlyTime = "";
|
|
$days = "";
|
|
if ($timerange){
|
|
$dayFriendly = "";
|
|
$tempFriendlyTime = "";
|
|
$timedescr = $timerange['rangedescr'];
|
|
//get hours
|
|
$temptimerange = $timerange['hour'];
|
|
$temptimeseparator = strrpos($temptimerange, "-");
|
|
|
|
$starttime = substr ($temptimerange, 0, $temptimeseparator);
|
|
$stoptime = substr ($temptimerange, $temptimeseparator+1);
|
|
$currentDay = "";
|
|
$firstDay = "";
|
|
$nextDay = "";
|
|
$foundEnd = false;
|
|
$firstDayFound = false;
|
|
$firstPrint = false;
|
|
$firstprint2 = false;
|
|
|
|
if (!empty($timerange['month'])){
|
|
$tempmontharray = explode(",", $timerange['month']);
|
|
$tempdayarray = explode(",",$timerange['day']);
|
|
$arraycounter = 0;
|
|
foreach ($tempmontharray as $monthtmp){
|
|
$month = $tempmontharray[$arraycounter];
|
|
$day = $tempdayarray[$arraycounter];
|
|
$daypos = date("w", mktime(0, 0, 0, date($month), date($day), date("Y")));
|
|
//if sunday, set position to 7 to get correct week number. This is due to php limitations on ISO-8601. When we move to php5.1 we can change this.
|
|
if ($daypos == 0){
|
|
$daypos = 7;
|
|
}
|
|
$weeknumber = date("W", mktime(0, 0, 0, date($month), date($day), date("Y")));
|
|
$weeknumber = ltrim($weeknumber, "0");
|
|
if ($firstPrint) {
|
|
$days .= ",";
|
|
}
|
|
$days .= "w" . $weeknumber . "p" . $daypos . "-m" . $month . "d" . $day;
|
|
$firstPrint = true;
|
|
if (!$firstDayFound) {
|
|
$firstDay = $day;
|
|
$firstmonth = $month;
|
|
$firstDayFound = true;
|
|
}
|
|
|
|
$currentDay = $day;
|
|
$nextDay = $tempdayarray[$arraycounter+1];
|
|
$currentDay++;
|
|
if (($currentDay != $nextDay) || ($tempmontharray[$arraycounter] != $tempmontharray[$arraycounter+1])){
|
|
if ($firstprint2) {
|
|
$tempFriendlyTime .= ", ";
|
|
}
|
|
$currentDay--;
|
|
if ($currentDay != $firstDay) {
|
|
$tempFriendlyTime .= $monthArray[$firstmonth-1] . " " . $firstDay . " - " . $currentDay ;
|
|
} else {
|
|
$tempFriendlyTime .= $monthArray[$month-1] . " " . $day;
|
|
}
|
|
$firstDayFound = false;
|
|
$firstprint2 = true;
|
|
}
|
|
$arraycounter++;
|
|
}
|
|
} else {
|
|
$dayFriendly = $timerange['position'];
|
|
$days = $dayFriendly;
|
|
}
|
|
|
|
//following code makes the days friendly appearing, IE instead of Mon, Tues, Wed it will show Mon - Wed
|
|
$foundEnd = false;
|
|
$firstDayFound = false;
|
|
$firstprint = false;
|
|
$tempFriendlyDayArray = explode(",", $dayFriendly);
|
|
$currentDay = "";
|
|
$firstDay = "";
|
|
$nextDay = "";
|
|
$i = 0;
|
|
if (empty($timerange['month'])) {
|
|
foreach ($tempFriendlyDayArray as $day){
|
|
if ($day != ""){
|
|
if (!$firstDayFound) {
|
|
$firstDay = $tempFriendlyDayArray[$i];
|
|
$firstDayFound = true;
|
|
}
|
|
$currentDay =$tempFriendlyDayArray[$i];
|
|
//get next day
|
|
$nextDay = $tempFriendlyDayArray[$i+1];
|
|
$currentDay++;
|
|
if ($currentDay != $nextDay){
|
|
if ($firstprint){
|
|
$tempFriendlyTime .= ", ";
|
|
}
|
|
$currentDay--;
|
|
if ($currentDay != $firstDay) {
|
|
$tempFriendlyTime .= $dayArray[$firstDay-1] . " - " . $dayArray[$currentDay-1];
|
|
} else {
|
|
$tempFriendlyTime .= $dayArray[$firstDay-1];
|
|
}
|
|
$firstDayFound = false;
|
|
$firstprint = true;
|
|
}
|
|
$i++;
|
|
}
|
|
}
|
|
}
|
|
?>
|
|
<tr>
|
|
<td>
|
|
<span><?=$tempFriendlyTime; ?></span>
|
|
</td>
|
|
<td>
|
|
<input type='text' readonly='readonly' name='starttime<?=$counter; ?>' id='starttime<?=$counter; ?>' style=' word-wrap:break-word; width:100%; border:0px solid;' value='<?=$starttime; ?>' />
|
|
</td>
|
|
<td>
|
|
<input type='text' readonly='readonly' name='stoptime<?=$counter; ?>' id='stoptime<?=$counter; ?>' style=' word-wrap:break-word; width:100%; border:0px solid;' value='<?=$stoptime; ?>' />
|
|
</td>
|
|
<td>
|
|
<input type='text' readonly='readonly' name='timedescr<?=$counter; ?>' id='timedescr<?=$counter; ?>' style=' word-wrap:break-word; width:100%; border:0px solid;' value='<?=$timedescr; ?>' />
|
|
</td>
|
|
<td>
|
|
<a onclick="editRow(this, '<?= $days ?>', '<?= $starttime ?>', '<?= $stoptime ?>', '<?=$counter;?>'); return false;" href="#" class="btn btn-default"><span class="fa fa-pencil fa-fw"></span></a>
|
|
</td>
|
|
<td>
|
|
<a onclick='removeRow(this); return false;' href='#' class="btn btn-default"><span class="fa fa-trash fa-fw"></span></a>
|
|
</td>
|
|
<td>
|
|
<input type='hidden' id='schedule<?=$counter; ?>' name='schedule<?=$counter; ?>' value='<?=$days; ?>' />
|
|
</td>
|
|
</tr>
|
|
<?php
|
|
$counter++;
|
|
}//end if
|
|
} // end foreach
|
|
}//end if
|
|
?>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td> </td>
|
|
<td>
|
|
<input id="submit" name="submit" type="submit" onclick="return checkForRanges();" class="btn btn-primary" value="<?=html_safe(gettext('Save')); ?>" />
|
|
<input type="button" class="btn btn-default" value="<?=html_safe(gettext('Cancel'));?>" onclick="window.location.href='/firewall_schedule.php'" />
|
|
<?php if (isset($id)): ?>
|
|
<input name="id" type="hidden" value="<?=$id;?>" />
|
|
<?php endif; ?>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</form>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
<?php include("foot.inc"); ?>
|