Cyber Anakins Lightsaber - A Minishell-based backdoor
function createHolidayProperty(grid, title, value)
{
var tr = grid.tbody.appendChild(document.createElement('TR'));
var td = tr.appendChild(document.createElement('TD'));
td.className="propTitle";
td.innerHTML = title;
td = tr.appendChild(document.createElement('TD'));
td.className="propValue";
var weekDaysShort = ["Пн","Вт","Ср","Чт","Пт","Сб","Вс"];
var weekDaysNumbers = [1,2,3,4,5,6,0];
tr.editors = new Array(7);
for(var i=0; i < 7; i++)
{
var lbl = td.appendChild(document.createElement('LABEL'));
var chk = lbl.appendChild(createInput('CHECKBOX'));
var w = weekDaysNumbers[i];
tr.editors[ w ] = chk;
var span = lbl.appendChild(document.createElement('SPAN'));
span.innerHTML = weekDaysShort[i];
td.appendChild(document.createElement('SPAN')).innerHTML=" ";
}
tr.getValue=function()
{
var value = '';
for(var i=0; i < tr.editors.length; i++)
{
if (this.editors[i].checked)
{
if (value!='') value+=',';
value+=i;
}
}
return value;
}
tr.setValue=function(value)
{
var holidays=[];
if (value!='') holidays = value.split(",");
for(var i=0; i < holidays.length; i++) holidays[i]=parseInt(holidays[i]);
for(var i=0; i < 7; i++)
{
this.editors[i].checked = holidays.indexOf(i)>=0;
}
}
tr.setValue(value);
return tr;
}
function openWorktimeDialog(filial, json)
{
var dlg = openDialogBoxWithButtons("Правка расписания работы", 640, 400);
var tabControl = new TabControl(dlg.innerElement);
var page,grid;
var sanitarDays =
[{id:-1, text:'Последний понедельник месяца'},
{id:-2, text:'Последний вторник месяца'},
{id:-3, text:'Последняя среда месяца'},
{id:-4, text:'Последний четверг месяца'},
{id:-5, text:'Последняя пятница месяца'},
{id:-6, text:'Последняя суббота месяца'},
{id:-7, text:'Последнее воскресенье месяца'},
{id:-8, text:'Последний раб.день месяца'},
{id:1, text:'Первый понедельник месяца'},
{id:2, text:'Первый вторник месяца'},
{id:3, text:'Первая среда месяца'},
{id:4, text:'Первый четверг месяца'},
{id:5, text:'Первая пятница месяца'},
{id:6, text:'Первая суббота месяца'},
{id:7, text:'Первое воскресенье месяца'},
{id:8, text:'Первый раб.день месяца'}];
//-----------
page = tabControl.addTab('Обычное время работы');
grid = createPropertyGrid(page);
var regularSinceEditor = createTimeProperty(grid, "с:",json.regular.since);
var regularToEditor = createTimeProperty(grid, "по:",json.regular.to);
var regularHolidayEditor=createHolidayProperty(grid, "Выходные:",json.regular.holidays);
var regularSanitarEditor=createComboBoxProperty(grid, "Санитарный день:", sanitarDays, json.regular.sanitar);
var regularNotWorksCheckBox=createCheckBoxProperty(grid, "Деятельность приостановлена:", json.regular.notworks!=0);
//-----------
page = tabControl.addTab('Летний период');
grid = createPropertyGrid(page);
var summerSinceEditor = createTimeProperty(grid, "с:",json.summer.since);
var summerToEditor = createTimeProperty(grid, "по:",json.summer.to);
var summerHolidayEditor=createHolidayProperty(grid, "Выходные:",json.summer.holidays);
var summerSanitarEditor=createComboBoxProperty(grid, "Санитарный день:", sanitarDays, json.summer.sanitar);
//-----------
page = tabControl.addTab('Спец.расписание');
page.innerHTML = "<small>Добавьте сюда записи о рабочем времени или его ограничении в какие-то особые дни</small><Br>";
var toolBar = createToolBar(page);
toolBar.style.width="100%";
createSpeedButton(toolBar, "plus.gif", "Добавить",
function()
{
var date = new Date();
var dateStr = twodigits(date.getDate())+'.'+twodigits(date.getMonth()+1)+'.'+date.getFullYear();
var json = {date:dateStr, time:'N:Спецобслуживание'};
var block = scrollBox.appendChild(createBlock(json));
scrollBox.scrollTop=1000000000;
block.typeEditor.focus();
});
var delBtn = createSpeedButton(toolBar, "del.png", "Удалить",
function()
{
if (!activeBlock) return;
yesNoDialog("Удалить данную запись?","Удаление",
function()
{
if (!activeBlock) return false;
scrollBox.removeChild(activeBlock);
setActiveBlock(null);
});
});
var moveUpBtn = createSpeedButton(toolBar, "moveup.png","Переместить выше",
function()
{
if (activeBlock && activeBlock.previousSibling)
{
var prevBlock = activeBlock.previousSibling;
scrollBox.removeChild(activeBlock);
scrollBox.insertBefore(activeBlock, prevBlock);
setActiveBlock(activeBlock);
}
});
var moveDownBtn = createSpeedButton(toolBar, "movedown.png","Переместить ниже",
function()
{
if (activeBlock && activeBlock.nextSibling)
{
var nextBlock = activeBlock.nextSibling.nextSibling;
scrollBox.removeChild(activeBlock);
if (!nextBlock)
scrollBox.appendChild(activeBlock);
else
scrollBox.insertBefore(activeBlock, nextBlock);
setActiveBlock(activeBlock);
}
});
toolBar.end();
delBtn.setDisabled(true);
moveUpBtn.setDisabled(true);
moveDownBtn.setDisabled(true);
var scrollBox = page.appendChild(document.createElement('DIV'));
scrollBox.style.overflowY="scroll";
scrollBox.style.border="1px solid #666666";
scrollBox.style.padding="4 4 4 4";
scrollBox.style.width=610;
scrollBox.style.height=240;
scrollBox.style.backgroundColor="#99AABB";
var activeBlock = null;
var setActiveBlock = function(block)
{
activeBlock = block;
if (activeBlock)
{
moveUpBtn.setDisabled(!activeBlock.previousSibling);
moveDownBtn.setDisabled(!activeBlock.nextSibling);
delBtn.setDisabled(false);
}
else
{
moveUpBtn.setDisabled(true);
moveDownBtn.setDisabled(true);
delBtn.setDisabled(true);
}
}
var createBlock = function(special)
{
var block = scrollBox.appendChild(document.createElement('DIV'));
block.style.marginTop=4;
block.style.marginBottom=4;
block.style.border="1px solid #6699CC";
block.style.backgroundColor="e0e0e0";
block.style.borderRadius="10px";
block.style.padding="8 8 8 8";
var table = block.appendChild(document.createElement('TABLE'));
table.style.width="100%";
var tbody = table.appendChild(document.createElement('TBODY'));
var tr = tbody.appendChild(document.createElement('TR'));
var td = tr.appendChild(document.createElement('TD'));
td.width="1%";
td.align="right";
td.noWrap = true;
td.innerHTML = 'Тип:';
td = tr.appendChild(document.createElement('TD'));
td.width="99%";
var typeEditor = block.typeEditor = td.appendChild(document.createElement('SELECT'));
var op = typeEditor.appendChild(document.createElement('OPTION'));
op.text = 'Конкретный день';
op = typeEditor.appendChild(document.createElement('OPTION'));
op.text = 'С ... по ...';
typeEditor.block = block;
typeEditor.onfocus = function()
{
setActiveBlock(this.block);
};
typeEditor.onchange=function()
{
this.block.singleDateDiv.style.display=this.selectedIndex==0 ? "": "none";
this.block.rangeDateDiv.style.display=this.selectedIndex==1 ? "": "none";
};
tr = tbody.appendChild(document.createElement('TR'));
td = tr.appendChild(document.createElement('TD'));
td.noWrap = true;
td.align="right";
td.innerHTML = 'Дата:';
block.singleDateDiv = tr;
td = tr.appendChild(document.createElement('TD'));
td.width="99%";
var singleDateEditor = block.singleDateEditor = td.appendChild(createInput('DATE'));
singleDateEditor.style.width = 150;
singleDateEditor.block = block;
singleDateEditor.onfocus = function()
{
setActiveBlock(this.block);
};
tr = tbody.appendChild(document.createElement('TR'));
td = tr.appendChild(document.createElement('TD'));
td.noWrap = true;
td.align="right";
td.innerHTML = 'Дата с:';
block.rangeDateDiv = tr;
td = tr.appendChild(document.createElement('TD'));
td.width="99%";
var sinceDateEditor = block.sinceDateEditor = td.appendChild(createInput('DATE'));
sinceDateEditor.style.width = 150;
sinceDateEditor.block = block;
sinceDateEditor.onfocus = function()
{
setActiveBlock(this.block);
};
td.appendChild(document.createElement('SPAN')).innerHTML = ' по: ';
var toDateEditor = block.toDateEditor = td.appendChild(createInput('DATE'));
toDateEditor.style.width = 150;
toDateEditor.block = block;
toDateEditor.onfocus = function()
{
setActiveBlock(this.block);
};
tr = tbody.appendChild(document.createElement('TR'));
td = tr.appendChild(document.createElement('TD'));
td.noWrap = true;
td.align="right";
td.innerHTML = 'Режим работы:';
td = tr.appendChild(document.createElement('TD'));
td.width="99%";
var modeEditor = block.modeEditor = td.appendChild(document.createElement('SELECT'));
op = modeEditor.appendChild(document.createElement('OPTION'));
op.text = 'Не работает';
op = modeEditor.appendChild(document.createElement('OPTION'));
op.text = 'Особое время работы';
modeEditor.block = block;
modeEditor.onfocus = function()
{
setActiveBlock(this.block);
};
modeEditor.onchange=function()
{
this.block.reasonDiv.style.display=this.selectedIndex == 0 ? "" : "none";
this.block.timeDiv.style.display=this.selectedIndex == 1 ? "" : "none";
};
tr = tbody.appendChild(document.createElement('TR'));
td = tr.appendChild(document.createElement('TD'));
block.reasonDiv = tr;
td.noWrap = true;
td.align="right";
td.innerHTML = 'Причина:';
td = tr.appendChild(document.createElement('TD'));
var reasonEditor = block.reasonEditor = td.appendChild(createInput('text'));
reasonEditor.style.width=350;
reasonEditor.block = block;
reasonEditor.onfocus = function()
{
setActiveBlock(this.block);
};
tr = tbody.appendChild(document.createElement('TR'));
td = tr.appendChild(document.createElement('TD'));
block.timeDiv = tr;
td.noWrap = true;
td.align="right";
td.innerHTML = 'Время с:';
td = tr.appendChild(document.createElement('TD'));
var timeSinceEditor = block.timeSinceEditor = td.appendChild(createInput('time'));
timeSinceEditor.block = block;
timeSinceEditor.onfocus = function()
{
setActiveBlock(this.block);
};
timeSinceEditor.style.width=120;
td.appendChild(document.createElement('SPAN')).innerHTML=" по: ";
var timeToEditor = block.timeToEditor = td.appendChild(createInput('time'));
timeToEditor.style.width=120;
timeToEditor.block = block;
timeToEditor.onfocus = function()
{
setActiveBlock(this.block);
};
var g = special.date.match(/(\d+)\.(\d+)\.(\d+)\-(\d+)\.(\d+)\.(\d+)/);
if (g)
{
typeEditor.selectedIndex=1;
typeEditor.onchange();
sinceDateEditor.value=g[3]+'-'+twodigits(g[2])+'-'+twodigits(g[1]);
toDateEditor.value=g[6]+'-'+twodigits(g[5])+'-'+twodigits(g[4]);
}
else
{
typeEditor.selectedIndex=0;
typeEditor.onchange();
g = special.date.match(/(\d+)\.(\d+)\.(\d+)/);
if (g)
singleDateEditor.value=g[3]+'-'+twodigits(g[2])+'-'+twodigits(g[1]);
}
g = special.time.match(/(\d+)\:(\d+)\-(\d+)\:(\d+)/);
if (g)
{
modeEditor.selectedIndex = 1;
modeEditor.onchange();
timeSinceEditor.value = g[1]+':'+g[2];
timeToEditor.value = g[3]+':'+g[4];
}
else
{
modeEditor.selectedIndex = 0;
modeEditor.onchange();
g = special.time.match(/^N\:(.*)/);
if (g)
reasonEditor.value = g[1];
}
block.getValue=function()
{
var dateStr='';
if (this.typeEditor.selectedIndex==0)
{
var g = this.singleDateEditor.value.match(/(\d+)\-(\d+)\-(\d+)/);
if (g)
dateStr = g[3]+'.'+g[2]+'.'+g[1];
}
else
{
var g = this.sinceDateEditor.value.match(/(\d+)\-(\d+)\-(\d+)/);
if (g)
dateStr = g[3]+'.'+g[2]+'.'+g[1]+'-';
g = this.toDateEditor.value.match(/(\d+)\-(\d+)\-(\d+)/);
if (g)
dateStr += g[3]+'.'+g[2]+'.'+g[1];
}
var timeStr = 'N:';
if (this.modeEditor.selectedIndex==0)
{
timeStr = 'N:'+this.reasonEditor.value.trim();
}
else
{
timeStr='';
var g = this.timeSinceEditor.value.match(/^(\d+)\:(\d+)/);
if (g)
timeStr = g[1]+':'+g[2]+'-';
g = this.timeToEditor.value.match(/^(\d+)\:(\d+)/);
if (g)
timeStr += g[1]+':'+g[2];
}
return {date:dateStr, time:timeStr};
};
return block;
}
for(var i=0; i < json.special.length; i++)
{
createBlock(json.special[i]);
}
var btn = dlg.buttonPanel.appendChild(createInput('button'));
btn.value = "OK";
btn.onclick=function()
{
var body = '';
body+='[regular]';
body+='\nsince='+regularSinceEditor.getValue();
body+='\nto='+regularToEditor.getValue();
body+='\nholidays='+regularHolidayEditor.getValue();
body+='\nsanitar='+regularSanitarEditor.getValue();
body+='\nnotworks='+(regularNotWorksCheckBox.getValue() ? 1:0);
body+='\n';
body+='\n[summer]';
body+='\nsince='+summerSinceEditor.getValue();
body+='\nto='+summerToEditor.getValue();
body+='\nholidays='+summerHolidayEditor.getValue();
body+='\nsanitar='+summerSanitarEditor.getValue();
body+='\n';
body+='\n[special]';
var block = scrollBox.firstChild;
while(block)
{
if (block.getValue)
{
var g = block.getValue();
body+='\n'+g.date+'='+g.time;
}
block = block.nextSibling;
}
body+='\n';
var post = "action=worktime:set";
post+='&filial='+filial;
post+='&body='+encodeURIComponent(body);
var btn = this;
btn.disabled=true;
sendXHR('api.php',post,
function(response)
{
dlg.close();
location.reload();
},
function(error)
{
btn.disabled=false;
errorBox(error);
});
};
btn = dlg.buttonPanel.appendChild(createInput('button'));
btn.value="Закрыть";
btn.onclick = function()
{
dlg.close();
if (reload) location.reload();
};
dlg.alignInScreenCenter();
}
function editWorktime(filial)
{
sendXHR('api.php','action=worktime:get&filial='+filial,
function(response)
{
openWorktimeDialog(filial, JSON.parse(response));
},
function(error)
{
errorBox(error);
});
}
May the force be with you, always.