getMessage()); } if ($phpMussel['Config']['general']['scan_cache_expiry'] > 0 && is_array($phpMussel['HashCache']['Data'])) { foreach ($phpMussel['HashCache']['Data'] as &$phpMussel['HashCache']['ThisData']) { if (is_array($phpMussel['HashCache']['ThisData'])) { $phpMussel['HashCache']['ThisData'] = implode(':', $phpMussel['HashCache']['ThisData']) . ';'; } } unset($phpMussel['HashCache']['ThisData']); $phpMussel['HashCache']['Data'] = implode('', $phpMussel['HashCache']['Data']); $phpMussel['HashCache']['Data'] = $phpMussel['SaveCache']( 'HashCache', $phpMussel['Time'] + $phpMussel['Config']['general']['scan_cache_expiry'], $phpMussel['HashCache']['Data'] ); } die; } /** Generate an MD5 signature or a SHA1 signature using a file or directory. **/ if ($phpMussel['cmd'] === 'md5_file' || $phpMussel['cmd'] === 'm' || $phpMussel['cmd'] === 'sha1_file') { echo $phpMussel['CLI-RecursiveCommand']($phpMussel['cli_args'][2], function ($Params) use (&$phpMussel) { $HashMe = $phpMussel['ReadFile']($Params, 0, true); return $phpMussel['HashAlias']($phpMussel['cmd'], $HashMe) . ':' . strlen($HashMe) . ':' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; }); } /** Generate a CoEx signature using a file. **/ if ($phpMussel['cmd'] === 'coex_file') { echo $phpMussel['CLI-RecursiveCommand']($phpMussel['cli_args'][2], function ($Params) use (&$phpMussel) { $HashMe = $phpMussel['ReadFile']($Params, 0, true); return '$md5:' . md5($HashMe) . ';' . '$sha:' . sha1($HashMe) . ';' . '$str_len:' . strlen($HashMe) . ';' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; }); } /** Fetch PE metadata. **/ if ($phpMussel['cmd'] === 'pe_meta') { echo $phpMussel['CLI-RecursiveCommand']($phpMussel['cli_args'][2], function ($Params) use (&$phpMussel) { $Data = $phpMussel['ReadFile']($Params, 0, true); $Returnable = ''; if (substr($Data, 0, 2) === 'MZ') { $PEArr = []; $PEArr['Len'] = strlen($Data); $PEArr['Offset'] = $phpMussel['UnpackSafe']('S', substr($Data, 60, 4)); $PEArr['Offset'] = $PEArr['Offset'][1]; while (true) { $PEArr['DoScan'] = true; if ($PEArr['Offset'] < 1 || $PEArr['Offset'] > 16384 || $PEArr['Offset'] > $PEArr['Len']) { $PEArr['DoScan'] = false; break; } $PEArr['Magic'] = substr($Data, $PEArr['Offset'], 2); if ($PEArr['Magic'] !== 'PE') { $PEArr['DoScan'] = false; break; } $PEArr['Proc'] = $phpMussel['UnpackSafe']('S', substr($Data, $PEArr['Offset'] + 4, 2)); $PEArr['Proc'] = $PEArr['Proc'][1]; if ($PEArr['Proc'] != 0x14c && $PEArr['Proc'] != 0x8664) { $PEArr['DoScan'] = false; break; } $PEArr['NumOfSections'] = $phpMussel['UnpackSafe']('S', substr($Data, $PEArr['Offset'] + 6, 2)); $PEArr['NumOfSections'] = $PEArr['NumOfSections'][1]; if ($PEArr['NumOfSections'] < 1 || $PEArr['NumOfSections'] > 40) { $PEArr['DoScan'] = false; } break; } if (!$PEArr['DoScan']) { return $phpMussel['lang']['cli_pe1'] . "\n"; } $PEArr['OptHdrSize'] = $phpMussel['UnpackSafe']('S', substr($Data, $PEArr['Offset'] + 20, 2)); $PEArr['OptHdrSize'] = $PEArr['OptHdrSize'][1]; $Returnable .= $phpMussel['lang']['cli_pe2'] . "\n"; for ($PEArr['k'] = 0; $PEArr['k'] < $PEArr['NumOfSections']; $PEArr['k']++) { $PEArr['SectionHead'] = substr($Data, $PEArr['Offset'] + 24 + $PEArr['OptHdrSize'] + ($PEArr['k'] * 40), $PEArr['NumOfSections'] * 40); $PEArr['SectionName'] = str_ireplace("\x00", '', substr($PEArr['SectionHead'], 0, 8)); $PEArr['VirtualSize'] = $phpMussel['UnpackSafe']('S', substr($PEArr['SectionHead'], 8, 4)); $PEArr['VirtualSize'] = $PEArr['VirtualSize'][1]; $PEArr['VirtualAddress'] = $phpMussel['UnpackSafe']('S', substr($PEArr['SectionHead'], 12, 4)); $PEArr['VirtualAddress'] = $PEArr['VirtualAddress'][1]; $PEArr['SizeOfRawData'] = $phpMussel['UnpackSafe']('S', substr($PEArr['SectionHead'], 16, 4)); $PEArr['SizeOfRawData'] = $PEArr['SizeOfRawData'][1]; $PEArr['PointerToRawData'] = $phpMussel['UnpackSafe']('S', substr($PEArr['SectionHead'], 20, 4)); $PEArr['PointerToRawData'] = $PEArr['PointerToRawData'][1]; $PEArr['SectionData'] = substr($Data, $PEArr['PointerToRawData'], $PEArr['SizeOfRawData']); $PEArr['MD5'] = md5($PEArr['SectionData']); $Returnable .= $PEArr['SizeOfRawData'] . ':' . $PEArr['MD5'] . ':' . $PEArr['SectionName'] . "\n"; } $Returnable .= "\n"; if (substr_count($Data, "V\x00a\x00r\x00F\x00i\x00l\x00e\x00I\x00n\x00f\x00o\x00\x00\x00\x00\x00\x24")) { $PEArr['FINFO'] = $phpMussel['substral']($Data, "V\x00a\x00r\x00F\x00i\x00l\x00e\x00I\x00n\x00f\x00o\x00\x00\x00\x00\x00\x24"); if (substr_count($PEArr['FINFO'], "F\x00i\x00l\x00e\x00D\x00e\x00s\x00c\x00r\x00i\x00p\x00t\x00i\x00o\x00n\x00\x00\x00")) { $PEArr['ThisData'] = trim(str_ireplace("\x00", '', $phpMussel['substrbf']($phpMussel['substral']($PEArr['FINFO'], "F\x00i\x00l\x00e\x00D\x00e\x00s\x00c\x00r\x00i\x00p\x00t\x00i\x00o\x00n\x00\x00\x00"), "\x00\x00\x00"))); $Returnable .= '$PEFileDescription:' . md5($PEArr['ThisData']) . ':' . strlen($PEArr['ThisData']) . ':' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; } if (substr_count($PEArr['FINFO'], "F\x00i\x00l\x00e\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00\x00\x00")) { $PEArr['ThisData'] = trim(str_ireplace("\x00", '', $phpMussel['substrbf']($phpMussel['substral']($PEArr['FINFO'], "F\x00i\x00l\x00e\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00\x00\x00"), "\x00\x00\x00"))); $Returnable .= '$PEFileVersion:' . md5($PEArr['ThisData']) . ':' . strlen($PEArr['ThisData']) . ':' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; } if (substr_count($PEArr['FINFO'], "P\x00r\x00o\x00d\x00u\x00c\x00t\x00N\x00a\x00m\x00e\x00\x00\x00")) { $PEArr['ThisData'] = trim(str_ireplace("\x00", '', $phpMussel['substrbf']($phpMussel['substral']($PEArr['FINFO'], "P\x00r\x00o\x00d\x00u\x00c\x00t\x00N\x00a\x00m\x00e\x00\x00\x00"), "\x00\x00\x00"))); $Returnable .= '$PEProductName:' . md5($PEArr['ThisData']) . ':' . strlen($PEArr['ThisData']) . ':' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; } if (substr_count($PEArr['FINFO'], "P\x00r\x00o\x00d\x00u\x00c\x00t\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00\x00\x00")) { $PEArr['ThisData'] = trim(str_ireplace("\x00", '', $phpMussel['substrbf']($phpMussel['substral']($PEArr['FINFO'], "P\x00r\x00o\x00d\x00u\x00c\x00t\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00\x00\x00"), "\x00\x00\x00"))); $Returnable .= '$PEProductVersion:' . md5($PEArr['ThisData']) . ':' . strlen($PEArr['ThisData']) . ':' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; } if (substr_count($PEArr['FINFO'], "L\x00e\x00g\x00a\x00l\x00C\x00o\x00p\x00y\x00r\x00i\x00g\x00h\x00t\x00\x00\x00")) { $PEArr['ThisData'] = trim(str_ireplace("\x00", '', $phpMussel['substrbf']($phpMussel['substral']($PEArr['FINFO'], "L\x00e\x00g\x00a\x00l\x00C\x00o\x00p\x00y\x00r\x00i\x00g\x00h\x00t\x00\x00\x00"), "\x00\x00\x00"))); $Returnable .= '$PECopyright:' . md5($PEArr['ThisData']) . ':' . strlen($PEArr['ThisData']) . ':' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; } if (substr_count($PEArr['FINFO'], "O\x00r\x00i\x00g\x00i\x00n\x00a\x00l\x00F\x00i\x00l\x00e\x00n\x00a\x00m\x00e\x00\x00\x00")) { $PEArr['ThisData'] = trim(str_ireplace("\x00", '', $phpMussel['substrbf']($phpMussel['substral']($PEArr['FINFO'], "O\x00r\x00i\x00g\x00i\x00n\x00a\x00l\x00F\x00i\x00l\x00e\x00n\x00a\x00m\x00e\x00\x00\x00"), "\x00\x00\x00"))); $Returnable .= '$PEOriginalFilename:' . md5($PEArr['ThisData']) . ':' . strlen($PEArr['ThisData']) . ':' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; } if (substr_count($PEArr['FINFO'], "C\x00o\x00m\x00p\x00a\x00n\x00y\x00N\x00a\x00m\x00e\x00\x00\x00")) { $PEArr['ThisData'] = trim(str_ireplace("\x00", '', $phpMussel['substrbf']($phpMussel['substral']($PEArr['FINFO'], "C\x00o\x00m\x00p\x00a\x00n\x00y\x00N\x00a\x00m\x00e\x00\x00\x00"), "\x00\x00\x00"))); $Returnable .= '$PECompanyName:' . md5($PEArr['ThisData']) . ':' . strlen($PEArr['ThisData']) . ':' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; } } return $Returnable; } return $phpMussel['lang']['cli_pe1'] . "\n"; }); } /** Die child process back to parent. */ die; } /** Echo the ASCII header art and CLI-mode information. */ echo $phpMussel['lang']['cli_ln1'] . $phpMussel['lang']['cli_ln2'] . $phpMussel['lang']['cli_ln3']; /** Open STDIN. */ $phpMussel['stdin_handle'] = fopen('php://stdin', 'r'); while (true) { /** Set CLI process title (PHP => 5.5.0). */ if (function_exists('cli_set_process_title')) { cli_set_process_title($phpMussel['ScriptIdent']); } /** Echo the CLI-mode prompt. */ echo $phpMussel['lang']['cli_prompt']; /** Wait for user input. */ $phpMussel['stdin_clean'] = trim(fgets($phpMussel['stdin_handle'])); /** Set CLI process title with "working" notice (PHP =>5.5.0). */ if (function_exists('cli_set_process_title')) { cli_set_process_title($phpMussel['ScriptIdent'] . ' - ' . $phpMussel['lang']['cli_working'] . '...'); } /** Fetch the command. **/ $phpMussel['cmd'] = strtolower($phpMussel['substrbf']($phpMussel['stdin_clean'], ' ') ?: $phpMussel['stdin_clean']); /** Exit CLI-mode. **/ if ($phpMussel['cmd'] === 'quit' || $phpMussel['cmd'] === 'q' || $phpMussel['cmd'] === 'exit') { die; } /** Generate an MD5 signature or a SHA1 signature using a file or directory. **/ if ($phpMussel['cmd'] === 'md5_file' || $phpMussel['cmd'] === 'm' || $phpMussel['cmd'] === 'sha1_file') { echo "\n" . $phpMussel['CLI-RecursiveCommand']($phpMussel['stdin_clean'], function ($Params) use (&$phpMussel) { $HashMe = $phpMussel['ReadFile']($Params, 0, true); return $phpMussel['HashAlias']($phpMussel['cmd'], $HashMe) . ':' . strlen($HashMe) . ':' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; }); } /** Generate a CoEx signature using a file. **/ if ($phpMussel['cmd'] === 'coex_file') { echo "\n" . $phpMussel['CLI-RecursiveCommand']($phpMussel['stdin_clean'], function ($Params) use (&$phpMussel) { $HashMe = $phpMussel['ReadFile']($Params, 0, true); return '$md5:' . md5($HashMe) . ';' . '$sha:' . sha1($HashMe) . ';' . '$str_len:' . strlen($HashMe) . ';' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; }); } /** Fetch PE metadata. **/ if ($phpMussel['cmd'] === 'pe_meta') { echo "\n" . $phpMussel['CLI-RecursiveCommand']($phpMussel['stdin_clean'], function ($Params) use (&$phpMussel) { return $phpMussel['Fork']($phpMussel['cmd'] . ' ' . $Params, $Params) . "\n"; }); } /** Generate an MD5 signature or a SHA1 signature using a string. **/ if ($phpMussel['cmd'] === 'md5' || $phpMussel['cmd'] === 'sha1') { $phpMussel['TargetData'] = substr($phpMussel['stdin_clean'], strlen($phpMussel['cmd']) + 1); echo "\n" . $phpMussel['cmd']($phpMussel['TargetData']) . ':' . strlen($phpMussel['TargetData']) . ':' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; } /** Generate a URL scanner signature from a URL. **/ if ($phpMussel['cmd'] === 'url_sig') { echo "\n"; $phpMussel['stdin_clean'] = $phpMussel['prescan_normalise'](substr($phpMussel['stdin_clean'], strlen($phpMussel['cmd']) + 1)); $phpMussel['URL'] = ['avoidme' => '', 'forthis' => '']; if ( !preg_match_all('/(data|file|https?|ftps?|sftp|ss[hl])\:\/\/(www[0-9]{0,3}\.)?([0-9a-z.-]{1,512})/i', $phpMussel['stdin_clean'], $phpMussel['URL']['domain']) || !preg_match_all('/(data|file|https?|ftps?|sftp|ss[hl])\:\/\/(www[0-9]{0,3}\.)?([\!\#\$\&-;\=\?\@-\[\]_a-z~]{1,4000})/i', $phpMussel['stdin_clean'], $phpMussel['URL']['url']) ) { echo $phpMussel['lang']['invalid_url'] . "\n"; } else { echo 'DOMAIN:' . md5($phpMussel['URL']['domain'][3][0]) . ':' . strlen($phpMussel['URL']['domain'][3][0]) . ':' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; $phpMussel['URL']['forthis'] = md5($phpMussel['URL']['url'][3][0]) . ':' . strlen($phpMussel['URL']['url'][3][0]); $phpMussel['URL']['avoidme'] .= ',' . $phpMussel['URL']['forthis'] . ','; echo 'URL:' . $phpMussel['URL']['forthis'] . ':' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; if (preg_match('/[^0-9a-z.-]$/i', $phpMussel['URL']['url'][3][0])) { $phpMussel['URL']['x'] = preg_replace('/[^0-9a-z.-]+$/i', '', $phpMussel['URL']['url'][3][0]); $phpMussel['URL']['forthis'] = md5($phpMussel['URL']['x']) . ':' . strlen($phpMussel['URL']['x']); if (!substr_count($phpMussel['URL']['avoidme'], $phpMussel['URL']['forthis'])) { $phpMussel['URL']['avoidme'] .= ',' . $phpMussel['URL']['forthis'] . ','; echo 'URL:' . $phpMussel['URL']['forthis'] . ':' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; } } if (substr_count($phpMussel['URL']['url'][3][0], '?')) { $phpMussel['URL']['x'] = $phpMussel['substrbf']($phpMussel['URL']['url'][3][0], '?'); $phpMussel['URL']['forthis'] = md5($phpMussel['URL']['x']) . ':' . strlen($phpMussel['URL']['x']); if (!substr_count($phpMussel['URL']['avoidme'], $phpMussel['URL']['forthis'])) { $phpMussel['URL']['avoidme'] .= ',' . $phpMussel['URL']['forthis'] . ','; echo 'URL:' . $phpMussel['URL']['forthis'] . ':' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; } $phpMussel['URL']['x'] = $phpMussel['substraf']($phpMussel['URL']['url'][3][0], '?'); $phpMussel['URL']['forthis'] = md5($phpMussel['URL']['x']) . ':' . strlen($phpMussel['URL']['x']); if ( !substr_count($phpMussel['URL']['avoidme'], $phpMussel['URL']['forthis']) && $phpMussel['URL']['forthis'] != 'd41d8cd98f00b204e9800998ecf8427e:0' ) { $phpMussel['URL']['avoidme'] .= ',' . $phpMussel['URL']['forthis'] . ','; echo 'QUERY:' . $phpMussel['URL']['forthis'] . ':' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; } } } unset($phpMussel['URL']); } /** Generate a CoEx signature using a string. **/ if ($phpMussel['cmd'] === 'coex') { $phpMussel['TargetData'] = substr($phpMussel['stdin_clean'], strlen($phpMussel['cmd']) + 1); echo "\n\$md5:" . md5($phpMussel['TargetData']) . ';$sha:' . sha1($phpMussel['TargetData']) . ';$str_len:' . strlen($phpMussel['TargetData']) . ';' . $phpMussel['lang']['cli_signature_placeholder'] . "\n"; } /** Convert a binary string to a hexadecimal. **/ if ($phpMussel['cmd'] === 'hex_encode' || $phpMussel['cmd'] === 'x') { $phpMussel['TargetData'] = substr($phpMussel['stdin_clean'], strlen($phpMussel['cmd']) + 1); echo "\n" . bin2hex($phpMussel['TargetData']) . "\n"; } /** Convert a hexadecimal to a binary string. **/ if ($phpMussel['cmd'] === 'hex_decode') { $phpMussel['TargetData'] = substr($phpMussel['stdin_clean'], strlen($phpMussel['cmd']) + 1); echo "\n" . ($phpMussel['HexSafe']($phpMussel['TargetData']) ?: $phpMussel['lang']['invalid_data']) . "\n"; } /** Convert a binary string to a base64 string. **/ if ($phpMussel['cmd'] === 'base64_encode' || $phpMussel['cmd'] === 'b') { $phpMussel['TargetData'] = substr($phpMussel['stdin_clean'], strlen($phpMussel['cmd']) + 1); echo "\n" . base64_encode($phpMussel['TargetData']) . "\n"; } /** Convert a base64 string to a binary string. **/ if ($phpMussel['cmd'] === 'base64_decode') { $phpMussel['TargetData'] = substr($phpMussel['stdin_clean'], strlen($phpMussel['cmd']) + 1); echo "\n" . (base64_decode($phpMussel['TargetData']) ?: $phpMussel['lang']['invalid_data']) . "\n"; } /** Scan a file or directory. **/ if ($phpMussel['cmd'] === 'scan' || $phpMussel['cmd'] === 's') { echo "\n"; $phpMussel['stdin_clean'] = substr($phpMussel['stdin_clean'], strlen($phpMussel['cmd']) + 1); $out = $r = ''; $phpMussel['memCache']['start_time'] = time() + ($phpMussel['Config']['general']['timeOffset'] * 60); $phpMussel['memCache']['start_time_2822'] = $phpMussel['TimeFormat']($phpMussel['memCache']['start_time'], $phpMussel['Config']['general']['timeFormat']); echo $s = $phpMussel['memCache']['start_time_2822'] . ' ' . $phpMussel['lang']['started'] . $phpMussel['lang']['_fullstop_final'] . "\n"; if (is_dir($phpMussel['stdin_clean'])) { if (!is_readable($phpMussel['stdin_clean'])) { $out = '> ' . $phpMussel['lang']['failed_to_access'] . '"' . $phpMussel['stdin_clean'] . "\".\n"; } else { $Terminal = $phpMussel['stdin_clean'][strlen($phpMussel['stdin_clean']) - 1]; if ($Terminal !== "\\" && $Terminal !== '/') { $phpMussel['stdin_clean'] .= '/'; } $List = $phpMussel['DirectoryRecursiveList']($phpMussel['stdin_clean']); $Total = count($List); $Current = 0; foreach ($List as $Item) { $Percent = round(($Current / $Total) * 100, 2) . '%'; echo $Percent . ' ' . $phpMussel['lang']['scan_complete'] . $phpMussel['lang']['_fullstop_final']; $out = $phpMussel['Fork']('scan ' . $phpMussel['stdin_clean'] . $Item, $Item); if (!$out) { $out = '> ' . $phpMussel['lang']['cli_failed_to_complete'] . ' (' . $Item . ')' . $phpMussel['lang']['_exclamation_final'] . "\n"; } $r .= $out; echo "\r" . $phpMussel['prescan_decode']($out); $out = ''; } } } elseif (is_file($phpMussel['stdin_clean'])) { $out = $phpMussel['Fork']('scan ' . $phpMussel['stdin_clean'], $phpMussel['stdin_clean']); if (!$out) { $out = '> ' . $phpMussel['lang']['cli_failed_to_complete'] . $phpMussel['lang']['_exclamation_final'] . "\n"; } } elseif (!$out) { $out = '> ' . $phpMussel['stdin_clean'] . $phpMussel['lang']['cli_is_not_a'] . "\n"; } $r .= $out; if ($out) { echo $phpMussel['prescan_decode']($out); $out = ''; } $phpMussel['memCache']['end_time'] = time() + ($phpMussel['Config']['general']['timeOffset'] * 60); $phpMussel['memCache']['end_time_2822'] = $phpMussel['TimeFormat']($phpMussel['memCache']['end_time'], $phpMussel['Config']['general']['timeFormat']); $r = $s . $r; $s = $phpMussel['memCache']['end_time_2822'] . ' ' . $phpMussel['lang']['finished'] . $phpMussel['lang']['_fullstop_final'] . "\n"; echo $s; $r .= $s; $phpMussel['WriteScanLog']($r); $phpMussel['WriteSerial']($phpMussel['memCache']['start_time'], $phpMussel['memCache']['end_time']); unset($r, $s); } /** Add an entry to the greylist. **/ if ($phpMussel['cmd'] === 'greylist' || $phpMussel['cmd'] === 'g') { echo "\n"; $phpMussel['stdin_clean'] = substr($phpMussel['stdin_clean'], strlen($phpMussel['cmd']) + 1); if (!empty($phpMussel['stdin_clean'])) { $Greylist = file_exists($phpMussel['Vault'] . 'greylist.csv') ? $phpMussel['stdin_clean'] . ',' : ',' . $phpMussel['stdin_clean'] . ','; $Handle = fopen($phpMussel['Vault'] . 'greylist.csv', 'a'); fwrite($Handle, $Greylist); fclose($Handle); unset($Handle, $Greylist); echo $phpMussel['lang']['greylist_updated']; } } /** Clear the greylist. **/ if ($phpMussel['cmd'] === 'greylist_clear' || $phpMussel['cmd'] === 'gc') { echo "\n"; $Handle = fopen($phpMussel['Vault'] . 'greylist.csv', 'a'); ftruncate($Handle, 0); fwrite($Handle, ','); fclose($Handle); unset($Handle, $Greylist); echo $phpMussel['lang']['greylist_cleared']; } /** Show the greylist. **/ if ($phpMussel['cmd'] === 'greylist_show' || $phpMussel['cmd'] === 'gs') { $phpMussel['stdin_clean'] = substr($phpMussel['stdin_clean'], strlen($phpMussel['cmd']) + 1); echo file_exists($phpMussel['Vault'] . 'greylist.csv') ? "\n greylist.csv:\n" . implode("\n ", explode(',', $phpMussel['ReadFile']($phpMussel['Vault'] . 'greylist.csv'))) : "\n greylist.csv " . $phpMussel['lang']['x_does_not_exist'] . $phpMussel['lang']['_exclamation_final']; } /** Print the command list. **/ if ($phpMussel['cmd'] === 'c') { echo $phpMussel['lang']['cli_commands']; } } die; } /** Restores default error handler (assuming we somehow reach this far). */ restore_error_handler();