globals plugins now work, bogoplugin for an example
[old-projects.git] / philter / philter / include / rule.inc.php
CommitLineData
dd8de1ec
PH
1<?php
2/********************************************************************************
3* include/rule.inc.php : The class representing One rule
4* --------------------
5*
6* This file is part of the philter distribution
7* Copyright: See COPYING files that comes with this distribution
8********************************************************************************/
9
10function rule_cmp($r1, $r2) {
11 return ($r1->rank - $r2->rank);
12}
13
14function to_js_str($s) {
15 if((string)((int)($s))==$s)
16 return((int)($s));
17 $s = addslashes(stripslashes($s));
18 $s = str_replace("\r\n", '\n', $s);
19 $s = str_replace("\n", '\n', $s);
20 return "'$s'";
21}
22
23/** this class represents One rule of filtering
24 */
25class Rule {
26 /** rank of the rule */
27 var $rank;
28 /** all the matches that the Rule use */
29 var $matches;
30 /** all the actions that the Rule use */
31 var $actions;
32 /** name of the rule */
33 var $name;
34 /** true if we must stop if the rule matches */
35 var $block;
36 /** true if all matches must match, false if only one is enough */
37 var $all;
38
39 function Rule($_rank,$_flags,$_name) {
40 $this->matches = array();
41 $this->actions = array();
42 $this->rank = $_rank;
43 $this->name = $_name;
44 $this->all = (stristr($_flags,'all')!==false);
45 $this->block = (stristr($_flags,'block')!==false);
46 }
47
48 function sql_get_actions($_uid, $_rid) {
49 global $philter;
50
51 $left_joins = "";
52 foreach($philter->config['action_plugins'] as $plug)
53 $left_joins .= $plug->sql_get();
54
55 $sql = mysql_query("SELECT * FROM actions WHERE actions.uid='$_uid' AND actions.rid='$_rid' ".$left_joins);
56
57 while($t = mysql_fetch_assoc($sql))
58 $this->actions[] = $philter->config['action_plugins'][$t['pid']]->sql_to_data($t);
59 }
60
61 function sql_get_matches($_uid, $_rid) {
62 global $philter;
63
64 $left_joins = "";
65 foreach($philter->config['match_plugins'] as $plug)
66 $left_joins .= $plug->sql_get();
67
68 $sql = mysql_query("SELECT * FROM matches WHERE matches.uid='$_uid' AND matches.rid='$_rid' ".$left_joins);
69
70 while($t = mysql_fetch_assoc($sql))
71 $this->matches[] = $philter->config['match_plugins'][$t['pid']]->sql_to_data($t);
72 }
73
74 function move_to($_new_rank, $_uid, $_rid) {
75 if($this->rank == $_new_rank)
76 return;
77 $this->rank = $_new_rank;
78 mysql_query("UPDATE rules SET rank='$_new_rank' WHERE uid='$_uid' AND rid='$_rid'");
79 }
80
81 function to_string() {
82 return "";
83 }
84
85 function sql_clean($_uid, $_rid) {
86 global $philter;
87
88 mysql_query("DELETE FROM rules WHERE uid='$_uid' AND rid='$_rid'");
89 mysql_query("DELETE FROM actions WHERE uid='$_uid' AND rid='$_rid'");
90 mysql_query("DELETE FROM matches WHERE uid='$_uid' AND rid='$_rid'");
91 foreach($philter->config['action_plugins'] as $plug)
92 $plug->sql_clean($_uid, $_rid);
93 foreach($philter->config['match_plugins'] as $plug)
94 $plug->sql_clean($_uid, $_rid);
95 }
96
97 function sql_store($_uid, $_rid) {
98 global $philter;
99
100 $flags = Array();
101 if($this->all) $flags[] = 'all';
102 if($this->block) $flags[] = 'block';
103 $flags = implode(',',$flags);
104
105 $this->sql_clean($_uid,$_rid);
106
107 mysql_query("INSERT INTO rules SET uid='$_uid',rid='$_rid',rank='{$this->rank}',flags='$flags',name='{$this->name}'");
108
de47756d
PH
109 if($_rid) {
110 foreach($this->matches as $match)
111 $philter->config['match_plugins'][$match[0]]->sql_store($_uid, $_rid, $match);
112
113 foreach($this->actions as $action)
114 $philter->config['action_plugins'][$action[0]]->sql_store($_uid, $_rid, $action);
115 } else
116 foreach($this->matches as $match)
117 $philter->config['global_plugins'][$match[0]]->sql_store($_uid, $_rid, $match);
dd8de1ec
PH
118 }
119
120 function to_js() {
121 $matches = array();
eca2e192 122 ksort($this->matches);
dd8de1ec
PH
123 foreach($this->matches as $data) {
124 $data = array_map('to_js_str', $data);
125 $matches[] = '[' . implode(',', $data) . ']';
126 }
127 $matches = '['.implode(',',$matches).']';
128
129 $actions = array();
130 foreach($this->actions as $data) {
131 $data = array_map('to_js_str', $data);
132 $actions[] = '[' . implode(',', $data) . ']';
133 }
134 $actions = '['.implode(',',$actions).']';
135
136 return "{ all: ".($this->all ? "1" : "0")
137 .", block: ".($this->block ? "1" : "0")
138 .", name: '{$this->name}', matches: ".$matches
139 .", actions: ".$actions." }";
140 }
141}
142
143/********************************************************************************
144* $Id$
145* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 textwidth=100:
146********************************************************************************/
147?>