| | @@ -96,10 +96,12 @@ |
| 96 | 96 | " on the same server"); |
| 97 | 97 | setup_menu_entry("Tickets", "tktsetup", |
| 98 | 98 | "Configure the trouble-ticketing system for this repository"); |
| 99 | 99 | setup_menu_entry("Search","srchsetup", |
| 100 | 100 | "Configure the built-in search engine"); |
| 101 | + setup_menu_entry("URL Aliases", "waliassetup", |
| 102 | + "Configure URL aliases"); |
| 101 | 103 | setup_menu_entry("Transfers", "xfersetup", |
| 102 | 104 | "Configure the transfer system for this repository"); |
| 103 | 105 | setup_menu_entry("Skins", "setup_skin", |
| 104 | 106 | "Select and/or modify the web interface \"skins\""); |
| 105 | 107 | setup_menu_entry("Moderation", "setup_modreq", |
| | @@ -2307,5 +2309,120 @@ |
| 2307 | 2309 | @ <p><input type="submit" name="fts1" value="Create A Full-Text Index"> |
| 2308 | 2310 | } |
| 2309 | 2311 | @ </div></form> |
| 2310 | 2312 | style_footer(); |
| 2311 | 2313 | } |
| 2314 | + |
| 2315 | +/* |
| 2316 | +** A URL Alias originally called zOldName is now zNewName/zValue. |
| 2317 | +** Write SQL to make this change into pSql. |
| 2318 | +** |
| 2319 | +** If zNewName or zValue is an empty string, then delete the entry. |
| 2320 | +** |
| 2321 | +** If zOldName is an empty string, create a new entry. |
| 2322 | +*/ |
| 2323 | +static void setup_update_url_alias( |
| 2324 | + Blob *pSql, |
| 2325 | + const char *zOldName, |
| 2326 | + const char *zNewName, |
| 2327 | + const char *zValue |
| 2328 | +){ |
| 2329 | + if( zNewName[0]==0 || zValue[0]==0 ){ |
| 2330 | + if( zOldName[0] ){ |
| 2331 | + blob_append_sql(pSql, |
| 2332 | + "DELETE FROM config WHERE name='walias:%q';\n", |
| 2333 | + zOldName); |
| 2334 | + } |
| 2335 | + return; |
| 2336 | + } |
| 2337 | + if( zOldName[0]==0 ){ |
| 2338 | + blob_append_sql(pSql, |
| 2339 | + "INSERT INTO config(name,value,mtime) VALUES('walias:%q',%Q,now());\n", |
| 2340 | + zNewName, zValue); |
| 2341 | + return; |
| 2342 | + } |
| 2343 | + if( strcmp(zOldName, zNewName)!=0 ){ |
| 2344 | + blob_append_sql(pSql, |
| 2345 | + "UPDATE config SET name='walias:%q', value=%Q, mtime=now()" |
| 2346 | + " WHERE name='walias:%q';\n", |
| 2347 | + zNewName, zValue, zOldName); |
| 2348 | + }else{ |
| 2349 | + blob_append_sql(pSql, |
| 2350 | + "UPDATE config SET value=%Q, mtime=now()" |
| 2351 | + " WHERE name='walias:%q' AND value<>%Q;\n", |
| 2352 | + zValue, zOldName, zValue); |
| 2353 | + } |
| 2354 | +} |
| 2355 | + |
| 2356 | +/* |
| 2357 | +** WEBPAGE: waliassetup |
| 2358 | +** |
| 2359 | +** Configure the URL aliases |
| 2360 | +*/ |
| 2361 | +void page_waliassetup(){ |
| 2362 | + Stmt q; |
| 2363 | + int cnt = 0; |
| 2364 | + Blob namelist; |
| 2365 | + login_check_credentials(); |
| 2366 | + if( !g.perm.Setup && !g.perm.Admin ){ |
| 2367 | + login_needed(0); |
| 2368 | + return; |
| 2369 | + } |
| 2370 | + style_header("URL ALias Configuration"); |
| 2371 | + if( P("submit")!=0 ){ |
| 2372 | + Blob token; |
| 2373 | + Blob sql; |
| 2374 | + const char *zNewName; |
| 2375 | + const char *zValue; |
| 2376 | + char zCnt[10]; |
| 2377 | + login_verify_csrf_secret(); |
| 2378 | + blob_init(&namelist, PD("namelist",""), -1); |
| 2379 | + blob_init(&sql, 0, 0); |
| 2380 | + while( blob_token(&namelist, &token) ){ |
| 2381 | + const char *zOldName = blob_str(&token); |
| 2382 | + sqlite3_snprintf(sizeof(zCnt), zCnt, "n%d", cnt); |
| 2383 | + zNewName = PD(zCnt, ""); |
| 2384 | + sqlite3_snprintf(sizeof(zCnt), zCnt, "v%d", cnt); |
| 2385 | + zValue = PD(zCnt, ""); |
| 2386 | + setup_update_url_alias(&sql, zOldName, zNewName, zValue); |
| 2387 | + cnt++; |
| 2388 | + blob_reset(&token); |
| 2389 | + } |
| 2390 | + sqlite3_snprintf(sizeof(zCnt), zCnt, "n%d", cnt); |
| 2391 | + zNewName = PD(zCnt,""); |
| 2392 | + sqlite3_snprintf(sizeof(zCnt), zCnt, "v%d", cnt); |
| 2393 | + zValue = PD(zCnt,""); |
| 2394 | + setup_update_url_alias(&sql, "", zNewName, zValue); |
| 2395 | + db_multi_exec("%s", blob_sql_text(&sql)); |
| 2396 | + blob_reset(&sql); |
| 2397 | + blob_reset(&namelist); |
| 2398 | + cnt = 0; |
| 2399 | + } |
| 2400 | + db_prepare(&q, |
| 2401 | + "SELECT substr(name,8), value FROM config WHERE name GLOB 'walias:/*'" |
| 2402 | + " UNION ALL SELECT '', ''" |
| 2403 | + ); |
| 2404 | + @ <form action="%s(g.zTop)/waliassetup" method="post"><div> |
| 2405 | + login_insert_csrf_secret(); |
| 2406 | + @ <table border=0 cellpadding=5> |
| 2407 | + @ <tr><th>Alias<th>URI That The Alias Maps Into |
| 2408 | + blob_init(&namelist, 0, 0); |
| 2409 | + while( db_step(&q)==SQLITE_ROW ){ |
| 2410 | + const char *zName = db_column_text(&q, 0); |
| 2411 | + const char *zValue = db_column_text(&q, 1); |
| 2412 | + @ <tr><td> |
| 2413 | + @ <input type='text' size='20' value='%h(zName)' name='n%d(cnt)'> |
| 2414 | + @ </td><td> |
| 2415 | + @ <input type='text' size='80' value='%h(zValue)' name='v%d(cnt)'> |
| 2416 | + @ </td></tr> |
| 2417 | + cnt++; |
| 2418 | + if( blob_size(&namelist)>0 ) blob_append(&namelist, " ", 1); |
| 2419 | + blob_append(&namelist, zName, -1); |
| 2420 | + } |
| 2421 | + db_finalize(&q); |
| 2422 | + @ <tr><td> |
| 2423 | + @ <input type='hidden' name='namelist' value='%h(blob_str(&namelist))'> |
| 2424 | + @ <input type='submit' name='submit' value="Apply Changes"> |
| 2425 | + @ </td><td></td></tr> |
| 2426 | + @ </table></form> |
| 2427 | + style_footer(); |
| 2428 | +} |
| 2312 | 2429 | |