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>
 | |
| 
 | |
|           <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 /><span style='font-size: 10pt;'>(control + click to select multiple)</span><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>
 | |
| 
 | |
|           <input type='button' name='update_bulk' value='Save' onclick='validate_bulk();' />
 | |
| 
 | |
|           <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';
 |