7 $self =
"$menu_link?ft=$ft";
9 $string = array(
"filter" => HCUFILTER_INPUT_STRING);
10 HCU_ImportVars($parameters,
"a", array(
"operation" => $string));
11 $operation = HCU_array_key_exists(
"operation", $parameters[
"a"]) ? trim($parameters[
"a"][
"operation"]) :
"";
12 $showSQL = $SYSENV[
"devmode"];
14 if ($operation !=
"") {
18 $tz = GetCreditUnionTimezone($dbh, $Cu);
19 $tz =
new DateTimeZone($tz);
20 $returnArray = readSecureForms($tz, $home_path);
23 $tz = GetCreditUnionTimezone($dbh, $Cu);
24 $tz =
new DateTimeZone($tz);
25 $returnArray = removeFiles($tz,
false, $home_path, $Cn);
28 $tz = GetCreditUnionTimezone($dbh, $Cu);
29 $tz =
new DateTimeZone($tz);
30 $returnArray = removeFiles($tz,
true, $home_path, $Cn);
37 viewFile($home_path,
"data");
40 default: $returnArray = array(
"sql" => array(),
"error" => array(
"Operation not recognized: $operation."),
"record" => array());
45 header(
'Content-type: application/json');
47 unset($returnArray[
"sql"]);
49 print HCU_JsonEncode($returnArray);
53 printSecureFormPage($self);
63 function viewFile($homePath, $type =
"regular") {
64 $string = array(
"filter" => HCUFILTER_INPUT_STRING);
65 HCU_ImportVars($parameters,
"a", array(
"filename" => $string));
66 $filename = HCU_array_key_exists(
"filename", $parameters[
"a"]) ? trim($parameters[
"a"][
"filename"]) :
"";
70 $path =
"$homePath/sslforms/$filename";
71 if (!is_file($path)) {
72 throw new exception(
"File is not found.", 1);
75 if (!is_array($file)) {
76 throw new exception(
"File is invalid.", 2);
82 $fileString = implode(
"", $file);
86 if (strpos($filename,
".dat") ===
false) {
87 throw new exception(
"Data file is not valid.", 4);
90 $fileString = implode(
"", $file);
91 header(
"Content-length: " . strlen($fileString) );
92 header(
"Content-type: application/octetstream");
93 header(
"Content-disposition: inline; filename=\"$filename\"");
98 throw new exception(
"Type is unrecognized.", 3);
101 }
catch(exception $e) {
102 print
"The file $file was not found. It may have been deleted.";
124 function removeFiles($tz, $restore, $homePath, $Cn) {
125 $parameters = array(
"a" => array(
"files" =>
"",
"nextFormIndex" =>
""));
126 $string = array(
"filter" => HCUFILTER_INPUT_STRING);
127 HCU_ImportVars($parameters,
"a", array(
"files" => $string,
"nextFormIndex" => $string));
128 extract($parameters[
"a"]);
129 $files = isset($files) ? trim($files) :
"";
130 $nextFormIndex = isset($nextFormIndex) ? trim($nextFormIndex) :
"";
134 if ($nextFormIndex ==
"") {
135 throw new exception(
"Next Form Index is required.", 10);
137 if (!is_numeric($nextFormIndex)) {
138 throw new exception(
"Next Form Index needs to be numeric.", 12);
140 $directory =
"$homePath/sslforms";
142 throw new exception(
"Filenames are required.", 1);
144 $files = HCU_JsonDecode($files);
145 if (!is_array($files)) {
146 throw new exception(
"Filenames are not encoded correctly.", 2);
148 $parsedFiles = array();
149 foreach($files as $fileRecord) {
150 $name = trim($fileRecord[
"name"]);
152 throw new exception(
"Filenames are not encoded correctly.", 3);
154 $preg=
'/^([a-zA-Z]+\\d+\\.html)' . ($restore ?
'\\.(\\w+)' :
'') .
'$/';
156 $pregResults = @preg_match($preg, $name, $matches);
157 if ($pregResults ===
false) {
158 throw new exception(
"Filenames are not encoded correctly.", 5);
160 if ($pregResults == 0) {
161 throw new exception(
"Filenames are not found.", 14);
163 $parsedFiles[] = $matches;
166 $extension = bin2hex($Cn);
167 foreach($parsedFiles as $matches) {
168 $oldFilename = $matches[0];
169 $oldFile =
"$directory/$oldFilename";
171 $newFilename = $matches[1];
172 $newFile =
"$directory/$newFilename";
173 if (!file_exists($oldFile)) {
174 throw new exception(
"File does not exist.", 6);
176 if (!@rename($oldFile, $newFile)) {
177 throw new exception(
"File could not be renamed.", 7);
180 $fileInfo = retrieveDateAndNames($tz, $newFilename, $directory);
182 $oldDataFilename = str_replace(
".html",
".dat", $oldFilename);
183 $newDataFilename = str_replace(
".html",
".dat", $newFilename);
184 $oldDataFile =
"$directory/$oldDataFilename";
185 $newDataFile =
"$directory/$newDataFilename";
186 if (file_exists($oldDataFile)) {
187 if (!@rename($oldDataFile, $newDataFile)) {
188 throw new exception(
"File could not be renamed.", 10);
191 $newDataFilename =
"";
194 $formData[] = array(
"index" => $nextFormIndex++,
"dataFile" => $newDataFilename,
"type" => $fileInfo[
"type"],
195 "createdDate" => $fileInfo[
"createdDate"],
"modifiedDate" => $fileInfo[
"modifiedDate"],
"deletedBy" => $fileInfo[
"deletedBy"],
"filename" => $newFilename);
198 $newFilename = $matches[0] .
".$extension";
199 $newFile =
"$directory/$newFilename";
200 if (file_exists($oldFile)) {
202 if (!@rename($oldFile, $newFile)) {
203 throw new exception(
"File could not be renamed.", 8);
206 if (!@touch($newFile)) {
207 throw new exception(
"File could not be renamed.", 9);
211 $fileInfo = retrieveDateAndNames($tz, $newFilename, $directory);
213 $oldDataFilename = str_replace(
".html",
".dat", $oldFilename);
214 $newDataFilename = str_replace(
".html",
".dat", $newFilename);
215 $oldDataFile =
"$directory/$oldDataFilename";
216 $newDataFile =
"$directory/$newDataFilename";
217 if (is_file($oldDataFile)) {
218 if (!@rename($oldDataFile, $newDataFile)) {
219 throw new exception(
"File could not be renamed.", 12);
222 $newDataFilename=
"";
225 $formData[] = array(
"index" => $nextFormIndex++,
"dataFile" => $newDataFilename,
"type" => $fileInfo[
"type"],
226 "createdDate" => $fileInfo[
"createdDate"],
"modifiedDate" => $fileInfo[
"modifiedDate"],
"deletedBy" => $fileInfo[
"deletedBy"],
"filename" => $newFilename);
229 }
catch(exception $e) {
230 return array(
"error" => array($e->getMessage()),
"code" => $e->getCode(),
"formData" => array());
232 return array(
"error" => array(),
"code" => 0,
"formData" => $formData);
248 function readSecureForms($tz, $homePath) {
250 $deletedFormData = array();
252 $directory =
"$homePath/sslforms";
253 if (!is_dir($directory)) {
254 throw new exception(
"Directory not found.", 1);
256 $dh = opendir($directory);
258 throw new exception(
"Directory not readable.", 2);
263 $cutoff = time() - ($daystokeep * 86400); # calculate $daystokeep purge timestamp
265 while (($file = readdir($dh)) !==
false) {
268 $pregMatch = @preg_match(
'/^([a-zA-Z]+\\d+(D?\\.dat)|(\\.html))|(\\d+\\.fdf)(\.\\w+?)$/', $file);
269 if ($pregMatch ===
false) {
270 throw new exception(
"String match failed.", 3);
272 if ($pregMatch && filemtime(
"$directory/$file") < $cutoff) {
273 if (!@unlink(
"$directory/$file")) {
274 throw new exception(
"File not unlinkable.", 4);
279 $dateAndNames = retrieveDateAndNames($tz, $file,
"$homePath/sslforms");
281 if ($dateAndNames[
"dontProcess"]) {
285 $dataFile = str_replace(
".html",
".dat", $file);
286 $dataFile = is_file(
"$directory/$dataFile") ? $dataFile :
"";
288 $row = array(
"index" => $index++,
"dataFile" => $dataFile,
"type" => $dateAndNames[
"type"],
"createdDate" => $dateAndNames[
"createdDate"],
289 "modifiedDate" => $dateAndNames[
"modifiedDate"],
"deletedBy" => $dateAndNames[
"deletedBy"],
"filename" => $file);
291 if ($row[
"deletedBy"] ==
"") {
294 $deletedFormData[] = $row;
298 }
catch(exception $e) {
299 return array(
"error" => array($e->getMessage()),
"code" => $e->getCode(),
"formData" => array(),
"deletedFormData" => array());
301 return array(
"error" => array(),
"code" => 0,
"formData" => $formData,
"deletedFormData" => $deletedFormData);
320 function retrieveDateAndNames($tz, $filename, $directory, $mode =
"kendo") {
327 $pregResults = @preg_match(
'/^(\\d+)\\.fdf(\\.(\\w+))?$/', $filename, $matches);
328 if ($pregResults ===
false) {
329 throw new exception(
"Preg match failed.", 3);
332 if ($pregResults !== 0) {
333 throw new exception(
"Mortgage files are phased out 9/1/2017.", -1);
335 $pregResults = @preg_match(
'/^([a-zA-Z]+)(\\d+)\\.html(\\.(\\w+))?$/', $filename, $matches);
336 if ($pregResults ===
false) {
337 throw new exception(
"Preg match failed.", 2);
339 if ($pregResults === 0) {
340 throw new exception(
"File doesn't match. Don't process this.", -1);
343 if (!@file_exists(
"$directory/$filename")) {
344 throw new exception(
"File doesn't exist.", 1);
347 $count = count($matches);
349 $type = trim($matches[1]);
352 $createdDate = trim($matches[2]);
355 $deletedBy = trim($matches[4]);
360 $UTCtz =
new DateTimeZone(
"UTC");
361 $createdDateUTC = isset($createdDate) ? DateTime::createFromFormat(
"YmdHis+", $createdDate, $UTCtz) : null;
362 $deletedBy = isset($deletedBy) ? pack(
'H*',$deletedBy) :
"";
363 $modifiedDateUTC = DateTime::createFromFormat(
"U", filemtime(
"$directory/$filename"), $UTCtz);
365 if ($createdDateUTC ===
false) {
366 throw new exception(
"Created date is not parseable from filename.", 4);
368 if ($modifiedDateUTC ===
false) {
369 throw new exception(
"Modified date is not parseable.", 5);
373 $createdDateUTC->setTimezone($tz);
374 $modifiedDateUTC->setTimezone($tz);
378 $createdDate = isset($createdDateUTC) ? $createdDateUTC->format(
"Y-m-d H:i:s.u") .
"Z" :
null;
379 $modifiedDate = isset($modifiedDateUTC) ? $modifiedDateUTC->format(
"Y-m-d H:i:s.u") .
"Z" :
null;
382 }
catch(exception $e) {
383 if ($e->getCode() == -1) {
384 return array(
"dontProcess" =>
true);
386 throw new exception(
"Name retrieval failed: " . $e->getMessage(), 3);
388 return array(
"createdDate" => $createdDate,
"modifiedDate" => $modifiedDate,
"deletedBy" => $deletedBy,
"type" => $type,
"dontProcess" =>
false);
397 function printSecureFormPage($self) { ?>
398 <script type=
"text/javascript">
400 getShowWaitFunctions(); ?>
404 function openDeleteConfirm(isRestore) {
405 var deleteConfirm = $(
"#deleteConfirm").data(
"kendoDialog");
406 if (deleteConfirm ==
null) {
407 deleteConfirm = $(
"<div id='deleteConfirm'></div>").appendTo(
"body").kendoDialog({
410 {text:
"Yes", primary:
true, action:
function() {
411 $(
"#deleteConfirm").data(
"kendoDialog").close();
412 deleteRestoreClick($(
"#deleteConfirm").data(
"isRestore"));
417 if (window.activeWindows !=
null) {
418 window.activeWindows.push(
this);
422 if (window.activeWindows !=
null) {
423 window.activeWindows.pop();
426 }).data(
"kendoDialog");
428 deleteConfirm.title(isRestore ?
"Restore Files" :
"Delete Files").content(
429 "<p>You are about to " + (isRestore ?
"restore" :
"delete") +
" these files.</p><p>Do you wish to continue?</p>").open();
430 $(
"#deleteConfirm").data({isRestore: isRestore});
433 function openFileWindow(filename, formtype) {
434 var fileWindow = $(
"#fileWindow").data(
"kendoWindow");
435 if (fileWindow ==
null) {
436 var fileWindow = $(
"<div id='fileWindow'></div>").appendTo(
"body").kendoWindow({
438 actions: [
"Print",
"Close" ],
440 if (window.activeWindows !=
null) {
441 window.activeWindows.push(
this);
445 if (window.activeWindows !=
null) {
446 window.activeWindows.pop();
452 }).data(
"kendoWindow");
454 $(
"#fileWindow").on(
"click",
".closeBtn",
function() {
455 $(
"#fileWindow").data(
"kendoWindow").close();
460 var bodyWidth = $(
"#body-wrapper").width();
461 var bodyHeight = $(
"#body-wrapper").height();
464 if (formtype ==
'loan' || formtype ==
'subuser') {
468 width = Math.min(Math.floor(bodyWidth * .95), width);
469 height = Math.min(Math.floor(bodyHeight * .95), height);
470 var
template = kendo.template(
'<div class="hcu-template"><iframe id="viewIframe" style="width: 100%;" ' 471 +
'src="<?php echo $self; ?>&operation=#: operation #&filename=#: filename #"></iframe>' 472 +
'<div class="hcu-edit-buttons k-state-default"><a class="closeBtn k-button k-primary" href="\\#"><i class="fa fa-check"></i>Close</a></div></div>');
474 $(fileWindow.wrapper).css({ width: width});
475 fileWindow.content(
template({operation:
"viewFile", filename: filename})).open().center();
476 $(
"#viewIframe").height(height);
478 var dialog = $(
"#fileWindow").data(
'kendoWindow');
480 printButton = dialog.wrapper.find(
".k-i-print");
481 printButton.click(
function (e) {
483 var src = $(
"#viewIframe").attr(
'src');
484 window.open( src,
"print_view" );
487 homecuTooltip.reset(); <?php
488 homecuTooltip.custom.content =
"View/Print in new window";
489 printButton.kendoTooltip(homecuTooltip.custom).data(
"kendoTooltip");
500 var rowTemplateTemplate = kendo.template(
"# var downloadClass= 'dataDownload';" 501 +
"var viewClass = 'formPreview'; #<tr data-uid='\\#: uid \\#'><td class='checkboxTD'><input type='checkbox' class='rowCheckbox'></td>" 502 +
"<td><i class='fa fa-search #: viewClass # showClickable'></i> # if (gridType == 'form') { # \\# if (dataFile != '' && dataFile != null) { \\# # } #" 503 +
"<i class='fa fa-download #: downloadClass # showClickable'></i># if (gridType == 'form') { # \\# } \\# # } #</td>" 504 +
"# if (gridType == 'form') { #<td>\\#: kendo.toString(createdDate, 'G') \\#</td><td>\\#: type \\#</td> # } else { # <td>\\#: filename \\#</td> # } #" 505 +
"# if (showsDeleted) { #<td>\\#: kendo.toString(modifiedDate, 'd') \\#</td><td>\\#: deletedBy \\#</td> # } #</tr>");
507 $(
"#deleteSelectedFormsBtn").click(
function() {
508 if (!$(
this).hasClass(
"k-state-disabled")) {
509 openDeleteConfirm(
false,
false);
514 $(
"#restoreSelectedFormsBtn").click(
function() {
515 if (!$(
this).hasClass(
"k-state-disabled")) {
516 openDeleteConfirm(
true,
false);
521 var formDefinition = {
524 read:
function (options) {
525 options.success(tempData);
532 index: {type:
"number"},
533 dataFile: {type:
"string"},
534 type: {type:
"string"},
535 createdDate: {type:
"date"},
536 modifiedDate: {type:
"date"},
537 deletedBy: {type:
"string"},
538 filename: {type:
"string"},
539 checked: {type:
"boolean"}
543 sort: {field:
"createdDate", dir:
"desc"}
548 {title:
"", width:
"45px", headerTemplate:
"<input type='checkbox' class='allCheckbox'>"},
550 {field:
"createdDate", title:
"Created", width:
"170px"},
551 {field:
"type", title:
"File Type"}
553 rowTemplate: rowTemplateTemplate({gridType:
"form", showsDeleted:
false}),
555 template:
"<tr><td colspan='4'>No Records Found</td></tr>" 559 var formGrid = $(
"#formGrid").kendoGrid(formDefinition).data(
"kendoGrid");
561 formDefinition.columns.splice(4,0, {field:
"modifiedDate", title:
"Deleted"}, {field:
"deletedBy", title:
"Deleted By"});
563 formDefinition.rowTemplate = rowTemplateTemplate({gridType:
"form", showsDeleted:
true});
564 var deletedFormGrid = $(
"#deletedFormGrid").kendoGrid(formDefinition).data(
"kendoGrid");
566 <?php printCheckboxEvents(
"#formGrid",
"#deleteSelectedFormsBtn");
567 printCheckboxEvents(
"#deletedFormGrid",
"#restoreSelectedFormsBtn"); ?>
569 $(
"#showDeletedBtn").click(
function() {
570 $(
"#activeFormDiv").hide();
571 $(
"#deletedFormDiv").show();
575 $(
"#showActiveBtn").click(
function() {
576 $(
"#activeFormDiv").show();
577 $(
"#deletedFormDiv").hide();
581 $(
".formDiv").on(
"click",
".formPreview",
function() {
582 var tr = $(
this).closest(
"tr");
583 var grid = $(
this).closest(
".formGrid").data(
"kendoGrid");
584 var dataItem = grid.dataItem(tr);
586 openFileWindow(dataItem.filename, dataItem.type);
590 $(
".formDiv").on(
"click",
".dataDownload",
function() {
591 var tr = $(
this).closest(
"tr");
592 var grid = $(
this).closest(
".formGrid").data(
"kendoGrid");
593 var dataItem = grid.dataItem(tr);
595 $(
"#downloadForm [name='filename']").val(dataItem.dataFile);
596 $(
"#downloadForm [name='operation']").val(
"downloadFile");
597 $(
"#downloadForm").submit();
602 $.post(
"<?php echo $self; ?>&operation=readForms", {},
function(data) {
604 if (data.error.length > 0) {
605 $.homecuValidator.displayMessage(data.error, $.homecuValidator.settings.statusError );
607 putDataInGrids(data.formData, data.deletedFormData);
627 function deleteRestoreClick(isRestore) {
628 var addToFormGrid =
null, removeFromFormGrid =
null;
630 addToFormGrid = $(
"#formGrid").data(
"kendoGrid");
631 removeFromFormGrid = $(
"#deletedFormGrid").data(
"kendoGrid");
633 removeFromFormGrid = $(
"#formGrid").data(
"kendoGrid");
634 addToFormGrid = $(
"#deletedFormGrid").data(
"kendoGrid");
637 var removeFromFormData = removeFromFormGrid.dataSource.data();
638 var addToFormData = addToFormGrid.dataSource.data();
641 var nextFormIndex = 1;
643 for(var i = 0; i != removeFromFormData.length; i++) {
644 var record = removeFromFormData[i];
645 if (record.checked) {
646 parseData.push({name: record.filename});
648 if (record.index > nextFormIndex) {
649 nextFormIndex = record.index;
652 for(var i = 0; i != addToFormData.length; i++) {
653 var record = addToFormData[i];
654 if (record.index > nextFormIndex) {
655 nextFormIndex = record.index;
659 var parameters = {files: kendo.stringify(parseData), nextFormIndex: ++ nextFormIndex};
662 $.post(
"<?php echo $self; ?>&operation=" + (isRestore ?
"restoreFiles" :
"removeFiles"), parameters,
function(data) {
665 if (data.error.length > 0) {
666 $.homecuValidator.displayMessage(data.error, $.homecuValidator.settings.statusError );
668 removeFromFormData = $.grep(removeFromFormData,
function(n,i) {
return !n.checked; });
670 for(var i = 0; i != data.formData.length; i++) {
671 addToFormData.push(data.formData[i]);
674 !isRestore ? putDataInGrids(removeFromFormData, addToFormData)
675 : putDataInGrids(addToFormData, removeFromFormData);
677 $(
".allCheckbox").prop(
"checked",
false);
691 function putDataInGrids(formData, deletedFormData) {
693 $(
"#formGrid").data(
"kendoGrid").dataSource.read();
695 tempData = deletedFormData;
697 $(
"#deletedFormGrid").data(
"kendoGrid").dataSource.read();
700 var activeWindows = [];
701 $(document).ready(
function() {
703 <?php printClickOverlayEvent(); ?>
706 <div
class=
"container secureFormsDiv hcu-all-100">
708 <div
id=
"formValidateDiv" class=
"k-block k-error-colored formValidateDiv" style=
"display:none;"></div>
710 <div
id=
"activeFormDiv" class=
"formDiv">
711 <h2>Secure Forms</h2>
712 <div
class=
"row hcuSpacer hcu-edit-buttons">
713 <div
class=
"col-xs-12">
714 <a href=
"#" id=
"deleteSelectedFormsBtn" class=
"k-button k-state-disabled">Delete selected forms</a> <a href=
"#" id=
"showDeletedBtn">Recently Deleted Forms</a>
718 <div
class=
"col-xs-12">
719 <div
id=
"formGrid" class=
"formGrid checkboxGrid hcu-all-100"></div>
723 <div
id=
"deletedFormDiv" class=
"formDiv" style=
"display:none;">
725 <div
class=
"col-xs-12">
729 <div
class=
"row hcuSpacer hcu-edit-buttons">
730 <div
class=
"col-xs-12">
731 <a href=
"#" id=
"restoreSelectedFormsBtn" class=
"k-button k-state-disabled">Restore selected forms</a> <a href=
"#" id=
"showActiveBtn">Active Forms</a>
735 <div
class=
"col-xs-12">
736 <div
id=
"deletedFormGrid" class=
"formGrid checkboxGrid hcu-all-100"></div>
742 <iframe name=
"hiddenFrame" style=
"display:none;"></iframe>
743 <form
id=
"downloadForm" action=
"<?php echo $self; ?>" method=
"post" target=
"hiddenFrame" style=
"display:none;">
744 <input name=
"operation" value=
"">
745 <input name=
"filename" value=
"">