| | @@ -79,10 +79,11 @@ |
| 79 | 79 | void home_page(void){ |
| 80 | 80 | char *zPageName = db_get("project-name",0); |
| 81 | 81 | if( zPageName ){ |
| 82 | 82 | login_check_credentials(); |
| 83 | 83 | g.zExtra = zPageName; |
| 84 | + cgi_set_parameter_nocopy("name", g.zExtra); |
| 84 | 85 | g.okRdWiki = 1; |
| 85 | 86 | g.okApndWiki = 0; |
| 86 | 87 | g.okWrWiki = 0; |
| 87 | 88 | g.okHistory = 0; |
| 88 | 89 | wiki_page(); |
| | @@ -98,25 +99,24 @@ |
| 98 | 99 | style_footer(); |
| 99 | 100 | } |
| 100 | 101 | |
| 101 | 102 | /* |
| 102 | 103 | ** WEBPAGE: wiki |
| 103 | | -** URL: /wiki/PAGENAME |
| 104 | +** URL: /wiki?name=PAGENAME |
| 104 | 105 | */ |
| 105 | 106 | void wiki_page(void){ |
| 106 | 107 | char *zTag; |
| 107 | 108 | int rid; |
| 108 | 109 | Blob wiki; |
| 109 | 110 | Manifest m; |
| 110 | | - char *zPageName; |
| 111 | + const char *zPageName; |
| 111 | 112 | char *zHtmlPageName; |
| 112 | 113 | char *zBody = mprintf("%s","<i>Empty Page</i>"); |
| 113 | 114 | |
| 114 | 115 | login_check_credentials(); |
| 115 | 116 | if( !g.okRdWiki ){ login_needed(); return; } |
| 116 | | - zPageName = mprintf("%s", g.zExtra); |
| 117 | | - dehttpize(zPageName); |
| 117 | + zPageName = PD("name",""); |
| 118 | 118 | if( check_name(zPageName) ) return; |
| 119 | 119 | zTag = mprintf("wiki-%s", zPageName); |
| 120 | 120 | rid = db_int(0, |
| 121 | 121 | "SELECT rid FROM tagxref" |
| 122 | 122 | " WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)" |
| | @@ -133,19 +133,19 @@ |
| 133 | 133 | zBody = m.zWiki; |
| 134 | 134 | } |
| 135 | 135 | } |
| 136 | 136 | if( (rid && g.okWrWiki) || (!rid && g.okNewWiki) ){ |
| 137 | 137 | style_submenu_element("Edit", "Edit Wiki Page", |
| 138 | | - mprintf("%s/wikiedit/%s", g.zTop, g.zExtra)); |
| 138 | + mprintf("%s/wikiedit?name=%t", g.zTop, zPageName)); |
| 139 | 139 | } |
| 140 | 140 | if( rid && g.okApndWiki ){ |
| 141 | 141 | style_submenu_element("Append", "Add A Comment", |
| 142 | | - mprintf("%s/wikiappend/%s", g.zTop, g.zExtra)); |
| 142 | + mprintf("%s/wikiappend?name=%t", g.zTop, zPageName)); |
| 143 | 143 | } |
| 144 | 144 | if( g.okHistory ){ |
| 145 | 145 | style_submenu_element("History", "History", |
| 146 | | - mprintf("%s/whistory/%s", g.zTop, g.zExtra)); |
| 146 | + mprintf("%s/whistory?name=%t", g.zTop, zPageName)); |
| 147 | 147 | } |
| 148 | 148 | zHtmlPageName = mprintf("%h", zPageName); |
| 149 | 149 | style_header(zHtmlPageName); |
| 150 | 150 | blob_init(&wiki, zBody, -1); |
| 151 | 151 | wiki_convert(&wiki, 0); |
| | @@ -154,29 +154,28 @@ |
| 154 | 154 | style_footer(); |
| 155 | 155 | } |
| 156 | 156 | |
| 157 | 157 | /* |
| 158 | 158 | ** WEBPAGE: wikiedit |
| 159 | | -** URL: /wikiedit/PAGENAME |
| 159 | +** URL: /wikiedit?page=PAGENAME |
| 160 | 160 | */ |
| 161 | 161 | void wikiedit_page(void){ |
| 162 | 162 | char *zTag; |
| 163 | 163 | int rid; |
| 164 | 164 | Blob wiki; |
| 165 | 165 | Manifest m; |
| 166 | | - char *zPageName; |
| 166 | + const char *zPageName; |
| 167 | 167 | char *zHtmlPageName; |
| 168 | 168 | int n; |
| 169 | 169 | const char *z; |
| 170 | 170 | char *zBody = (char*)P("w"); |
| 171 | 171 | |
| 172 | 172 | if( zBody ){ |
| 173 | 173 | zBody = mprintf("%s", zBody); |
| 174 | 174 | } |
| 175 | 175 | login_check_credentials(); |
| 176 | | - zPageName = mprintf("%s", g.zExtra); |
| 177 | | - dehttpize(zPageName); |
| 176 | + zPageName = PD("name",""); |
| 178 | 177 | if( check_name(zPageName) ) return; |
| 179 | 178 | zTag = mprintf("wiki-%s", zPageName); |
| 180 | 179 | rid = db_int(0, |
| 181 | 180 | "SELECT rid FROM tagxref" |
| 182 | 181 | " WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)" |
| | @@ -224,14 +223,14 @@ |
| 224 | 223 | db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid); |
| 225 | 224 | manifest_crosslink(nrid, &wiki); |
| 226 | 225 | blob_reset(&wiki); |
| 227 | 226 | content_deltify(rid, nrid, 0); |
| 228 | 227 | db_end_transaction(0); |
| 229 | | - cgi_redirect(mprintf("wiki/%s", g.zExtra)); |
| 228 | + cgi_redirectf("wiki?name=%t", zPageName); |
| 230 | 229 | } |
| 231 | 230 | if( P("cancel")!=0 ){ |
| 232 | | - cgi_redirect(mprintf("wiki/%s", g.zExtra)); |
| 231 | + cgi_redirectf("wiki?name=%t", zPageName); |
| 233 | 232 | return; |
| 234 | 233 | } |
| 235 | 234 | if( zBody==0 ){ |
| 236 | 235 | zBody = mprintf("<i>Empty Page</i>"); |
| 237 | 236 | } |
| | @@ -248,11 +247,12 @@ |
| 248 | 247 | for(n=2, z=zBody; z[0]; z++){ |
| 249 | 248 | if( z[0]=='\n' ) n++; |
| 250 | 249 | } |
| 251 | 250 | if( n<20 ) n = 20; |
| 252 | 251 | if( n>200 ) n = 200; |
| 253 | | - @ <form method="POST" action="%s(g.zBaseURL)/wikiedit/%t(g.zExtra)"> |
| 252 | + @ <form method="POST" action="%s(g.zBaseURL)/wikiedit"> |
| 253 | + @ <input type="hidden" name="name" value="%t(zPageName)"> |
| 254 | 254 | @ <textarea name="w" class="wikiedit" cols="80" |
| 255 | 255 | @ rows="%d(n)" wrap="virtual">%h(zBody)</textarea> |
| 256 | 256 | @ <br> |
| 257 | 257 | @ <input type="submit" name="preview" value="Preview Your Changes"> |
| 258 | 258 | @ <input type="submit" name="submit" value="Apply These Changes"> |
| | @@ -281,22 +281,21 @@ |
| 281 | 281 | blob_appendf(p, " added:\n\n%s", zRemark); |
| 282 | 282 | } |
| 283 | 283 | |
| 284 | 284 | /* |
| 285 | 285 | ** WEBPAGE: wikiappend |
| 286 | | -** URL: /wikiappend/PAGENAME |
| 286 | +** URL: /wikiappend?name=PAGENAME |
| 287 | 287 | */ |
| 288 | 288 | void wikiappend_page(void){ |
| 289 | 289 | char *zTag; |
| 290 | 290 | int rid; |
| 291 | | - char *zPageName; |
| 291 | + const char *zPageName; |
| 292 | 292 | char *zHtmlPageName; |
| 293 | 293 | const char *zUser; |
| 294 | 294 | |
| 295 | 295 | login_check_credentials(); |
| 296 | | - zPageName = mprintf("%s", g.zExtra); |
| 297 | | - dehttpize(zPageName); |
| 296 | + zPageName = PD("name",""); |
| 298 | 297 | if( check_name(zPageName) ) return; |
| 299 | 298 | zTag = mprintf("wiki-%s", zPageName); |
| 300 | 299 | rid = db_int(0, |
| 301 | 300 | "SELECT rid FROM tagxref" |
| 302 | 301 | " WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)" |
| | @@ -351,14 +350,14 @@ |
| 351 | 350 | db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid); |
| 352 | 351 | manifest_crosslink(nrid, &wiki); |
| 353 | 352 | blob_reset(&wiki); |
| 354 | 353 | content_deltify(rid, nrid, 0); |
| 355 | 354 | db_end_transaction(0); |
| 356 | | - cgi_redirect(mprintf("wiki/%s", g.zExtra)); |
| 355 | + cgi_redirectf("wiki?name=%t", zPageName); |
| 357 | 356 | } |
| 358 | 357 | if( P("cancel")!=0 ){ |
| 359 | | - cgi_redirect(mprintf("wiki/%s", g.zExtra)); |
| 358 | + cgi_redirectf("wiki?name=%t", zPageName); |
| 360 | 359 | return; |
| 361 | 360 | } |
| 362 | 361 | zHtmlPageName = mprintf("Append Comment To: %h", zPageName); |
| 363 | 362 | style_header(zHtmlPageName); |
| 364 | 363 | if( P("preview")!=0 ){ |
| | @@ -369,11 +368,12 @@ |
| 369 | 368 | wiki_convert(&preview, 0); |
| 370 | 369 | @ <hr> |
| 371 | 370 | blob_reset(&preview); |
| 372 | 371 | } |
| 373 | 372 | zUser = PD("u", g.zLogin); |
| 374 | | - @ <form method="POST" action="%s(g.zBaseURL)/wikiappend/%t(g.zExtra)"> |
| 373 | + @ <form method="POST" action="%s(g.zBaseURL)/wikiappend"> |
| 374 | + @ <input type="hidden" name="name" value="%t(zPageName)"> |
| 375 | 375 | @ Your Name: |
| 376 | 376 | @ <input type="text" name="u" size="20" value="%h(zUser)"><br> |
| 377 | 377 | @ Comment to append:<br> |
| 378 | 378 | @ <textarea name="r" class="wikiedit" cols="80" |
| 379 | 379 | @ rows="10" wrap="virtual">%h(PD("r",""))</textarea> |
| | @@ -385,29 +385,31 @@ |
| 385 | 385 | style_footer(); |
| 386 | 386 | } |
| 387 | 387 | |
| 388 | 388 | /* |
| 389 | 389 | ** WEBPAGE: whistory |
| 390 | +** URL: /whistory?name=PAGENAME |
| 390 | 391 | ** |
| 391 | | -** Show the complete change history for a single wiki page. The name |
| 392 | | -** of the wiki is in g.zExtra |
| 392 | +** Show the complete change history for a single wiki page. |
| 393 | 393 | */ |
| 394 | 394 | void whistory_page(void){ |
| 395 | 395 | Stmt q; |
| 396 | 396 | char *zTitle; |
| 397 | 397 | char *zSQL; |
| 398 | + const char *zPageName; |
| 398 | 399 | login_check_credentials(); |
| 399 | 400 | if( !g.okHistory ){ login_needed(); return; } |
| 400 | | - zTitle = mprintf("History Of %h", g.zExtra); |
| 401 | + zPageName = PD("name",""); |
| 402 | + zTitle = mprintf("History Of %h", zPageName); |
| 401 | 403 | style_header(zTitle); |
| 402 | 404 | free(zTitle); |
| 403 | 405 | |
| 404 | 406 | zSQL = mprintf("%s AND event.objid IN " |
| 405 | 407 | " (SELECT rid FROM tagxref WHERE tagid=" |
| 406 | 408 | "(SELECT tagid FROM tag WHERE tagname='wiki-%q'))" |
| 407 | 409 | "ORDER BY mtime DESC", |
| 408 | | - timeline_query_for_www(), g.zExtra); |
| 410 | + timeline_query_for_www(), zPageName); |
| 409 | 411 | db_prepare(&q, zSQL); |
| 410 | 412 | free(zSQL); |
| 411 | 413 | www_print_timeline(&q, 0, 0, 0, 0); |
| 412 | 414 | db_finalize(&q); |
| 413 | 415 | style_footer(); |
| | @@ -428,36 +430,10 @@ |
| 428 | 430 | "SELECT substr(tagname, 6, 1000) FROM tag WHERE tagname GLOB 'wiki-*'" |
| 429 | 431 | " ORDER BY lower(tagname)" |
| 430 | 432 | ); |
| 431 | 433 | while( db_step(&q)==SQLITE_ROW ){ |
| 432 | 434 | const char *zName = db_column_text(&q, 0); |
| 433 | | - @ <li><a href="%s(g.zBaseURL)/wiki/%t(zName)">%h(zName)</a></li> |
| 434 | | - } |
| 435 | | - db_finalize(&q); |
| 436 | | - style_footer(); |
| 437 | | -} |
| 438 | | - |
| 439 | | -/* |
| 440 | | -** WEBPAGE: ambiguous |
| 441 | | -** |
| 442 | | -** This is the destination for UUID hyperlinks that are ambiguous. |
| 443 | | -** Show all possible choices for the destination with links to each. |
| 444 | | -** |
| 445 | | -** The ambiguous UUID prefix is in g.zExtra |
| 446 | | -*/ |
| 447 | | -void ambiguous_page(void){ |
| 448 | | - Stmt q; |
| 449 | | - style_header("Ambiguous UUID"); |
| 450 | | - @ <p>The link <a href="%s(g.zBaseURL)/ambiguous/%T(g.zExtra)"> |
| 451 | | - @ [%h(g.zExtra)]</a> is ambiguous. It might mean any of the following:</p> |
| 452 | | - @ <ul> |
| 453 | | - db_prepare(&q, "SELECT uuid, rid FROM blob WHERE uuid>=%Q AND uuid<'%qz'" |
| 454 | | - " ORDER BY uuid", g.zExtra, g.zExtra); |
| 455 | | - while( db_step(&q)==SQLITE_ROW ){ |
| 456 | | - const char *zUuid = db_column_text(&q, 0); |
| 457 | | - int rid = db_column_int(&q, 1); |
| 458 | | - @ <li> %s(zUuid) - %d(rid) |
| 459 | | - } |
| 460 | | - db_finalize(&q); |
| 461 | | - @ </ul> |
| 435 | + @ <li><a href="%s(g.zBaseURL)/wiki?page=%t(zName)">%h(zName)</a></li> |
| 436 | + } |
| 437 | + db_finalize(&q); |
| 462 | 438 | style_footer(); |
| 463 | 439 | } |
| 464 | 440 | |