515 lines
16 KiB
PHP
515 lines
16 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* File: bulk_edit.php
|
||
|
* Author: Ryan Prather
|
||
|
* Purpose: Allow for multiple hosts in a category to be editted in specific ways
|
||
|
* Created: May 14, 2014
|
||
|
*
|
||
|
* Portions Copyright 2016: Cyber Perspectives, All rights reserved
|
||
|
* Released under the Apache v2.0 License
|
||
|
*
|
||
|
* Portions Copyright (c) 2012-2015, Salient Federal Solutions
|
||
|
* Portions Copyright (c) 2008-2011, Science Applications International Corporation (SAIC)
|
||
|
* Released under Modified BSD License
|
||
|
*
|
||
|
* See license.txt for details
|
||
|
*
|
||
|
* Change Log:
|
||
|
* - May 14, 2014 - File created
|
||
|
* - Sep 1, 2016 - Copyright updated and functions for class merger
|
||
|
* Converted ajax to php instead of cgi
|
||
|
* Standardized other content
|
||
|
* - Mar 4, 2017 - Changed AJAX to use /ajax.php instead of /cgi-bin/ajax.php
|
||
|
* - Apr 5, 2017 - Formatting
|
||
|
* - Aug 28, 2017 - Fixed bugs #285 & #269, cleaned up code, & use filter_input method
|
||
|
* - Aug 31, 2017 - Fixed bug #269, #289, & #290
|
||
|
*/
|
||
|
include_once 'config.inc';
|
||
|
include_once 'helper.inc';
|
||
|
include_once 'database.inc';
|
||
|
|
||
|
$db = new db();
|
||
|
|
||
|
$int = array(
|
||
|
'filter' => FILTER_VALIDATE_INT,
|
||
|
'flag' => FILTER_NULL_ON_FAILURE
|
||
|
);
|
||
|
$string = array(
|
||
|
'filter' => FILTER_SANITIZE_STRING,
|
||
|
'flag' => FILTER_NULL_ON_FAILURE
|
||
|
);
|
||
|
$boolean = array(
|
||
|
'filter' => FILTER_VALIDATE_BOOLEAN,
|
||
|
'flag' => FILTER_NULL_ON_FAILURE
|
||
|
);
|
||
|
|
||
|
$args = array(
|
||
|
'action' => $string,
|
||
|
'cat' => $int,
|
||
|
'selected_tgts' => $string,
|
||
|
'osSoftware' => $int,
|
||
|
'location' => $string,
|
||
|
'auto_status' => $int,
|
||
|
'man_status' => $int,
|
||
|
'data_status' => $int,
|
||
|
'fp_cat1_status' => $int,
|
||
|
'remove_existing' => $boolean,
|
||
|
'checklists' => array(
|
||
|
'filter' => FILTER_VALIDATE_INT,
|
||
|
'flags' => FILTER_REQUIRE_ARRAY
|
||
|
),
|
||
|
'post_process' => $boolean
|
||
|
);
|
||
|
|
||
|
$post = filter_input_array(INPUT_POST, $args);
|
||
|
$cat = filter_input(INPUT_GET, 'cat', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
|
||
|
$ste = filter_input(INPUT_COOKIE, 'ste', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
|
||
|
|
||
|
$tgts = $db->get_Target_By_Category($cat);
|
||
|
$task_statuses = $db->get_Task_Statuses();
|
||
|
$task_statuses[null] = 'Not Reviewed';
|
||
|
|
||
|
if ($post['action'] == 'update_bulk') {
|
||
|
set_time_limit(300);
|
||
|
$sel_tgts = json_decode(html_entity_decode($post['selected_tgts']));
|
||
|
|
||
|
foreach ($sel_tgts as $tgt_id) {
|
||
|
$tgt = $db->get_Target_Details($ste, $tgt_id)[0];
|
||
|
if ($post['cat']) {
|
||
|
$tgt->set_Cat_ID($post['cat']);
|
||
|
}
|
||
|
|
||
|
if ($post['osSoftware']) {
|
||
|
$os = $db->get_Software($post['osSoftware']);
|
||
|
if (is_array($os) && count($os) && isset($os[0]) && is_a($os[0], 'software')) {
|
||
|
$tgt->set_OS_ID($os[0]->get_ID());
|
||
|
$tgt->set_OS_String($os[0]->get_Shortened_SW_String());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ($post['location']) {
|
||
|
$tgt->set_Location($post['location']);
|
||
|
}
|
||
|
|
||
|
if ($post['auto_status']) {
|
||
|
$tgt->set_Auto_Status_ID($post['auto_status']);
|
||
|
}
|
||
|
|
||
|
if ($post['man_status']) {
|
||
|
$tgt->set_Man_Status_ID($post['man_status']);
|
||
|
}
|
||
|
|
||
|
if ($post['data_status']) {
|
||
|
$tgt->set_Data_Status_ID($post['data_status']);
|
||
|
}
|
||
|
|
||
|
if ($post['fp_cat1_status']) {
|
||
|
$tgt->set_FP_Cat1_Status_ID($post['fp_cat1_status']);
|
||
|
}
|
||
|
|
||
|
if ($post['remove_existing']) {
|
||
|
foreach ($tgt->checklists as $key => $chk) {
|
||
|
unset($tgt->checklists[$key]);
|
||
|
}
|
||
|
$db->delete_Target_Checklists($tgt);
|
||
|
}
|
||
|
|
||
|
if ($post['checklists']) {
|
||
|
$chks = array();
|
||
|
foreach ($post['checklists'] as $key => $chk) {
|
||
|
$tgt->checklists[] = $db->get_Checklist($chk)[0];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$pp = ($post['post_process'] ? true : false);
|
||
|
|
||
|
$db->save_Target($tgt, $pp);
|
||
|
}
|
||
|
|
||
|
header("Location: /ste");
|
||
|
}
|
||
|
|
||
|
include_once 'header.inc';
|
||
|
?>
|
||
|
|
||
|
<script src='ste_script.js' type='text/javascript'></script>
|
||
|
|
||
|
<style type="text/css">
|
||
|
.header {
|
||
|
width: auto;
|
||
|
background-color: #31363C;
|
||
|
display: table-cell;
|
||
|
}
|
||
|
|
||
|
.left_cat_header {
|
||
|
width: 200px;
|
||
|
float: left;
|
||
|
}
|
||
|
|
||
|
.right_cat_header {
|
||
|
width: 200px;
|
||
|
float: right;
|
||
|
}
|
||
|
|
||
|
.cat_icons {
|
||
|
background-size: 20px 20px;
|
||
|
vertical-align: middle;
|
||
|
width: 20px;
|
||
|
height: 20px;
|
||
|
}
|
||
|
|
||
|
.not_reviewed,.not_applicable,.not_planned,.complete,.in_progress {
|
||
|
text-align: center;
|
||
|
width: 92px;
|
||
|
}
|
||
|
|
||
|
.not_reviewed {
|
||
|
color: #fff;
|
||
|
background-color: #ff0000;
|
||
|
}
|
||
|
|
||
|
.not_applicable {
|
||
|
color: #000;
|
||
|
background-color: #8db4e2;
|
||
|
}
|
||
|
|
||
|
.not_planned {
|
||
|
color: #fff;
|
||
|
background-color: #000;
|
||
|
}
|
||
|
|
||
|
.complete {
|
||
|
color: #000;
|
||
|
background-color: #92d050;
|
||
|
}
|
||
|
|
||
|
.in_progress {
|
||
|
color: #000;
|
||
|
background-color: #ffff66;
|
||
|
}
|
||
|
|
||
|
.checklists {
|
||
|
display: inline;
|
||
|
width: 300px;
|
||
|
height: 150px;
|
||
|
}
|
||
|
|
||
|
.checklist_image {
|
||
|
width: 32px;
|
||
|
vertical-align: middle;
|
||
|
}
|
||
|
|
||
|
.notes {
|
||
|
width: 100%;
|
||
|
}
|
||
|
|
||
|
#osSoftware {
|
||
|
display: inline-block;
|
||
|
width: 300px;
|
||
|
text-align: right;
|
||
|
}
|
||
|
|
||
|
#availableOS {
|
||
|
position: absolute;
|
||
|
text-align: left;
|
||
|
background-color: white;
|
||
|
border: solid 1px black;
|
||
|
z-index: 100;
|
||
|
overflow-y: scroll;
|
||
|
height: 250px;
|
||
|
width: 400px;
|
||
|
}
|
||
|
|
||
|
.swmouseover {
|
||
|
background-color:#1D57A0;
|
||
|
color:#fff;
|
||
|
cursor:pointer;
|
||
|
}
|
||
|
</style>
|
||
|
|
||
|
<script type='text/javascript'>
|
||
|
/**
|
||
|
* Function to filter the checklists via AJAX
|
||
|
*
|
||
|
* @param {boolean} bln_hide_old
|
||
|
*/
|
||
|
function filter_checklists(bln_hide_old) {
|
||
|
if ($('#chk_filter').val().length < 3) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$.ajax('/ajax.php', {
|
||
|
data: {
|
||
|
action: 'chk_filter',
|
||
|
filter: $('#chk_filter').val(),
|
||
|
hide_old: bln_hide_old
|
||
|
},
|
||
|
success: function (data) {
|
||
|
$('#checklists option').remove();
|
||
|
|
||
|
for (var x in data) {
|
||
|
$('#checklists').append("<option " +
|
||
|
"value='" + data[x].id + "'>" +
|
||
|
data[x].name + " V" + data[x].ver + "R" + data[x].release + " (" + data[x].type + ")</option>");
|
||
|
}
|
||
|
},
|
||
|
dataType: 'json',
|
||
|
method: 'post'
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Function to filter the operating systems via AJAX
|
||
|
*/
|
||
|
function filter_os() {
|
||
|
if ($('#os_filter').val().length < 3) {
|
||
|
$('#availableOS').html('');
|
||
|
$('#availableOS').hide();
|
||
|
return;
|
||
|
}
|
||
|
$.ajax('/ajax.php', {
|
||
|
data: {
|
||
|
action: 'os_filter',
|
||
|
filter: $('#os_filter').val()
|
||
|
},
|
||
|
success: function (data) {
|
||
|
$('#availableOS div').remove();
|
||
|
$('#availableOS').show();
|
||
|
for (var x in data) {
|
||
|
$('#availableOS').append("<div sw_id='" + data[x].sw_id + "' cpe='" + data[x].cpe + "'>" + data[x].sw_string + "</div>");
|
||
|
}
|
||
|
|
||
|
$('#availableOS div').each(function () {
|
||
|
$(this).on("mouseover", function () {
|
||
|
$(this).addClass("swmouseover");
|
||
|
});
|
||
|
$(this).on("mouseout", function () {
|
||
|
$(this).removeClass("swmouseover");
|
||
|
});
|
||
|
$(this).on("click", function () {
|
||
|
$('#availableOS').hide();
|
||
|
$('#osSoftware').html($(this).text() + "<input type='hidden' name='osSoftware' value='" + $(this).attr('sw_id') + "' />");
|
||
|
$('#installedSoftware').append("<option value='" + $(this).attr('sw_id') + "' ondblclick='$(this).remove();'>" + $(this).html() + "</option>");
|
||
|
$(this).remove();
|
||
|
});
|
||
|
});
|
||
|
},
|
||
|
dataType: 'json',
|
||
|
method: 'post'
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Function to validate the form before submitting
|
||
|
*/
|
||
|
function validate_bulk() {
|
||
|
$('#selected_tgts').val(JSON.stringify(sel_tgts));
|
||
|
|
||
|
form.submit();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Function to toggle to checkbox selections (what was check is now uncheck and visa versa)
|
||
|
*/
|
||
|
function toggle_selection() {
|
||
|
$('.tgt_chk').each(function () {
|
||
|
$(this).prop('checked', !$(this).is(":checked"));
|
||
|
update_tgt_chk(this);
|
||
|
});
|
||
|
}
|
||
|
</script>
|
||
|
|
||
|
<div id='wrapper'>
|
||
|
<div id='main-wrapper'>
|
||
|
<div class='12u' id='main-contnt'>
|
||
|
<div id='tableContainer' class='tableContainer'>
|
||
|
<form method='post' name='form'>
|
||
|
<input type='hidden' name='action' value='update_bulk' />
|
||
|
<input type='hidden' name='selected_tgts' id='selected_tgts' />
|
||
|
<input type='hidden' name='ste' value='<?php print ($ste ? $ste : ''); ?>' />
|
||
|
To change multiple targets:<br />
|
||
|
<ol style='font-size:small;'>
|
||
|
<li>Check the targets you want to change above</li>
|
||
|
<li>Select only the fields below you want to change</li>
|
||
|
<li>Click the Save button</li>
|
||
|
</ol>
|
||
|
|
||
|
<input type='button' name='update_bulk' value='Save' onclick='validate_bulk();' />
|
||
|
|
||
|
<table>
|
||
|
<tbody>
|
||
|
<tr>
|
||
|
<th>Category:</th>
|
||
|
<td>
|
||
|
<select name='cat'>
|
||
|
<option value='0'>-- do not change --</option>
|
||
|
<?php
|
||
|
$cats = $db->get_STE_Cat_List($ste);
|
||
|
foreach ($cats as $cat):print $cat->get_Option();
|
||
|
endforeach;
|
||
|
?>
|
||
|
</select>
|
||
|
</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<th>Operating System:</th>
|
||
|
<td class="Control">
|
||
|
<input type='text' id='os_filter' style="display:inline;" title='CPE string' placeholder='Filter...' onkeyup="javascript:filter_os();" autocomplete="off" />
|
||
|
<span id="osSoftware">
|
||
|
<input type='hidden' name='osSoftware' />
|
||
|
</span>
|
||
|
<div id="availableOS" onmouseover="$(this).show();" onmouseout="$(this).hide();" style="display:none;"></div>
|
||
|
</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<th>Location:</th>
|
||
|
<td><input type='text' name='location' placeholder='-- do not change --' /></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<th>Automated Status:</th>
|
||
|
<td>
|
||
|
<select name='auto_status'>
|
||
|
<option value='0'>-- do not change --</option>
|
||
|
<?php
|
||
|
foreach ($task_statuses as $key => $status):print "<option value='$key'>$status</option>";
|
||
|
endforeach;
|
||
|
?>
|
||
|
</select>
|
||
|
</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<th>Manual Status:</th>
|
||
|
<td>
|
||
|
<select name='man_status'>
|
||
|
<option value='0'>-- do not change --</option>
|
||
|
<?php
|
||
|
foreach ($task_statuses as $key => $status):print "<option value='$key'>$status</option>";
|
||
|
endforeach;
|
||
|
?>
|
||
|
</select>
|
||
|
</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<th>Data Gathering Status:</th>
|
||
|
<td>
|
||
|
<select name='data_status'>
|
||
|
<option value='0'>-- do not change --</option>
|
||
|
<?php
|
||
|
foreach ($task_statuses as $key => $status):print "<option value='$key'>$status</option>";
|
||
|
endforeach;
|
||
|
?>
|
||
|
</select>
|
||
|
</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<th>FP/Cat1 Status:</th>
|
||
|
<td>
|
||
|
<select name='fp_cat1_status'>
|
||
|
<option value='0'>-- do not change --</option>
|
||
|
<?php
|
||
|
foreach ($task_statuses as $key => $status):print "<option value='$key'>$status</option>";
|
||
|
endforeach;
|
||
|
?>
|
||
|
</select>
|
||
|
</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<th title='Select to change' style='vertical-align:bottom;'>
|
||
|
Checklists:<br />
|
||
|
<input type='text' name='chk_filter' id='chk_filter' placeholder="Filter..." onkeyup="javascript:filter_checklists($('#hide_old').is(':checked'));" style='width:132px;' /><br />
|
||
|
Remove Existing Checklists:
|
||
|
<input type='checkbox' name='remove_existing' value='1' />
|
||
|
</th>
|
||
|
<td>
|
||
|
<select name='checklists[]' class='checklists' id="checklists" multiple='multiple'>
|
||
|
<?php
|
||
|
$all_chks = $db->get_Checklist();
|
||
|
foreach ($all_chks as $key => $chk):print $chk->print_Option();
|
||
|
endforeach;
|
||
|
?>
|
||
|
</select>
|
||
|
</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<th>Post Processing?</th>
|
||
|
<td>
|
||
|
<input type='checkbox' name='post_process' value='1' />
|
||
|
</td>
|
||
|
</tr>
|
||
|
</tbody>
|
||
|
</table>
|
||
|
|
||
|
<table class=''>
|
||
|
<thead>
|
||
|
<tr>
|
||
|
<th class="header" style='text-align:left;'>
|
||
|
<input type='button' value='Toggle Selection' onclick='javascript:toggle_selection();' /> Name
|
||
|
</th>
|
||
|
<th class="header">OS</th>
|
||
|
<th class="header">Location</th>
|
||
|
<th class="header">Auto</th>
|
||
|
<th class="header">Manual</th>
|
||
|
<th class="header">Data</th>
|
||
|
<th class="header">FP/Cat1</th>
|
||
|
<th class="header">Checklists</th>
|
||
|
</tr>
|
||
|
</thead>
|
||
|
|
||
|
<tbody id='targets'>
|
||
|
<?php
|
||
|
$odd = true;
|
||
|
foreach ($tgts as $key => $tgt) {
|
||
|
$os = $db->get_Software($tgt->get_OS_ID())[0];
|
||
|
$auto_status = $task_statuses[$tgt->get_Auto_Status_ID()];
|
||
|
$man_status = $task_statuses[$tgt->get_Man_Status_ID()];
|
||
|
$data_status = $task_statuses[$tgt->get_Data_Status_ID()];
|
||
|
$fpcat1_status = $task_statuses[$tgt->get_FP_Cat1_Status_ID()];
|
||
|
|
||
|
$checklists = $db->get_Target_Checklists($tgt->get_ID());
|
||
|
|
||
|
$icons = array();
|
||
|
foreach ($checklists as $key2 => $chk) {
|
||
|
$current_icon = $chk->get_Icon();
|
||
|
if (array_key_exists($current_icon, $icons)) {
|
||
|
$icons[$current_icon]['title'] .= "\n- {$chk->get_Name()} V{$chk->get_Version()}R{$chk->get_Release()} ({$chk->get_type()})";
|
||
|
}
|
||
|
else {
|
||
|
$icons[$current_icon] = array(
|
||
|
'icon' => $current_icon,
|
||
|
'title' => "- {$chk->get_Name()} V{$chk->get_Version()}R{$chk->get_Release()} ({$chk->get_type()})"
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
print "<tr class='" . ($odd ? 'odd' : 'even') . "_row'>" .
|
||
|
"<td><input type='checkbox' class='tgt_chk' value='{$tgt->get_ID()}' onclick='javascript:update_tgt_chk(this);'/>{$tgt->get_Name()}</td>" .
|
||
|
"<td>{$os->get_Name()} {$os->get_Version()}</td>" .
|
||
|
"<td>{$tgt->get_Location()}</td>" .
|
||
|
"<td class='" . strtolower(str_replace(' ', '_', $auto_status)) . "'>{$auto_status}</td>" .
|
||
|
"<td class='" . strtolower(str_replace(' ', '_', $man_status)) . "'>{$man_status}</td>" .
|
||
|
"<td class='" . strtolower(str_replace(' ', '_', $data_status)) . "'>{$data_status}</td>" .
|
||
|
"<td class='" . strtolower(str_replace(' ', '_', $fpcat1_status)) . "'>{$fpcat1_status}</td>" .
|
||
|
"<td>";
|
||
|
|
||
|
foreach ($icons as $icon_key => $icon) {
|
||
|
print "<img src='/img/checklist_icons/$icon_key' class='checklist_image' title='{$icon['title']}' />";
|
||
|
}
|
||
|
|
||
|
print "</td>" .
|
||
|
"</tr>";
|
||
|
|
||
|
$odd = !$odd;
|
||
|
}
|
||
|
?>
|
||
|
|
||
|
</tbody>
|
||
|
</table>
|
||
|
</form>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<?php
|
||
|
include_once 'footer.inc';
|