Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Changes In Branch base-href-fix Excluding Merge-Ins
This is equivalent to a diff from cef15ed3d3 to d253ece08a
2022-02-15
| ||
21:35 | FIXME-comments in the code did not indicate issues and are now rephrased to be mere reminders. ... (Leaf check-in: d253ece08a user: george tags: base-href-fix) | |
02:26 | Do not override base href for wiki pages. This needs testing. ... (check-in: 89dd34519f user: george tags: base-href-fix) | |
2022-02-12
| ||
20:30 | Enhancement to robot defense. The auto-hyperlink setting can now be 2 (UserAgent only) in which case the UserAgent string is consulted and hyperlinks are generated if and only if the UserAgent looks human. Javascript does not come into play. When auto-hyperlink is 1, the traditional Javascript changes to href= in anchor tags are still used. ... (check-in: df337eb61c user: drh tags: trunk) | |
19:53 | An attepmt to fix the [https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base|<code><base href="..."></code>] element of webpages so that the value of <var>href</var> attribute matches the URL being served. This should fix "#fragment" hyperlinks on all pages where these were broken (all except [/help?cmd=/doc|<code>/doc</code>]). The values for [/help?cmd=/wiki|<code>/wiki</code>] and [/help?cmd=/info|<code>/info</code>] were left unchanged (it's yet unclear if they should also be changed). ... (check-in: 03b39f1d00 user: george tags: base-href-fix) | |
13:55 | Do not require mouse events for auto-hyperlink if the UserAgent string includes "Android". Describe the Safari visited/unvisited link limitation on the auto-hyperlink setting. ... (check-in: cef15ed3d3 user: drh tags: trunk) | |
13:29 | New javascript for href.js such that any mousemove or mousedown event at any time is sufficient to trigger the mouse activity condition for activation of hyperlinks. This works better on FF and chrome, but with safari, the visited/unvisited link color is determined by the initial value of href= and is not adjusted when href= changes, so visited/unvisited colors are not being updated on safari. ... (check-in: e7d67b7640 user: drh tags: trunk) | |
Changes to src/cgi.c.
︙ | |||
1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 | 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 | + + + + - - + + | ** the QUERY_STRING environment variable (if it exists), from standard ** input if there is POST data, and from HTTP_COOKIE. ** ** REQUEST_URI, PATH_INFO, and SCRIPT_NAME are related as follows: ** ** REQUEST_URI == SCRIPT_NAME + PATH_INFO ** ** Or if QUERY_STRING is not empty: ** ** REQUEST_URI == SCRIPT_NAME + PATH_INFO + '?' + QUERY_STRING ** ** Where "+" means concatenate. Fossil requires SCRIPT_NAME. If ** REQUEST_URI is provided but PATH_INFO is not, then PATH_INFO is ** computed from REQUEST_URI and SCRIPT_NAME. If PATH_INFO is provided ** but REQUEST_URI is not, then compute REQUEST_URI from PATH_INFO and ** SCRIPT_NAME. If neither REQUEST_URI nor PATH_INFO are provided, then ** assume that PATH_INFO is an empty string and set REQUEST_URI equal ** to PATH_INFO. ** ** Sometimes PATH_INFO is missing and SCRIPT_NAME is not a prefix of ** REQUEST_URI. (See https://fossil-scm.org/forum/forumpost/049e8650ed) ** In that case, truncate SCRIPT_NAME so that it is a proper prefix ** of REQUEST_URI. ** ** SCGI typically omits PATH_INFO. CGI sometimes omits REQUEST_URI and ** PATH_INFO when it is empty. ** ** CGI Parameter quick reference: ** ** REQUEST_URI |
︙ | |||
1224 1225 1226 1227 1228 1229 1230 | 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 | + + + + - + + | /* We must have SCRIPT_NAME. If the web server did not supply it, try ** to compute it from REQUEST_URI and PATH_INFO. */ if( zScriptName==0 ){ size_t nRU, nPI; if( zRequestUri==0 || zPathInfo==0 ){ malformed_request("missing SCRIPT_NAME"); /* Does not return */ } z = strchr(zRequestUri,'?'); if( z ){ nRU = (int)(z - zRequestUri); }else{ |
︙ | |||
1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 | 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 | + + + + - + + | for(j=i; zPathInfo[j] && zPathInfo[j]!='?'; j++){} zPathInfo = fossil_strndup(zPathInfo+i, j-i); cgi_replace_parameter("PATH_INFO", zPathInfo); } #endif if( zRequestUri==0 ){ const char *z = zPathInfo; const char *zQS = cgi_parameter("QUERY_STRING",0); if( zPathInfo==0 ){ malformed_request("missing PATH_INFO and/or REQUEST_URI"); } if( z[0]=='/' ) z++; if( zQS && zQS[0] ){ zRequestUri = mprintf("%s/%s?%s", zScriptName, z, zQS); }else{ |
︙ | |||
1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 | 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 | + - | } cgi_setenv("GATEWAY_INTERFACE","CGI/1.0"); cgi_setenv("REQUEST_METHOD",zToken); zToken = extract_token(z, &z); if( zToken==0 ){ malformed_request("malformed URL in HTTP header"); } cgi_setenv("REQUEST_URI", zToken); cgi_setenv("SCRIPT_NAME", ""); for(i=0; zToken[i] && zToken[i]!='?'; i++){} if( zToken[i] ) zToken[i++] = 0; |
︙ |
Changes to src/encode.c.
︙ | |||
203 204 205 206 207 208 209 210 211 212 213 214 215 216 | 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | ** characters are encoded as "%HH" where HH is a two-digit hexidecimal ** representation of the character. The "/" character is not encoded ** by this routine. */ char *urlize(const char *z, int n){ return EncodeHttp(z, n, 0); } /* ** If input string does not contain quotes (niether ' nor ") ** then return the argument itself. Otherwise return a newly allocated ** copy of input with all quotes %-escaped. */ const char* escape_quotes(const char *zIn){ char *zRet, *zOut; size_t i, n = 0; for(i=0; zIn[i]; i++){ if( zIn[i]== '"' || zIn[i]== '\'' ) n++; } if( !n ) return zIn; zRet = zOut = fossil_malloc( i + 2*n + 1 ); for(i=0; zIn[i]; i++){ if( zIn[i]=='"' ){ *(zOut++) = '%'; *(zOut++) = '2'; *(zOut++) = '2'; }else if( zIn[i]=='\'' ){ *(zOut++) = '%'; *(zOut++) = '2'; *(zOut++) = '7'; }else{ *(zOut++) = zIn[i]; } } *zOut = 0; return zRet; } /* ** Convert a single HEX digit to an integer */ static int AsciiToHex(int c){ if( c>='a' && c<='f' ){ c += 10 - 'a'; |
︙ |
Changes to src/extcgi.c.
︙ | |||
226 227 228 229 230 231 232 233 234 235 236 237 238 239 | 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 | + + + + | } if( nScript==0 ){ zFailReason = "path does not match any file or script"; goto ext_not_found; } assert( nScript>=nRoot+1 ); style_set_current_page("ext/%s", &zScript[nRoot+1]); /* Overriding of base href disabled as part of 'base-href-fix' branch ** otherwise #fragment links may break under /ext */ zMime = mimetype_from_name(zScript); if( zMime==0 ) zMime = "application/octet-stream"; if( !file_isexe(zScript, ExtFILE) ){ /* File is not executable. Must be a regular file. In that case, ** disallow extra path elements */ if( zPath[nScript]!=0 ){ zFailReason = "extra path elements after filename"; |
︙ |
Changes to src/fossil.page.wikiedit.js.
︙ | |||
881 882 883 884 885 886 887 | 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 | + + + - + + + + + - + + | /* Several places make sense for a save button, so we'll move that button around to those tabs where it makes sense. */ btnSlot.parentNode.insertBefore( P.e.btnSave.parentNode, btnSlot ); btnSlot.parentNode.insertBefore( P.e.btnSaveClose.parentNode, btnSlot ); P.updateSaveButton(); } if(theTab===P.e.tabs.preview){ /* Overriding of base href disabled as part of 'base-href-fix' branch ** To bring back the old behavior uncomment the following call |
︙ |
Changes to src/info.c.
︙ | |||
984 985 986 987 988 989 990 | 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 | - - - + + + | if( strcmp(zModAction,"approve")==0 ){ moderation_approve('w', rid); } } style_header("Update of \"%h\"", pWiki->zWikiTitle); zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); zDate = db_text(0, "SELECT datetime(%.17g)", pWiki->rDate); |
︙ | |||
1012 1013 1014 1015 1016 1017 1018 | 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 | - + | @ <tr><th>Mimetype:</th><td>%h(pWiki->zMimetype)</td></tr> } if( pWiki->nParent>0 ){ int i; @ <tr><th>Parent%s(pWiki->nParent==1?"":"s"):</th><td> for(i=0; i<pWiki->nParent; i++){ char *zParent = pWiki->azParent[i]; |
︙ | |||
1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 | 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 | + | @ <li>Executable file objType |= OBJTYPE_EXE; }else{ @ <li>File if( bNeedBase ){ bNeedBase = 0; style_set_current_page("doc/%S/%s",zVers,zName); style_set_base_href_suffix("doc/%S/%s",zVers,zName); } } objType |= OBJTYPE_CONTENT; @ %z(href("%R/finfo?name=%T&ci=%!S&m=%!S",zName,zVers,zUuid))\ @ %h(zName)</a> tag_private_status(rid); if( showDetail ){ |
︙ | |||
2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 | 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 | + + + | } } if( isFile ){ if( isSymbolicCI ){ zHeader = mprintf("%s at %s", file_tail(zName), zCI); style_set_current_page("doc/%t/%T", zCI, zName); style_set_base_href_suffix("doc/%t/%T", zCI, zName); }else if( zCIUuid && zCIUuid[0] ){ zHeader = mprintf("%s at [%S]", file_tail(zName), zCIUuid); style_set_current_page("doc/%S/%T", zCIUuid, zName); style_set_base_href_suffix("doc/%S/%T", zCIUuid, zName); }else{ zHeader = mprintf("%s", file_tail(zName)); style_set_current_page("doc/tip/%T", zName); style_set_base_href_suffix("doc/tip/%T", zName); } }else if( descOnly ){ zHeader = mprintf("Artifact Description [%S]", zUuid); }else{ zHeader = mprintf("Artifact [%S]", zUuid); } style_header("%s", zHeader); |
︙ |
Changes to src/main.c.
︙ | |||
176 177 178 179 180 181 182 | 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | - + + + | int fNoHttpCompress; /* Do not compress HTTP traffic (for debugging) */ char *zSshCmd; /* SSH command string */ const char *zHttpCmd; /* External program to do HTTP requests */ int fNoSync; /* Do not do an autosync ever. --nosync */ int fIPv4; /* Use only IPv4, not IPv6. --ipv4 */ char *zPath; /* Name of webpage being served */ char *zExtra; /* Extra path information past the webpage name */ |
︙ | |||
1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 | 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 | + + | ** g.zBaseURL and g.zTop is set from that instead. */ void set_base_url(const char *zAltBase){ int i; const char *zHost; const char *zMode; const char *zCur; const char *zRU; /* REQUEST_URI */ size_t nTop; /* length of g.zTop */ if( g.zBaseURL!=0 ) return; if( zAltBase ){ int i, n, c; g.zTop = g.zBaseURL = mprintf("%s", zAltBase); i = (int)strlen(g.zBaseURL); while( i>3 && g.zBaseURL[i-1]=='/' ){ i--; } |
︙ | |||
1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 | 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 | + + + + + + | g.zBaseURL = mprintf("http://%s%.*s", z, i, zCur); g.zTop = &g.zBaseURL[7+strlen(z)]; g.zHttpsURL = mprintf("https://%s%.*s", z, i, zCur); } fossil_free(z); } zRU = PD("REQUEST_URI",""); nTop = strlen( g.zTop ); g.zRelReqURI = strncmp(zRU,g.zTop,nTop) ? "" : zRU+nTop; if(g.zRelReqURI[0]=='/') g.zRelReqURI++; g.zRelReqURI = fossil_strdup( g.zRelReqURI ); /* Try to record the base URL as a CONFIG table entry with a name ** of the form: "baseurl:BASE". This keeps a record of how the ** the repository is used as a server, to help in answering questions ** like "where is the CGI script that references this repository?" ** ** This is just a logging hint. So don't worry if it cannot be done. ** Don't try this if the repository database is not writable, for |
︙ |
Changes to src/style.c.
︙ | |||
402 403 404 405 406 407 408 409 410 411 412 413 414 415 | 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 | + + + + + + + + + + + + + + + + + + + + + + + + | }else{ va_list ap; va_start(ap, zFormat); local_zCurrentPage = vmprintf(zFormat, ap); va_end(ap); } } /* Use this for the $base_href_suffix variable if it is not NULL. ** If it is NULL then use g.zRelReqURI */ static const char *local_zBaseHrefSuffix = 0; /* ** Set the desired $base_href_suffix to something other than g.zRelReqURI */ void style_set_base_href_suffix(const char *zFormat, ...){ fossil_free( (char*)local_zBaseHrefSuffix ); if( zFormat==0 ){ local_zBaseHrefSuffix = 0; }else{ char *z; va_list ap; va_start(ap, zFormat); z = vmprintf(zFormat, ap); va_end(ap); local_zBaseHrefSuffix = escape_quotes( z ); if( local_zBaseHrefSuffix!=z ) fossil_free( z ); } } /* ** Create a TH1 variable containing the URL for the stylesheet. ** ** The name of the new variable will be "stylesheet_url". ** ** The value will be a URL for accessing the appropriate stylesheet. |
︙ | |||
645 646 647 648 649 650 651 | 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 | - + - + | ** Default HTML page header text through <body>. If the repository-specific ** header template lacks a <body> tag, then all of the following is ** prepended. */ static const char zDfltHeader[] = @ <html> @ <head> |
︙ | |||
767 768 769 770 771 772 773 774 775 776 777 778 779 780 | 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 | + + + | if( zTitle ) Th_Store("title", zTitle); Th_Store("baseurl", g.zBaseURL); Th_Store("secureurl", fossil_wants_https(1)? g.zHttpsURL: g.zBaseURL); Th_Store("home", g.zTop); Th_Store("index_page", db_get("index-page","/home")); if( local_zCurrentPage==0 ) style_set_current_page("%T", g.zPath); Th_Store("current_page", local_zCurrentPage); if( !local_zBaseHrefSuffix ) style_set_base_href_suffix("%s",g.zRelReqURI); Th_Store("base_href_suffix", local_zBaseHrefSuffix); Th_Store("webpagename", escape_quotes(g.zPath)); Th_Store("csrf_token", g.zCsrfToken); Th_Store("release_version", RELEASE_VERSION); Th_Store("manifest_version", MANIFEST_VERSION); Th_Store("manifest_date", MANIFEST_DATE); Th_Store("compiler_name", COMPILER_NAME); Th_Store("mainmenu", style_get_mainmenu()); stylesheet_url_var(); |
︙ | |||
1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 | 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 | + | if( isAuth ){ #if !defined(_WIN32) @ uid=%d(getuid()), gid=%d(getgid())<br /> #endif @ g.zBaseURL = %h(g.zBaseURL)<br /> @ g.zHttpsURL = %h(g.zHttpsURL)<br /> @ g.zRelReqURI = %h(g.zRelReqURI)<br /> @ g.zTop = %h(g.zTop)<br /> @ g.zPath = %h(g.zPath)<br /> @ g.userUid = %d(g.userUid)<br /> @ g.zLogin = %h(g.zLogin)<br /> @ g.isHuman = %d(g.isHuman)<br /> @ g.javascriptHyperlink = %d(g.javascriptHyperlink)<br /> if( g.nRequest ){ |
︙ |
Changes to src/wiki.c.
︙ | |||
595 596 597 598 599 600 601 602 603 604 605 606 607 608 | 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 | + + + + + | } if( g.perm.Hyperlink ){ style_submenu_element("History", "%R/whistory?name=%T", zPageName); } } if( !isPopup ){ style_set_current_page("%T?name=%T", g.zPath, zPageName); /* Overriding of base href disabled as part of 'base-href-fix' branch ** To bring back the old behavior uncomment the following call ** style_set_base_href_suffix("%T?name=%T", g.zPath, zPageName); */ wiki_page_header(WIKITYPE_UNKNOWN, zPageName, ""); if( !noSubmenu ){ wiki_standard_submenu(submenuFlags); } } if( zBody[0]==0 ){ @ <i>This page has been deleted</i> |
︙ | |||
1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 | 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 | + + + + + | } if( !isSandbox && P("cancel")!=0 ){ manifest_destroy(pWiki); cgi_redirectf("wiki?name=%T", zPageName); return; } style_set_current_page("%T?name=%T", g.zPath, zPageName); /* Overriding of base href disabled as part of 'base-href-fix' branch ** To bring back the old behavior uncomment the following call ** style_set_base_href_suffix("%T?name=%T", g.zPath, zPageName); */ style_set_current_feature("wiki"); style_header("Append Comment To: %s", zPageName); if( !goodCaptcha ){ @ <p class="generalError">Error: Incorrect security code.</p> } if( isSandbox ){ @ <p class="generalError">Error: the Sandbox page may not |
︙ |