BOINC /
boinc
| 1 | <?php |
||
| 2 | // This file is part of BOINC. |
||
| 3 | // http://boinc.berkeley.edu |
||
| 4 | // Copyright (C) 2008 University of California |
||
| 5 | // |
||
| 6 | // BOINC is free software; you can redistribute it and/or modify it |
||
| 7 | // under the terms of the GNU Lesser General Public License |
||
| 8 | // as published by the Free Software Foundation, |
||
| 9 | // either version 3 of the License, or (at your option) any later version. |
||
| 10 | // |
||
| 11 | // BOINC is distributed in the hope that it will be useful, |
||
| 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
| 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
||
| 14 | // See the GNU Lesser General Public License for more details. |
||
| 15 | // |
||
| 16 | // You should have received a copy of the GNU Lesser General Public License |
||
| 17 | // along with BOINC. If not, see <http://www.gnu.org/licenses/>. |
||
| 18 | |||
| 19 | // stuff related to "buddy lists" |
||
| 20 | |||
| 21 | require_once("../inc/forum_db.inc"); |
||
| 22 | require_once("../inc/profile.inc"); |
||
| 23 | |||
| 24 | check_get_args(array("target_userid", "userid", "action")); |
||
| 25 | |||
| 26 | text_counter_script(); |
||
| 27 | |||
| 28 | // see if there's already a request, |
||
| 29 | // and whether the notification record is there |
||
| 30 | // |
||
| 31 | function check_pending($user, $destuser) { |
||
| 32 | $friend = BoincFriend::lookup($user->id, $destuser->id); |
||
| 33 | if ($friend) { |
||
| 34 | if ($friend->reciprocated) { |
||
| 35 | error_page(tra("Already friends")); |
||
| 36 | } |
||
| 37 | $notify = BoincNotify::lookup($destuser->id, NOTIFY_FRIEND_REQ, $user->id); |
||
| 38 | if ($notify) { |
||
| 39 | page_head(tra("Request pending")); |
||
| 40 | $t = date_str($friend->create_time); |
||
| 41 | echo tra("You requested friendship with %1 on %2.", $destuser->name,$t) . " |
||
| 42 | <p>" . |
||
| 43 | tra("This request is still pending confirmation."); |
||
| 44 | page_tail(); |
||
| 45 | exit(); |
||
|
0 ignored issues
–
show
|
|||
| 46 | } |
||
| 47 | BoincFriend::delete($user->id, $destuser->id); |
||
| 48 | } |
||
| 49 | } |
||
| 50 | |||
| 51 | function check_ignoring($srcuser, $destuser) { |
||
| 52 | BoincForumPrefs::lookup($destuser); |
||
| 53 | if (is_ignoring($destuser, $srcuser)) { |
||
| 54 | error_page(tra("%1 is not accepting friendship requests from you",$destuser->name)); |
||
| 55 | } |
||
| 56 | } |
||
| 57 | |||
| 58 | // user has clicked "add to friends". Ask them if they really mean it. |
||
| 59 | // |
||
| 60 | function handle_add($user) { |
||
| 61 | $destid = get_int('userid'); |
||
| 62 | if ($destid == $user->id) { |
||
| 63 | error_page(tra("You can't be friends with yourself")); |
||
| 64 | } |
||
| 65 | $destuser = BoincUser::lookup_id($destid); |
||
| 66 | if (!$destuser) error_page("No such user"); |
||
| 67 | |||
| 68 | check_pending($user, $destuser); |
||
| 69 | check_ignoring($user, $destuser); |
||
| 70 | |||
| 71 | page_head(tra("Add friend")); |
||
| 72 | echo " |
||
| 73 | <form method=post action=friend.php> |
||
| 74 | <input type=hidden name=userid value=$destid> |
||
| 75 | <input type=hidden name=action value=add_confirm>" . |
||
| 76 | tra("You have asked to add %1 as a friend. We will notify %1 and will ask him/her to confirm that you are friends.", |
||
| 77 | "<b>".$destuser->name."</b>") ." |
||
| 78 | <p>" . |
||
| 79 | tra("Add an optional message here:") ." |
||
| 80 | <br> |
||
| 81 | ".textarea_with_counter("message", 250, "")." |
||
| 82 | <p> |
||
| 83 | <input class=\"btn btn-primary\" type=submit value=\"".tra("OK")."\"> |
||
| 84 | </form> |
||
| 85 | "; |
||
| 86 | page_tail(); |
||
| 87 | } |
||
| 88 | |||
| 89 | // User really means it. Make DB entry and send notification |
||
| 90 | // |
||
| 91 | function handle_add_confirm($user) { |
||
| 92 | $destid = post_int('userid'); |
||
| 93 | $destuser = BoincUser::lookup_id($destid); |
||
| 94 | if (!$destuser) error_page("No such user"); |
||
| 95 | |||
| 96 | check_pending($user, $destuser); |
||
| 97 | check_ignoring($user, $destuser); |
||
| 98 | |||
| 99 | $msg = post_str('message', true); |
||
| 100 | if ($msg) $msg = sanitize_tags(BoincDb::escape_string($msg)); |
||
| 101 | |||
| 102 | $now = time(); |
||
| 103 | $ret = BoincFriend::replace( |
||
| 104 | "user_src=$user->id, user_dest=$destid, message='$msg', create_time=$now, reciprocated=0" |
||
| 105 | ); |
||
| 106 | if (!$ret) { |
||
| 107 | error_page(tra("Database error")); |
||
| 108 | } |
||
| 109 | $now = time(); |
||
| 110 | $type = NOTIFY_FRIEND_REQ; |
||
| 111 | BoincNotify::replace("userid=$destid, create_time=$now, type=$type, opaque=$user->id"); |
||
| 112 | |||
| 113 | BoincForumPrefs::lookup($destuser); |
||
| 114 | if ($destuser->prefs->pm_notification == 1) { |
||
| 115 | send_friend_request_email($user, $destuser, $msg); |
||
| 116 | } |
||
| 117 | page_head(tra("Friend request sent")); |
||
| 118 | echo tra("We have notified %1 of your request.","<b>".$destuser->name."</b>"); |
||
| 119 | page_tail(); |
||
| 120 | } |
||
| 121 | |||
| 122 | // Show destination user the details of request, ask if they accept |
||
| 123 | // |
||
| 124 | function handle_query($user) { |
||
| 125 | $target_userid = get_int('target_userid', true); |
||
| 126 | if ($target_userid && $target_userid != $user->id) { |
||
| 127 | $target_user = BoincUser::lookup_id($target_userid); |
||
| 128 | page_head(tra("Please log in as %1", $target_user->name)); |
||
| 129 | echo tra("You must log in as %1 to view this friend request", |
||
| 130 | $target_user->name |
||
| 131 | ); |
||
| 132 | page_tail(); |
||
| 133 | exit; |
||
|
0 ignored issues
–
show
|
|||
| 134 | } |
||
| 135 | $srcid = get_int('userid'); |
||
| 136 | $srcuser = BoincUser::lookup_id($srcid); |
||
| 137 | if (!$srcuser) error_page("No such user"); |
||
| 138 | $friend = BoincFriend::lookup($srcid, $user->id); |
||
| 139 | if (!$friend) error_page("Request not found"); |
||
| 140 | page_head(tra("Friend request")); |
||
| 141 | echo time_str($friend->create_time)."<p>\n"; |
||
| 142 | $x = user_links($srcuser, BADGE_HEIGHT_MEDIUM); |
||
| 143 | echo tra("%1 has requested friendship with you.", $x); |
||
| 144 | if (strlen($friend->message)) { |
||
| 145 | echo "<p>".tra("%1 says: %2", $srcuser->name, $friend->message)."</p>"; |
||
| 146 | } |
||
| 147 | echo "<p>"; |
||
| 148 | show_button( |
||
| 149 | "friend.php?action=accept&userid=".$srcid, tra("Accept friendship"), |
||
| 150 | tra("Click accept if %1 is in fact a friend", |
||
| 151 | $srcuser->name) |
||
| 152 | ); |
||
| 153 | echo " "; |
||
| 154 | show_button( |
||
| 155 | "friend.php?action=ignore&userid=".$srcid, tra("Decline"), |
||
| 156 | tra("Click decline if %1 is not a friend", |
||
| 157 | $srcuser->name), |
||
| 158 | "btn-sm btn-warning" |
||
| 159 | ); |
||
| 160 | echo " <p> |
||
| 161 | "; |
||
| 162 | page_tail(); |
||
| 163 | } |
||
| 164 | |||
| 165 | // Here if they accepted |
||
| 166 | // |
||
| 167 | function handle_accept($user) { |
||
| 168 | $srcid = get_int('userid'); |
||
| 169 | $srcuser = BoincUser::lookup_id($srcid); |
||
| 170 | if (!$srcuser) error_page("No such user"); |
||
| 171 | |||
| 172 | $friend = BoincFriend::lookup($srcid, $user->id); |
||
| 173 | if (!$friend) { |
||
| 174 | error_page("No request"); |
||
| 175 | } |
||
| 176 | $friend->update("reciprocated=1"); |
||
| 177 | |||
| 178 | // "accept message" not implemented in interface yet |
||
| 179 | $msg = post_str('message', true); |
||
| 180 | if ($msg) $msg = sanitize_tags(BoincDb::escape_string($msg)); |
||
| 181 | $now = time(); |
||
| 182 | $ret = BoincFriend::replace("user_src=$user->id, user_dest=$srcid, message='$msg', create_time=$now, reciprocated=1"); |
||
| 183 | if (!$ret) { |
||
| 184 | error_page(tra("Database error")); |
||
| 185 | } |
||
| 186 | $type = NOTIFY_FRIEND_ACCEPT; |
||
| 187 | BoincNotify::replace("userid=$srcid, create_time=$now, type=$type, opaque=$user->id"); |
||
| 188 | BoincForumPrefs::lookup($srcuser); |
||
| 189 | if ($srcuser->prefs->pm_notification == 1) { |
||
| 190 | send_friend_accept_email($user, $srcuser, $msg); |
||
| 191 | } |
||
| 192 | |||
| 193 | $notify = BoincNotify::lookup($user->id, NOTIFY_FRIEND_REQ, $srcid); |
||
| 194 | if ($notify) { |
||
| 195 | $notify->delete(); |
||
| 196 | } |
||
| 197 | |||
| 198 | page_head(tra("Friendship confirmed")); |
||
| 199 | echo tra("Your friendship with %1 has been confirmed.","<b>" . $srcuser->name ."</b>"); |
||
| 200 | page_tail(); |
||
| 201 | } |
||
| 202 | |||
| 203 | // Here if they declined |
||
| 204 | // |
||
| 205 | function handle_ignore($user) { |
||
| 206 | $srcid = get_int('userid'); |
||
| 207 | $srcuser = BoincUser::lookup_id($srcid); |
||
| 208 | if (!$srcuser) error_page("No such user"); |
||
| 209 | $friend = BoincFriend::lookup($srcid, $user->id); |
||
| 210 | if (!$friend) { |
||
| 211 | error_page("No request"); |
||
| 212 | } |
||
| 213 | $notify = BoincNotify::lookup($user->id, NOTIFY_FRIEND_REQ, $srcid); |
||
| 214 | if ($notify) { |
||
| 215 | $notify->delete(); |
||
| 216 | } |
||
| 217 | page_head(tra("Friendship declined")); |
||
| 218 | echo tra("You have declined friendship with %1","<b>".$srcuser->name."</b>"); |
||
| 219 | page_tail(); |
||
| 220 | } |
||
| 221 | |||
| 222 | // Here if initiator clicked on "confirmed" notification. |
||
| 223 | // Delete notification |
||
| 224 | // |
||
| 225 | function handle_accepted($user) { |
||
| 226 | $destid = get_int('userid'); |
||
| 227 | $destuser = BoincUser::lookup_id($destid); |
||
| 228 | if (!$destuser) error_page("No such user"); |
||
| 229 | $notify = BoincNotify::lookup($user->id, NOTIFY_FRIEND_ACCEPT, $destid); |
||
| 230 | if ($notify) { |
||
| 231 | $notify->delete(); |
||
| 232 | } else { |
||
| 233 | echo tra("Notification not found"); |
||
| 234 | } |
||
| 235 | page_head(tra("Friend confirmed")); |
||
| 236 | echo tra("You are now friends with %1.",$destuser->name); |
||
| 237 | page_tail(); |
||
| 238 | } |
||
| 239 | |||
| 240 | function handle_cancel_confirm($user) { |
||
| 241 | $destid = get_int('userid'); |
||
| 242 | $destuser = BoincUser::lookup_id($destid); |
||
| 243 | if (!$destuser) error_page("No such user"); |
||
| 244 | page_head(tra("Cancel friendship?")); |
||
| 245 | echo |
||
| 246 | tra("Are you sure you want to cancel your friendship with %1?", |
||
| 247 | $destuser->name |
||
| 248 | ) ."<p>\n" |
||
| 249 | ; |
||
|
0 ignored issues
–
show
|
|||
| 250 | show_button("friend.php?action=cancel&userid=$destid", tra("Yes"), tra("Cancel friendship")); |
||
| 251 | show_button(HOME_PAGE, tra("No"), tra("Stay friends")); |
||
| 252 | echo "</ul>"; |
||
| 253 | page_tail(); |
||
| 254 | } |
||
| 255 | |||
| 256 | function handle_cancel($user) { |
||
| 257 | $destid = get_int('userid'); |
||
| 258 | $destuser = BoincUser::lookup_id($destid); |
||
| 259 | if (!$destuser) error_page("No such user"); |
||
| 260 | BoincFriend::delete($user->id, $destid); |
||
| 261 | page_head(tra("Friendship cancelled")); |
||
| 262 | echo tra("Your friendship with %1 has been cancelled.",$destuser->name); |
||
| 263 | page_tail(); |
||
| 264 | } |
||
| 265 | |||
| 266 | // "home page" has Requests area |
||
| 267 | // (icon) N friend request(s) |
||
| 268 | |||
| 269 | $user = get_logged_in_user(); |
||
| 270 | |||
| 271 | $action = get_str('action', true); |
||
| 272 | if (!$action) $action = post_str('action'); |
||
| 273 | |||
| 274 | switch ($action) { |
||
| 275 | case 'add': |
||
| 276 | handle_add($user); |
||
| 277 | break; |
||
| 278 | case 'add_confirm': |
||
| 279 | handle_add_confirm($user); |
||
| 280 | break; |
||
| 281 | case 'query': |
||
| 282 | handle_query($user); |
||
| 283 | break; |
||
| 284 | case 'accept': |
||
| 285 | handle_accept($user); |
||
| 286 | break; |
||
| 287 | case 'accepted': |
||
| 288 | handle_accepted($user); |
||
| 289 | break; |
||
| 290 | case 'ignore': |
||
| 291 | handle_ignore($user); |
||
| 292 | break; |
||
| 293 | case 'cancel_confirm': |
||
| 294 | handle_cancel_confirm($user); |
||
| 295 | break; |
||
| 296 | case 'cancel': |
||
| 297 | handle_cancel($user); |
||
| 298 | break; |
||
| 299 | default: |
||
|
0 ignored issues
–
show
|
|||
| 300 | error_page("Unknown action"); |
||
| 301 | } |
||
| 302 | |||
| 303 | ?> |
||
| 304 |
In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.