summaryrefslogtreecommitdiff
path: root/plugins/markasjunk2/drivers/cmd_learn.php
blob: f27adc1d1f2c947d9a02a1114e8bf1b7ae4be58e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php

/**
 * Command line learn driver
 * @version 2.0
 * @author Philip Weir
 * Patched by Julien Vehent to support DSPAM
 * Enhanced support for DSPAM by Stevan Bajic <stevan@bajic.ch>
 */

class markasjunk2_cmd_learn
{
	public function spam($uids)
	{
		$this->_do_salearn($uids, true);
	}

	public function ham($uids)
	{
		$this->_do_salearn($uids, false);
	}

	private function _do_salearn($uids, $spam)
	{
		$rcmail = rcube::get_instance();
		$temp_dir = realpath($rcmail->config->get('temp_dir'));

		if ($spam)
			$command = $rcmail->config->get('markasjunk2_spam_cmd');
		else
			$command = $rcmail->config->get('markasjunk2_ham_cmd');

		if (!$command)
			return;

		$command = str_replace('%u', $_SESSION['username'], $command);
		$command = str_replace('%l', $rcmail->user->get_username('local'), $command);
		$command = str_replace('%d', $rcmail->user->get_username('domain'), $command);
		if (preg_match('/%i/', $command)) {
			$identity_arr = $rcmail->user->get_identity();
			$command = str_replace('%i', $identity_arr['email'], $command);
		}

		foreach (explode(",", $uids) as $uid) {
			// get DSPAM signature from header (if %xds macro is used)
			if (preg_match('/%xds/', $command)) {
				if (preg_match('/^X\-DSPAM\-Signature:\s+((\d+,)?([a-f\d]+))\s*$/im', $rcmail->storage->get_raw_headers($uid), $dspam_signature))
					$tmp_command = str_replace('%xds', $dspam_signature[1], $command);
				else
					continue; // no DSPAM signature found in headers -> continue with next uid/message
			}

			if (preg_match('/%f/', $command)) {
				$tmpfname = tempnam($temp_dir, 'rcmSALearn');
				file_put_contents($tmpfname, $rcmail->storage->get_raw_body($uid));
				$tmp_command = str_replace('%f', $tmpfname, $command);
			}

			exec($tmp_command, $output);

			if ($rcmail->config->get('markasjunk2_debug')) {
				rcube::write_log('markasjunk2', $tmp_command);
				rcube::write_log('markasjunk2', $output);
			}

			if (preg_match('/%f/', $command))
				unlink($tmpfname);

			$output = '';
		}
	}
}

?>