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() { | |
4956445b | 100 | $res = "<form id=\"emails\" action=\"{$_SERVER['REQUEST_URI']}\" method=\"post\">\n" |
86b5093c | 101 | . "<table class=\"bicol\" cellpadding=\"1\" cellspacing=\"1\" width=\"95%\" align=\"center\">\n" |
6398953d PH |
102 | . "<tr><th>"._i18n('email')."</th>\n" |
103 | . " <th>"._i18n('active')."</th>\n" | |
86b5093c PH |
104 | . " <th> </th>\n" |
105 | . "</tr>\n"; | |
dd8de1ec PH |
106 | |
107 | $pair = true; | |
86b5093c | 108 | |
dd8de1ec | 109 | foreach($this->emails as $id => $email) { |
86b5093c PH |
110 | $res .= "<tr class=\"".($pair?"pair":"impair")."\">\n" |
111 | . "<td>".$email->email."</td>\n" | |
112 | . "<td align=\"center\" width=\"10%\">\n" | |
113 | . " <input type=\"checkbox\" name=\"emails[$id][active]\"" | |
114 | . ($email->is_active() ? " checked=\"checked\"" : "")." /></td>\n" | |
0eb037c8 | 115 | . "<td align=\"center\"><input type=\"button\" " |
6398953d | 116 | . "value=\""._i18n('del')."\" onclick=\"del_onclick($id)\" /></td>\n" |
dd8de1ec PH |
117 | . "</tr>\n"; |
118 | $pair = !$pair; | |
119 | } | |
120 | ||
86b5093c | 121 | $res .= "</table>\n" |
0cff7bb6 | 122 | . "<br /><center>\n" |
0eb037c8 | 123 | . " <input id=\"emailsDel\" type=\"hidden\" name=\"emails[del]\" value=\"-1\" />\n" |
5ae3e923 | 124 | . " <input type=\"submit\" name=\"emails[apply]\" value=\"" |
6398953d | 125 | . _i18n('apply_changes')."\" />\n" |
0cff7bb6 | 126 | . "</center><br />\n" |
86b5093c | 127 | . "</form>\n"; |
01f3d5ec | 128 | |
6398953d | 129 | $val = _i18n('your_email'); |
01f3d5ec PH |
130 | |
131 | $res .= "<form action=\"{$_SERVER['REQUEST_URI']}\" method=\"post\">\n" | |
0cff7bb6 | 132 | . _i18n('pool_help2') |
86b5093c PH |
133 | . "<input type=\"text\" name=\"emails[new]\" size=\"50\" value='$val' " |
134 | . " onfocus=\"text_onfocus(this,'$val')\" onblur=\"text_onblur(this,'$val')\" />\n" | |
5ae3e923 | 135 | . "<input type=\"submit\" name=\"emails[add]\" value=\"". |
6398953d | 136 | _i18n('add')."\" />\n" |
86b5093c | 137 | . "</form>\n"; |
dd8de1ec | 138 | |
dd8de1ec PH |
139 | return $res; |
140 | } | |
141 | ||
142 | /** return the string containing the list of $this->emails in javascript. | |
143 | * @return the JS code | |
144 | */ | |
145 | function to_js() { | |
146 | $res = ""; | |
147 | foreach($this->emails as $id=>$mail) | |
148 | $res .= "mail_pool[$id] = '{$mail->email}';\n"; | |
149 | ||
150 | return $res; | |
151 | } | |
152 | ||
153 | /** compute a new free id for a new mail. | |
154 | * @return the new free id | |
155 | */ | |
156 | function new_mail_id() { | |
157 | $i=0; | |
158 | while(array_key_exists($i,$this->emails)) | |
159 | $i++; | |
160 | return $i; | |
161 | } | |
162 | ||
163 | /** handle the data from the form | |
164 | * @return true if all is ok, false and sets $philter->error() else | |
165 | */ | |
166 | function handle_form() { | |
167 | global $philter; | |
168 | ||
169 | if(isset($_POST['emails']['add'])) { // add an email to the pool | |
170 | if(Email::Check($_POST['emails']['new'])) { | |
171 | $new_mail = strtolower($_POST['emails']['new']); | |
172 | ||
173 | // we check that the email is not already there | |
174 | foreach($this->emails as $id=>$key) | |
175 | if($key->email == $new_mail) { | |
176 | $philter->set_error("$new_mail is already in the Email Pool"); | |
177 | return false; | |
178 | } | |
179 | ||
180 | // then we compute one free id, and we add it to the list | |
181 | $mid = $this->new_mail_id(); | |
182 | $this->emails[$mid] = new Email($new_mail, 'active'); | |
183 | $this->emails[$mid]->commit($this->uid, $mid); | |
184 | uasort($this->emails, "email_cmp"); | |
185 | } else { | |
186 | $philter->set_error($_POST['emails']['new']." is not a valid email"); | |
187 | return false; | |
188 | } | |
0eb037c8 | 189 | } elseif(isset($_POST['emails']['del']) && $_POST['emails']['del'] != -1) { // delete one email |
4956445b PH |
190 | $del_id = $_POST['emails']['del']; |
191 | // we compute a list of all actives emails | |
192 | $allow = false; | |
0eb037c8 PH |
193 | |
194 | foreach($this->emails as $id=>$mail) { | |
195 | if($del_id!=$id && $mail->is_active()) { | |
4956445b | 196 | $allow = true; |
0eb037c8 PH |
197 | break; |
198 | } | |
199 | } | |
4956445b PH |
200 | |
201 | if($allow && isset($this->emails[$del_id])) { | |
202 | list($count) = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM actions " | |
203 | ."WHERE uid='{$this->uid}' AND pid='" | |
204 | .FwdPlugin::rtti()."' AND data='$del_id'")); | |
205 | if($count) { | |
206 | $philter->set_error("This email is still in use and can't be deleted !"); | |
207 | return false; | |
208 | } else { | |
209 | mysql_query("DELETE FROM emails WHERE uid='{$this->uid}' " | |
210 | ."AND email='{$this->emails[$del_id]->email}'"); | |
211 | unset($this->emails[$del_id]); | |
212 | } | |
213 | } else { | |
214 | $philter->set_error("you must have at least one active email !"); | |
215 | return false; | |
216 | } | |
dd8de1ec PH |
217 | } elseif(isset($_POST['emails']['apply'])) { // apply actives changes |
218 | $one_active = false; | |
4956445b | 219 | |
dd8de1ec PH |
220 | foreach($this->emails as $id=>$mail) |
221 | if(isset($_POST['emails'][$id]['active'])) { | |
222 | $one_active = true; | |
223 | break; | |
224 | } | |
225 | ||
226 | if(!$one_active) { | |
227 | $philter->set_error("you must have at least one active email !"); | |
228 | return false; | |
229 | } | |
230 | ||
231 | foreach($this->emails as $id=>$key) | |
232 | if(isset($_POST['emails'][$id]['active']) xor $this->emails[$id]->is_active()) { | |
233 | $this->emails[$id]->toggle_flag('active'); | |
234 | $this->emails[$id]->commit($this->uid, $id); | |
235 | } | |
dd8de1ec | 236 | return true; |
4956445b | 237 | } |
dd8de1ec PH |
238 | } |
239 | } | |
240 | ||
241 | /******************************************************************************** | |
242 | * $Id$ | |
243 | * vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 textwidth=100: | |
244 | ********************************************************************************/ | |
245 | ?> |