@@ -39,14 +39,19 @@
39 39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int h1, h2; /* Proof-of-work hash values */
40 40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int resultCache; /* 0: unknown. 1: human 2: might-be-robot */
41 41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} robot = { 0, 0, 0 };
42 42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
43 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Allowed values for robot.resultCache
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Allowed values for robot.resultCache.
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The names are slightly misleading. KNOWN_NOT_ROBOT might be set even
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** if the client is a robot, but only if the robot is an approved robot.
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A better name might be "KNOWN_NOT_UNAUTHORIZED_ROBOT", but that is too
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** long of a name.
45 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define KNOWN_NOT_ROBOT 1
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define MIGHT_BE_ROBOT 2
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define KNOWN_NOT_ROBOT 1 /* Approved to consume CPU and bandwidth */
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define MIGHT_BE_ROBOT 2 /* Might be an unapproved robot */
48 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
49 54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
50 55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Compute two hashes, robot.h1 and robot.h2, that are used as
51 56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** part of determining whether or not the HTTP client is a robot.
52 57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** These hashes are based on current time, client IP address,
@@ -265,11 +270,13 @@
265 270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The "diff" tag covers all diffing pages such as /vdiff, /fdiff, and
266 271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** /vpatch. The "annotate" tag also covers /blame and /praise. "zip"
267 272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** also covers /tarball and /sqlar. If a tag has an "X" character appended,
268 273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** then it only applies if query parameters are such that the page is
269 274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** particularly difficult to compute. In all other case, the tag should
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** exactly match the page name.
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** exactly match the page name. Useful "X" tags include "timelineX"
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and "zipX". See the robot-zip-leaf and robot-zip-tag settings
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for additional controls associated with the "zipX" restriction.
271 278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
272 279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Change this setting "off" to disable all robot restrictions.
273 280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
274 281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
275 282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** SETTING: robot-exception width=40 block-text
@@ -287,10 +294,28 @@
287 294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This setting can hold multiple regular expressions, one
288 295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** regular expression per line. The input URL is exempted from
289 296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** anti-robot defenses if any of the multiple regular expressions
290 297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** matches.
291 298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SETTING: robot-zip-leaf boolean
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If this setting is true, the robots are allowed to download tarballs,
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ZIP-archives, and SQL-archives even though "zipX" is found in
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the robot-restrict setting as long as the specific check-in being
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** downloaded is a leaf check-in.
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SETTING: robot-zip-tag width=40 block-text
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If this setting is a list of GLOB patterns matching tags,
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** then robots are allowed to download tarballs, ZIP-archives, and
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQL-archives even though "zipX" appears in robot-restrict, as long as
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the specific check-in being downloaded has a tags that matches
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the GLOB list of this setting. Recommended value:
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "release,robot-access".
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
292 317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
293 318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
294 319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return the default restriction GLOB
295 320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
296 321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *robot_restrict_default(void){
@@ -405,10 +430,67 @@
405 430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
406 431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Generate the proof-of-work captcha */
407 432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ask_for_proof_that_client_is_not_robot();
408 433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
409 434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Check to see if a robot is allowed to download a tarball, ZIP archive,
438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or SQL Archive for a particular check-in identified by the "rid"
439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** argument. Return true to block the download. Return false to
440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** continue. Prior to returning true, a captcha is presented to the user.
441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** No output is generated when returning false.
442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The rules:
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (1) If "zipX" is missing from the robot-restrict setting, then robots
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are allowed to download any archive. None of the remaining rules
447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** below are consulted unless "zipX" is on the robot-restrict setting.
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (2) If the robot-zip-leaf setting is true, then robots are allowed
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to download archives for any leaf check-in. This allows URL like
451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** /tarball/trunk/archive.tar.gz to work since branch labels like "trunk"
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** always resolve to a leaf.
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (3) If the robot-zip-tag setting is a comma-separated tags, then any
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** check-in that contains one of the tags on that list is allowed to
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be downloaded. This allows check-ins with tags like "release" or
457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "robot-access" to be downloaded by robots.
458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int robot_restrict_zip(int rid){
460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTag;
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !robot_restrict_has_tag("zipX") || !client_might_be_a_robot() ){
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0; /* Rule (1) */
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( db_get_boolean("robot-zip-leaf",0) && is_a_leaf(rid) ){
466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0; /* Rule (2) */
467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zTag = db_get("robot-zip-tag",0);
470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zTag && zTag[0] && fossil_strcmp(zTag,"off")!=0 ){
471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ok = 0;
472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Stmt q;
473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q,
474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT substr(tagname,5) FROM tagxref, tag"
475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE tagxref.rid=%d"
476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " AND tag.tagid=tagxref.tagid"
477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " AND tagxref.tagtype=1"
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " AND tag.tagname GLOB 'sym-*'",
479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rid
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( !ok && db_step(&q)==SQLITE_ROW ){
482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( glob_multi_match(zTag, db_column_text(&q,0)) ) ok = 1;
483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ok ) return 0; /* Rule (3) */
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Generate the proof-of-work captcha */
489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ask_for_proof_that_client_is_not_robot();
490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
410 492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
411 493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
412 494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** WEBPAGE: test-robotck
413 495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
414 496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Run the robot_restrict() function using the value of the "name="
@@ -416,21 +498,30 @@
416 498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** logic.
417 499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
418 500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Whenever this page is successfully rendered (when it doesn't go to
419 501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the captcha) it deletes the proof-of-work cookie. So reloading the
420 502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** page will reset the cookie and restart the verification.
503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the zip=CHECKIN query parameter is provided, then also invoke
505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** robot_restrict_archive() on the RID of CHECKIN.
421 506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
422 507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void robot_restrict_test_page(void){
423 508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName = P("name");
509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zZip = P("zip");
424 510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zP1 = P("proof");
425 511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zP2 = P(ROBOT_COOKIE);
426 512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *z;
513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rid = 0;
427 514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zName==0 || zName[0]==0 ) zName = g.zPath;
428 515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
login_check_credentials();
429 516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.zLogin==0 ){ login_needed(1); return; }
430 517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.zLogin = 0;
431 518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( robot_restrict(zName) ) return;
519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zZip && zZip[0] ){
520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rid = symbolic_name_to_rid(zZip, "ci");
521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rid && robot_restrict_zip(rid) ) return;
522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
432 523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_set_current_feature("test");
433 524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_header("robot_restrict() test");
434 525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <h1>Captcha passed</h1>
435 526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@
436 527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <p>
@@ -438,10 +529,14 @@
438 529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ proof=%h(zP1)<br>
439 530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
440 531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zP2 && zP2[0] ){
441 532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ %h(ROBOT_COOKIE)=%h(zP2)<br>
442 533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cgi_set_cookie(ROBOT_COOKIE,"",0,-1);
534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zZip && zZip[0] ){
536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ zip=%h(zZip)<br>
537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ rid=%d(rid)<br>
443 538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
444 539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.perm.Admin ){
445 540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
z = db_get("robot-restrict",robot_restrict_default());
446 541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( z && z[0] ){
447 542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ robot-restrict=%h(z)</br>
448 543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!