Commit | Line | Data |
---|---|---|
dd8de1ec PH |
1 | <?php |
2 | /******************************************************************************** | |
3 | * include/emails.inc.php : Gestion of the email Pool of the User | |
4 | * ---------------------- | |
5 | * | |
6 | * This file is part of the philter distribution | |
7 | * Copyright: See COPYING files that comes with this distribution | |
8 | ********************************************************************************/ | |
9 | ||
10 | /** sorting function to compare to Email objects. | |
11 | * I wanted to use it as Email::cmp but the fonction uasort didn't seem to accept such a name as argument | |
12 | * @param $m1 the first Email object | |
13 | * @param $m2 the second Email object | |
14 | * @return -1,0,1 whether $m1 <,==,> $m2 | |
15 | */ | |
16 | function email_cmp($m1,$m2) { | |
17 | return strcmp($m1->email,$m2->email); | |
18 | } | |
19 | ||
20 | class Email { | |
21 | /** email */ | |
22 | var $email; | |
23 | /** flags */ | |
24 | var $flags; | |
25 | ||
26 | /** constructor. | |
27 | * @param $_email the email string | |
28 | * @param $_flags the flags | |
29 | */ | |
30 | function Email($_email, $_flags) { | |
31 | $this->email = $_email; | |
32 | $this->flags = $_flags; | |
33 | } | |
34 | ||
35 | /** checks if the given string is a valid email. | |
36 | * @param $_string the string to check | |
37 | * @return true if the string is a valid email, false else | |
38 | */ | |
39 | function Check($_string) { | |
40 | return preg_match("/^[\w\-.]+(\+[\w\-.]+)?@[\w\-.]+\.[a-zA-Z]{2,44}$/", $_string); | |
41 | } | |
42 | ||
43 | /** returns if the email is active or not. | |
44 | * @return true if $this->flags contains active | |
45 | */ | |
46 | function is_active() { | |
47 | return (stristr($this->flags, 'active')!==false); | |
48 | } | |
49 | ||
50 | /** toggle the state of a flag. | |
51 | * @param $_flag the flag to toggle | |
52 | * @return void | |
53 | */ | |
54 | function toggle_flag($_flag) { | |
55 | $flags = explode(",", $this->flags); | |
56 | $key = array_search($_flag,$flags); | |
57 | if($key===false) | |
58 | $flags[]=$_flag; | |
59 | else | |
60 | unset($flags[$key]); | |
61 | ||
62 | $this->flags = implode(",",$flags); | |
63 | } | |
64 | ||
65 | /** add the email in the database. | |
66 | * @param $_uid the uid of the user | |
67 | * @param $_mid the id of the mail into the user mail list | |
68 | * @return void | |
69 | */ | |
70 | function commit($_uid,$_mid) { | |
71 | mysql_query("REPLACE INTO emails " | |
72 | ."SET uid='{$_uid}',mid='$_mid',email='{$this->email}',flags='{$this->flags}'"); | |
73 | } | |
74 | } | |
75 | ||
76 | class EmailPool { | |
77 | /** emails list */ | |
78 | var $emails; | |
79 | /** uid */ | |
80 | var $uid; | |
81 | ||
82 | /** constructor | |
83 | * @param $_uid id of the user | |
84 | */ | |
85 | function EmailPool($_uid) { | |
86 | global $philter; | |
87 | $this->uid = $_uid; | |
88 | $this->emails = array(); | |
89 | ||
90 | $sql = mysql_query("SELECT * FROM emails WHERE uid='$_uid' ORDER BY email"); | |
91 | while($res = mysql_fetch_assoc($sql)) { | |
92 | $this->emails[$res['mid']] = new Email($res['email'], $res['flags']); | |
93 | } | |
94 | } | |
95 | ||
96 | /** create the part of the form for the mail pool. | |
97 | * @return the string containing the form | |
98 | */ | |
99 | function to_form() { | |
100 | $res = "<form action=\"{$_SERVER['REQUEST_URI']}\" method=\"post\">\n" | |
101 | . "<table class=\"bicol\" width=\"100%\">\n"; | |
102 | ||
103 | $pair = true; | |
104 | foreach($this->emails as $id => $email) { | |
105 | $res .= "<tr class=\"".($pair?"pair":"impair")."\"><td>\n" | |
106 | . " <input type=\"checkbox\" name=\"emails[$id][active]\"" | |
107 | . ($email->is_active() ? " checked=\"checked\"" : "")." /> ".$email->email."\n" | |
108 | . "</td><td><input type=\"submit\" name=\"emails[$id][del]\" value=\"Del\" /></td>\n" | |
109 | . "</tr>\n"; | |
110 | $pair = !$pair; | |
111 | } | |
112 | ||
113 | $res .= "<tr><td colspan=\"2\">\n" | |
114 | . " <input type=\"submit\" name=\"emails[apply]\" value=\"Apply changes\" /></td>\n" | |
115 | . "</tr>\n"; | |
116 | ||
117 | $val = 'your email ...'; | |
118 | $res .= "<tr><td colspan=\"2\">\n" | |
119 | . " <input type=\"text\" name=\"emails[new]\" size=\"60\" value='$val' " | |
120 | . "onfocus=\"text_onfocus(this,'$val')\" onblur=\"text_onblur(this,'$val')\" />\n" | |
121 | . " <input type=\"submit\" name=\"emails[add]\" value=\"Add\" /></td>\n" | |
122 | . "</td></tr>\n"; | |
123 | ||
124 | $res .= "</table>\n</form>\n"; | |
125 | ||
126 | return $res; | |
127 | } | |
128 | ||
129 | /** return the string containing the list of $this->emails in javascript. | |
130 | * @return the JS code | |
131 | */ | |
132 | function to_js() { | |
133 | $res = ""; | |
134 | foreach($this->emails as $id=>$mail) | |
135 | $res .= "mail_pool[$id] = '{$mail->email}';\n"; | |
136 | ||
137 | return $res; | |
138 | } | |
139 | ||
140 | /** compute a new free id for a new mail. | |
141 | * @return the new free id | |
142 | */ | |
143 | function new_mail_id() { | |
144 | $i=0; | |
145 | while(array_key_exists($i,$this->emails)) | |
146 | $i++; | |
147 | return $i; | |
148 | } | |
149 | ||
150 | /** handle the data from the form | |
151 | * @return true if all is ok, false and sets $philter->error() else | |
152 | */ | |
153 | function handle_form() { | |
154 | global $philter; | |
155 | ||
156 | if(isset($_POST['emails']['add'])) { // add an email to the pool | |
157 | if(Email::Check($_POST['emails']['new'])) { | |
158 | $new_mail = strtolower($_POST['emails']['new']); | |
159 | ||
160 | // we check that the email is not already there | |
161 | foreach($this->emails as $id=>$key) | |
162 | if($key->email == $new_mail) { | |
163 | $philter->set_error("$new_mail is already in the Email Pool"); | |
164 | return false; | |
165 | } | |
166 | ||
167 | // then we compute one free id, and we add it to the list | |
168 | $mid = $this->new_mail_id(); | |
169 | $this->emails[$mid] = new Email($new_mail, 'active'); | |
170 | $this->emails[$mid]->commit($this->uid, $mid); | |
171 | uasort($this->emails, "email_cmp"); | |
172 | } else { | |
173 | $philter->set_error($_POST['emails']['new']." is not a valid email"); | |
174 | return false; | |
175 | } | |
176 | } elseif(isset($_POST['emails']['apply'])) { // apply actives changes | |
177 | $one_active = false; | |
178 | foreach($this->emails as $id=>$mail) | |
179 | if(isset($_POST['emails'][$id]['active'])) { | |
180 | $one_active = true; | |
181 | break; | |
182 | } | |
183 | ||
184 | if(!$one_active) { | |
185 | $philter->set_error("you must have at least one active email !"); | |
186 | return false; | |
187 | } | |
188 | ||
189 | foreach($this->emails as $id=>$key) | |
190 | if(isset($_POST['emails'][$id]['active']) xor $this->emails[$id]->is_active()) { | |
191 | $this->emails[$id]->toggle_flag('active'); | |
192 | $this->emails[$id]->commit($this->uid, $id); | |
193 | } | |
194 | } else { // delete one email | |
195 | // we compute a list of all actives emails | |
196 | $actives = array(); | |
197 | foreach($this->emails as $id=>$mail) | |
198 | if($mail->is_active()) | |
199 | $actives[$id] = true; | |
200 | ||
201 | foreach($this->emails as $id=>$key) | |
202 | if(isset($_POST['emails'][$id]['del'])) { | |
203 | if(count($this->emails)>0 && (count($actives)>1 || empty($actives[$id]))) { | |
204 | list($count) = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM actions " | |
205 | ."WHERE uid='{$this->uid}' AND pid='" | |
206 | .FwdPlugin::rtti()."' AND data='$id'")); | |
207 | if($count) { | |
208 | $philter->set_error("This email is still in use and can't be deleted !"); | |
209 | return false; | |
210 | } else { | |
211 | mysql_query("DELETE FROM emails WHERE uid='{$this->uid}' " | |
212 | ."AND email='{$this->emails[$id]->email}'"); | |
213 | unset($this->emails[$id]); | |
214 | unset($actives[$id]); | |
215 | } | |
216 | } else { | |
217 | $philter->set_error("you must have at least one active email !"); | |
218 | return false; | |
219 | } | |
220 | } | |
221 | } | |
222 | return true; | |
223 | } | |
224 | } | |
225 | ||
226 | /******************************************************************************** | |
227 | * $Id$ | |
228 | * vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 textwidth=100: | |
229 | ********************************************************************************/ | |
230 | ?> |