| 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); |