PageRenderTime 30ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/vtigerCRM/modules/Settings/MailScanner/core/MailScannerInfo.php

https://github.com/hitchby/PLEXUS
PHP | 398 lines | 269 code | 39 blank | 90 comment | 41 complexity | 7774249b9a3333a4119d2565b4878230 MD5 | raw file
  1. <?php
  2. /*********************************************************************************
  3. ** The contents of this file are subject to the vtiger CRM Public License Version 1.0
  4. * ("License"); You may not use this file except in compliance with the License
  5. * The Original Code is: vtiger CRM Open Source
  6. * The Initial Developer of the Original Code is vtiger.
  7. * Portions created by vtiger are Copyright (C) vtiger.
  8. * All Rights Reserved.
  9. *
  10. ********************************************************************************/
  11. require_once('modules/Settings/MailScanner/core/MailScannerRule.php');
  12. /**
  13. * Mail Scanner information manager.
  14. */
  15. class Vtiger_MailScannerInfo {
  16. // id of this scanner record
  17. var $scannerid = false;
  18. // name of this scanner
  19. var $scannername=false;
  20. // mail server to connect to
  21. var $server = false;
  22. // mail protocol to use
  23. var $protocol = false;
  24. // username to use
  25. var $username = false;
  26. // password to use
  27. var $password = false;
  28. // notls/tls/ssl
  29. var $ssltype = false;
  30. // validate-certificate or novalidate-certificate
  31. var $sslmethod = false;
  32. // last successful connection url to use
  33. var $connecturl= false;
  34. // search for type
  35. var $searchfor = false;
  36. // post scan mark record as
  37. var $markas = false;
  38. // is the scannered enabled?
  39. var $isvalid = false;
  40. // Last scan on the folders.
  41. var $lastscan = false;
  42. // Need rescan on the folders?
  43. var $rescan = false;
  44. // Rules associated with this mail scanner
  45. var $rules = false;
  46. /**
  47. * Constructor
  48. */
  49. function __construct($scannername, $initialize=true) {
  50. if($initialize && $scannername) $this->initialize($scannername);
  51. }
  52. /**
  53. * Encrypt/Decrypt input.
  54. * @access private
  55. */
  56. function __crypt($password, $encrypt=true) {
  57. require_once('include/utils/encryption.php');
  58. $cryptobj = new Encryption();
  59. if($encrypt) return $cryptobj->encrypt(trim($password));
  60. else return $cryptobj->decrypt(trim($password));
  61. }
  62. /**
  63. * Initialize this instance.
  64. */
  65. function initialize($scannername) {
  66. global $adb;
  67. $result = $adb->pquery("SELECT * FROM vtiger_mailscanner WHERE scannername=?", Array($scannername));
  68. if($adb->num_rows($result)) {
  69. $this->scannerid = $adb->query_result($result, 0, 'scannerid');
  70. $this->scannername= $adb->query_result($result, 0, 'scannername');
  71. $this->server = $adb->query_result($result, 0, 'server');
  72. $this->protocol = $adb->query_result($result, 0, 'protocol');
  73. $this->username = $adb->query_result($result, 0, 'username');
  74. $this->password = $adb->query_result($result, 0, 'password');
  75. $this->password = $this->__crypt($this->password, false);
  76. $this->ssltype = $adb->query_result($result, 0, 'ssltype');
  77. $this->sslmethod = $adb->query_result($result, 0, 'sslmethod');
  78. $this->connecturl = $adb->query_result($result, 0, 'connecturl');
  79. $this->searchfor = $adb->query_result($result, 0, 'searchfor');
  80. $this->markas = $adb->query_result($result, 0, 'markas');
  81. $this->isvalid = $adb->query_result($result, 0, 'isvalid');
  82. $this->initializeFolderInfo();
  83. $this->initializeRules();
  84. }
  85. }
  86. /**
  87. * Initialize the folder details
  88. */
  89. function initializeFolderInfo() {
  90. global $adb;
  91. if($this->scannerid) {
  92. $this->lastscan = Array();
  93. $this->rescan = Array();
  94. $lastscanres = $adb->pquery("SELECT * FROM vtiger_mailscanner_folders WHERE scannerid=?",Array($this->scannerid));
  95. $lastscancount = $adb->num_rows($lastscanres);
  96. if($lastscancount) {
  97. for($lsindex = 0; $lsindex < $lastscancount; ++$lsindex) {
  98. $folder = $adb->query_result($lastscanres, $lsindex, 'foldername');
  99. $scannedon =$adb->query_result($lastscanres, $lsindex, 'lastscan');
  100. $nextrescan =$adb->query_result($lastscanres, $lsindex, 'rescan');
  101. $this->lastscan[$folder] = $scannedon;
  102. $this->rescan[$folder] = ($nextrescan == 0)? false : true;
  103. }
  104. }
  105. }
  106. }
  107. /**
  108. * Delete lastscan details with this scanner
  109. */
  110. function clearLastscan() {
  111. global $adb;
  112. $adb->pquery("DELETE FROM vtiger_mailscanner_folders WHERE scannerid=?", Array($this->scannerid));
  113. $this->lastscan = false;
  114. }
  115. /**
  116. * Update rescan flag on all folders
  117. */
  118. function updateAllFolderRescan($rescanFlag=false) {
  119. global $adb;
  120. $useRescanFlag = $rescanFlag? 1 : 0;
  121. $adb->pquery("UPDATE vtiger_mailscanner_folders set rescan=? WHERE scannerid=?",
  122. Array($rescanFlag, $this->scannerid));
  123. if($this->rescan) {
  124. foreach($this->rescan as $folderName=>$oldRescanFlag) {
  125. $this->rescan[$folderName] = $rescanFlag;
  126. }
  127. }
  128. }
  129. /**
  130. * Update lastscan information on folder (or set for rescan next)
  131. */
  132. function updateLastscan($folderName, $rescanFolder=false) {
  133. global $adb;
  134. $scannedOn = date('d-M-Y');
  135. $needRescan = $rescanFolder? 1 : 0;
  136. $folderInfo = $adb->pquery("SELECT folderid FROM vtiger_mailscanner_folders WHERE scannerid=? AND foldername=?",
  137. Array($this->scannerid, $folderName));
  138. if($adb->num_rows($folderInfo)) {
  139. $folderid = $adb->query_result($folderInfo, 0, 'folderid');
  140. $adb->pquery("UPDATE vtiger_mailscanner_folders SET lastscan=?, rescan=? WHERE folderid=?",
  141. Array($scannedOn, $needRescan, $folderid));
  142. } else {
  143. $enabledForScan = 1; // Enable folder for scan by default
  144. $adb->pquery("INSERT INTO vtiger_mailscanner_folders(scannerid, foldername, lastscan, rescan, enabled)
  145. VALUES(?,?,?,?,?)", Array($this->scannerid, $folderName, $scannedOn, $needRescan, $enabledForScan));
  146. }
  147. if(!$this->lastscan) $this->lastscan = Array();
  148. $this->lastscan[$folderName] = $scannedOn;
  149. if(!$this->rescan) $this->rescan = Array();
  150. $this->rescan[$folderName] = $needRescan;
  151. }
  152. /**
  153. * Get lastscan of the folder.
  154. */
  155. function getLastscan($folderName) {
  156. if($this->lastscan) return $this->lastscan[$folderName];
  157. else return false;
  158. }
  159. /**
  160. * Does the folder need message rescan?
  161. */
  162. function needRescan($folderName) {
  163. if($this->rescan && isset($this->rescan[$folderName])) {
  164. return $this->rescan[$folderName];
  165. }
  166. // TODO Pick details of rescan flag of folder from database?
  167. return false;
  168. }
  169. /**
  170. * Check if rescan is required atleast on a folder?
  171. */
  172. function checkRescan() {
  173. $rescanRequired = false;
  174. if($this->rescan) {
  175. foreach($this->rescan as $folderName=>$rescan) {
  176. if($rescan) {
  177. $rescanRequired = $folderName;
  178. break;
  179. }
  180. }
  181. }
  182. return $rescanRequired;
  183. }
  184. /**
  185. * Get the folder information that has been scanned
  186. */
  187. function getFolderInfo() {
  188. $folderinfo = false;
  189. if($this->scannerid) {
  190. global $adb;
  191. $fldres = $adb->pquery("SELECT * FROM vtiger_mailscanner_folders WHERE scannerid=?", Array($this->scannerid));
  192. $fldcount = $adb->num_rows($fldres);
  193. if($fldcount) {
  194. $folderinfo = Array();
  195. for($index = 0; $index < $fldcount; ++$index) {
  196. $foldername = $adb->query_result($fldres, $index, 'foldername');
  197. $folderid = $adb->query_result($fldres, $index, 'folderid');
  198. $lastscan = $adb->query_result($fldres, $index, 'lastscan');
  199. $rescan = $adb->query_result($fldres, $index, 'rescan');
  200. $enabled = $adb->query_result($fldres, $index, 'enabled');
  201. $folderinfo[$foldername] = Array ('folderid'=>$folderid, 'lastscan'=>$lastscan, 'rescan'=> $rescan, 'enabled'=>$enabled);
  202. }
  203. }
  204. }
  205. return $folderinfo;
  206. }
  207. /**
  208. * Update the folder information with given folder names
  209. */
  210. function updateFolderInfo($foldernames, $rescanFolder=false) {
  211. if($this->scannerid && !empty($foldernames)) {
  212. global $adb;
  213. $qmarks = Array();
  214. foreach($foldernames as $foldername) {
  215. $qmarks[] = '?';
  216. $this->updateLastscan($foldername, $rescanFolder);
  217. }
  218. // Delete the folder that is no longer present
  219. $adb->pquery("DELETE FROM vtiger_mailscanner_folders WHERE scannerid=? AND foldername NOT IN
  220. (". implode(',', $qmarks) . ")", Array($this->scannerid, $foldernames));
  221. }
  222. }
  223. /**
  224. * Enable only given folders for scanning
  225. */
  226. function enableFoldersForScan($folderinfo) {
  227. if($this->scannerid) {
  228. global $adb;
  229. $adb->pquery("UPDATE vtiger_mailscanner_folders set enabled=0 WHERE scannerid=?", Array($this->scannerid));
  230. foreach($folderinfo as $foldername=>$foldervalue) {
  231. $folderid = $foldervalue[folderid];
  232. $enabled = $foldervalue[enabled];
  233. $adb->pquery("UPDATE vtiger_mailscanner_folders set enabled=? WHERE folderid=? AND scannerid=?",
  234. Array($enabled,$folderid,$this->scannerid));
  235. }
  236. }
  237. }
  238. /**
  239. * Initialize scanner rule information
  240. */
  241. function initializeRules() {
  242. global $adb;
  243. if($this->scannerid) {
  244. $this->rules = Array();
  245. $rulesres = $adb->pquery("SELECT * FROM vtiger_mailscanner_rules WHERE scannerid=? ORDER BY sequence",Array($this->scannerid));
  246. $rulescount = $adb->num_rows($rulesres);
  247. if($rulescount) {
  248. for($index = 0; $index < $rulescount; ++$index) {
  249. $ruleid = $adb->query_result($rulesres, $index, 'ruleid');
  250. $scannerrule = new Vtiger_MailScannerRule($ruleid);
  251. $scannerrule->debug = $this->debug;
  252. $this->rules[] = $scannerrule;
  253. }
  254. }
  255. }
  256. }
  257. /**
  258. * Get scanner information as map
  259. */
  260. function getAsMap() {
  261. $infomap = Array();
  262. $keys = Array('scannerid', 'scannername', 'server', 'protocol', 'username', 'password', 'ssltype',
  263. 'sslmethod', 'connecturl', 'searchfor', 'markas', 'isvalid', 'rules');
  264. foreach($keys as $key) {
  265. $infomap[$key] = $this->$key;
  266. }
  267. $infomap['requireRescan'] = $this->checkRescan();
  268. return $infomap;
  269. }
  270. /**
  271. * Compare this instance with give instance
  272. */
  273. function compare($otherInstance) {
  274. $checkkeys = Array('server', 'scannername', 'protocol', 'username', 'password', 'ssltype', 'sslmethod', 'searchfor', 'markas',);
  275. foreach($checkkeys as $key) {
  276. if($this->$key != $otherInstance->$key) return false;
  277. }
  278. return true;
  279. }
  280. /**
  281. * Create/Update the scanner information in database
  282. */
  283. function update($otherInstance) {
  284. $mailServerChanged = false;
  285. // Is there is change in server setup?
  286. if($this->server != $otherInstance->server || $this->username != $otherInstance->username) {
  287. $mailServerChanged = true;
  288. $this->clearLastscan();
  289. // TODO How to handle lastscan info if server settings switches back in future?
  290. }
  291. $this->server = $otherInstance->server;
  292. $this->scannername= $otherInstance->scannername;
  293. $this->protocol = $otherInstance->protocol;
  294. $this->username = $otherInstance->username;
  295. $this->password = $otherInstance->password;
  296. $this->ssltype = $otherInstance->ssltype;
  297. $this->sslmethod = $otherInstance->sslmethod;
  298. $this->connecturl= $otherInstance->connecturl;
  299. $this->searchfor = $otherInstance->searchfor;
  300. $this->markas = $otherInstance->markas;
  301. $this->isvalid = $otherInstance->isvalid;
  302. $useisvalid = ($this->isvalid)? 1 : 0;
  303. $usepassword = $this->__crypt($this->password);
  304. global $adb;
  305. if($this->scannerid) { // This record exists in the database
  306. $adb->pquery("UPDATE vtiger_mailscanner SET scannername=?,server=?,protocol=?,username=?,password=?,ssltype=?,
  307. sslmethod=?,connecturl=?,searchfor=?,markas=?,isvalid=? WHERE scannerid=?",
  308. Array($this->scannername,$this->server,$this->protocol, $this->username, $usepassword, $this->ssltype,
  309. $this->sslmethod, $this->connecturl,$this->searchfor, $this->markas,$useisvalid, $this->scannerid));
  310. } else {
  311. $adb->pquery("INSERT INTO vtiger_mailscanner(scannername,server,protocol,username,password,ssltype,
  312. sslmethod,connecturl,searchfor,markas,isvalid) VALUES(?,?,?,?,?,?,?,?,?,?,?)",
  313. Array($this->scannername,$this->server, $this->protocol, $this->username, $usepassword,
  314. $this->ssltype, $this->sslmethod, $this->connecturl, $this->searchfor, $this->markas, $useisvalid));
  315. $this->scannerid = $adb->database->Insert_ID();
  316. }
  317. return $mailServerChanged;
  318. }
  319. /**
  320. * Delete the scanner information from database
  321. */
  322. function delete() {
  323. global $adb;
  324. // Delete dependencies
  325. if(!empty($this->rules)) {
  326. foreach($this->rules as $rule) {
  327. $rule->delete();
  328. }
  329. }
  330. if($this->scannerid) {
  331. $tables = Array(
  332. 'vtiger_mailscanner',
  333. 'vtiger_mailscanner_ids',
  334. 'vtiger_mailscanner_folders'
  335. );
  336. foreach($tables as $table) {
  337. $adb->pquery("DELETE FROM $table WHERE scannerid=?", Array($this->scannerid));
  338. }
  339. $adb->pquery("DELETE FROM vtiger_mailscanner_ruleactions
  340. WHERE actionid in (SELECT actionid FROM vtiger_mailscanner_actions WHERE scannerid=?)", Array($this->scannerid));
  341. $adb->pquery("DELETE FROM vtiger_mailscanner_actions WHERE scannerid=?", Array($this->scannerid));
  342. }
  343. }
  344. /**
  345. * List all the mail-scanners configured.
  346. */
  347. static function listAll() {
  348. $scanners = array();
  349. global $adb;
  350. $result = $adb->pquery("SELECT scannername FROM vtiger_mailscanner", array());
  351. if($result && $adb->num_rows($result)) {
  352. while($resultrow = $adb->fetch_array($result)) {
  353. $scanners[] = new self( decode_html($resultrow['scannername'] ));
  354. }
  355. }
  356. return $scanners;
  357. }
  358. }
  359. ?>