PageRenderTime 44ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/Settings/MailConverter/handlers/MailScannerInfo.php

https://bitbucket.org/thomashii/vtigercrm-6-for-postgresql
PHP | 414 lines | 283 code | 39 blank | 92 comment | 44 complexity | a4d3e682006cfafe70d08adb325e683e MD5 | raw file
Possible License(s): Apache-2.0, LGPL-3.0, LGPL-2.1, GPL-2.0, GPL-3.0
  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/MailConverter/handlers/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. // server timezone
  39. var $timezone = false;
  40. // is the scannered enabled?
  41. var $isvalid = false;
  42. // Last scan on the folders.
  43. var $lastscan = false;
  44. // Need rescan on the folders?
  45. var $rescan = false;
  46. // Rules associated with this mail scanner
  47. var $rules = false;
  48. /**
  49. * Constructor
  50. */
  51. function __construct($scannername, $initialize=true) {
  52. if($initialize && $scannername) $this->initialize($scannername);
  53. }
  54. /**
  55. * Encrypt/Decrypt input.
  56. * @access private
  57. */
  58. function __crypt($password, $encrypt=true) {
  59. require_once('include/utils/encryption.php');
  60. $cryptobj = new Encryption();
  61. if($encrypt) return $cryptobj->encrypt(trim($password));
  62. else return $cryptobj->decrypt(trim($password));
  63. }
  64. /**
  65. * Initialize this instance.
  66. */
  67. function initialize($scannername) {
  68. global $adb;
  69. $result = $adb->pquery("SELECT * FROM vtiger_mailscanner WHERE scannername=?", Array($scannername));
  70. if($adb->num_rows($result)) {
  71. $this->scannerid = $adb->query_result($result, 0, 'scannerid');
  72. $this->scannername= $adb->query_result($result, 0, 'scannername');
  73. $this->server = $adb->query_result($result, 0, 'server');
  74. $this->protocol = $adb->query_result($result, 0, 'protocol');
  75. $this->username = $adb->query_result($result, 0, 'username');
  76. $this->password = $adb->query_result($result, 0, 'password');
  77. $this->password = $this->__crypt($this->password, false);
  78. $this->ssltype = $adb->query_result($result, 0, 'ssltype');
  79. $this->sslmethod = $adb->query_result($result, 0, 'sslmethod');
  80. $this->connecturl = $adb->query_result($result, 0, 'connecturl');
  81. $this->searchfor = $adb->query_result($result, 0, 'searchfor');
  82. $this->markas = $adb->query_result($result, 0, 'markas');
  83. $this->isvalid = $adb->query_result($result, 0, 'isvalid');
  84. $this->timezone = $adb->query_result($result, 0, 'timezone');
  85. $this->initializeFolderInfo();
  86. $this->initializeRules();
  87. }
  88. }
  89. /**
  90. * Initialize the folder details
  91. */
  92. function initializeFolderInfo() {
  93. global $adb;
  94. if($this->scannerid) {
  95. $this->lastscan = Array();
  96. $this->rescan = Array();
  97. $lastscanres = $adb->pquery("SELECT * FROM vtiger_mailscanner_folders WHERE scannerid=?",Array($this->scannerid));
  98. $lastscancount = $adb->num_rows($lastscanres);
  99. if($lastscancount) {
  100. for($lsindex = 0; $lsindex < $lastscancount; ++$lsindex) {
  101. $folder = $adb->query_result($lastscanres, $lsindex, 'foldername');
  102. $scannedon =$adb->query_result($lastscanres, $lsindex, 'lastscan');
  103. $nextrescan =$adb->query_result($lastscanres, $lsindex, 'rescan');
  104. $this->lastscan[$folder] = $scannedon;
  105. $this->rescan[$folder] = ($nextrescan == 0)? false : true;
  106. }
  107. }
  108. }
  109. }
  110. /**
  111. * Delete lastscan details with this scanner
  112. */
  113. function clearLastscan() {
  114. global $adb;
  115. $adb->pquery("DELETE FROM vtiger_mailscanner_folders WHERE scannerid=?", Array($this->scannerid));
  116. $this->lastscan = false;
  117. }
  118. /**
  119. * Update rescan flag on all folders
  120. */
  121. function updateAllFolderRescan($rescanFlag=false) {
  122. global $adb;
  123. $useRescanFlag = $rescanFlag? 1 : 0;
  124. $adb->pquery("UPDATE vtiger_mailscanner_folders set rescan=? WHERE scannerid=?",
  125. Array($rescanFlag, $this->scannerid));
  126. if($this->rescan) {
  127. foreach($this->rescan as $folderName=>$oldRescanFlag) {
  128. $this->rescan[$folderName] = $rescanFlag;
  129. }
  130. }
  131. }
  132. function dateBasedOnMailServerTimezone($format='d-M-Y') {
  133. $returnDate = NULL;
  134. if (!empty($this->timezone)) {
  135. $currentTZ = date_default_timezone_get();
  136. list ($tzhours, $tzminutes) = explode(':', trim($this->timezone));
  137. $returnDate = date($format, strtotime(sprintf("%s hours %s minutes", $tzhours, $tzminutes)));
  138. date_default_timezone_set($currentTZ);
  139. } else {
  140. // Search email one-day before to overcome timezone differences.
  141. $returnDate = date($format, strtotime("-1 day"));
  142. }
  143. return $returnDate;
  144. }
  145. /**
  146. * Update lastscan information on folder (or set for rescan next)
  147. */
  148. function updateLastscan($folderName, $rescanFolder=false, $enabledForScan=1) {
  149. global $adb;
  150. $scannedOn = $this->dateBasedOnMailServerTimezone('d-M-Y');
  151. $needRescan = $rescanFolder? 1 : 0;
  152. $folderInfo = $adb->pquery("SELECT folderid FROM vtiger_mailscanner_folders WHERE scannerid=? AND foldername=?",
  153. Array($this->scannerid, $folderName));
  154. if($adb->num_rows($folderInfo)) {
  155. $folderid = $adb->query_result($folderInfo, 0, 'folderid');
  156. $adb->pquery("UPDATE vtiger_mailscanner_folders SET lastscan=?, rescan=? WHERE folderid=?",
  157. Array($scannedOn, $needRescan, $folderid));
  158. } else {
  159. $adb->pquery("INSERT INTO vtiger_mailscanner_folders(scannerid, foldername, lastscan, rescan, enabled)
  160. VALUES(?,?,?,?,?)", Array($this->scannerid, $folderName, $scannedOn, $needRescan, $enabledForScan));
  161. }
  162. if(!$this->lastscan) $this->lastscan = Array();
  163. $this->lastscan[$folderName] = $scannedOn;
  164. if(!$this->rescan) $this->rescan = Array();
  165. $this->rescan[$folderName] = $needRescan;
  166. }
  167. /**
  168. * Get lastscan of the folder.
  169. */
  170. function getLastscan($folderName) {
  171. if($this->lastscan) return $this->lastscan[$folderName];
  172. else return false;
  173. }
  174. /**
  175. * Does the folder need message rescan?
  176. */
  177. function needRescan($folderName) {
  178. if($this->rescan && isset($this->rescan[$folderName])) {
  179. return $this->rescan[$folderName];
  180. }
  181. // TODO Pick details of rescan flag of folder from database?
  182. return false;
  183. }
  184. /**
  185. * Check if rescan is required atleast on a folder?
  186. */
  187. function checkRescan() {
  188. $rescanRequired = false;
  189. if($this->rescan) {
  190. foreach($this->rescan as $folderName=>$rescan) {
  191. if($rescan) {
  192. $rescanRequired = $folderName;
  193. break;
  194. }
  195. }
  196. }
  197. return $rescanRequired;
  198. }
  199. /**
  200. * Get the folder information that has been scanned
  201. */
  202. function getFolderInfo() {
  203. $folderinfo = false;
  204. if($this->scannerid) {
  205. global $adb;
  206. $fldres = $adb->pquery("SELECT * FROM vtiger_mailscanner_folders WHERE scannerid=?", Array($this->scannerid));
  207. $fldcount = $adb->num_rows($fldres);
  208. if($fldcount) {
  209. $folderinfo = Array();
  210. for($index = 0; $index < $fldcount; ++$index) {
  211. $foldername = $adb->query_result($fldres, $index, 'foldername');
  212. $folderid = $adb->query_result($fldres, $index, 'folderid');
  213. $lastscan = $adb->query_result($fldres, $index, 'lastscan');
  214. $rescan = $adb->query_result($fldres, $index, 'rescan');
  215. $enabled = $adb->query_result($fldres, $index, 'enabled');
  216. $folderinfo[$foldername] = Array ('folderid'=>$folderid, 'lastscan'=>$lastscan, 'rescan'=> $rescan, 'enabled'=>$enabled);
  217. }
  218. }
  219. }
  220. return $folderinfo;
  221. }
  222. /**
  223. * Update the folder information with given folder names
  224. */
  225. function updateFolderInfo($foldernames, $rescanFolder=false) {
  226. if($this->scannerid && !empty($foldernames)) {
  227. global $adb;
  228. $qmarks = Array();
  229. foreach($foldernames as $foldername) {
  230. $qmarks[] = '?';
  231. $this->updateLastscan($foldername, $rescanFolder);
  232. }
  233. // Delete the folder that is no longer present
  234. $adb->pquery("DELETE FROM vtiger_mailscanner_folders WHERE scannerid=? AND foldername NOT IN
  235. (". implode(',', $qmarks) . ")", Array($this->scannerid, $foldernames));
  236. }
  237. }
  238. /**
  239. * Enable only given folders for scanning
  240. */
  241. function enableFoldersForScan($folderinfo) {
  242. if($this->scannerid) {
  243. global $adb;
  244. $adb->pquery("UPDATE vtiger_mailscanner_folders set enabled=0 WHERE scannerid=?", Array($this->scannerid));
  245. foreach($folderinfo as $foldername=>$foldervalue) {
  246. $folderid = $foldervalue[folderid];
  247. $enabled = $foldervalue[enabled];
  248. $adb->pquery("UPDATE vtiger_mailscanner_folders set enabled=? WHERE folderid=? AND scannerid=?",
  249. Array($enabled,$folderid,$this->scannerid));
  250. }
  251. }
  252. }
  253. /**
  254. * Initialize scanner rule information
  255. */
  256. function initializeRules() {
  257. global $adb;
  258. if($this->scannerid) {
  259. $this->rules = Array();
  260. $rulesres = $adb->pquery("SELECT * FROM vtiger_mailscanner_rules WHERE scannerid=? ORDER BY sequence",Array($this->scannerid));
  261. $rulescount = $adb->num_rows($rulesres);
  262. if($rulescount) {
  263. for($index = 0; $index < $rulescount; ++$index) {
  264. $ruleid = $adb->query_result($rulesres, $index, 'ruleid');
  265. $scannerrule = new Vtiger_MailScannerRule($ruleid);
  266. $scannerrule->debug = $this->debug;
  267. $this->rules[] = $scannerrule;
  268. }
  269. }
  270. }
  271. }
  272. /**
  273. * Get scanner information as map
  274. */
  275. function getAsMap() {
  276. $infomap = Array();
  277. $keys = Array('scannerid', 'scannername', 'server', 'protocol', 'username', 'password', 'ssltype',
  278. 'sslmethod', 'connecturl', 'searchfor', 'markas', 'isvalid', 'timezone', 'rules');
  279. foreach($keys as $key) {
  280. $infomap[$key] = $this->$key;
  281. }
  282. $infomap['requireRescan'] = $this->checkRescan();
  283. return $infomap;
  284. }
  285. /**
  286. * Compare this instance with give instance
  287. */
  288. function compare($otherInstance) {
  289. $checkkeys = Array('server', 'scannername', 'protocol', 'username', 'password', 'ssltype', 'sslmethod', 'searchfor', 'markas');
  290. foreach($checkkeys as $key) {
  291. if($this->$key != $otherInstance->$key) return false;
  292. }
  293. return true;
  294. }
  295. /**
  296. * Create/Update the scanner information in database
  297. */
  298. function update($otherInstance) {
  299. $mailServerChanged = false;
  300. // Is there is change in server setup?
  301. if($this->server != $otherInstance->server || $this->username != $otherInstance->username) {
  302. $mailServerChanged = true;
  303. $this->clearLastscan();
  304. // TODO How to handle lastscan info if server settings switches back in future?
  305. }
  306. $this->server = $otherInstance->server;
  307. $this->scannername= $otherInstance->scannername;
  308. $this->protocol = $otherInstance->protocol;
  309. $this->username = $otherInstance->username;
  310. $this->password = $otherInstance->password;
  311. $this->ssltype = $otherInstance->ssltype;
  312. $this->sslmethod = $otherInstance->sslmethod;
  313. $this->connecturl= $otherInstance->connecturl;
  314. $this->searchfor = $otherInstance->searchfor;
  315. $this->markas = $otherInstance->markas;
  316. $this->isvalid = $otherInstance->isvalid;
  317. $this->timezone = $otherInstance->timezone;
  318. $useisvalid = ($this->isvalid)? 1 : 0;
  319. $usepassword = $this->__crypt($this->password);
  320. global $adb;
  321. if($this->scannerid == false) {
  322. $adb->pquery("INSERT INTO vtiger_mailscanner(scannername,server,protocol,username,password,ssltype,
  323. sslmethod,connecturl,searchfor,markas,isvalid,timezone) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)",
  324. Array($this->scannername,$this->server, $this->protocol, $this->username, $usepassword,
  325. $this->ssltype, $this->sslmethod, $this->connecturl, $this->searchfor, $this->markas, $useisvalid, $this->timezone));
  326. $this->scannerid = $adb->database->Insert_ID();
  327. } else { //this record is exist in the data
  328. $adb->pquery("UPDATE vtiger_mailscanner SET scannername=?,server=?,protocol=?,username=?,password=?,ssltype=?,
  329. sslmethod=?,connecturl=?,searchfor=?,markas=?,isvalid=?, timezone=? WHERE scannerid=?",
  330. Array($this->scannername,$this->server,$this->protocol, $this->username, $usepassword, $this->ssltype,
  331. $this->sslmethod, $this->connecturl,$this->searchfor, $this->markas,$useisvalid, $this->timezone, $this->scannerid));
  332. }
  333. return $mailServerChanged;
  334. }
  335. /**
  336. * Delete the scanner information from database
  337. */
  338. function delete() {
  339. global $adb;
  340. // Delete dependencies
  341. if(!empty($this->rules)) {
  342. foreach($this->rules as $rule) {
  343. $rule->delete();
  344. }
  345. }
  346. if($this->scannerid) {
  347. $tables = Array(
  348. 'vtiger_mailscanner',
  349. 'vtiger_mailscanner_ids',
  350. 'vtiger_mailscanner_folders'
  351. );
  352. foreach($tables as $table) {
  353. $adb->pquery("DELETE FROM $table WHERE scannerid=?", Array($this->scannerid));
  354. }
  355. $adb->pquery("DELETE FROM vtiger_mailscanner_ruleactions
  356. WHERE actionid in (SELECT actionid FROM vtiger_mailscanner_actions WHERE scannerid=?)", Array($this->scannerid));
  357. $adb->pquery("DELETE FROM vtiger_mailscanner_actions WHERE scannerid=?", Array($this->scannerid));
  358. }
  359. }
  360. /**
  361. * List all the mail-scanners configured.
  362. */
  363. static function listAll() {
  364. $scanners = array();
  365. global $adb;
  366. $result = $adb->pquery("SELECT scannername FROM vtiger_mailscanner", array());
  367. if($result && $adb->num_rows($result)) {
  368. while($resultrow = $adb->fetch_array($result)) {
  369. $scanners[] = new self( decode_html($resultrow['scannername'] ));
  370. }
  371. }
  372. return $scanners;
  373. }
  374. }
  375. ?>