File TODO changed (mode: 100644) (index a520351..c713968) |
1 |
1 |
== Where I stopped last time == |
== Where I stopped last time == |
2 |
|
[ ] Creating git folder is not always working? |
|
3 |
|
De verificat toate pe rocketgit.com. |
|
4 |
|
[ ] What if a user passed </textarea> or <xss> into a field for edit?! |
|
5 |
|
We may have a xss attack! Bad! Bad! |
|
|
2 |
|
[ ] admin_delete_rights::delete, was not protected against csrf/ua! |
|
3 |
|
Other places? Use a unit test for this stuff? |
|
4 |
|
[ ] Seems I do not insert a history item on repo creation! |
|
5 |
|
[ ] Bugs caching page is not working anymore (after NO_WAIT changes) |
|
6 |
|
Seems I regenerate the CSRF tokens! |
|
7 |
|
[ ] tests are failing! |
6 |
8 |
[ ] |
[ ] |
7 |
9 |
|
|
|
10 |
|
== CSRF logic == |
|
11 |
|
- Generate a token for a specific form (call rg_token_get with an $op) |
|
12 |
|
Why I do not use a key per user not a master key?! Maybe because I have |
|
13 |
|
to store it in db. Why not? Because of caching of the pages... |
|
14 |
|
- For a form, we create a token based on sess, ua, tag and a random string. |
|
15 |
|
We store it in sess::SID::token::tag to be reused next time we |
|
16 |
|
load that specific form. |
|
17 |
|
Also, we store it in sess::SID::used_tokens::TOKEN=0 to optimize |
|
18 |
|
for when we receive the POST request (to not lookup in db). |
|
19 |
|
- When checking the validity, we look it up in sess::SID::used_tokens and |
|
20 |
|
compare with 0. If true, we know that token is valid and not used. |
|
21 |
|
|
|
22 |
|
|
8 |
23 |
== BEFORE NEXT RELEASE == |
== BEFORE NEXT RELEASE == |
|
24 |
|
[ ] Some rg_cache_unset may trigger an error. Case by case we have to |
|
25 |
|
analyze the impact. We may want to give an error to the user. |
|
26 |
|
I am thinking at tokens. Maybe we do ot want to mark it as used in |
|
27 |
|
db if we cannot set it as used in the cache. Else, an attacker may |
|
28 |
|
reuse the token. |
|
29 |
|
[ ] Run the tests also with cache down (on the server side). |
|
30 |
|
[ ] When showing empty rights, maybe replace with "DENY"? |
|
31 |
|
[ ] Show who is watching a bug. |
|
32 |
|
[ ] Mess with session_*() functions to achieve some vars persistence. |
|
33 |
|
[ ] Add a para to rg_token_get to specify the form (ex: 'login'), this way |
|
34 |
|
we can still cache the other pages, becasue that token is not |
|
35 |
|
marked as used. |
|
36 |
|
[ ] Add some area with citations? |
|
37 |
|
- I find people who think open-source is anti-capitalism to be kind |
|
38 |
|
of naive and slightly stupid. (bloomberg.com) |
|
39 |
|
[ ] Build a big repo from all hosted projects! |
|
40 |
|
[ ] Add a link to comments to be able to pass that link to others. |
9 |
41 |
[ ] First page can be cached at least 10 minutes? I think not because of |
[ ] First page can be cached at least 10 minutes? I think not because of |
10 |
42 |
logout token. What if the user is not logged in?! Yep, we can do it. |
logout token. What if the user is not logged in?! Yep, we can do it. |
11 |
43 |
ETag! What about the cookies?! |
ETag! What about the cookies?! |
File inc/admin.inc.php changed (mode: 100644) (index 8aa3f0b..8d34f3d) |
... |
... |
function rg_admin_invites_high_level($db, $rg) |
120 |
120 |
break; |
break; |
121 |
121 |
} |
} |
122 |
122 |
|
|
123 |
|
if (!rg_token_valid($db, $rg, FALSE)) { |
|
|
123 |
|
if (!rg_token_valid($db, $rg, 'admin_invites_hl', FALSE)) { |
124 |
124 |
$errmsg[] = "invalid token; try again"; |
$errmsg[] = "invalid token; try again"; |
125 |
125 |
break; |
break; |
126 |
126 |
} |
} |
|
... |
... |
function rg_admin_invites_high_level($db, $rg) |
178 |
178 |
if ($show_form) { |
if ($show_form) { |
179 |
179 |
$rg['inv'] = $inv; |
$rg['inv'] = $inv; |
180 |
180 |
$rg['HTML:errmsg'] = rg_template_errmsg($errmsg); |
$rg['HTML:errmsg'] = rg_template_errmsg($errmsg); |
181 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg); |
|
|
181 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg, 'admin_invites_hl'); |
182 |
182 |
$ret .= rg_template("admin/invites/invites.html", $rg, TRUE /* xss */); |
$ret .= rg_template("admin/invites/invites.html", $rg, TRUE /* xss */); |
183 |
183 |
} |
} |
184 |
184 |
|
|
|
... |
... |
function rg_init($db, $rg) |
231 |
231 |
break; |
break; |
232 |
232 |
} |
} |
233 |
233 |
|
|
234 |
|
if (!rg_token_valid($db, $rg, FALSE)) { |
|
|
234 |
|
if (!rg_token_valid($db, $rg, 'init', FALSE)) { |
235 |
235 |
$errmsg[] = "invalid token; try again"; |
$errmsg[] = "invalid token; try again"; |
236 |
236 |
break; |
break; |
237 |
237 |
} |
} |
|
... |
... |
function rg_init($db, $rg) |
251 |
251 |
|
|
252 |
252 |
if ($load_form) { |
if ($load_form) { |
253 |
253 |
$rg['HTML:errmsg'] = rg_template_errmsg($errmsg); |
$rg['HTML:errmsg'] = rg_template_errmsg($errmsg); |
254 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg); |
|
|
254 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg, 'init'); |
255 |
255 |
$ret .= rg_template("admin/init.html", $rg, TRUE /* xss */); |
$ret .= rg_template("admin/init.html", $rg, TRUE /* xss */); |
256 |
256 |
} |
} |
257 |
257 |
|
|
|
... |
... |
function rg_clean_logs($dir) |
413 |
413 |
|
|
414 |
414 |
$limit_ts = gmmktime(0, 0, 0, gmdate('m'), gmdate('d') - $rg_logs_lifetime); |
$limit_ts = gmmktime(0, 0, 0, gmdate('m'), gmdate('d') - $rg_logs_lifetime); |
415 |
415 |
$limit = gmdate("Ymd", $limit_ts); |
$limit = gmdate("Ymd", $limit_ts); |
416 |
|
rg_log("limit_ts=$limit_ts limit=$limit"); |
|
|
416 |
|
//rg_log("limit_ts=$limit_ts limit=$limit"); |
417 |
417 |
|
|
418 |
418 |
foreach ($files as $file) { |
foreach ($files as $file) { |
419 |
419 |
$ymd = preg_replace('/.*-([0-9]*)\.log/', '$1', $file); |
$ymd = preg_replace('/.*-([0-9]*)\.log/', '$1', $file); |
File inc/bug.inc.php changed (mode: 100644) (index 002e383..8273d34) |
... |
... |
function rg_bug_info($db, $repo_id, $bug_id) |
378 |
378 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
379 |
379 |
|
|
380 |
380 |
// We set the cache even on non-existent bug |
// We set the cache even on non-existent bug |
381 |
|
rg_cache_set($key, $ret); |
|
|
381 |
|
rg_cache_set($key, $ret, RG_SOCKET_NO_WAIT); |
382 |
382 |
break; |
break; |
383 |
383 |
} |
} |
384 |
384 |
|
|
|
... |
... |
function rg_bug_edit($db, $login_ui, $ri, $data) |
484 |
484 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
485 |
485 |
|
|
486 |
486 |
// Add reporter and assignee to the watch list |
// Add reporter and assignee to the watch list |
487 |
|
$r = rg_watch_add($db, "bug", $login_ui['uid'], $ri['repo_id'], |
|
488 |
|
$data['bug_id']); |
|
489 |
|
if ($r === FALSE) { |
|
490 |
|
rg_bug_set_error("cannot add to watch list" |
|
491 |
|
. " (" . rg_watch_error() . ")"); |
|
492 |
|
break; |
|
|
487 |
|
if ($add == 1) { |
|
488 |
|
$r = rg_watch_add($db, 'bug', $login_ui['uid'], |
|
489 |
|
$ri['repo_id'], $data['bug_id']); |
|
490 |
|
if ($r === FALSE) { |
|
491 |
|
rg_bug_set_error("cannot add to watch list" |
|
492 |
|
. " (" . rg_watch_error() . ")"); |
|
493 |
|
break; |
|
494 |
|
} |
493 |
495 |
} |
} |
494 |
496 |
|
|
495 |
497 |
if ($data['assigned_uid'] > 0) { |
if ($data['assigned_uid'] > 0) { |
496 |
|
$r = rg_watch_add($db, "bug", $data['assigned_uid'], |
|
|
498 |
|
$r = rg_watch_add($db, 'bug', $data['assigned_uid'], |
497 |
499 |
$ri['repo_id'], $data['bug_id']); |
$ri['repo_id'], $data['bug_id']); |
498 |
500 |
if ($r === FALSE) { |
if ($r === FALSE) { |
499 |
501 |
rg_bug_set_error("cannot add to watch list" |
rg_bug_set_error("cannot add to watch list" |
|
... |
... |
function rg_bug_edit($db, $login_ui, $ri, $data) |
533 |
535 |
$data['exists'] = 1; |
$data['exists'] = 1; |
534 |
536 |
rg_bug_cosmetic($db, $data); |
rg_bug_cosmetic($db, $data); |
535 |
537 |
$key = $ri['repo_id'] . "::bugs::" . $data['bug_id']; |
$key = $ri['repo_id'] . "::bugs::" . $data['bug_id']; |
536 |
|
rg_cache_set($key, $data); |
|
|
538 |
|
rg_cache_set($key, $data, RG_SOCKET_NO_WAIT); |
537 |
539 |
|
|
538 |
540 |
rg_event_signal_daemon("", 0); |
rg_event_signal_daemon("", 0); |
539 |
541 |
|
|
|
... |
... |
function rg_bug_edit_high_level($db, &$rg) |
1302 |
1304 |
break; |
break; |
1303 |
1305 |
} |
} |
1304 |
1306 |
|
|
1305 |
|
if (!rg_token_valid($db, $rg, FALSE)) { |
|
|
1307 |
|
if (!rg_token_valid($db, $rg, 'bug_edit_hl', FALSE)) { |
1306 |
1308 |
$errmsg[] = "invalid token; try again"; |
$errmsg[] = "invalid token; try again"; |
1307 |
1309 |
break; |
break; |
1308 |
1310 |
} |
} |
|
... |
... |
function rg_bug_edit_high_level($db, &$rg) |
1325 |
1327 |
|
|
1326 |
1328 |
if ($show_form) { |
if ($show_form) { |
1327 |
1329 |
$rg['HTML:errmsg'] = rg_template_errmsg($errmsg); |
$rg['HTML:errmsg'] = rg_template_errmsg($errmsg); |
1328 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg); |
|
|
1330 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg, 'bug_edit_hl'); |
|
1331 |
|
$rg['rg_form_token_tag'] = 'bug_edit_hl'; |
1329 |
1332 |
|
|
1330 |
1333 |
$exclude = array(0); |
$exclude = array(0); |
1331 |
1334 |
$rg['bug']['HTML:state_select'] = |
$rg['bug']['HTML:state_select'] = |
File inc/cache.inc.php changed (mode: 100644) (index 7ef4077..2fece33) |
... |
... |
function rg_cache_get($ns_var) |
291 |
291 |
|
|
292 |
292 |
rg_prof_start("cache_get"); |
rg_prof_start("cache_get"); |
293 |
293 |
if ($rg_cache_debug) |
if ($rg_cache_debug) |
294 |
|
rg_log_enter("cache_get($ns_var)"); |
|
|
294 |
|
rg_log_enter("cache_get: $ns_var"); |
295 |
295 |
|
|
296 |
296 |
$ret = FALSE; |
$ret = FALSE; |
297 |
297 |
while (1) { |
while (1) { |
298 |
298 |
$ret = rg_cache_core_get($ns_var); |
$ret = rg_cache_core_get($ns_var); |
299 |
|
if ($ret !== FALSE) |
|
|
299 |
|
if ($ret !== FALSE) { |
|
300 |
|
if ($rg_cache_debug) |
|
301 |
|
rg_log('Found in core. Good!'); |
300 |
302 |
break; |
break; |
|
303 |
|
} |
301 |
304 |
|
|
302 |
305 |
if ($rg_cache_enable === FALSE) |
if ($rg_cache_enable === FALSE) |
303 |
306 |
break; |
break; |
304 |
307 |
|
|
305 |
308 |
$c = rg_socket($rg_cache_socket, |
$c = rg_socket($rg_cache_socket, |
306 |
|
"GET " . $ns_var . "\n", $rg_cache_timeout, 1); |
|
|
309 |
|
"GET F= " . $ns_var . "\n", $rg_cache_timeout, 1, 0); |
307 |
310 |
if ($c === FALSE) |
if ($c === FALSE) |
308 |
311 |
break; |
break; |
309 |
312 |
|
|
|
... |
... |
function rg_cache_prepare($s) |
346 |
349 |
/* |
/* |
347 |
350 |
* Sets a variable in the cache daemon |
* Sets a variable in the cache daemon |
348 |
351 |
*/ |
*/ |
349 |
|
function rg_cache_set($ns_var, $value) |
|
|
352 |
|
function rg_cache_set($ns_var, $value, $flags) |
350 |
353 |
{ |
{ |
351 |
354 |
global $rg_cache_socket; |
global $rg_cache_socket; |
352 |
355 |
global $rg_cache_timeout; |
global $rg_cache_timeout; |
|
... |
... |
function rg_cache_set($ns_var, $value) |
355 |
358 |
|
|
356 |
359 |
rg_prof_start("cache_set"); |
rg_prof_start("cache_set"); |
357 |
360 |
if ($rg_cache_debug) |
if ($rg_cache_debug) |
358 |
|
rg_log_ml_enter("cache_set: $ns_var = " . print_r($value, TRUE)); |
|
|
361 |
|
rg_log_ml_enter("cache_set: flags=$flags" |
|
362 |
|
. " $ns_var = " . print_r($value, TRUE)); |
359 |
363 |
|
|
360 |
364 |
$ret = FALSE; |
$ret = FALSE; |
361 |
365 |
while (1) { |
while (1) { |
|
... |
... |
function rg_cache_set($ns_var, $value) |
364 |
368 |
if ($rg_cache_enable === FALSE) |
if ($rg_cache_enable === FALSE) |
365 |
369 |
break; |
break; |
366 |
370 |
|
|
367 |
|
$c = rg_socket($rg_cache_socket, "SET " . $ns_var . "=" |
|
368 |
|
. rg_cache_prepare($value) . "\n", $rg_cache_timeout, 3); |
|
|
371 |
|
$f = ''; |
|
372 |
|
if ($flags & RG_SOCKET_NO_WAIT) |
|
373 |
|
$f .= 'W'; |
|
374 |
|
|
|
375 |
|
$c = rg_socket($rg_cache_socket, "SET F=$f " . $ns_var . "=" |
|
376 |
|
. rg_cache_prepare($value) . "\n", $rg_cache_timeout, 3, $flags); |
369 |
377 |
if ($c === FALSE) |
if ($c === FALSE) |
370 |
378 |
break; |
break; |
371 |
379 |
|
|
|
380 |
|
if ($flags & RG_SOCKET_NO_WAIT) { |
|
381 |
|
$ret = TRUE; |
|
382 |
|
break; |
|
383 |
|
} |
|
384 |
|
|
372 |
385 |
if (strncmp($c, "OK", 2) != 0) |
if (strncmp($c, "OK", 2) != 0) |
373 |
386 |
break; |
break; |
374 |
387 |
|
|
|
... |
... |
function rg_cache_inc($ns_var) |
404 |
417 |
break; |
break; |
405 |
418 |
|
|
406 |
419 |
$c = rg_socket($rg_cache_socket, |
$c = rg_socket($rg_cache_socket, |
407 |
|
"INC " . $ns_var . "\n", $rg_cache_timeout, 1); |
|
|
420 |
|
"INC F= " . $ns_var . "\n", $rg_cache_timeout, 1, 0); |
408 |
421 |
if ($c === FALSE) |
if ($c === FALSE) |
409 |
422 |
break; |
break; |
410 |
423 |
|
|
|
... |
... |
function rg_cache_inc($ns_var) |
428 |
441 |
/* |
/* |
429 |
442 |
* Unsets a variable in the cache daemon |
* Unsets a variable in the cache daemon |
430 |
443 |
*/ |
*/ |
431 |
|
function rg_cache_unset($ns_var) |
|
|
444 |
|
function rg_cache_unset($ns_var, $flags) |
432 |
445 |
{ |
{ |
433 |
446 |
global $rg_cache_socket; |
global $rg_cache_socket; |
434 |
447 |
global $rg_cache_timeout; |
global $rg_cache_timeout; |
|
... |
... |
function rg_cache_unset($ns_var) |
437 |
450 |
|
|
438 |
451 |
rg_prof_start("cache_unset"); |
rg_prof_start("cache_unset"); |
439 |
452 |
if ($rg_cache_debug) |
if ($rg_cache_debug) |
440 |
|
rg_log_enter("cache_unset($ns_var)" |
|
|
453 |
|
rg_log_enter("cache_unset($ns_var) flags=$flags" |
441 |
454 |
. " enable=" . ($rg_cache_enable ? "true" : "false")); |
. " enable=" . ($rg_cache_enable ? "true" : "false")); |
442 |
455 |
|
|
443 |
456 |
$ret = FALSE; |
$ret = FALSE; |
|
... |
... |
function rg_cache_unset($ns_var) |
447 |
460 |
if ($rg_cache_enable === FALSE) |
if ($rg_cache_enable === FALSE) |
448 |
461 |
break; |
break; |
449 |
462 |
|
|
|
463 |
|
$f = ''; |
|
464 |
|
if ($flags & RG_SOCKET_NO_WAIT) |
|
465 |
|
$f .= 'W'; |
|
466 |
|
|
450 |
467 |
$ret = rg_socket($rg_cache_socket, |
$ret = rg_socket($rg_cache_socket, |
451 |
|
"UNSET " . $ns_var . "\n", $rg_cache_timeout, 1); |
|
|
468 |
|
"UNSET F=$f " . $ns_var . "\n", $rg_cache_timeout, 1, $flags); |
452 |
469 |
if ($ret === FALSE) |
if ($ret === FALSE) |
453 |
470 |
break; |
break; |
454 |
471 |
|
|
|
472 |
|
if ($flags & RG_SOCKET_NO_WAIT) { |
|
473 |
|
$ret = TRUE; |
|
474 |
|
break; |
|
475 |
|
} |
|
476 |
|
|
455 |
477 |
if (strncmp($ret, "NOT_FOUND", 9) == 0) |
if (strncmp($ret, "NOT_FOUND", 9) == 0) |
456 |
478 |
break; |
break; |
457 |
479 |
|
|
|
... |
... |
function rg_cache_merge($ns_var, $list) |
494 |
516 |
if ($rg_cache_enable === FALSE) |
if ($rg_cache_enable === FALSE) |
495 |
517 |
break; |
break; |
496 |
518 |
|
|
497 |
|
$c = rg_socket($rg_cache_socket, "MERGE " . $ns_var . "=" |
|
498 |
|
. rg_cache_prepare($list) . "\n", $rg_cache_timeout, 1); |
|
|
519 |
|
$c = rg_socket($rg_cache_socket, "MERGE F= " . $ns_var . "=" |
|
520 |
|
. rg_cache_prepare($list) . "\n", $rg_cache_timeout, 1, 0); |
499 |
521 |
if ($c === FALSE) |
if ($c === FALSE) |
500 |
522 |
break; |
break; |
501 |
523 |
|
|
File inc/plan.inc.php changed (mode: 100644) (index c7bcece..6690ce9) |
... |
... |
function rg_plan_edit($db, $d) |
81 |
81 |
$d['id'] = $row['id']; |
$d['id'] = $row['id']; |
82 |
82 |
|
|
83 |
83 |
// invalidate cache |
// invalidate cache |
84 |
|
rg_cache_unset("plan::list"); |
|
|
84 |
|
rg_cache_unset('plan::list', RG_SOCKET_NO_WAIT); |
85 |
85 |
|
|
86 |
86 |
$ret = $row['id']; |
$ret = $row['id']; |
87 |
87 |
break; |
break; |
|
... |
... |
function rg_plan_remove($db, $list) |
117 |
117 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
118 |
118 |
|
|
119 |
119 |
// invalidate cache |
// invalidate cache |
120 |
|
rg_cache_unset("plan::list"); |
|
|
120 |
|
rg_cache_unset('plan::list', RG_SOCKET_NO_WAIT); |
121 |
121 |
|
|
122 |
122 |
$ret = TRUE; |
$ret = TRUE; |
123 |
123 |
break; |
break; |
|
... |
... |
function rg_plan_list($db) |
162 |
162 |
} |
} |
163 |
163 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
164 |
164 |
|
|
165 |
|
rg_cache_set("plan::list", $ret); |
|
|
165 |
|
rg_cache_set("plan::list", $ret, RG_SOCKET_NO_WAIT); |
166 |
166 |
break; |
break; |
167 |
167 |
} |
} |
168 |
168 |
|
|
|
... |
... |
function rg_plan_list_high_level($db, $rg) |
250 |
250 |
break; |
break; |
251 |
251 |
} |
} |
252 |
252 |
|
|
253 |
|
if (!rg_token_valid($db, $rg, FALSE)) { |
|
|
253 |
|
if (!rg_token_valid($db, $rg, 'plan_list', FALSE)) { |
254 |
254 |
$del_errmsg[] = "Invalid token. Try again."; |
$del_errmsg[] = "Invalid token. Try again."; |
255 |
255 |
break; |
break; |
256 |
256 |
} |
} |
|
... |
... |
function rg_plan_list_high_level($db, $rg) |
273 |
273 |
return rg_template("admin/plans/list_err.html", $rg, TRUE /* xss */); |
return rg_template("admin/plans/list_err.html", $rg, TRUE /* xss */); |
274 |
274 |
} |
} |
275 |
275 |
|
|
276 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg); |
|
|
276 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg, 'plan_list'); |
277 |
277 |
$rg['HTML:del_errmsg'] = rg_template_errmsg($del_errmsg); |
$rg['HTML:del_errmsg'] = rg_template_errmsg($del_errmsg); |
278 |
278 |
$ret .= rg_template_table("admin/plans/list", $list, $rg); |
$ret .= rg_template_table("admin/plans/list", $list, $rg); |
279 |
279 |
return $ret; |
return $ret; |
|
... |
... |
function rg_plan_edit_high_level($db, &$rg) |
342 |
342 |
break; |
break; |
343 |
343 |
} |
} |
344 |
344 |
|
|
345 |
|
if (!rg_token_valid($db, $rg, FALSE)) { |
|
|
345 |
|
if (!rg_token_valid($db, $rg, 'plan_edit_hl', FALSE)) { |
346 |
346 |
$errmsg[] = "invalid token; try again"; |
$errmsg[] = "invalid token; try again"; |
347 |
347 |
break; |
break; |
348 |
348 |
} |
} |
|
... |
... |
function rg_plan_edit_high_level($db, &$rg) |
361 |
361 |
if ($load_form) { |
if ($load_form) { |
362 |
362 |
$rg['pi'] = $pi; |
$rg['pi'] = $pi; |
363 |
363 |
$rg['HTML:errmsg'] = rg_template_errmsg($errmsg); |
$rg['HTML:errmsg'] = rg_template_errmsg($errmsg); |
364 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg); |
|
|
364 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg, 'plan_edit_hl'); |
365 |
365 |
$ret .= rg_template("admin/plans/add_edit.html", $rg, TRUE /* xss */); |
$ret .= rg_template("admin/plans/add_edit.html", $rg, TRUE /* xss */); |
366 |
366 |
} |
} |
367 |
367 |
|
|
File inc/repo.inc.php changed (mode: 100644) (index 3706700..a13e3cb) |
... |
... |
function rg_repo_info($db, $repo_id, $uid, $repo_name) |
708 |
708 |
} |
} |
709 |
709 |
//rg_log_ml("CHECK: ret=" . print_r($ret, TRUE)); |
//rg_log_ml("CHECK: ret=" . print_r($ret, TRUE)); |
710 |
710 |
|
|
711 |
|
rg_cache_set("repo_by_id::$repo_id", $ret); |
|
|
711 |
|
rg_cache_set("repo_by_id::$repo_id", $ret, RG_SOCKET_NO_WAIT); |
712 |
712 |
|
|
713 |
713 |
if ($ret['exists'] == 1) |
if ($ret['exists'] == 1) |
714 |
714 |
rg_cache_set("repo_by_name::$uid::" . $ret['name'], |
rg_cache_set("repo_by_name::$uid::" . $ret['name'], |
715 |
|
$ret['repo_id']); |
|
|
715 |
|
$ret['repo_id'], RG_SOCKET_NO_WAIT); |
716 |
716 |
|
|
717 |
717 |
break; |
break; |
718 |
718 |
} |
} |
|
... |
... |
function rg_repo_delete($db, $repo_id, $ui) |
769 |
769 |
} |
} |
770 |
770 |
rg_event_signal_daemon("", 0); |
rg_event_signal_daemon("", 0); |
771 |
771 |
|
|
772 |
|
rg_cache_unset("repo_by_id::$repo_id"); |
|
773 |
|
rg_cache_unset("repo_by_name::" . $ui['uid'] . "::" . $ri['name']); |
|
|
772 |
|
rg_cache_unset('repo_by_id::' . $repo_id, RG_SOCKET_NO_WAIT); |
|
773 |
|
rg_cache_unset('repo_by_name::' . $ui['uid'] |
|
774 |
|
. '::' . $ri['name'], RG_SOCKET_NO_WAIT); |
774 |
775 |
|
|
775 |
776 |
$ret = TRUE; |
$ret = TRUE; |
776 |
777 |
break; |
break; |
|
... |
... |
function rg_repo_lookup_by_old_name($db, $uid, $old_name) |
816 |
817 |
else |
else |
817 |
818 |
$ret = $row['repo_id']; |
$ret = $row['repo_id']; |
818 |
819 |
|
|
819 |
|
rg_cache_set("repo_by_old_name::$uid::$old_name", $ret); |
|
|
820 |
|
rg_cache_set("repo_by_old_name::$uid::$old_name", $ret, RG_SOCKET_NO_WAIT); |
820 |
821 |
break; |
break; |
821 |
822 |
} |
} |
822 |
823 |
|
|
|
... |
... |
function rg_repo_insert_rename($db, $uid, $repo_id, $old_name) |
863 |
864 |
break; |
break; |
864 |
865 |
} |
} |
865 |
866 |
|
|
866 |
|
rg_cache_set("repo_by_name::$uid::$old_name", $repo_id); |
|
|
867 |
|
rg_cache_set("repo_by_name::$uid::$old_name", $repo_id, RG_SOCKET_NO_WAIT); |
867 |
868 |
|
|
868 |
869 |
$ret = TRUE; |
$ret = TRUE; |
869 |
870 |
break; |
break; |
|
... |
... |
function rg_repo_edit($db, $login_ui, &$new) |
1008 |
1009 |
|
|
1009 |
1010 |
$new['ok'] = 1; |
$new['ok'] = 1; |
1010 |
1011 |
$new['exists'] = 1; |
$new['exists'] = 1; |
1011 |
|
rg_cache_set("repo_by_id::" . $new['repo_id'], $new); |
|
|
1012 |
|
rg_cache_set("repo_by_id::" . $new['repo_id'], $new, RG_SOCKET_NO_WAIT); |
1012 |
1013 |
rg_cache_set("repo_by_name::" . $login_ui['uid'] . "::" |
rg_cache_set("repo_by_name::" . $login_ui['uid'] . "::" |
1013 |
|
. $new['name'], $new['repo_id']); |
|
|
1014 |
|
. $new['name'], $new['repo_id'], RG_SOCKET_NO_WAIT); |
1014 |
1015 |
|
|
1015 |
1016 |
rg_event_signal_daemon("", 0); |
rg_event_signal_daemon("", 0); |
1016 |
1017 |
|
|
|
... |
... |
function rg_repo_admin_rights($db, $rg, $type) |
1265 |
1266 |
|
|
1266 |
1267 |
$delete = rg_var_bool("delete"); |
$delete = rg_var_bool("delete"); |
1267 |
1268 |
while ($delete == 1) { |
while ($delete == 1) { |
|
1269 |
|
if (!rg_valid_referer()) { |
|
1270 |
|
$errmsg[] = "invalid referer; try again"; |
|
1271 |
|
break; |
|
1272 |
|
} |
|
1273 |
|
|
|
1274 |
|
if (!rg_token_valid($db, $rg, 'repo_admin_rights', FALSE)) { |
|
1275 |
|
$errmsg[] = "invalid token; try again"; |
|
1276 |
|
break; |
|
1277 |
|
} |
|
1278 |
|
|
1268 |
1279 |
$list = rg_var_uint("rights_delete_ids"); |
$list = rg_var_uint("rights_delete_ids"); |
1269 |
1280 |
if (empty($list)) { |
if (empty($list)) { |
1270 |
1281 |
$list_errmsg[] = "please select at least one item"; |
$list_errmsg[] = "please select at least one item"; |
|
... |
... |
function rg_repo_admin_rights($db, $rg, $type) |
1316 |
1327 |
break; |
break; |
1317 |
1328 |
} |
} |
1318 |
1329 |
|
|
1319 |
|
if (!rg_token_valid($db, $rg, FALSE)) { |
|
|
1330 |
|
if (!rg_token_valid($db, $rg, 'repo_admin_rights', FALSE)) { |
1320 |
1331 |
$errmsg[] = "invalid token; try again"; |
$errmsg[] = "invalid token; try again"; |
1321 |
1332 |
break; |
break; |
1322 |
1333 |
} |
} |
|
... |
... |
function rg_repo_admin_rights($db, $rg, $type) |
1359 |
1370 |
$rg = rg_array_merge($rg, '', $a); |
$rg = rg_array_merge($rg, '', $a); |
1360 |
1371 |
} |
} |
1361 |
1372 |
|
|
1362 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg); |
|
|
1373 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg, 'repo_admin_rights'); |
1363 |
1374 |
$rg['HTML:errmsg'] = rg_template_errmsg($errmsg); |
$rg['HTML:errmsg'] = rg_template_errmsg($errmsg); |
1364 |
1375 |
$rg['HTML:list_errmsg'] = rg_template_errmsg($list_errmsg); |
$rg['HTML:list_errmsg'] = rg_template_errmsg($list_errmsg); |
1365 |
1376 |
$rg['HTML:rights_checkboxes'] = rg_rights_checkboxes($type, "rights", |
$rg['HTML:rights_checkboxes'] = rg_rights_checkboxes($type, "rights", |
|
... |
... |
function rg_repo_admin_delete($db, $rg) |
1425 |
1436 |
break; |
break; |
1426 |
1437 |
} |
} |
1427 |
1438 |
|
|
1428 |
|
if (!rg_token_valid($db, $rg, FALSE)) { |
|
|
1439 |
|
if (!rg_token_valid($db, $rg, 'repo_admin_delete', FALSE)) { |
1429 |
1440 |
$errmsg[] = "invalid token; try again"; |
$errmsg[] = "invalid token; try again"; |
1430 |
1441 |
break; |
break; |
1431 |
1442 |
} |
} |
|
... |
... |
function rg_repo_admin_delete($db, $rg) |
1446 |
1457 |
|
|
1447 |
1458 |
if ($show_form == 1) { |
if ($show_form == 1) { |
1448 |
1459 |
$rg['HTML:errmsg'] = rg_template_errmsg($errmsg); |
$rg['HTML:errmsg'] = rg_template_errmsg($errmsg); |
1449 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg); |
|
|
1460 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg, 'repo_admin_delete'); |
1450 |
1461 |
$ret .= rg_template("user/repo/delete/sure.html", $rg, TRUE /* xss */); |
$ret .= rg_template("user/repo/delete/sure.html", $rg, TRUE /* xss */); |
1451 |
1462 |
} |
} |
1452 |
1463 |
|
|
|
... |
... |
function rg_repo_edit_high_level($db, &$rg) |
1509 |
1520 |
break; |
break; |
1510 |
1521 |
} |
} |
1511 |
1522 |
|
|
1512 |
|
$rg['ri']['repo_id'] = rg_var_uint("repo_id"); |
|
1513 |
|
$rg['ri']['master'] = rg_var_uint("master"); |
|
1514 |
|
$rg['ri']['name'] = rg_var_str("name"); // TODO: filter name! |
|
1515 |
|
$rg['ri']['max_commit_size'] = rg_var_uint("max_commit_size"); |
|
1516 |
|
$rg['ri']['description'] = trim(rg_var_str("description")); |
|
1517 |
|
$rg['ri']['public'] = rg_var_bool("public"); |
|
1518 |
|
$rg['ri']['license'] = trim(rg_var_str("license")); |
|
|
1523 |
|
$rg['ri']['repo_id'] = rg_var_uint('repo_id'); |
|
1524 |
|
$rg['ri']['master'] = rg_var_uint('master'); |
|
1525 |
|
$rg['ri']['name'] = rg_var_str('name'); // TODO: filter name! |
|
1526 |
|
$rg['ri']['max_commit_size'] = rg_var_uint('max_commit_size'); |
|
1527 |
|
$rg['ri']['description'] = trim(rg_var_str('description')); |
|
1528 |
|
$rg['ri']['public'] = rg_var_bool('public'); |
|
1529 |
|
$rg['ri']['license'] = trim(rg_var_str('license')); |
1519 |
1530 |
rg_repo_cosmetic($rg['ri']); |
rg_repo_cosmetic($rg['ri']); |
1520 |
1531 |
//rg_log_ml("CHECK: after repo edit: rg[ri]=" . print_r($rg['ri'], TRUE)); |
//rg_log_ml("CHECK: after repo edit: rg[ri]=" . print_r($rg['ri'], TRUE)); |
1521 |
1532 |
|
|
|
... |
... |
function rg_repo_edit_high_level($db, &$rg) |
1524 |
1535 |
break; |
break; |
1525 |
1536 |
} |
} |
1526 |
1537 |
|
|
1527 |
|
if (!rg_token_valid($db, $rg, FALSE)) { |
|
|
1538 |
|
if (!rg_token_valid($db, $rg, 'repo_edit_hl', FALSE)) { |
1528 |
1539 |
// TODO: replace all of these with a template |
// TODO: replace all of these with a template |
1529 |
1540 |
$errmsg[] = "invalid token; try again."; |
$errmsg[] = "invalid token; try again."; |
1530 |
1541 |
break; |
break; |
|
... |
... |
function rg_repo_edit_high_level($db, &$rg) |
1559 |
1570 |
} |
} |
1560 |
1571 |
|
|
1561 |
1572 |
$rg['HTML:errmsg'] = rg_template_errmsg($errmsg); |
$rg['HTML:errmsg'] = rg_template_errmsg($errmsg); |
1562 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg); |
|
|
1573 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg, 'repo_edit_hl'); |
1563 |
1574 |
$hints = array(); |
$hints = array(); |
1564 |
1575 |
$hints[]['HTML:hint'] = rg_template("hints/repo/create_repo.html", $rg, TRUE /* xss */); |
$hints[]['HTML:hint'] = rg_template("hints/repo/create_repo.html", $rg, TRUE /* xss */); |
1565 |
1576 |
$rg['HTML:repo_edit_hints'] = rg_template_table("hints/list", $hints, $rg); |
$rg['HTML:repo_edit_hints'] = rg_template_table("hints/list", $hints, $rg); |
File inc/token.inc.php changed (mode: 100644) (index 3f49644..f7e5774) |
2 |
2 |
require_once($INC . "/util.inc.php"); |
require_once($INC . "/util.inc.php"); |
3 |
3 |
require_once($INC . "/log.inc.php"); |
require_once($INC . "/log.inc.php"); |
4 |
4 |
require_once($INC . "/sql.inc.php"); |
require_once($INC . "/sql.inc.php"); |
|
5 |
|
require_once($INC . "/cache.inc.php"); |
5 |
6 |
require_once($INC . "/prof.inc.php"); |
require_once($INC . "/prof.inc.php"); |
6 |
7 |
|
|
7 |
8 |
$rg_token_error = ""; |
$rg_token_error = ""; |
|
... |
... |
function rg_token_get_master($db) |
66 |
67 |
|
|
67 |
68 |
$ret = FALSE; |
$ret = FALSE; |
68 |
69 |
while (1) { |
while (1) { |
69 |
|
$key = rg_state_get($db, "token_key"); |
|
|
70 |
|
$key = rg_state_get($db, 'token_key'); |
70 |
71 |
if ($key === FALSE) { |
if ($key === FALSE) { |
71 |
72 |
rg_token_set_error("cannot get token_key:" |
rg_token_set_error("cannot get token_key:" |
72 |
73 |
. " " . rg_state_error()); |
. " " . rg_state_error()); |
|
... |
... |
function rg_token_get_master($db) |
75 |
76 |
|
|
76 |
77 |
if (empty($key)) { |
if (empty($key)) { |
77 |
78 |
$key = rg_id(32); |
$key = rg_id(32); |
78 |
|
$r = rg_state_set($db, "token_key", $key); |
|
|
79 |
|
$r = rg_state_set($db, 'token_key', $key); |
79 |
80 |
if ($r !== TRUE) { |
if ($r !== TRUE) { |
80 |
81 |
rg_token_set_error("cannot set state:" |
rg_token_set_error("cannot set state:" |
81 |
82 |
. " " . rg_state_error()); |
. " " . rg_state_error()); |
|
... |
... |
function rg_token_get_master($db) |
94 |
95 |
|
|
95 |
96 |
/* |
/* |
96 |
97 |
* Returns TRUE if the token is valid |
* Returns TRUE if the token is valid |
|
98 |
|
* @double_allowed - if TRUE, we will not mark the token as used |
|
99 |
|
* (for example, logout token does not have to be marked as used) |
97 |
100 |
*/ |
*/ |
98 |
|
function rg_token_valid($db, $rg, $double_allowed) |
|
|
101 |
|
function rg_token_valid($db, $rg, $tag, $double_allowed) |
99 |
102 |
{ |
{ |
100 |
103 |
rg_prof_start("token_valid"); |
rg_prof_start("token_valid"); |
101 |
104 |
rg_log_enter("token_valid: sid=" . $rg['sid'] . " token=" . $rg['token'] |
rg_log_enter("token_valid: sid=" . $rg['sid'] . " token=" . $rg['token'] |
102 |
|
. " ua=" . $rg['ua']); |
|
|
105 |
|
. " ua=" . $rg['ua'] . ' tag=' . $tag); |
103 |
106 |
|
|
104 |
107 |
$ret = FALSE; |
$ret = FALSE; |
105 |
108 |
while (1) { |
while (1) { |
106 |
|
$ua_hash = substr(sha512($rg['ua']), 0, 8); |
|
107 |
|
|
|
108 |
109 |
$len = strlen($rg['token']); |
$len = strlen($rg['token']); |
109 |
|
if ($len != 32) { |
|
|
110 |
|
if ($len < 32) { |
110 |
111 |
rg_token_set_error("invalid token"); |
rg_token_set_error("invalid token"); |
111 |
112 |
rg_security_violation_no_exit("invalid token ($len != 32)"); |
rg_security_violation_no_exit("invalid token ($len != 32)"); |
112 |
113 |
break; |
break; |
113 |
114 |
} |
} |
|
115 |
|
$rg['token'] = substr($rg['token'], 0, 32); |
114 |
116 |
|
|
|
117 |
|
// We have to check first because of ua |
115 |
118 |
$key = rg_token_get_master($db); |
$key = rg_token_get_master($db); |
116 |
119 |
if ($key === FALSE) |
if ($key === FALSE) |
117 |
120 |
break; |
break; |
|
... |
... |
function rg_token_valid($db, $rg, $double_allowed) |
119 |
122 |
$rand = substr($rg['token'], 0, 16); |
$rand = substr($rg['token'], 0, 16); |
120 |
123 |
$sign = substr($rg['token'], 16, 16); |
$sign = substr($rg['token'], 16, 16); |
121 |
124 |
|
|
122 |
|
$data = $rand . $rg['sid'] . $ua_hash; |
|
123 |
|
$hash = hash_hmac("sha512", $data, $key); |
|
|
125 |
|
$data = $rand . $rg['sid'] . $rg['ua'] . $tag; |
|
126 |
|
$hash = hash_hmac('sha512', $data, $key); |
124 |
127 |
if ($hash === FALSE) { |
if ($hash === FALSE) { |
125 |
128 |
rg_token_set_error("cannot compute hmac"); |
rg_token_set_error("cannot compute hmac"); |
126 |
129 |
break; |
break; |
|
... |
... |
function rg_token_valid($db, $rg, $double_allowed) |
134 |
137 |
break; |
break; |
135 |
138 |
} |
} |
136 |
139 |
|
|
|
140 |
|
$ukey = 'sess' . '::' . $rg['sid'] . '::' . 'used_tokens' |
|
141 |
|
. '::' . $rg['token']; |
|
142 |
|
$c = rg_cache_get($ukey); |
|
143 |
|
if ($c === '1') { |
|
144 |
|
rg_token_set_error("token already used"); |
|
145 |
|
break; |
|
146 |
|
} |
|
147 |
|
|
|
148 |
|
$params = array("sid" => $rg['sid'], |
|
149 |
|
"token" => $rg['token'], |
|
150 |
|
"expire" => time() + 24 * 3600); |
|
151 |
|
|
|
152 |
|
if ($c === FALSE) { |
|
153 |
|
// We check to see if token was already used |
|
154 |
|
$sql = "SELECT 1 FROM tokens" |
|
155 |
|
. " WHERE sid = @@sid@@" |
|
156 |
|
. " AND token = @@token@@"; |
|
157 |
|
$res = rg_sql_query_params($db, $sql, $params); |
|
158 |
|
if ($res === FALSE) { |
|
159 |
|
rg_token_set_error("cannot check if token is used" |
|
160 |
|
. " (" . rg_sql_error() . ")"); |
|
161 |
|
break; |
|
162 |
|
} |
|
163 |
|
$rows = rg_sql_num_rows($res); |
|
164 |
|
rg_sql_free_result($res); |
|
165 |
|
if ($rows == 1) { |
|
166 |
|
rg_token_set_error("token already used"); |
|
167 |
|
break; |
|
168 |
|
} |
|
169 |
|
} |
|
170 |
|
|
137 |
171 |
if (strncmp($rg['sid'], "X", 1) == 0) { |
if (strncmp($rg['sid'], "X", 1) == 0) { |
138 |
172 |
// We have a pre-login session: we do not have to mark |
// We have a pre-login session: we do not have to mark |
139 |
173 |
// the token as used. |
// the token as used. |
|
... |
... |
function rg_token_valid($db, $rg, $double_allowed) |
146 |
180 |
break; |
break; |
147 |
181 |
} |
} |
148 |
182 |
|
|
149 |
|
$params = array("sid" => $rg['sid'], |
|
150 |
|
"token" => $rg['token'], |
|
151 |
|
"expire" => time() + 24 * 3600); |
|
152 |
|
|
|
153 |
|
// We check to see if token was already used |
|
154 |
|
$sql = "SELECT 1 FROM tokens" |
|
155 |
|
. " WHERE sid = @@sid@@" |
|
156 |
|
. " AND token = @@token@@"; |
|
157 |
|
$res = rg_sql_query_params($db, $sql, $params); |
|
158 |
|
if ($res === FALSE) { |
|
159 |
|
rg_token_set_error("cannot check if token is used" |
|
160 |
|
. " (" . rg_sql_error() . ")"); |
|
161 |
|
break; |
|
162 |
|
} |
|
163 |
|
$rows = rg_sql_num_rows($res); |
|
164 |
|
rg_sql_free_result($res); |
|
165 |
|
if ($rows == 1) { |
|
166 |
|
rg_token_set_error("token already used"); |
|
167 |
|
break; |
|
168 |
|
} |
|
|
183 |
|
// Unset cached token to generate a new one for this tag |
|
184 |
|
$tkey = 'sess' . '::' . $rg['sid'] . '::' . 'token' |
|
185 |
|
. '::' . $tag; |
|
186 |
|
rg_cache_unset($tkey, RG_SOCKET_NO_WAIT); |
169 |
187 |
|
|
170 |
188 |
$sql = "INSERT INTO tokens (sid, token, expire)" |
$sql = "INSERT INTO tokens (sid, token, expire)" |
171 |
189 |
. " VALUES (@@sid@@, @@token@@, @@expire@@)"; |
. " VALUES (@@sid@@, @@token@@, @@expire@@)"; |
|
... |
... |
function rg_token_valid($db, $rg, $double_allowed) |
177 |
195 |
} |
} |
178 |
196 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
179 |
197 |
|
|
|
198 |
|
// This is an optimization to not look next time in db |
|
199 |
|
rg_cache_set($ukey, '1', RG_SOCKET_NO_WAIT); |
|
200 |
|
|
180 |
201 |
$ret = TRUE; |
$ret = TRUE; |
181 |
202 |
break; |
break; |
182 |
203 |
} |
} |
|
... |
... |
function rg_token_valid($db, $rg, $double_allowed) |
188 |
209 |
|
|
189 |
210 |
/* |
/* |
190 |
211 |
* Returns a token to be used on a form/url |
* Returns a token to be used on a form/url |
191 |
|
* We generate only one per form, but multiple per session. |
|
|
212 |
|
* We generate only one per form (tag is the id), but multiple per session. |
192 |
213 |
*/ |
*/ |
193 |
|
$rg_token = FALSE; |
|
194 |
|
function rg_token_get($db, $rg) |
|
|
214 |
|
function rg_token_get($db, $rg, $tag) |
195 |
215 |
{ |
{ |
196 |
|
global $rg_token; |
|
197 |
|
|
|
198 |
|
rg_log_enter("token_get: sid=" . $rg['sid']); |
|
|
216 |
|
rg_log_enter('token_get: sid=' . $rg['sid'] . ' tag=' . $tag |
|
217 |
|
. 'ua=' . $rg['ua']); |
199 |
218 |
|
|
200 |
219 |
$ret = FALSE; |
$ret = FALSE; |
201 |
220 |
while (1) { |
while (1) { |
202 |
221 |
if (empty($rg['sid'])) |
if (empty($rg['sid'])) |
203 |
222 |
break; |
break; |
204 |
223 |
|
|
205 |
|
if ($rg_token !== FALSE) { |
|
206 |
|
$ret = $rg_token; |
|
|
224 |
|
$key = 'sess' . '::' . $rg['sid'] . '::' . 'token' . '::' . $tag; |
|
225 |
|
$c = rg_cache_get($key); |
|
226 |
|
if ($c !== FALSE) { |
|
227 |
|
$ret = $c; |
207 |
228 |
break; |
break; |
208 |
229 |
} |
} |
209 |
230 |
|
|
210 |
|
$key = rg_token_get_master($db); |
|
211 |
|
if ($key === FALSE) |
|
|
231 |
|
$sign_key = rg_token_get_master($db); |
|
232 |
|
if ($sign_key === FALSE) |
212 |
233 |
break; |
break; |
213 |
234 |
|
|
214 |
235 |
$rand = rg_id(16); |
$rand = rg_id(16); |
215 |
|
$ua_hash = substr(sha512($rg['ua']), 0, 8); |
|
216 |
|
|
|
217 |
|
$data = $rand . $rg['sid'] . $ua_hash; |
|
218 |
|
$sign = hash_hmac("sha512", $data, $key); |
|
|
236 |
|
$data = $rand . $rg['sid'] . $rg['ua'] . $tag; |
|
237 |
|
$sign = hash_hmac('sha512', $data, $sign_key); |
219 |
238 |
if ($sign === FALSE) { |
if ($sign === FALSE) { |
220 |
239 |
rg_token_set_error("cannot compute hmac"); |
rg_token_set_error("cannot compute hmac"); |
221 |
240 |
break; |
break; |
222 |
241 |
} |
} |
223 |
242 |
$sign = substr($sign, 0, 16); |
$sign = substr($sign, 0, 16); |
224 |
|
$rg_token = $rand . $sign; |
|
225 |
|
$ret = $rg_token; |
|
|
243 |
|
$ret = $rand . $sign; |
|
244 |
|
$ret2 = $ret; |
|
245 |
|
|
|
246 |
|
if ($rg['debug']) |
|
247 |
|
$ret2 .= ':' . $tag; |
|
248 |
|
|
|
249 |
|
rg_cache_set($key, $ret2, RG_SOCKET_NO_WAIT); |
|
250 |
|
|
|
251 |
|
// Optimization to not look in database next time |
|
252 |
|
$key = 'sess' . '::' . $rg['sid'] . '::' . 'used_tokens' |
|
253 |
|
. '::' . $ret; |
|
254 |
|
rg_cache_set($key, '0', RG_SOCKET_NO_WAIT); |
|
255 |
|
|
|
256 |
|
$ret = $ret2; |
226 |
257 |
break; |
break; |
227 |
258 |
} |
} |
228 |
259 |
|
|
File inc/user.inc.php changed (mode: 100644) (index 7e935da..921d99d) |
... |
... |
function rg_user_lookup_by_old_name($db, $old_name) |
267 |
267 |
else |
else |
268 |
268 |
$ret = $row['uid']; |
$ret = $row['uid']; |
269 |
269 |
|
|
270 |
|
rg_cache_set("old_name::" . $old_name, $ret); |
|
|
270 |
|
rg_cache_set("old_name::" . $old_name, $ret, RG_SOCKET_NO_WAIT); |
271 |
271 |
break; |
break; |
272 |
272 |
} |
} |
273 |
273 |
|
|
|
... |
... |
function rg_user_insert_rename($db, $uid, $old_name) |
311 |
311 |
break; |
break; |
312 |
312 |
} |
} |
313 |
313 |
|
|
314 |
|
rg_cache_set("old_name::" . $old_name, $uid); |
|
|
314 |
|
rg_cache_set("old_name::" . $old_name, $uid, RG_SOCKET_NO_WAIT); |
315 |
315 |
|
|
316 |
316 |
$ret = TRUE; |
$ret = TRUE; |
317 |
317 |
break; |
break; |
|
... |
... |
function rg_user_edit($db, $d) |
506 |
506 |
// invalidate cache (because we may not have the password) |
// invalidate cache (because we may not have the password) |
507 |
507 |
// TODO: but, we can do a merge! |
// TODO: but, we can do a merge! |
508 |
508 |
if ($d['uid'] > 0) |
if ($d['uid'] > 0) |
509 |
|
rg_cache_unset("user::" . $d['uid']); |
|
|
509 |
|
rg_cache_unset('user::' . $d['uid'], RG_SOCKET_NO_WAIT); |
510 |
510 |
|
|
511 |
511 |
if ($d['uid'] == 0) { // add |
if ($d['uid'] == 0) { // add |
512 |
512 |
$event = array('category' => 2000, 'prio' => 50, |
$event = array('category' => 2000, 'prio' => 50, |
|
... |
... |
function rg_user_remove($db, $rg, $uid) |
570 |
570 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
571 |
571 |
|
|
572 |
572 |
// invalidate cache |
// invalidate cache |
573 |
|
rg_cache_unset("user::" . $uid); |
|
|
573 |
|
rg_cache_unset('user::' . $uid, RG_SOCKET_NO_WAIT); |
574 |
574 |
|
|
575 |
575 |
$ret = TRUE; |
$ret = TRUE; |
576 |
576 |
break; |
break; |
|
... |
... |
function rg_user_info($db, $uid, $user, $email) |
652 |
652 |
$ret = array_merge($ret, $row); |
$ret = array_merge($ret, $row); |
653 |
653 |
$ret['exists'] = 1; |
$ret['exists'] = 1; |
654 |
654 |
|
|
655 |
|
rg_cache_set("user::" . $ret['uid'], $ret); |
|
656 |
|
rg_cache_set("username_to_uid::" . $ret['username'], $ret['uid']); |
|
657 |
|
rg_cache_set("email_to_uid::" . $ret['email'], $ret['uid']); |
|
|
655 |
|
rg_cache_set("user::" . $ret['uid'], $ret, RG_SOCKET_NO_WAIT); |
|
656 |
|
rg_cache_set('username_to_uid::' . $ret['username'], |
|
657 |
|
$ret['uid'], RG_SOCKET_NO_WAIT); |
|
658 |
|
rg_cache_set('email_to_uid::' . $ret['email'], $ret['uid'], |
|
659 |
|
RG_SOCKET_NO_WAIT); |
658 |
660 |
break; |
break; |
659 |
661 |
} |
} |
660 |
662 |
|
|
|
... |
... |
function rg_user_suspend($db, $rg, $uid, $op) |
935 |
937 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
936 |
938 |
|
|
937 |
939 |
// update cache |
// update cache |
938 |
|
rg_cache_set("user::" . $uid . "::suspended", $v); |
|
|
940 |
|
// TODO: what if we cannot update? |
|
941 |
|
rg_cache_set("user::" . $uid . "::suspended", $v, RG_SOCKET_NO_WAIT); |
939 |
942 |
|
|
940 |
943 |
break; |
break; |
941 |
944 |
} |
} |
|
... |
... |
function rg_user_make_admin($db, $rg, $uid, $op) |
977 |
980 |
} |
} |
978 |
981 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
979 |
982 |
|
|
980 |
|
rg_cache_set("user::" . $uid . "::is_admin", 1); |
|
|
983 |
|
rg_cache_set("user::" . $uid . "::is_admin", 1, RG_SOCKET_NO_WAIT); |
981 |
984 |
|
|
982 |
985 |
$ret = TRUE; |
$ret = TRUE; |
983 |
986 |
break; |
break; |
|
... |
... |
function rg_user_forgot_pass_uid($db, $token) |
1133 |
1136 |
*/ |
*/ |
1134 |
1137 |
function rg_user_forgot_pass_mail_prepare($db, $email) |
function rg_user_forgot_pass_mail_prepare($db, $email) |
1135 |
1138 |
{ |
{ |
1136 |
|
rg_log("user_forgot_pass_mail_prepare: email=$email"); |
|
|
1139 |
|
rg_log_enter("user_forgot_pass_mail_prepare: email=$email"); |
1137 |
1140 |
|
|
1138 |
1141 |
$ret = array(); |
$ret = array(); |
1139 |
1142 |
$ret['ok'] = 0; |
$ret['ok'] = 0; |
|
... |
... |
function rg_user_set_pass($db, $uid, $pass) |
1280 |
1283 |
|
|
1281 |
1284 |
// Because we may not have info about the user in cache, |
// Because we may not have info about the user in cache, |
1282 |
1285 |
// we cannot do a merge. |
// we cannot do a merge. |
1283 |
|
rg_cache_unset("user::$uid"); |
|
|
1286 |
|
rg_cache_unset('user::' . $uid, RG_SOCKET_NO_WAIT); |
1284 |
1287 |
|
|
1285 |
1288 |
$ret = TRUE; |
$ret = TRUE; |
1286 |
1289 |
break; |
break; |
|
... |
... |
function rg_user_confirm($db, $token) |
1338 |
1341 |
} |
} |
1339 |
1342 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
1340 |
1343 |
|
|
1341 |
|
rg_cache_unset("user::" . $uid); |
|
|
1344 |
|
rg_cache_unset('user::' . $uid, RG_SOCKET_NO_WAIT); |
1342 |
1345 |
|
|
1343 |
1346 |
$ret = $uid; |
$ret = $uid; |
1344 |
1347 |
break; |
break; |
|
... |
... |
function rg_user_edit_high_level($db, &$rg) |
1490 |
1493 |
break; |
break; |
1491 |
1494 |
} |
} |
1492 |
1495 |
|
|
1493 |
|
if (!rg_token_valid($db, $rg, FALSE)) { |
|
|
1496 |
|
if (!rg_token_valid($db, $rg, 'user_edit_hl', FALSE)) { |
1494 |
1497 |
$errmsg[] = "invalid token; try again"; |
$errmsg[] = "invalid token; try again"; |
1495 |
1498 |
break; |
break; |
1496 |
1499 |
} |
} |
|
... |
... |
function rg_user_edit_high_level($db, &$rg) |
1518 |
1521 |
if (!empty($ui['pass'])) |
if (!empty($ui['pass'])) |
1519 |
1522 |
rg_security_violation_no_exit("User tried to" |
rg_security_violation_no_exit("User tried to" |
1520 |
1523 |
. " change pass using 'edit info' page."); |
. " change pass using 'edit info' page."); |
1521 |
|
$ui['pass'] = ""; |
|
|
1524 |
|
$ui['pass'] = ''; |
1522 |
1525 |
} |
} |
1523 |
1526 |
|
|
1524 |
1527 |
$r = rg_user_edit($db, $ui); |
$r = rg_user_edit($db, $ui); |
|
... |
... |
function rg_user_edit_high_level($db, &$rg) |
1543 |
1546 |
$rg['HTML:checkbox_rights'] = rg_rights_checkboxes("user", |
$rg['HTML:checkbox_rights'] = rg_rights_checkboxes("user", |
1544 |
1547 |
"rights", $ui['rights']); |
"rights", $ui['rights']); |
1545 |
1548 |
$rg['HTML:errmsg'] = rg_template_errmsg($errmsg); |
$rg['HTML:errmsg'] = rg_template_errmsg($errmsg); |
1546 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg); |
|
|
1549 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg, 'user_edit_hl'); |
1547 |
1550 |
$ret .= rg_template("user/add_edit.html", $rg, TRUE /* xss */); |
$ret .= rg_template("user/add_edit.html", $rg, TRUE /* xss */); |
1548 |
1551 |
} |
} |
1549 |
1552 |
|
|
File inc/user/repo/bug/show/show.php changed (mode: 100644) (index 9ad0863..98005dd) |
... |
... |
rg_log("FILE: /inc/user/repo/bug/show/show"); |
3 |
3 |
|
|
4 |
4 |
// TODO: security checks |
// TODO: security checks |
5 |
5 |
|
|
6 |
|
$_bug_show = ""; |
|
|
6 |
|
$_bug_show = ''; |
7 |
7 |
|
|
8 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg); |
|
9 |
|
$rg['HTML:bug_edit'] = ""; |
|
|
8 |
|
$rg['HTML:bug_edit'] = ''; |
|
9 |
|
$rg['HTML:button_error'] = ''; |
10 |
10 |
|
|
11 |
11 |
$ibug = rg_bug_info($db, $rg['ri']['repo_id'], $rg['bug']['bug_id']); |
$ibug = rg_bug_info($db, $rg['ri']['repo_id'], $rg['bug']['bug_id']); |
12 |
12 |
if ($ibug === FALSE) |
if ($ibug === FALSE) |
|
... |
... |
if ($ibug === FALSE) |
15 |
15 |
$rg['bug'] = array_merge($rg['bug'], $ibug); |
$rg['bug'] = array_merge($rg['bug'], $ibug); |
16 |
16 |
|
|
17 |
17 |
if ($ibug['exists'] != 1) { |
if ($ibug['exists'] != 1) { |
18 |
|
$_bug_body .= rg_template("repo/bug/not_found.html", $rg, TRUE /* xss */); |
|
|
18 |
|
$_bug_body .= rg_template("repo/bug/not_found.html", $rg, TRUE /*xss*/); |
19 |
19 |
return; |
return; |
20 |
20 |
} |
} |
21 |
21 |
|
|
|
... |
... |
$x['misc'] = ''; |
32 |
32 |
if ($ibug['deleted'] > 0) { |
if ($ibug['deleted'] > 0) { |
33 |
33 |
$x['needed_rights'] = 'd'; |
$x['needed_rights'] = 'd'; |
34 |
34 |
if (rg_rights_allow($db, $x) !== TRUE) { |
if (rg_rights_allow($db, $x) !== TRUE) { |
35 |
|
$_bug_body .= rg_template("repo/bug/deleted.html", $rg, TRUE /* xss */); |
|
|
35 |
|
$_bug_body .= rg_template("repo/bug/deleted.html", $rg, TRUE /*xss*/); |
36 |
36 |
return; |
return; |
37 |
37 |
} |
} |
38 |
38 |
} |
} |
|
... |
... |
if ($ibug['deleted'] > 0) { |
40 |
40 |
// load labels |
// load labels |
41 |
41 |
$labels = rg_bug_label_get($db, $rg['ri']['repo_id'], $rg['bug']['bug_id']); |
$labels = rg_bug_label_get($db, $rg['ri']['repo_id'], $rg['bug']['bug_id']); |
42 |
42 |
if ($labels === FALSE) |
if ($labels === FALSE) |
43 |
|
$rg['HTML:labels_html'] = "Cannot load labels!"; |
|
|
43 |
|
$rg['HTML:labels_html'] = rg_warning('Cannot load labels!', $rg); |
44 |
44 |
else |
else |
45 |
45 |
$rg['HTML:labels_html'] = rg_bug_label_html($db, $labels); |
$rg['HTML:labels_html'] = rg_bug_label_html($db, $labels); |
46 |
46 |
$rg['bug']['labels'] = implode(" ", $labels); |
$rg['bug']['labels'] = implode(" ", $labels); |
47 |
47 |
|
|
48 |
48 |
// edit |
// edit |
49 |
|
$rg['HTML:edit_form'] = rg_template("repo/bug/b_edit.html", $rg, TRUE /* xss */); |
|
|
49 |
|
$rg['rg_form_token_tag'] = 'bug_edit_hl'; |
|
50 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg, 'bug_edit_hl'); |
|
51 |
|
$rg['HTML:edit_form'] = rg_template("repo/bug/b_edit.html", $rg, TRUE /*xss*/); |
50 |
52 |
if (rg_var_uint("edit") == 1) |
if (rg_var_uint("edit") == 1) |
51 |
53 |
$rg['HTML:bug_edit'] = rg_bug_edit_high_level($db, $rg); |
$rg['HTML:bug_edit'] = rg_bug_edit_high_level($db, $rg); |
52 |
54 |
|
|
53 |
55 |
// close/re-open |
// close/re-open |
54 |
|
$close_reopen_error = ""; |
|
|
56 |
|
$close_reopen_error = ''; |
55 |
57 |
while (1) { |
while (1) { |
56 |
58 |
if (rg_var_uint("close_reopen") != 1) |
if (rg_var_uint("close_reopen") != 1) |
57 |
59 |
break; |
break; |
|
... |
... |
while (1) { |
62 |
64 |
if ($ibug['state'] == 1) { // reopen |
if ($ibug['state'] == 1) { // reopen |
63 |
65 |
$x['needed_rights'] = 'r'; |
$x['needed_rights'] = 'r'; |
64 |
66 |
if (rg_rights_allow($db, $x) !== TRUE) { |
if (rg_rights_allow($db, $x) !== TRUE) { |
65 |
|
rg_template("repo/bug/deny_reopen.html", $rg, TRUE /* xss */); |
|
|
67 |
|
rg_template("repo/bug/deny_reopen.html", $rg, TRUE /*xss*/); |
66 |
68 |
break; |
break; |
67 |
69 |
} |
} |
68 |
70 |
} else { // close |
} else { // close |
69 |
71 |
$x['needed_rights'] = 'C'; |
$x['needed_rights'] = 'C'; |
70 |
72 |
if (rg_rights_allow($db, $x) !== TRUE) { |
if (rg_rights_allow($db, $x) !== TRUE) { |
71 |
|
rg_template("repo/bug/deny_close.html", $rg, TRUE /* xss */); |
|
|
73 |
|
rg_template("repo/bug/deny_close.html", $rg, TRUE /*xss*/); |
72 |
74 |
break; |
break; |
73 |
75 |
} |
} |
74 |
76 |
} |
} |
75 |
77 |
|
|
76 |
78 |
if (!rg_valid_referer()) { |
if (!rg_valid_referer()) { |
77 |
|
$close_reopen_error = "Invalid referer; try again"; |
|
|
79 |
|
$close_reopen_error = rg_warning('Invalid referer; try again', $rg); |
78 |
80 |
break; |
break; |
79 |
81 |
} |
} |
80 |
82 |
|
|
81 |
|
if (!rg_token_valid($db, $rg, FALSE)) { |
|
82 |
|
$close_reopen_error = "Invalid token. Try again."; |
|
|
83 |
|
if (!rg_token_valid($db, $rg, 'close_reopen', FALSE)) { |
|
84 |
|
$close_reopen_error = rg_warning('Invalid token. Try again.', $rg); |
83 |
85 |
break; |
break; |
84 |
86 |
} |
} |
85 |
87 |
|
|
86 |
88 |
$ret = rg_bug_edit($db, $rg['login_ui'], $rg['ri'], $ibug); |
$ret = rg_bug_edit($db, $rg['login_ui'], $rg['ri'], $ibug); |
87 |
89 |
if ($ret === FALSE) { |
if ($ret === FALSE) { |
88 |
|
$close_reopen_error = "Cannot edit bug (" . rg_bug_error() . ")"; |
|
|
90 |
|
$close_reopen_error = rg_warning('Cannot edit bug (' . rg_bug_error() . ')', $rg); |
89 |
91 |
break; |
break; |
90 |
92 |
} |
} |
91 |
93 |
|
|
|
... |
... |
if ($ibug['state'] == 1) |
96 |
98 |
$t = "repo/bug/b_close.html"; |
$t = "repo/bug/b_close.html"; |
97 |
99 |
else |
else |
98 |
100 |
$t = "repo/bug/b_reopen.html"; |
$t = "repo/bug/b_reopen.html"; |
99 |
|
$rg['HTML:close_form'] = rg_template($t, $rg, TRUE /* xss */); |
|
100 |
|
$rg['HTML:button_error'] = rg_warning($close_reopen_error, $rg); |
|
|
101 |
|
$rg['rg_form_token_tag'] = 'close_reopen'; |
|
102 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg, 'close_reopen'); |
|
103 |
|
$rg['HTML:close_form'] = rg_template($t, $rg, TRUE /*xss*/); |
|
104 |
|
if (!empty($close_reopen_error)) |
|
105 |
|
$rg['HTML:button_error'] = $close_reopen_error; |
|
106 |
|
|
101 |
107 |
|
|
102 |
108 |
// 'add_note' must be unconditionally included because we must insert the form |
// 'add_note' must be unconditionally included because we must insert the form |
103 |
109 |
include($INC . "/user/repo/bug/show/add_note.php"); |
include($INC . "/user/repo/bug/show/add_note.php"); |
|
... |
... |
include($INC . "/user/repo/bug/show/add_note.php"); |
106 |
112 |
$notes = rg_bug_note_list($db, $rg['ri']['repo_id'], |
$notes = rg_bug_note_list($db, $rg['ri']['repo_id'], |
107 |
113 |
$rg['bug']['bug_id'], 0); |
$rg['bug']['bug_id'], 0); |
108 |
114 |
if ($notes === FALSE) |
if ($notes === FALSE) |
109 |
|
$rg['HTML:notes'] = "Cannot load notes!"; |
|
|
115 |
|
$rg['HTML:notes'] = rg_warning('Cannot load notes!', $rg); |
110 |
116 |
else |
else |
111 |
117 |
$rg['HTML:notes'] = rg_template_table("repo/bug/list_note", $notes, $rg); |
$rg['HTML:notes'] = rg_template_table("repo/bug/list_note", $notes, $rg); |
112 |
118 |
|
|
|
119 |
|
|
113 |
120 |
// watch |
// watch |
114 |
|
$watch_body = ""; |
|
|
121 |
|
$watch_error = ''; |
115 |
122 |
$watch = rg_watch_load($db, "bug", $rg['login_ui']['uid'], $rg['ri']['repo_id'], |
$watch = rg_watch_load($db, "bug", $rg['login_ui']['uid'], $rg['ri']['repo_id'], |
116 |
123 |
$rg['bug']['bug_id']); |
$rg['bug']['bug_id']); |
117 |
124 |
if ($watch === FALSE) { |
if ($watch === FALSE) { |
118 |
|
$watch_body .= rg_warning("Internal error."); |
|
|
125 |
|
$watch_error = rg_warning("Internal error."); |
119 |
126 |
} else { |
} else { |
120 |
|
if ($watch === 0) { |
|
121 |
|
// user does not watch the bug, present 'watch' form |
|
122 |
|
if (rg_var_uint("watch") == 1) { |
|
123 |
|
// user pressed watch button |
|
124 |
|
$r = rg_watch_add($db, "bug", $rg['login_ui']['uid'], |
|
125 |
|
$rg['ri']['repo_id'], $rg['bug']['bug_id']); |
|
126 |
|
if ($r === FALSE) |
|
127 |
|
rg_internal_error("TODO: find something here"); |
|
128 |
|
$watch = 1; |
|
|
127 |
|
while (1) { |
|
128 |
|
if (rg_var_uint('watch_doit') != 1) |
|
129 |
|
break; |
|
130 |
|
|
|
131 |
|
if (rg_var_uint('watch') == $watch) { |
|
132 |
|
rg_log('Already in propoer state'); |
|
133 |
|
break; |
|
134 |
|
} |
|
135 |
|
|
|
136 |
|
if (!rg_valid_referer()) { |
|
137 |
|
$watch_error = rg_warning('Invalid referer; try again', $rg); |
|
138 |
|
break; |
|
139 |
|
} |
|
140 |
|
|
|
141 |
|
if (!rg_token_valid($db, $rg, 'bug_watch', FALSE)) { |
|
142 |
|
$watch_error = rg_warning('Invalid token. Try again.', $rg); |
|
143 |
|
break; |
129 |
144 |
} |
} |
130 |
|
} else { |
|
131 |
|
// user is already watching the bug, present 'unwatch' option |
|
132 |
|
if (rg_var_uint("unwatch") == 1) { |
|
133 |
|
// user pressed unwatch button |
|
134 |
|
$r = rg_watch_del($db, "bug", $rg['login_ui']['uid'], |
|
|
145 |
|
|
|
146 |
|
if (rg_var_uint('watch') == 1) |
|
147 |
|
$r = rg_watch_add($db, 'bug', $rg['login_ui']['uid'], |
|
148 |
|
$rg['ri']['repo_id'], $rg['bug']['bug_id']); |
|
149 |
|
else |
|
150 |
|
$r = rg_watch_del($db, 'bug', $rg['login_ui']['uid'], |
135 |
151 |
$rg['ri']['repo_id'], $rg['bug']['bug_id']); |
$rg['ri']['repo_id'], $rg['bug']['bug_id']); |
136 |
|
if ($r === FALSE) |
|
137 |
|
rg_internal_error("TODO: find something here"); |
|
138 |
|
$watch = 0; |
|
|
152 |
|
if ($r === FALSE) { |
|
153 |
|
$watch_error = rg_warning('Internal error. Try again', $rg); |
|
154 |
|
break; |
139 |
155 |
} |
} |
|
156 |
|
|
|
157 |
|
$watch = 1 - $watch; |
|
158 |
|
|
|
159 |
|
break; |
140 |
160 |
} |
} |
141 |
161 |
|
|
142 |
|
if ($watch == 0) |
|
143 |
|
$t = "repo/bug/b_watch.html"; |
|
144 |
|
else |
|
145 |
|
$t = "repo/bug/b_unwatch.html"; |
|
146 |
|
$r = rg_template($t, $rg, TRUE /* xss */); |
|
147 |
|
if ($r !== FALSE) |
|
148 |
|
$watch_body .= $r; |
|
|
162 |
|
$rg['rg_form_token_tag'] = 'bug_watch'; |
|
163 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg, 'bug_watch'); |
|
164 |
|
$rg['bug']['watch'] = 1 - $watch; |
|
165 |
|
$rg['HTML:watch_form'] = rg_template('repo/bug/b_watch.html', |
|
166 |
|
$rg, TRUE /*xss*/); |
149 |
167 |
} |
} |
150 |
|
$rg['HTML:watch_form'] = $watch_body; |
|
|
168 |
|
if (!empty($delete_error)) |
|
169 |
|
$rg['HTML:watch_error'] = $delete_error; |
151 |
170 |
|
|
152 |
|
// delete |
|
153 |
|
$delete_error = ""; |
|
154 |
|
while (1) { |
|
|
171 |
|
|
|
172 |
|
// delete/undelete |
|
173 |
|
$delete_error = ''; |
|
174 |
|
$del = $rg['bug']['deleted'] > 0; |
|
175 |
|
while (rg_var_uint('del_doit') == 1) { |
|
176 |
|
// 1 = del, 2 = undel |
155 |
177 |
$del_undel = rg_var_uint("del_undel"); |
$del_undel = rg_var_uint("del_undel"); |
156 |
|
if ($del_undel == 0) |
|
|
178 |
|
|
|
179 |
|
if (($del_undel == 1) && $del) |
157 |
180 |
break; |
break; |
158 |
181 |
|
|
159 |
|
$x['needed_rights'] = 'd'; |
|
160 |
|
if (rg_rights_allow($db, $x) !== TRUE) { |
|
161 |
|
$delete_error = rg_template("repo/bug/deny_delete.html", $rg, TRUE /* xss */); |
|
|
182 |
|
if (($del_undel == 2) && !$del) |
162 |
183 |
break; |
break; |
163 |
|
} |
|
164 |
184 |
|
|
165 |
185 |
if (!rg_valid_referer()) { |
if (!rg_valid_referer()) { |
166 |
186 |
$delete_error = rg_warning("Invalid referer; try again", $rg); |
$delete_error = rg_warning("Invalid referer; try again", $rg); |
167 |
187 |
break; |
break; |
168 |
188 |
} |
} |
169 |
189 |
|
|
170 |
|
if (!rg_token_valid($db, $rg, FALSE)) { |
|
|
190 |
|
if (!rg_token_valid($db, $rg, 'del_undel', FALSE)) { |
171 |
191 |
$delete_error = rg_warning("Invalid token; try again.", $rg); |
$delete_error = rg_warning("Invalid token; try again.", $rg); |
172 |
192 |
break; |
break; |
173 |
193 |
} |
} |
174 |
194 |
|
|
175 |
|
$ret = rg_bug_delete_undelete($db, $rg['login_ui']['uid'], |
|
|
195 |
|
$x['needed_rights'] = 'd'; |
|
196 |
|
if (rg_rights_allow($db, $x) !== TRUE) { |
|
197 |
|
$delete_error = rg_template("repo/bug/deny_delete.html", |
|
198 |
|
$rg, TRUE /*xss*/); |
|
199 |
|
break; |
|
200 |
|
} |
|
201 |
|
|
|
202 |
|
$r = rg_bug_delete_undelete($db, $rg['login_ui']['uid'], |
176 |
203 |
$rg['ri']['repo_id'], $ibug['bug_id'], $del_undel); |
$rg['ri']['repo_id'], $ibug['bug_id'], $del_undel); |
177 |
|
if ($ret === FALSE) { |
|
|
204 |
|
if ($r === FALSE) { |
178 |
205 |
$delete_error = rg_warning(rg_bug_error(), $rg); |
$delete_error = rg_warning(rg_bug_error(), $rg); |
179 |
206 |
break; |
break; |
180 |
207 |
} |
} |
|
208 |
|
|
|
209 |
|
$del = 1 - $del; |
181 |
210 |
break; |
break; |
182 |
211 |
} |
} |
183 |
|
$rg['HTML:button_error'] = $delete_error; |
|
|
212 |
|
$rg['rg_form_token_tag'] = 'del_undel:' . $rg['rg_form_token']; |
|
213 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg, 'del_undel'); |
|
214 |
|
$rg['bug']['del'] = 1 - $del; |
|
215 |
|
$rg['HTML:del_form'] = rg_template('repo/bug/b_del.html', $rg, TRUE /*xss*/); |
|
216 |
|
if (!empty($delete_error)) |
|
217 |
|
$rg['HTML:button_error'] = $delete_error; |
184 |
218 |
|
|
185 |
219 |
|
|
186 |
220 |
// We must look it up again because it can be edited above; no prob, is in cache |
// We must look it up again because it can be edited above; no prob, is in cache |
|
... |
... |
if ($ibug === FALSE) |
189 |
223 |
rg_fatal("Cannot lookup bug!"); |
rg_fatal("Cannot lookup bug!"); |
190 |
224 |
$rg = rg_array_merge($rg, "bug", $ibug); |
$rg = rg_array_merge($rg, "bug", $ibug); |
191 |
225 |
|
|
192 |
|
$_bug_show .= rg_template("repo/bug/show.html", $rg, TRUE /* xss */); |
|
|
226 |
|
$_bug_show .= rg_template("repo/bug/show.html", $rg, TRUE /*xss*/); |
193 |
227 |
?> |
?> |
File inc/util.inc.php changed (mode: 100644) (index 7df267a..dd45fc0) |
... |
... |
require_once($INC . "/log.inc.php"); |
5 |
5 |
set_error_handler("rg_error_handler"); |
set_error_handler("rg_error_handler"); |
6 |
6 |
register_shutdown_function("rg_error_shutdown"); |
register_shutdown_function("rg_error_shutdown"); |
7 |
7 |
|
|
|
8 |
|
define('RG_SOCKET_NO_WAIT', 0x01); |
|
9 |
|
|
8 |
10 |
$rg_util_error = ""; |
$rg_util_error = ""; |
9 |
11 |
|
|
10 |
12 |
function rg_util_set_error($str) |
function rg_util_set_error($str) |
|
... |
... |
function rg_template_find_true_and_false(&$s, $off, &$true_start, &$true_end, |
580 |
582 |
//rg_log("DEBUG: cannot find '{{'"); |
//rg_log("DEBUG: cannot find '{{'"); |
581 |
583 |
} |
} |
582 |
584 |
|
|
583 |
|
rg_log_exit(); |
|
|
585 |
|
//rg_log_exit(); |
584 |
586 |
return 0; |
return 0; |
585 |
587 |
} |
} |
586 |
588 |
|
|
|
... |
... |
function rg_template($file, &$data, $xss_protection) |
760 |
762 |
} |
} |
761 |
763 |
|
|
762 |
764 |
$body = rg_file_get_contents($xfile); |
$body = rg_file_get_contents($xfile); |
763 |
|
if (empty($body)) { |
|
764 |
|
rg_log("File [$xfile] is empty. Return ''."); |
|
|
765 |
|
if (empty($body)) |
765 |
766 |
break; |
break; |
766 |
|
} |
|
767 |
767 |
|
|
768 |
768 |
$ret = rg_template_string($body, 0, $data, $xss_protection); |
$ret = rg_template_string($body, 0, $data, $xss_protection); |
769 |
769 |
break; |
break; |
|
... |
... |
$rg_socket_cache = array(); |
1295 |
1295 |
*/ |
*/ |
1296 |
1296 |
function rg_socket_recv_wait($socket, $wait, $timeout) |
function rg_socket_recv_wait($socket, $wait, $timeout) |
1297 |
1297 |
{ |
{ |
|
1298 |
|
rg_prof_start('sock_recv_wait'); |
|
1299 |
|
|
1298 |
1300 |
$ret = FALSE; |
$ret = FALSE; |
1299 |
1301 |
|
|
1300 |
1302 |
if ($timeout === NULL) { |
if ($timeout === NULL) { |
|
... |
... |
function rg_socket_recv_wait($socket, $wait, $timeout) |
1341 |
1343 |
break; |
break; |
1342 |
1344 |
} |
} |
1343 |
1345 |
|
|
|
1346 |
|
rg_prof_end('sock_recv_wait'); |
1344 |
1347 |
return $ret; |
return $ret; |
1345 |
1348 |
} |
} |
1346 |
1349 |
|
|
|
... |
... |
function rg_socket_recv_wait($socket, $wait, $timeout) |
1350 |
1353 |
*/ |
*/ |
1351 |
1354 |
function rg_socket_send($socket, $buf) |
function rg_socket_send($socket, $buf) |
1352 |
1355 |
{ |
{ |
|
1356 |
|
rg_prof_start('socket_send'); |
|
1357 |
|
|
1353 |
1358 |
$ret = FALSE; |
$ret = FALSE; |
1354 |
1359 |
$len = strlen($buf); |
$len = strlen($buf); |
1355 |
1360 |
$off = 0; |
$off = 0; |
|
... |
... |
function rg_socket_send($socket, $buf) |
1368 |
1373 |
} |
} |
1369 |
1374 |
} |
} |
1370 |
1375 |
|
|
|
1376 |
|
rg_prof_end('socket_send'); |
1371 |
1377 |
return $ret; |
return $ret; |
1372 |
1378 |
} |
} |
1373 |
1379 |
|
|
|
... |
... |
function rg_socket_send($socket, $buf) |
1377 |
1383 |
is 0, we do not wait for an answer. If is NULL, we wait forever. |
is 0, we do not wait for an answer. If is NULL, we wait forever. |
1378 |
1384 |
* @tries - how many time to retry if it fails |
* @tries - how many time to retry if it fails |
1379 |
1385 |
*/ |
*/ |
1380 |
|
function rg_socket($path, $buf, $timeout, $tries) |
|
|
1386 |
|
function rg_socket($path, $buf, $timeout, $tries, $flags) |
1381 |
1387 |
{ |
{ |
1382 |
1388 |
global $rg_socket_cache; |
global $rg_socket_cache; |
1383 |
1389 |
|
|
1384 |
|
rg_prof_start("socket"); |
|
|
1390 |
|
rg_prof_start('socket'); |
1385 |
1391 |
|
|
1386 |
1392 |
$ret = FALSE; |
$ret = FALSE; |
1387 |
1393 |
while ($tries > 0) { |
while ($tries > 0) { |
1388 |
1394 |
if (isset($rg_socket_cache[$path])) { |
if (isset($rg_socket_cache[$path])) { |
1389 |
1395 |
$socket = $rg_socket_cache[$path]; |
$socket = $rg_socket_cache[$path]; |
1390 |
1396 |
} else { |
} else { |
|
1397 |
|
rg_prof_start('sock_create'); |
1391 |
1398 |
$socket = @socket_create(AF_UNIX, SOCK_STREAM, 0); |
$socket = @socket_create(AF_UNIX, SOCK_STREAM, 0); |
1392 |
1399 |
if ($socket === FALSE) { |
if ($socket === FALSE) { |
1393 |
1400 |
rg_log("Could not create socket (" . socket_strerror(socket_last_error()) . ")!"); |
rg_log("Could not create socket (" . socket_strerror(socket_last_error()) . ")!"); |
|
... |
... |
function rg_socket($path, $buf, $timeout, $tries) |
1395 |
1402 |
} |
} |
1396 |
1403 |
|
|
1397 |
1404 |
while ($tries > 0) { |
while ($tries > 0) { |
|
1405 |
|
rg_prof_start('sock_conn'); |
1398 |
1406 |
$r = @socket_connect($socket, $path); |
$r = @socket_connect($socket, $path); |
|
1407 |
|
rg_prof_end('sock_conn'); |
1399 |
1408 |
if ($r === FALSE) { |
if ($r === FALSE) { |
1400 |
1409 |
$tries--; |
$tries--; |
1401 |
1410 |
usleep(50 * 1000); |
usleep(50 * 1000); |
|
... |
... |
function rg_socket($path, $buf, $timeout, $tries) |
1408 |
1417 |
rg_log("Could not connect the socket (" . socket_strerror(socket_last_error()) . ")!"); |
rg_log("Could not connect the socket (" . socket_strerror(socket_last_error()) . ")!"); |
1409 |
1418 |
break; |
break; |
1410 |
1419 |
} |
} |
|
1420 |
|
rg_prof_end('sock_create'); |
1411 |
1421 |
|
|
1412 |
1422 |
$rg_socket_cache[$path] = $socket; |
$rg_socket_cache[$path] = $socket; |
1413 |
1423 |
} |
} |
|
... |
... |
function rg_socket($path, $buf, $timeout, $tries) |
1419 |
1429 |
continue; |
continue; |
1420 |
1430 |
} |
} |
1421 |
1431 |
|
|
1422 |
|
if ($timeout === 0) { |
|
1423 |
|
rg_log("We do not have to wait. Exit."); |
|
1424 |
|
$ret = ""; |
|
|
1432 |
|
if ($flags & RG_SOCKET_NO_WAIT) { |
|
1433 |
|
//rg_log('We do not have to wait. Exit.'); |
|
1434 |
|
$ret = ''; |
1425 |
1435 |
break; |
break; |
1426 |
1436 |
} |
} |
1427 |
1437 |
|
|
File root/index.php changed (mode: 100644) (index e5dc14c..778dd1c) |
... |
... |
$rg['rg_account_allow_creation'] = $rg_account_allow_creation; |
43 |
43 |
|
|
44 |
44 |
// Init variables |
// Init variables |
45 |
45 |
$THEME_URL = "/themes/" . $rg_theme; |
$THEME_URL = "/themes/" . $rg_theme; |
|
46 |
|
$rg['rg_redirect_html'] = 0; |
46 |
47 |
$rg['rg_theme_url'] = $THEME_URL; |
$rg['rg_theme_url'] = $THEME_URL; |
47 |
48 |
$rg['login_ui'] = array(); |
$rg['login_ui'] = array(); |
48 |
49 |
$rg['target_ui'] = array("ok" => 1, "exists" => 0, "uid" => 0); |
$rg['target_ui'] = array("ok" => 1, "exists" => 0, "uid" => 0); |
|
... |
... |
$rg['ri'] = array("repo_id" => 0, "uid" => 0); |
50 |
51 |
$rg['bug'] = array("bug_id" => 0); |
$rg['bug'] = array("bug_id" => 0); |
51 |
52 |
$rg['HTML:submenu1'] = ""; |
$rg['HTML:submenu1'] = ""; |
52 |
53 |
$rg['HTML:submenu2'] = ""; |
$rg['HTML:submenu2'] = ""; |
|
54 |
|
$rg['debug'] = rg_var_uint('rg_debug'); |
53 |
55 |
|
|
54 |
56 |
// We have variable 'vv' passed from webserver - build 'op' and rest of paras |
// We have variable 'vv' passed from webserver - build 'op' and rest of paras |
55 |
57 |
$sparas = rg_var_str("vv"); |
$sparas = rg_var_str("vv"); |
|
... |
... |
if ($r === FALSE) { |
146 |
148 |
|
|
147 |
149 |
if ($rg['login_ui']['uid'] > 0) { |
if ($rg['login_ui']['uid'] > 0) { |
148 |
150 |
$rg['login_ui']['homepage'] = rg_re_userpage($rg['login_ui']); |
$rg['login_ui']['homepage'] = rg_re_userpage($rg['login_ui']); |
149 |
|
$rg['logout_token'] = rg_token_get($db, $rg); |
|
|
151 |
|
$rg['logout_token'] = rg_token_get($db, $rg, 'logout'); |
150 |
152 |
} else { |
} else { |
151 |
153 |
$rg['login_ui']['username'] = ""; |
$rg['login_ui']['username'] = ""; |
152 |
154 |
$rg['login_ui']['homepage'] = ""; |
$rg['login_ui']['homepage'] = ""; |
|
... |
... |
header('Cache-Control: private, no-cache'); |
161 |
163 |
|
|
162 |
164 |
// Caching |
// Caching |
163 |
165 |
$proto = rg_var_str('SERVER_PROTOCOL'); |
$proto = rg_var_str('SERVER_PROTOCOL'); |
164 |
|
rg_log('DEBUG: proto=' . $proto); |
|
165 |
166 |
if (strcmp($proto, 'HTTP/1.1') == 0) { |
if (strcmp($proto, 'HTTP/1.1') == 0) { |
166 |
167 |
$we_have = sha1($_c); |
$we_have = sha1($_c); |
167 |
168 |
if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) |
if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) |
|
... |
... |
if (strcmp($proto, 'HTTP/1.1') == 0) { |
172 |
173 |
if (strcmp($client_have, $we_have) == 0) { |
if (strcmp($client_have, $we_have) == 0) { |
173 |
174 |
rg_log('CACHE: Client has the right version'); |
rg_log('CACHE: Client has the right version'); |
174 |
175 |
header('HTTP/1.1 304 Not modified'); |
header('HTTP/1.1 304 Not modified'); |
175 |
|
header('ETag: ' . $we_have); |
|
176 |
176 |
} else { |
} else { |
177 |
|
rg_log('CACHE: Client has NOT the right version [' . $client_have . ']'); |
|
178 |
177 |
header('ETag: ' . $we_have); |
header('ETag: ' . $we_have); |
179 |
178 |
echo $_c; |
echo $_c; |
180 |
179 |
} |
} |
181 |
180 |
} else { |
} else { |
|
181 |
|
rg_log('WARN: Un-handled protocol ' . $proto); |
182 |
182 |
echo $_c; |
echo $_c; |
183 |
183 |
} |
} |
184 |
184 |
|
|
File tests/http.inc.php changed (mode: 100644) (index 5db8725..fcc73ba) |
... |
... |
function do_req($url, &$data, &$headers) |
21 |
21 |
rg_log_ml("do_req url[$url] data=" . print_r($data, TRUE) |
rg_log_ml("do_req url[$url] data=" . print_r($data, TRUE) |
22 |
22 |
. "headers=" . print_r($headers, TRUE)); |
. "headers=" . print_r($headers, TRUE)); |
23 |
23 |
|
|
|
24 |
|
if (!strstr($url, '?')) |
|
25 |
|
$url .= '?rg_debug=1'; |
|
26 |
|
else |
|
27 |
|
$url .= '&rg_debug=1'; |
|
28 |
|
rg_log('DEBUG: url=' . $url); |
|
29 |
|
|
24 |
30 |
$c = curl_init($url); |
$c = curl_init($url); |
25 |
31 |
if (count($data) > 0) { |
if (count($data) > 0) { |
26 |
32 |
curl_setopt($c, CURLOPT_POST, 1); |
curl_setopt($c, CURLOPT_POST, 1); |
|
... |
... |
function do_req($url, &$data, &$headers) |
76 |
82 |
} |
} |
77 |
83 |
|
|
78 |
84 |
// Check for XSS |
// Check for XSS |
79 |
|
if (strstr($ret['body'], '<xss>')) { |
|
|
85 |
|
if (stristr($ret['body'], '<xss>')) { |
80 |
86 |
file_put_contents('http_xss.out', $ret['body']); |
file_put_contents('http_xss.out', $ret['body']); |
81 |
87 |
rg_log("Found <xss> token! Check http_xss.out. Not good!"); |
rg_log("Found <xss> token! Check http_xss.out. Not good!"); |
82 |
88 |
exit(1); |
exit(1); |
83 |
89 |
} |
} |
84 |
90 |
|
|
85 |
|
// find token |
|
86 |
|
$x = preg_match('/ name="token" value="([a-zA-Z0-9]*)"/', $ret['body'], $matches); |
|
|
91 |
|
$ret['tokens'] = array(); |
|
92 |
|
$x = preg_match_all('/ name="token" value="([a-zA-Z0-9_:]*)"/', $ret['body'], $matches); |
|
93 |
|
//rg_log_ml('DEBUG: matches: ' . print_r($matches, TRUE)); |
87 |
94 |
if (($x === FALSE) || (!isset($matches[1]))) { |
if (($x === FALSE) || (!isset($matches[1]))) { |
88 |
95 |
//rg_log("CHECK: no token found"); |
//rg_log("CHECK: no token found"); |
89 |
|
$ret['token'] = ""; |
|
90 |
96 |
} else { |
} else { |
91 |
|
$ret['token'] = $matches[1]; |
|
|
97 |
|
foreach ($matches[1] as $m) { |
|
98 |
|
$t = explode(':', $m); |
|
99 |
|
if (!isset($t[1])) { |
|
100 |
|
rg_log('Invalid debug token: ' . $m); |
|
101 |
|
exit(1); |
|
102 |
|
} |
|
103 |
|
$ret['tokens'][$t[1]] = $t[0]; |
|
104 |
|
} |
92 |
105 |
} |
} |
|
106 |
|
rg_log_ml('DEBUG ret[tokens]: ' . print_r($ret['tokens'], TRUE)); |
93 |
107 |
|
|
94 |
108 |
// find logout token |
// find logout token |
95 |
|
$x = preg_match('/logout\?token=([a-zA-Z0-9]*)"/', $ret['body'], $matches); |
|
|
109 |
|
$x = preg_match('/logout\?token=([a-zA-Z0-9:]*)"/', $ret['body'], $matches); |
|
110 |
|
//rg_log_ml('DEBUG: matches[logout]: ' . print_r($matches, TRUE)); |
96 |
111 |
if (($x === FALSE) || (!isset($matches[1]))) { |
if (($x === FALSE) || (!isset($matches[1]))) { |
97 |
|
$ret['logout_token'] = ""; |
|
|
112 |
|
$ret['tokens']['logout'] = ''; |
98 |
113 |
} else { |
} else { |
99 |
|
$ret['logout_token'] = $matches[1]; |
|
|
114 |
|
$t = explode(':', $matches[1]); |
|
115 |
|
$ret['tokens']['logout'] = $t[0]; |
100 |
116 |
} |
} |
101 |
117 |
|
|
102 |
118 |
$x = preg_match('/Location: (.*)\s/', $ret['header'], $matches); |
$x = preg_match('/Location: (.*)\s/', $ret['header'], $matches); |
|
... |
... |
function do_req($url, &$data, &$headers) |
116 |
132 |
return $f; |
return $f; |
117 |
133 |
} |
} |
118 |
134 |
|
|
|
135 |
|
@rename('http-last.out', 'http-prev.out'); |
|
136 |
|
file_put_contents('http-last.out', $ret['body']); |
|
137 |
|
|
119 |
138 |
return $ret; |
return $ret; |
120 |
139 |
} |
} |
121 |
140 |
|
|
|
... |
... |
function test_login($url, $rg_ui, &$good_sid) |
136 |
155 |
return FALSE; |
return FALSE; |
137 |
156 |
} |
} |
138 |
157 |
$good_sid = $r['sid']; |
$good_sid = $r['sid']; |
139 |
|
$good_token = $r['token']; |
|
|
158 |
|
$good_token = $r['tokens']['login']; |
140 |
159 |
rg_log("good: sid=$good_sid token=$good_token"); |
rg_log("good: sid=$good_sid token=$good_token"); |
141 |
160 |
if (strncmp($good_sid, "X", 1) != 0) { |
if (strncmp($good_sid, "X", 1) != 0) { |
142 |
161 |
rg_log("Seems we did not get a pre-login session!"); |
rg_log("Seems we did not get a pre-login session!"); |
|
... |
... |
function test_restore($db) |
188 |
207 |
} |
} |
189 |
208 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
190 |
209 |
|
|
191 |
|
rg_cache_unset("user::4"); |
|
|
210 |
|
rg_cache_unset('user::4', RG_SOCKET_NO_WAIT); |
192 |
211 |
} |
} |
193 |
212 |
|
|
194 |
213 |
/* |
/* |
File tests/http_bug.php changed (mode: 100644) (index 9802330..fc08ebc) |
... |
... |
if ($r === FALSE) |
27 |
27 |
exit(1); |
exit(1); |
28 |
28 |
|
|
29 |
29 |
|
|
30 |
|
rg_log("Loading bug form..."); |
|
|
30 |
|
rg_log(''); |
|
31 |
|
rg_log_enter("Loading bug form..."); |
31 |
32 |
$url = "/user/" . $u1['username'] . "/" . $repo['name'] . "/bug/add"; |
$url = "/user/" . $u1['username'] . "/" . $repo['name'] . "/bug/add"; |
32 |
33 |
$headers = array("Cookie: sid=" . $good_sid); |
$headers = array("Cookie: sid=" . $good_sid); |
33 |
34 |
$data = array(); |
$data = array(); |
|
... |
... |
if ($r === FALSE) { |
36 |
37 |
rg_log('Cannot load add bug form.'); |
rg_log('Cannot load add bug form.'); |
37 |
38 |
exit(1); |
exit(1); |
38 |
39 |
} |
} |
39 |
|
$token = $r['token']; |
|
|
40 |
|
$token = $r['tokens']['bug_edit_hl']; |
40 |
41 |
if (empty($token)) { |
if (empty($token)) { |
41 |
|
rg_log_ml(print_r($r, TRUE)); |
|
42 |
42 |
rg_log("Seems I cannot load a token. See above."); |
rg_log("Seems I cannot load a token. See above."); |
43 |
43 |
exit(1); |
exit(1); |
44 |
44 |
} |
} |
|
45 |
|
rg_log_exit(); |
45 |
46 |
|
|
46 |
|
rg_log("Posting bug form (token=$token)..."); |
|
|
47 |
|
rg_log(''); |
|
48 |
|
rg_log_enter("Posting bug form (token=$token)..."); |
47 |
49 |
$labels = array('a/b', 'uu::bb', '<xss>'); sort($labels); |
$labels = array('a/b', 'uu::bb', '<xss>'); sort($labels); |
48 |
50 |
$data = array('doit' => 1, 'edit' => 1, 'token' => $token, |
$data = array('doit' => 1, 'edit' => 1, 'token' => $token, |
49 |
51 |
'title' => 'Title1 space<xss>', |
'title' => 'Title1 space<xss>', |
|
... |
... |
if (strcmp($p1, $p2) != 0) { |
89 |
91 |
rg_log('Labels are different [' . $p1 . '] != [' . $p2 . ']!'); |
rg_log('Labels are different [' . $p1 . '] != [' . $p2 . ']!'); |
90 |
92 |
exit(1); |
exit(1); |
91 |
93 |
} |
} |
|
94 |
|
rg_log_exit(); |
92 |
95 |
|
|
93 |
96 |
|
|
94 |
|
rg_log("Testing adding a note"); |
|
|
97 |
|
rg_log(''); |
|
98 |
|
rg_log_enter("Testing adding a note"); |
95 |
99 |
|
|
96 |
|
rg_log("Loading bug/note form..."); |
|
|
100 |
|
rg_log_enter("Loading bug/note form..."); |
97 |
101 |
$url = "/user/" . $u1['username'] . "/" . $repo['name'] . "/bug/1"; |
$url = "/user/" . $u1['username'] . "/" . $repo['name'] . "/bug/1"; |
98 |
102 |
$data = array('_test' => 'adding a note'); |
$data = array('_test' => 'adding a note'); |
99 |
103 |
$r = do_req($test_url . $url, $data, $headers); |
$r = do_req($test_url . $url, $data, $headers); |
|
... |
... |
if ($r === FALSE) { |
101 |
105 |
rg_log("Cannot load bug page."); |
rg_log("Cannot load bug page."); |
102 |
106 |
exit(1); |
exit(1); |
103 |
107 |
} |
} |
104 |
|
$token = $r['token']; |
|
|
108 |
|
if (!isset($r['tokens']['note_add'])) { |
|
109 |
|
rg_log('note_add token not present!'); |
|
110 |
|
exit(1); |
|
111 |
|
} |
|
112 |
|
$token = $r['tokens']['note_add']; |
|
113 |
|
rg_log_exit(); |
105 |
114 |
|
|
106 |
|
rg_log("Posting note add form (token=$token)..."); |
|
|
115 |
|
rg_log_enter("Posting note add form (token=$token)..."); |
107 |
116 |
$note = 'This is a note<xss>'; |
$note = 'This is a note<xss>'; |
108 |
117 |
$data = array('note_add_doit' => 1, 'token' => $token, |
$data = array('note_add_doit' => 1, 'token' => $token, |
109 |
118 |
'note' => $note, |
'note' => $note, |
|
... |
... |
if ($row['uid'] != $u1['uid']) { |
126 |
135 |
rg_log('uid is not ok [' . $row['uid'] . '] != [' . $u1['uid'] . ']!'); |
rg_log('uid is not ok [' . $row['uid'] . '] != [' . $u1['uid'] . ']!'); |
127 |
136 |
exit(1); |
exit(1); |
128 |
137 |
} |
} |
|
138 |
|
rg_log_exit(); |
129 |
139 |
|
|
|
140 |
|
rg_log_exit(); |
130 |
141 |
|
|
131 |
|
// Test closing a bug |
|
132 |
|
$token = $r['token']; |
|
133 |
|
rg_log("Posting close bug form..."); |
|
|
142 |
|
|
|
143 |
|
$token = $r['tokens']['close_reopen']; |
|
144 |
|
rg_log(''); |
|
145 |
|
rg_log_enter("Posting close bug form (token=$token)..."); |
134 |
146 |
$data = array('token' => $token, |
$data = array('token' => $token, |
135 |
147 |
'close_reopen' => 1, |
'close_reopen' => 1, |
136 |
148 |
'state' => 2, |
'state' => 2, |
|
... |
... |
$res = rg_sql_query($db, $sql); |
146 |
158 |
$row = rg_sql_fetch_array($res); |
$row = rg_sql_fetch_array($res); |
147 |
159 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
148 |
160 |
if ($row['state'] != 2) { |
if ($row['state'] != 2) { |
149 |
|
rg_log('Seems we could not close the bug; state= [' . $row['state']); |
|
|
161 |
|
rg_log('Seems we could not close the bug; state=[' . $row['state'] . ']'); |
150 |
162 |
exit(1); |
exit(1); |
151 |
163 |
} |
} |
|
164 |
|
rg_log_exit(); |
152 |
165 |
|
|
153 |
|
|
|
154 |
|
// Test re-opening a bug |
|
155 |
|
$token = $r['token']; |
|
156 |
|
rg_log("Posting re-open bug form..."); |
|
|
166 |
|
$token = $r['tokens']['close_reopen']; |
|
167 |
|
rg_log(''); |
|
168 |
|
rg_log_enter("Posting re-open bug form (token=$token)..."); |
157 |
169 |
$data = array('token' => $token, |
$data = array('token' => $token, |
158 |
170 |
'close_reopen' => 1, |
'close_reopen' => 1, |
159 |
171 |
'state'=> 1, |
'state'=> 1, |
160 |
172 |
'_test' => 're-opn bug'); |
'_test' => 're-opn bug'); |
161 |
173 |
$r = do_req($test_url . $url, $data, $headers); |
$r = do_req($test_url . $url, $data, $headers); |
162 |
174 |
if ($r === FALSE) { |
if ($r === FALSE) { |
163 |
|
rg_log('Cannot post bug request.'); |
|
|
175 |
|
rg_log('Cannot post bug request (check http_bug.out for last answer).'); |
164 |
176 |
exit(1); |
exit(1); |
165 |
177 |
} |
} |
166 |
178 |
$sql = 'SELECT * FROM bugs WHERE repo_id = ' . $repo['repo_id'] |
$sql = 'SELECT * FROM bugs WHERE repo_id = ' . $repo['repo_id'] |
|
... |
... |
$row = rg_sql_fetch_array($res); |
170 |
182 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
171 |
183 |
if ($row['state'] != 1) { |
if ($row['state'] != 1) { |
172 |
184 |
rg_log('Seems we could not re-open the bug;' |
rg_log('Seems we could not re-open the bug;' |
173 |
|
. ' state= [' . $row['state'] . ']!'); |
|
|
185 |
|
. ' state=[' . $row['state'] . ']!'); |
174 |
186 |
exit(1); |
exit(1); |
175 |
187 |
} |
} |
|
188 |
|
rg_log_exit(); |
176 |
189 |
|
|
177 |
|
|
|
178 |
|
rg_log("Testing deleting a bug"); |
|
|
190 |
|
rg_log(''); |
|
191 |
|
rg_log_enter("Testing deleting a bug"); |
179 |
192 |
for ($i = 0; $i <= 1; $i++) { |
for ($i = 0; $i <= 1; $i++) { |
180 |
|
$token = $r['token']; |
|
181 |
|
rg_log("Posting delete bug form..."); |
|
|
193 |
|
$token = $r['tokens']['del_undel']; |
|
194 |
|
rg_log("Posting delete bug form (token=$token)..."); |
182 |
195 |
$data = array('token' => $token, |
$data = array('token' => $token, |
|
196 |
|
'del_doit' => 1, |
183 |
197 |
'del_undel' => $i + 1, |
'del_undel' => $i + 1, |
184 |
|
'_test' => 'deleting a bug'); |
|
|
198 |
|
'_test' => 'deleting a bug (i=' . $i . ')'); |
185 |
199 |
$r = do_req($test_url . $url, $data, $headers); |
$r = do_req($test_url . $url, $data, $headers); |
186 |
200 |
if ($r === FALSE) { |
if ($r === FALSE) { |
187 |
201 |
rg_log('Cannot post bug request.'); |
rg_log('Cannot post bug request.'); |
|
... |
... |
for ($i = 0; $i <= 1; $i++) { |
198 |
212 |
$test = $row['deleted'] == 0; |
$test = $row['deleted'] == 0; |
199 |
213 |
if (!$test) { |
if (!$test) { |
200 |
214 |
rg_log('i=' . $i . ': Seems we could not delete/undelete the bug;' |
rg_log('i=' . $i . ': Seems we could not delete/undelete the bug;' |
201 |
|
. ' deleted= [' . $row['deleted'] . ']!'); |
|
|
215 |
|
. ' deleted=[' . $row['deleted'] . ']!'); |
202 |
216 |
exit(1); |
exit(1); |
203 |
217 |
} |
} |
204 |
218 |
if ($row['deleted_who'] != $u1['uid']) { |
if ($row['deleted_who'] != $u1['uid']) { |
205 |
219 |
rg_log('i=' . $i . ': Seems the deleted_who was not updated;' |
rg_log('i=' . $i . ': Seems the deleted_who was not updated;' |
206 |
|
. ' deleted_who= [' . $row['deleted_who'] . ']!'); |
|
|
220 |
|
. ' deleted_who=[' . $row['deleted_who'] . ']!'); |
207 |
221 |
exit(1); |
exit(1); |
208 |
222 |
} |
} |
209 |
223 |
} |
} |
|
224 |
|
rg_log_exit(); |
210 |
225 |
|
|
211 |
226 |
|
|
212 |
|
// Test watching a bug - we need to login as a different user |
|
|
227 |
|
rg_log(''); |
|
228 |
|
rg_log_enter("Test watching a bug - we need to login as a different user"); |
213 |
229 |
$r = test_login($test_url, $u2, $good_sid); |
$r = test_login($test_url, $u2, $good_sid); |
214 |
230 |
if ($r === FALSE) |
if ($r === FALSE) |
215 |
231 |
exit(1); |
exit(1); |
|
... |
... |
for ($i = 0; $i <= 1; $i++) { |
224 |
240 |
rg_log('Cannot load bug form.'); |
rg_log('Cannot load bug form.'); |
225 |
241 |
exit(1); |
exit(1); |
226 |
242 |
} |
} |
227 |
|
$token = $r['token']; |
|
|
243 |
|
$token = $r['tokens']['bug_watch']; |
228 |
244 |
|
|
229 |
245 |
rg_log("Posting (un)watch bug form..."); |
rg_log("Posting (un)watch bug form..."); |
230 |
|
$data = array('token' => $token, 'watch' => $i, 'unwatch' => 1 - $i, |
|
|
246 |
|
$data = array('token' => $token, 'watch_doit' => 1, 'watch' => $i, |
231 |
247 |
'_test' => 'post-watch-' . $i); |
'_test' => 'post-watch-' . $i); |
232 |
248 |
$r = do_req($test_url . $url, $data, $headers); |
$r = do_req($test_url . $url, $data, $headers); |
233 |
249 |
if ($r === FALSE) { |
if ($r === FALSE) { |
|
... |
... |
for ($i = 0; $i <= 1; $i++) { |
261 |
277 |
} |
} |
262 |
278 |
} |
} |
263 |
279 |
} |
} |
264 |
|
|
|
|
280 |
|
rg_log_exit(); |
265 |
281 |
|
|
266 |
282 |
rg_prof_log(); |
rg_prof_log(); |
267 |
283 |
rg_log("OK!"); |
rg_log("OK!"); |
File tests/http_csrf.php changed (mode: 100644) (index 1467ad1..ea73956) |
... |
... |
$rg_cache_enable = TRUE; |
22 |
22 |
|
|
23 |
23 |
$now = time(); |
$now = time(); |
24 |
24 |
|
|
|
25 |
|
test_set_ua("user-agent-1"); |
25 |
26 |
rg_test_create_user($db, $rg_ui); |
rg_test_create_user($db, $rg_ui); |
26 |
27 |
$r = test_login($test_url, $rg_ui, $good_sid); |
$r = test_login($test_url, $rg_ui, $good_sid); |
27 |
28 |
if ($r === FALSE) { |
if ($r === FALSE) { |
|
... |
... |
if ($r === FALSE) { |
29 |
30 |
exit(1); |
exit(1); |
30 |
31 |
} |
} |
31 |
32 |
|
|
32 |
|
rg_log("Loading suggestion form (ua test)"); |
|
|
33 |
|
rg_log_enter("Loading suggestion form (ua test)"); |
33 |
34 |
test_set_ua("user-agent-1"); |
test_set_ua("user-agent-1"); |
34 |
35 |
test_set_referer($test_url); |
test_set_referer($test_url); |
35 |
36 |
$data = array(); |
$data = array(); |
36 |
37 |
$headers = array("Cookie: sid=" . $good_sid); |
$headers = array("Cookie: sid=" . $good_sid); |
37 |
38 |
$r = do_req($test_url . "/op/suggestion?t=load_suggestion_form_ua", $data, $headers); |
$r = do_req($test_url . "/op/suggestion?t=load_suggestion_form_ua", $data, $headers); |
38 |
39 |
if (!stristr($r['body'], "action=\"/op/suggestion\"")) { |
if (!stristr($r['body'], "action=\"/op/suggestion\"")) { |
39 |
|
rg_log_ml(print_r($r, TRUE)); |
|
40 |
40 |
rg_log("Cannot load form! See above."); |
rg_log("Cannot load form! See above."); |
41 |
41 |
exit(1); |
exit(1); |
42 |
42 |
} |
} |
43 |
|
$good_token = $r['token']; |
|
|
43 |
|
$good_token = $r['tokens']['suggestion']; |
|
44 |
|
rg_log_exit(); |
44 |
45 |
|
|
45 |
|
rg_log("Try posting with different user-agent: should not work"); |
|
|
46 |
|
rg_log_enter("Try posting with different user-agent: should not work"); |
46 |
47 |
test_set_ua("user-agent-2"); |
test_set_ua("user-agent-2"); |
47 |
48 |
$data = array( |
$data = array( |
48 |
49 |
"doit" => 1, |
"doit" => 1, |
|
... |
... |
$data = array( |
52 |
53 |
$headers = array("Cookie: sid=" . $good_sid); |
$headers = array("Cookie: sid=" . $good_sid); |
53 |
54 |
$r = do_req($test_url . "/op/suggestion?t=post_suggestion_form_diff_ua", $data, $headers); |
$r = do_req($test_url . "/op/suggestion?t=post_suggestion_form_diff_ua", $data, $headers); |
54 |
55 |
if (!stristr($r['body'], "invalid token")) { |
if (!stristr($r['body'], "invalid token")) { |
55 |
|
rg_log_ml(print_r($r, TRUE)); |
|
56 |
56 |
rg_log("Seems I could add a suggestion bypassing CSRF" |
rg_log("Seems I could add a suggestion bypassing CSRF" |
57 |
57 |
. " protection based on user-agent! See above."); |
. " protection based on user-agent! See above."); |
58 |
58 |
exit(1); |
exit(1); |
59 |
59 |
} |
} |
|
60 |
|
rg_log_exit(); |
60 |
61 |
|
|
61 |
62 |
|
|
62 |
|
rg_log("Loading suggestion form (referer test)"); |
|
|
63 |
|
rg_log_enter("Loading suggestion form (referer test)"); |
63 |
64 |
test_set_ua("user-agent-1"); |
test_set_ua("user-agent-1"); |
64 |
65 |
test_set_referer($test_url); |
test_set_referer($test_url); |
65 |
66 |
$data = array(); |
$data = array(); |
66 |
67 |
$headers = array("Cookie: sid=" . $good_sid); |
$headers = array("Cookie: sid=" . $good_sid); |
67 |
68 |
$r = do_req($test_url . "/op/suggestion?t=load_suggestion_form_referer", $data, $headers); |
$r = do_req($test_url . "/op/suggestion?t=load_suggestion_form_referer", $data, $headers); |
68 |
69 |
if (!stristr($r['body'], "action=\"/op/suggestion\"")) { |
if (!stristr($r['body'], "action=\"/op/suggestion\"")) { |
69 |
|
rg_log_ml(print_r($r, TRUE)); |
|
70 |
70 |
rg_log("Cannot load form! See above."); |
rg_log("Cannot load form! See above."); |
71 |
71 |
exit(1); |
exit(1); |
72 |
72 |
} |
} |
73 |
|
$good_token = $r['token']; |
|
74 |
|
$good_logout_token = $r['logout_token']; |
|
|
73 |
|
$good_token = $r['tokens']['suggestion']; |
|
74 |
|
$good_logout_token = $r['tokens']['logout']; |
|
75 |
|
rg_log_exit(); |
75 |
76 |
|
|
76 |
|
rg_log("Try posting with different referer: should not work"); |
|
|
77 |
|
rg_log_enter("Try posting with different referer: should not work"); |
77 |
78 |
test_set_ua("user-agent-1"); |
test_set_ua("user-agent-1"); |
78 |
79 |
test_set_referer("http://attacker.com:4000/bla"); |
test_set_referer("http://attacker.com:4000/bla"); |
79 |
80 |
$data = array( |
$data = array( |
|
... |
... |
$data = array( |
84 |
85 |
$headers = array("Cookie: sid=" . $good_sid); |
$headers = array("Cookie: sid=" . $good_sid); |
85 |
86 |
$r = do_req($test_url . "/op/suggestion?t=post_suggestion_form_diff_referer", $data, $headers); |
$r = do_req($test_url . "/op/suggestion?t=post_suggestion_form_diff_referer", $data, $headers); |
86 |
87 |
if (!stristr($r['body'], "invalid referer")) { |
if (!stristr($r['body'], "invalid referer")) { |
87 |
|
rg_log_ml(print_r($r, TRUE)); |
|
88 |
88 |
rg_log_ml("Seems I could add a suggestion bypassing CSRF" |
rg_log_ml("Seems I could add a suggestion bypassing CSRF" |
89 |
89 |
. " protection based on referer! See above."); |
. " protection based on referer! See above."); |
90 |
90 |
exit(1); |
exit(1); |
91 |
91 |
} |
} |
|
92 |
|
rg_log_exit(); |
92 |
93 |
|
|
93 |
94 |
|
|
94 |
|
rg_log("Testing logout CSRF (wrong token)..."); |
|
|
95 |
|
rg_log_enter("Testing logout CSRF (wrong token)..."); |
95 |
96 |
test_set_ua("user-agent-1"); |
test_set_ua("user-agent-1"); |
96 |
97 |
test_set_referer($test_url); |
test_set_referer($test_url); |
97 |
98 |
$headers = array("Cookie: sid=" . $good_sid); |
$headers = array("Cookie: sid=" . $good_sid); |
98 |
99 |
$data['token'] = strtoupper($good_token); |
$data['token'] = strtoupper($good_token); |
99 |
100 |
$r = do_req($test_url . "/op/logout?t=wrong_token", $data, $headers); |
$r = do_req($test_url . "/op/logout?t=wrong_token", $data, $headers); |
100 |
101 |
if (stristr($r['body'], "You are now logged out")) { |
if (stristr($r['body'], "You are now logged out")) { |
101 |
|
rg_log_ml(print_r($r, TRUE)); |
|
102 |
102 |
rg_log("No error on logout with wrong token?! See above."); |
rg_log("No error on logout with wrong token?! See above."); |
103 |
103 |
exit(1); |
exit(1); |
104 |
104 |
} |
} |
|
105 |
|
rg_log_exit(); |
105 |
106 |
|
|
106 |
107 |
|
|
107 |
|
rg_log("Testing logout CSRF (token passed in cookie)..."); |
|
|
108 |
|
rg_log_enter("Testing logout CSRF (token passed in cookie)..."); |
108 |
109 |
test_set_ua("user-agent-1"); |
test_set_ua("user-agent-1"); |
109 |
110 |
test_set_referer($test_url); |
test_set_referer($test_url); |
110 |
111 |
$headers = array("Cookie: sid=" . $good_sid . "; token=" . $good_logout_token); |
$headers = array("Cookie: sid=" . $good_sid . "; token=" . $good_logout_token); |
111 |
112 |
$data = array('doit' => 1); |
$data = array('doit' => 1); |
112 |
113 |
$r = do_req($test_url . "/op/logout?t=token_passed_by_cookie", $data, $headers); |
$r = do_req($test_url . "/op/logout?t=token_passed_by_cookie", $data, $headers); |
113 |
114 |
if (stristr($r['body'], "You are now logged out")) { |
if (stristr($r['body'], "You are now logged out")) { |
114 |
|
rg_log_ml(print_r($r, TRUE)); |
|
115 |
115 |
rg_log("No error on logout with token passed by cookie?! See above."); |
rg_log("No error on logout with token passed by cookie?! See above."); |
116 |
116 |
exit(1); |
exit(1); |
117 |
117 |
} |
} |
|
118 |
|
rg_log_exit(); |
118 |
119 |
|
|
119 |
120 |
|
|
120 |
|
rg_log("Testing logout CSRF (good token)..."); |
|
|
121 |
|
rg_log_enter("Testing logout CSRF (good token)..."); |
|
122 |
|
test_set_ua("user-agent-1"); |
121 |
123 |
$url = $test_url . "/op/logout?t=good_token&token=" . $good_logout_token; |
$url = $test_url . "/op/logout?t=good_token&token=" . $good_logout_token; |
122 |
|
$data['token'] = $good_token; |
|
|
124 |
|
$data = array(); |
123 |
125 |
$r = do_req($url, $data, $headers); |
$r = do_req($url, $data, $headers); |
124 |
126 |
if (!stristr($r['body'], "You are now logged out")) { |
if (!stristr($r['body'], "You are now logged out")) { |
125 |
|
rg_log_ml(print_r($r, TRUE)); |
|
126 |
127 |
rg_log("Seems I cannot logout with a good token! See above."); |
rg_log("Seems I cannot logout with a good token! See above."); |
127 |
128 |
exit(1); |
exit(1); |
128 |
129 |
} |
} |
|
130 |
|
rg_log_exit(); |
129 |
131 |
|
|
130 |
132 |
rg_log("OK!"); |
rg_log("OK!"); |
131 |
133 |
?> |
?> |
File tests/http_settings.php changed (mode: 100644) (index 88b3854..32ef9ca) |
... |
... |
$rg_cache_enable = TRUE; |
23 |
23 |
$now = time(); |
$now = time(); |
24 |
24 |
|
|
25 |
25 |
rg_log("Test if caching works cache_enable=" . ($rg_cache_enable ? "true" : "false")); |
rg_log("Test if caching works cache_enable=" . ($rg_cache_enable ? "true" : "false")); |
26 |
|
rg_cache_set("test::a", "1"); |
|
|
26 |
|
rg_cache_set("test::a", "1", 0); |
27 |
27 |
$r = rg_cache_get("test::a"); |
$r = rg_cache_get("test::a"); |
28 |
28 |
if (strcmp($r, "1") != 0) { |
if (strcmp($r, "1") != 0) { |
29 |
29 |
rg_log("Main cache (set) is not working!"); |
rg_log("Main cache (set) is not working!"); |
30 |
30 |
exit(1); |
exit(1); |
31 |
31 |
} |
} |
32 |
|
rg_cache_unset("test::a"); |
|
|
32 |
|
rg_cache_unset("test::a", RG_SOCKET_NO_WAIT); |
33 |
33 |
$r = rg_cache_get("test::a"); |
$r = rg_cache_get("test::a"); |
34 |
34 |
if ($r !== FALSE) { |
if ($r !== FALSE) { |
35 |
35 |
rg_log("Main cache (unset) is not working!"); |
rg_log("Main cache (unset) is not working!"); |
|
... |
... |
$data = array(); |
50 |
50 |
$headers = array("Cookie: sid=" . $good_sid); |
$headers = array("Cookie: sid=" . $good_sid); |
51 |
51 |
$r = do_req($test_url . "/op/settings/change_pass?t=load_change_pass_form", $data, $headers); |
$r = do_req($test_url . "/op/settings/change_pass?t=load_change_pass_form", $data, $headers); |
52 |
52 |
if (!strstr($r['body'], "action=\"/op/settings/change_pass\"")) { |
if (!strstr($r['body'], "action=\"/op/settings/change_pass\"")) { |
53 |
|
file_put_contents("http_settings_change_pass.log", $r['body']); |
|
54 |
53 |
rg_log_ml("Cannot load change pass form!"); |
rg_log_ml("Cannot load change pass form!"); |
55 |
54 |
exit(1); |
exit(1); |
56 |
55 |
} |
} |
57 |
|
$good_token = $r['token']; |
|
|
56 |
|
$good_token = $r['tokens']['set_pass']; |
58 |
57 |
|
|
59 |
58 |
rg_log("Posting change pass form"); |
rg_log("Posting change pass form"); |
60 |
59 |
$data = array( |
$data = array( |
|
... |
... |
$data = array( |
67 |
66 |
$headers = array("Cookie: sid=" . $good_sid); |
$headers = array("Cookie: sid=" . $good_sid); |
68 |
67 |
$r = do_req($test_url . "/op/settings/change_pass?t=post_change_pass_form", $data, $headers); |
$r = do_req($test_url . "/op/settings/change_pass?t=post_change_pass_form", $data, $headers); |
69 |
68 |
if (!strstr($r['body'], "Password was updated with success")) { |
if (!strstr($r['body'], "Password was updated with success")) { |
70 |
|
file_put_contents("http_settings_change_pass.log", $r['body']); |
|
71 |
69 |
rg_log_ml("Cannot change pass!"); |
rg_log_ml("Cannot change pass!"); |
72 |
70 |
exit(1); |
exit(1); |
73 |
71 |
} |
} |
|
... |
... |
if (!strstr($r['body'], "Password was updated with success")) { |
76 |
74 |
rg_log("Now, try to login with the old password"); |
rg_log("Now, try to login with the old password"); |
77 |
75 |
$r2 = test_login($test_url, $rg_ui, $junk); |
$r2 = test_login($test_url, $rg_ui, $junk); |
78 |
76 |
if ($r2 !== FALSE) { |
if ($r2 !== FALSE) { |
79 |
|
rg_log_ml("Seems we were able to login with the old password!"); |
|
|
77 |
|
rg_log("Seems we were able to login with the old password!"); |
80 |
78 |
exit(1); |
exit(1); |
81 |
79 |
} |
} |
82 |
80 |
|
|
|
... |
... |
$data = array(); |
86 |
84 |
$headers = array("Cookie: sid=" . $good_sid); |
$headers = array("Cookie: sid=" . $good_sid); |
87 |
85 |
$r = do_req($test_url . "/op/settings/change_pass?t=load_change_pass_form", $data, $headers); |
$r = do_req($test_url . "/op/settings/change_pass?t=load_change_pass_form", $data, $headers); |
88 |
86 |
if (!strstr($r['body'], "action=\"/op/settings/change_pass\"")) { |
if (!strstr($r['body'], "action=\"/op/settings/change_pass\"")) { |
89 |
|
file_put_contents("http_settings_change_pass.log", $r['body']); |
|
90 |
87 |
rg_log_ml("Cannot load change pass form!"); |
rg_log_ml("Cannot load change pass form!"); |
91 |
88 |
exit(1); |
exit(1); |
92 |
89 |
} |
} |
93 |
|
$good_token = $r['token']; |
|
|
90 |
|
$good_token = $r['tokens']['set_pass']; |
94 |
91 |
$data = array( |
$data = array( |
95 |
92 |
"doit" => 1, |
"doit" => 1, |
96 |
93 |
"token" => $good_token, |
"token" => $good_token, |
|
... |
... |
$data = array( |
101 |
98 |
$headers = array("Cookie: sid=" . $good_sid); |
$headers = array("Cookie: sid=" . $good_sid); |
102 |
99 |
$r = do_req($test_url . "/op/settings/change_pass?t=change_back_the_password", $data, $headers); |
$r = do_req($test_url . "/op/settings/change_pass?t=change_back_the_password", $data, $headers); |
103 |
100 |
if ($r === FALSE) { |
if ($r === FALSE) { |
104 |
|
file_put_contents("http_settings_change_back.log", $r['body']); |
|
105 |
101 |
rg_log_ml("Cannot change back the pass to aaaa!"); |
rg_log_ml("Cannot change back the pass to aaaa!"); |
106 |
102 |
exit(1); |
exit(1); |
107 |
103 |
} |
} |
|
... |
... |
rg_log("Posting edit info form"); |
122 |
118 |
$session_time = intval($now / 393956); |
$session_time = intval($now / 393956); |
123 |
119 |
$data = array( |
$data = array( |
124 |
120 |
"doit" => 1, |
"doit" => 1, |
125 |
|
"token" => $r['token'], |
|
|
121 |
|
"token" => $r['tokens']['user_edit_hl'], |
126 |
122 |
"uid" => 4, |
"uid" => 4, |
127 |
123 |
"username" => $rg_ui['username'], |
"username" => $rg_ui['username'], |
128 |
124 |
"realname" => $rg_ui['realname'], |
"realname" => $rg_ui['realname'], |
|
... |
... |
$data = array( |
132 |
128 |
$headers = array("Cookie: sid=" . $good_sid); |
$headers = array("Cookie: sid=" . $good_sid); |
133 |
129 |
$r = do_req($test_url . "/op/settings/edit_info?t=post_edit_info_form", $data, $headers); |
$r = do_req($test_url . "/op/settings/edit_info?t=post_edit_info_form", $data, $headers); |
134 |
130 |
if (!strstr($r['body'], "Information was updated with success")) { |
if (!strstr($r['body'], "Information was updated with success")) { |
135 |
|
file_put_contents("http_settings_edit_info.log", $r['body']); |
|
136 |
131 |
rg_log_ml("Cannot change back the pass to aaaa: " . print_r($r, TRUE)); |
rg_log_ml("Cannot change back the pass to aaaa: " . print_r($r, TRUE)); |
137 |
132 |
exit(1); |
exit(1); |
138 |
133 |
} |
} |
|
... |
... |
$res = rg_sql_query($db, $sql); |
143 |
138 |
$row = rg_sql_fetch_array($res); |
$row = rg_sql_fetch_array($res); |
144 |
139 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
145 |
140 |
if (strcmp($rg_ui['realname'], $row['realname']) != 0) { |
if (strcmp($rg_ui['realname'], $row['realname']) != 0) { |
146 |
|
file_put_contents("http_settings_edit_info.log", $r['body']); |
|
147 |
141 |
rg_log_ml("realname was not changed: " . print_r($row, TRUE)); |
rg_log_ml("realname was not changed: " . print_r($row, TRUE)); |
148 |
142 |
exit(1); |
exit(1); |
149 |
143 |
} |
} |
150 |
144 |
if ($row['plan_id'] != 5) { |
if ($row['plan_id'] != 5) { |
151 |
|
file_put_contents("http_settings_edit_info.log", $r['body']); |
|
152 |
145 |
rg_log_ml("plan_id was not changed: " . print_r($row, TRUE)); |
rg_log_ml("plan_id was not changed: " . print_r($row, TRUE)); |
153 |
146 |
exit(1); |
exit(1); |
154 |
147 |
} |
} |
155 |
148 |
if ($row['session_time'] != $session_time) { |
if ($row['session_time'] != $session_time) { |
156 |
|
file_put_contents("http_settings_edit_info.log", $r['body']); |
|
157 |
149 |
rg_log_ml("session_time was not changed: " . print_r($row, TRUE)); |
rg_log_ml("session_time was not changed: " . print_r($row, TRUE)); |
158 |
150 |
exit(1); |
exit(1); |
159 |
151 |
} |
} |
|
... |
... |
if ($r === FALSE) { |
168 |
160 |
rg_log("Cannot load form!"); |
rg_log("Cannot load form!"); |
169 |
161 |
exit(1); |
exit(1); |
170 |
162 |
} |
} |
171 |
|
if (empty($r['token'])) { |
|
|
163 |
|
if (empty($r['tokens']['keys'])) { |
172 |
164 |
rg_log_ml("token not found! r:" . print_r($r, TRUE)); |
rg_log_ml("token not found! r:" . print_r($r, TRUE)); |
173 |
165 |
exit(1); |
exit(1); |
174 |
166 |
} |
} |
175 |
167 |
rg_log("Posting keys form"); |
rg_log("Posting keys form"); |
176 |
168 |
$comment = "<xss>" . $rg_ui['uid']; |
$comment = "<xss>" . $rg_ui['uid']; |
177 |
169 |
$key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+2OHaQiZzdwV4HQF9pCBbSQFaoM5Q0YmmRYDL8BUCjwClDgOLp9lQVN5XksoBx2t9INj6XrobjNc/GUF60c1Ald0FtjRl7nIZdYvKDutlxHcGUy6MHsVnCDviXQJD9Hm9fyuBLdy3/oadSCAaQYE/Tcf9rWt1NmhQ7560bCGmh4pw8N+XXAz2nQBCqvIK8VDoBbOOgFa/HOwBrKCgaGmcTGs5wRWHbw3+h6CO1vqEYcSCSqBPMG1JOMfMTuJ0aTXXEkSNPF+TVva85L4qrQslyHbn2JU1t7/HQsFnGtgF1o2AglIR2RbyMmr6axI51Srf20EB9/c9T3auYQipbw85"; |
$key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+2OHaQiZzdwV4HQF9pCBbSQFaoM5Q0YmmRYDL8BUCjwClDgOLp9lQVN5XksoBx2t9INj6XrobjNc/GUF60c1Ald0FtjRl7nIZdYvKDutlxHcGUy6MHsVnCDviXQJD9Hm9fyuBLdy3/oadSCAaQYE/Tcf9rWt1NmhQ7560bCGmh4pw8N+XXAz2nQBCqvIK8VDoBbOOgFa/HOwBrKCgaGmcTGs5wRWHbw3+h6CO1vqEYcSCSqBPMG1JOMfMTuJ0aTXXEkSNPF+TVva85L4qrQslyHbn2JU1t7/HQsFnGtgF1o2AglIR2RbyMmr6axI51Srf20EB9/c9T3auYQipbw85"; |
178 |
|
$data = array("add" => 1, "token" => $r['token'], "key" => $key . ' ' . $comment); |
|
|
170 |
|
$data = array("add" => 1, "token" => $r['tokens']['keys'], "key" => $key . ' ' . $comment); |
179 |
171 |
$headers = array("Cookie: sid=" . $good_sid); |
$headers = array("Cookie: sid=" . $good_sid); |
180 |
172 |
$r = do_req($test_url . "/op/settings/keys?t=post_key_form_add", $data, $headers); |
$r = do_req($test_url . "/op/settings/keys?t=post_key_form_add", $data, $headers); |
181 |
173 |
if ($r === FALSE) { |
if ($r === FALSE) { |
182 |
|
file_put_contents("http_settings_key.log", $r['body']); |
|
183 |
174 |
rg_log_ml("Cannot upload key: " . print_r($r, TRUE)); |
rg_log_ml("Cannot upload key: " . print_r($r, TRUE)); |
184 |
175 |
exit(1); |
exit(1); |
185 |
176 |
} |
} |
|
... |
... |
if ($r === FALSE) { |
207 |
198 |
exit(1); |
exit(1); |
208 |
199 |
} |
} |
209 |
200 |
rg_log("Posting delete keys form"); |
rg_log("Posting delete keys form"); |
210 |
|
$data = array("delete" => 1, "token" => $r['token'], "key_delete_ids[$key_id]" => "on"); |
|
|
201 |
|
$data = array("delete" => 1, "token" => $r['tokens']['keys'], "key_delete_ids[$key_id]" => "on"); |
211 |
202 |
$headers = array("Cookie: sid=" . $good_sid); |
$headers = array("Cookie: sid=" . $good_sid); |
212 |
203 |
$r = do_req($test_url . "/op/settings/keys?t=post_key_form_del", $data, $headers); |
$r = do_req($test_url . "/op/settings/keys?t=post_key_form_del", $data, $headers); |
213 |
204 |
if (!strstr($r['body'], "Selected keys were removed with success.")) { |
if (!strstr($r['body'], "Selected keys were removed with success.")) { |
214 |
|
file_put_contents("http_settings_key_del.log", $r['body']); |
|
215 |
205 |
rg_log_ml("Cannot delete key!"); |
rg_log_ml("Cannot delete key!"); |
216 |
206 |
exit(1); |
exit(1); |
217 |
207 |
} |
} |
File tests/token.php changed (mode: 100644) (index 1b1e866..07bae60) |
... |
... |
rg_log_set_file("token.log"); |
14 |
14 |
$rg_no_db = TRUE; |
$rg_no_db = TRUE; |
15 |
15 |
require_once("common.php"); |
require_once("common.php"); |
16 |
16 |
|
|
17 |
|
$a = array("ua" => "user-agent1", "sid" => "session1"); |
|
18 |
|
$token = rg_token_get($db, $a); |
|
|
17 |
|
$a = array("ua" => "user-agent1", "sid" => "session1", 'debug' => 1); |
|
18 |
|
$token = rg_token_get($db, $a, 'tag1'); |
19 |
19 |
if ($token === FALSE) { |
if ($token === FALSE) { |
20 |
20 |
rg_log("Generating a token should not fail (" . rg_token_error() . ")!"); |
rg_log("Generating a token should not fail (" . rg_token_error() . ")!"); |
21 |
21 |
exit(1); |
exit(1); |
|
... |
... |
if ($token === FALSE) { |
23 |
23 |
rg_log("Correct token: $token"); |
rg_log("Correct token: $token"); |
24 |
24 |
|
|
25 |
25 |
$a['token'] = $token; |
$a['token'] = $token; |
26 |
|
$r = rg_token_valid($db, $a, FALSE); |
|
|
26 |
|
$r = rg_token_valid($db, $a, 'tag1', FALSE); |
27 |
27 |
if ($r === FALSE) { |
if ($r === FALSE) { |
28 |
28 |
rg_log("Validating a correct token must work (" . rg_token_error() . ")!"); |
rg_log("Validating a correct token must work (" . rg_token_error() . ")!"); |
29 |
29 |
exit(1); |
exit(1); |
|
... |
... |
if ($r === FALSE) { |
32 |
32 |
|
|
33 |
33 |
rg_log("Now, test pre-login sessions..."); |
rg_log("Now, test pre-login sessions..."); |
34 |
34 |
$rg_token = FALSE; /* we must remove it from memory */ |
$rg_token = FALSE; /* we must remove it from memory */ |
35 |
|
$a = array("ua" => "user-agent1", "sid" => "Xsession2"); |
|
36 |
|
$token = rg_token_get($db, $a); |
|
|
35 |
|
$a = array("ua" => "user-agent1", "sid" => "Xsession2", 'debug' => 1); |
|
36 |
|
$token = rg_token_get($db, $a, 'tag2'); |
37 |
37 |
if ($token === FALSE) { |
if ($token === FALSE) { |
38 |
38 |
rg_log("Generating a token should not fail (" . rg_token_error() . ")!"); |
rg_log("Generating a token should not fail (" . rg_token_error() . ")!"); |
39 |
39 |
exit(1); |
exit(1); |
|
... |
... |
$a['token'] = $token; |
43 |
43 |
|
|
44 |
44 |
$copy = $a; |
$copy = $a; |
45 |
45 |
$copy['token'] = "y" . substr($a['token'], 1); |
$copy['token'] = "y" . substr($a['token'], 1); |
46 |
|
$r = rg_token_valid($db, $copy, FALSE); |
|
|
46 |
|
$r = rg_token_valid($db, $copy, 'tag2', FALSE); |
47 |
47 |
if ($r !== FALSE) { |
if ($r !== FALSE) { |
48 |
48 |
rg_log("An altered token must return error!"); |
rg_log("An altered token must return error!"); |
49 |
49 |
exit(1); |
exit(1); |
50 |
50 |
} |
} |
51 |
51 |
|
|
52 |
|
$r = rg_token_valid($db, $a, FALSE); |
|
|
52 |
|
$r = rg_token_valid($db, $a, 'tag2', FALSE); |
53 |
53 |
if ($r === FALSE) { |
if ($r === FALSE) { |
54 |
54 |
rg_log("Validating a correct token must work (" . rg_token_error() . ")!"); |
rg_log("Validating a correct token must work (" . rg_token_error() . ")!"); |
55 |
55 |
exit(1); |
exit(1); |
|
... |
... |
if ($r === FALSE) { |
59 |
59 |
rg_log("Testing double posting..."); |
rg_log("Testing double posting..."); |
60 |
60 |
$rg_token = FALSE; /* we must remove it from memory */ |
$rg_token = FALSE; /* we must remove it from memory */ |
61 |
61 |
$a = array("ua" => "user-agent3", |
$a = array("ua" => "user-agent3", |
62 |
|
"sid" => "session_double"); |
|
63 |
|
$token = rg_token_get($db, $a); |
|
|
62 |
|
"sid" => "session_double", |
|
63 |
|
'debug' => 1); |
|
64 |
|
$token = rg_token_get($db, $a, 'tag3'); |
64 |
65 |
if ($token === FALSE) { |
if ($token === FALSE) { |
65 |
66 |
rg_log("Generating a token should not fail (" . rg_token_error() . ")!"); |
rg_log("Generating a token should not fail (" . rg_token_error() . ")!"); |
66 |
67 |
exit(1); |
exit(1); |
67 |
68 |
} |
} |
68 |
69 |
$a['token'] = $token; |
$a['token'] = $token; |
69 |
70 |
|
|
70 |
|
$r = rg_token_valid($db, $a, FALSE); |
|
|
71 |
|
$r = rg_token_valid($db, $a, 'tag3', FALSE); |
71 |
72 |
if ($r === FALSE) { |
if ($r === FALSE) { |
72 |
73 |
rg_log("Calling 'valid' first time must work!"); |
rg_log("Calling 'valid' first time must work!"); |
73 |
74 |
exit(1); |
exit(1); |
74 |
75 |
} |
} |
75 |
|
$r = rg_token_valid($db, $a, FALSE); |
|
|
76 |
|
$r = rg_token_valid($db, $a, 'tag3', FALSE); |
76 |
77 |
if ($r !== FALSE) { |
if ($r !== FALSE) { |
77 |
78 |
rg_log("Calling 'valid' second time must NOT work!"); |
rg_log("Calling 'valid' second time must NOT work!"); |
78 |
79 |
exit(1); |
exit(1); |