Fossil SCM
On the /rcvfromlist page, show the hash algorithms used for each batch of artifacts received.
Commit
386191d37967aaba59ed7af527874ce572b83c06efbe0d02418618290370d0cf
Parent
c5e4f7dff876ddf…
1 file changed
+24
-5
+24
-5
| --- src/shun.c | ||
| +++ src/shun.c | ||
| @@ -308,10 +308,11 @@ | ||
| 308 | 308 | void rcvfromlist_page(void){ |
| 309 | 309 | int ofst = atoi(PD("ofst","0")); |
| 310 | 310 | int showAll = P("all")!=0; |
| 311 | 311 | int cnt; |
| 312 | 312 | Stmt q; |
| 313 | + const int perScreen = 500; /* RCVIDs per page */ | |
| 313 | 314 | |
| 314 | 315 | login_check_credentials(); |
| 315 | 316 | if( !g.perm.Admin ){ |
| 316 | 317 | login_needed(0); |
| 317 | 318 | return; |
| @@ -322,27 +323,39 @@ | ||
| 322 | 323 | }else{ |
| 323 | 324 | style_submenu_element("All", "rcvfromlist?all=1"); |
| 324 | 325 | } |
| 325 | 326 | if( ofst>0 ){ |
| 326 | 327 | style_submenu_element("Newer", "rcvfromlist?ofst=%d", |
| 327 | - ofst>30 ? ofst-30 : 0); | |
| 328 | + ofst>perScreen ? ofst-perScreen : 0); | |
| 328 | 329 | } |
| 329 | 330 | db_multi_exec( |
| 330 | 331 | "CREATE TEMP TABLE rcvidUsed(x INTEGER PRIMARY KEY);" |
| 332 | + "CREATE TEMP TABLE rcvidSha1(x INTEGER PRIMARY KEY);" | |
| 333 | + "CREATE TEMP TABLE rcvidSha3(x INTEGER PRIMARY KEY);" | |
| 331 | 334 | "INSERT OR IGNORE INTO rcvidUsed(x) SELECT rcvid FROM blob;" |
| 335 | + "INSERT OR IGNORE INTO rcvidSha1(x)" | |
| 336 | + " SELECT rcvid FROM blob WHERE length(uuid)==40;" | |
| 337 | + "INSERT OR IGNORE INTO rcvidSha3(x)" | |
| 338 | + " SELECT rcvid FROM blob WHERE length(uuid)==64;" | |
| 332 | 339 | ); |
| 333 | 340 | if( db_table_exists("repository","unversioned") ){ |
| 334 | 341 | db_multi_exec( |
| 335 | 342 | "INSERT OR IGNORE INTO rcvidUsed(x) SELECT rcvid FROM unversioned;" |
| 343 | + "INSERT OR IGNORE INTO rcvidSha1(x)" | |
| 344 | + " SELECT rcvid FROM unversioned WHERE length(hash)==40;" | |
| 345 | + "INSERT OR IGNORE INTO rcvidSha3(x)" | |
| 346 | + " SELECT rcvid FROM unversioned WHERE length(hash)==64;" | |
| 336 | 347 | ); |
| 337 | 348 | } |
| 338 | 349 | db_prepare(&q, |
| 339 | 350 | "SELECT rcvid, login, datetime(rcvfrom.mtime), rcvfrom.ipaddr," |
| 340 | - " EXISTS(SELECT 1 FROM rcvidUsed WHERE x=rcvfrom.rcvid)" | |
| 351 | + " EXISTS(SELECT 1 FROM rcvidUsed WHERE x=rcvfrom.rcvid)," | |
| 352 | + " EXISTS(SELECT 1 FROM rcvidSha1 WHERE x=rcvfrom.rcvid)," | |
| 353 | + " EXISTS(SELECT 1 FROM rcvidSha3 WHERE x=rcvfrom.rcvid)" | |
| 341 | 354 | " FROM rcvfrom LEFT JOIN user USING(uid)" |
| 342 | 355 | " ORDER BY rcvid DESC LIMIT %d OFFSET %d", |
| 343 | - showAll ? -1 : 31, ofst | |
| 356 | + showAll ? -1 : perScreen+1, ofst | |
| 344 | 357 | ); |
| 345 | 358 | @ <p>Whenever new artifacts are added to the repository, either by |
| 346 | 359 | @ push or using the web interface, an entry is made in the RCVFROM table |
| 347 | 360 | @ to record the source of that artifact. This log facilitates |
| 348 | 361 | @ finding and fixing attempts to inject illicit content into the |
| @@ -356,19 +369,24 @@ | ||
| 356 | 369 | @ |
| 357 | 370 | @ <table cellpadding="0" cellspacing="0" border="0"> |
| 358 | 371 | @ <tr><th style="padding-right: 15px;text-align: right;">rcvid</th> |
| 359 | 372 | @ <th style="padding-right: 15px;text-align: left;">Date</th> |
| 360 | 373 | @ <th style="padding-right: 15px;text-align: left;">User</th> |
| 374 | + @ <th style="padding-right: 15px;text-align: left;">Hash</th> | |
| 361 | 375 | @ <th style="text-align: left;">IP Address</th></tr> |
| 362 | 376 | cnt = 0; |
| 363 | 377 | while( db_step(&q)==SQLITE_ROW ){ |
| 364 | 378 | int rcvid = db_column_int(&q, 0); |
| 365 | 379 | const char *zUser = db_column_text(&q, 1); |
| 366 | 380 | const char *zDate = db_column_text(&q, 2); |
| 367 | 381 | const char *zIpAddr = db_column_text(&q, 3); |
| 368 | - if( cnt==30 && !showAll ){ | |
| 369 | - style_submenu_element("Older", "rcvfromlist?ofst=%d", ofst+30); | |
| 382 | + int usesSha1 = db_column_int(&q, 5)!=0; | |
| 383 | + int usesSha3 = db_column_int(&q, 6)!=0; | |
| 384 | + static const char *zHashType[] = { "", "sha1", "sha3", "both" }; | |
| 385 | + const char *zHash = zHashType[usesSha1+usesSha3*2]; | |
| 386 | + if( cnt==perScreen && !showAll ){ | |
| 387 | + style_submenu_element("Older", "rcvfromlist?ofst=%d", ofst+perScreen); | |
| 370 | 388 | }else{ |
| 371 | 389 | cnt++; |
| 372 | 390 | @ <tr> |
| 373 | 391 | if( db_column_int(&q,4) ){ |
| 374 | 392 | @ <td style="padding-right: 15px;text-align: right;"> |
| @@ -376,10 +394,11 @@ | ||
| 376 | 394 | }else{ |
| 377 | 395 | @ <td style="padding-right: 15px;text-align: right;">%d(rcvid)</td> |
| 378 | 396 | } |
| 379 | 397 | @ <td style="padding-right: 15px;text-align: left;">%s(zDate)</td> |
| 380 | 398 | @ <td style="padding-right: 15px;text-align: left;">%h(zUser)</td> |
| 399 | + @ <td style="padding-right: 15px;text-align: left;">%s(zHash)</td> | |
| 381 | 400 | @ <td style="text-align: left;">%s(zIpAddr)</td> |
| 382 | 401 | @ </tr> |
| 383 | 402 | } |
| 384 | 403 | } |
| 385 | 404 | db_finalize(&q); |
| 386 | 405 |
| --- src/shun.c | |
| +++ src/shun.c | |
| @@ -308,10 +308,11 @@ | |
| 308 | void rcvfromlist_page(void){ |
| 309 | int ofst = atoi(PD("ofst","0")); |
| 310 | int showAll = P("all")!=0; |
| 311 | int cnt; |
| 312 | Stmt q; |
| 313 | |
| 314 | login_check_credentials(); |
| 315 | if( !g.perm.Admin ){ |
| 316 | login_needed(0); |
| 317 | return; |
| @@ -322,27 +323,39 @@ | |
| 322 | }else{ |
| 323 | style_submenu_element("All", "rcvfromlist?all=1"); |
| 324 | } |
| 325 | if( ofst>0 ){ |
| 326 | style_submenu_element("Newer", "rcvfromlist?ofst=%d", |
| 327 | ofst>30 ? ofst-30 : 0); |
| 328 | } |
| 329 | db_multi_exec( |
| 330 | "CREATE TEMP TABLE rcvidUsed(x INTEGER PRIMARY KEY);" |
| 331 | "INSERT OR IGNORE INTO rcvidUsed(x) SELECT rcvid FROM blob;" |
| 332 | ); |
| 333 | if( db_table_exists("repository","unversioned") ){ |
| 334 | db_multi_exec( |
| 335 | "INSERT OR IGNORE INTO rcvidUsed(x) SELECT rcvid FROM unversioned;" |
| 336 | ); |
| 337 | } |
| 338 | db_prepare(&q, |
| 339 | "SELECT rcvid, login, datetime(rcvfrom.mtime), rcvfrom.ipaddr," |
| 340 | " EXISTS(SELECT 1 FROM rcvidUsed WHERE x=rcvfrom.rcvid)" |
| 341 | " FROM rcvfrom LEFT JOIN user USING(uid)" |
| 342 | " ORDER BY rcvid DESC LIMIT %d OFFSET %d", |
| 343 | showAll ? -1 : 31, ofst |
| 344 | ); |
| 345 | @ <p>Whenever new artifacts are added to the repository, either by |
| 346 | @ push or using the web interface, an entry is made in the RCVFROM table |
| 347 | @ to record the source of that artifact. This log facilitates |
| 348 | @ finding and fixing attempts to inject illicit content into the |
| @@ -356,19 +369,24 @@ | |
| 356 | @ |
| 357 | @ <table cellpadding="0" cellspacing="0" border="0"> |
| 358 | @ <tr><th style="padding-right: 15px;text-align: right;">rcvid</th> |
| 359 | @ <th style="padding-right: 15px;text-align: left;">Date</th> |
| 360 | @ <th style="padding-right: 15px;text-align: left;">User</th> |
| 361 | @ <th style="text-align: left;">IP Address</th></tr> |
| 362 | cnt = 0; |
| 363 | while( db_step(&q)==SQLITE_ROW ){ |
| 364 | int rcvid = db_column_int(&q, 0); |
| 365 | const char *zUser = db_column_text(&q, 1); |
| 366 | const char *zDate = db_column_text(&q, 2); |
| 367 | const char *zIpAddr = db_column_text(&q, 3); |
| 368 | if( cnt==30 && !showAll ){ |
| 369 | style_submenu_element("Older", "rcvfromlist?ofst=%d", ofst+30); |
| 370 | }else{ |
| 371 | cnt++; |
| 372 | @ <tr> |
| 373 | if( db_column_int(&q,4) ){ |
| 374 | @ <td style="padding-right: 15px;text-align: right;"> |
| @@ -376,10 +394,11 @@ | |
| 376 | }else{ |
| 377 | @ <td style="padding-right: 15px;text-align: right;">%d(rcvid)</td> |
| 378 | } |
| 379 | @ <td style="padding-right: 15px;text-align: left;">%s(zDate)</td> |
| 380 | @ <td style="padding-right: 15px;text-align: left;">%h(zUser)</td> |
| 381 | @ <td style="text-align: left;">%s(zIpAddr)</td> |
| 382 | @ </tr> |
| 383 | } |
| 384 | } |
| 385 | db_finalize(&q); |
| 386 |
| --- src/shun.c | |
| +++ src/shun.c | |
| @@ -308,10 +308,11 @@ | |
| 308 | void rcvfromlist_page(void){ |
| 309 | int ofst = atoi(PD("ofst","0")); |
| 310 | int showAll = P("all")!=0; |
| 311 | int cnt; |
| 312 | Stmt q; |
| 313 | const int perScreen = 500; /* RCVIDs per page */ |
| 314 | |
| 315 | login_check_credentials(); |
| 316 | if( !g.perm.Admin ){ |
| 317 | login_needed(0); |
| 318 | return; |
| @@ -322,27 +323,39 @@ | |
| 323 | }else{ |
| 324 | style_submenu_element("All", "rcvfromlist?all=1"); |
| 325 | } |
| 326 | if( ofst>0 ){ |
| 327 | style_submenu_element("Newer", "rcvfromlist?ofst=%d", |
| 328 | ofst>perScreen ? ofst-perScreen : 0); |
| 329 | } |
| 330 | db_multi_exec( |
| 331 | "CREATE TEMP TABLE rcvidUsed(x INTEGER PRIMARY KEY);" |
| 332 | "CREATE TEMP TABLE rcvidSha1(x INTEGER PRIMARY KEY);" |
| 333 | "CREATE TEMP TABLE rcvidSha3(x INTEGER PRIMARY KEY);" |
| 334 | "INSERT OR IGNORE INTO rcvidUsed(x) SELECT rcvid FROM blob;" |
| 335 | "INSERT OR IGNORE INTO rcvidSha1(x)" |
| 336 | " SELECT rcvid FROM blob WHERE length(uuid)==40;" |
| 337 | "INSERT OR IGNORE INTO rcvidSha3(x)" |
| 338 | " SELECT rcvid FROM blob WHERE length(uuid)==64;" |
| 339 | ); |
| 340 | if( db_table_exists("repository","unversioned") ){ |
| 341 | db_multi_exec( |
| 342 | "INSERT OR IGNORE INTO rcvidUsed(x) SELECT rcvid FROM unversioned;" |
| 343 | "INSERT OR IGNORE INTO rcvidSha1(x)" |
| 344 | " SELECT rcvid FROM unversioned WHERE length(hash)==40;" |
| 345 | "INSERT OR IGNORE INTO rcvidSha3(x)" |
| 346 | " SELECT rcvid FROM unversioned WHERE length(hash)==64;" |
| 347 | ); |
| 348 | } |
| 349 | db_prepare(&q, |
| 350 | "SELECT rcvid, login, datetime(rcvfrom.mtime), rcvfrom.ipaddr," |
| 351 | " EXISTS(SELECT 1 FROM rcvidUsed WHERE x=rcvfrom.rcvid)," |
| 352 | " EXISTS(SELECT 1 FROM rcvidSha1 WHERE x=rcvfrom.rcvid)," |
| 353 | " EXISTS(SELECT 1 FROM rcvidSha3 WHERE x=rcvfrom.rcvid)" |
| 354 | " FROM rcvfrom LEFT JOIN user USING(uid)" |
| 355 | " ORDER BY rcvid DESC LIMIT %d OFFSET %d", |
| 356 | showAll ? -1 : perScreen+1, ofst |
| 357 | ); |
| 358 | @ <p>Whenever new artifacts are added to the repository, either by |
| 359 | @ push or using the web interface, an entry is made in the RCVFROM table |
| 360 | @ to record the source of that artifact. This log facilitates |
| 361 | @ finding and fixing attempts to inject illicit content into the |
| @@ -356,19 +369,24 @@ | |
| 369 | @ |
| 370 | @ <table cellpadding="0" cellspacing="0" border="0"> |
| 371 | @ <tr><th style="padding-right: 15px;text-align: right;">rcvid</th> |
| 372 | @ <th style="padding-right: 15px;text-align: left;">Date</th> |
| 373 | @ <th style="padding-right: 15px;text-align: left;">User</th> |
| 374 | @ <th style="padding-right: 15px;text-align: left;">Hash</th> |
| 375 | @ <th style="text-align: left;">IP Address</th></tr> |
| 376 | cnt = 0; |
| 377 | while( db_step(&q)==SQLITE_ROW ){ |
| 378 | int rcvid = db_column_int(&q, 0); |
| 379 | const char *zUser = db_column_text(&q, 1); |
| 380 | const char *zDate = db_column_text(&q, 2); |
| 381 | const char *zIpAddr = db_column_text(&q, 3); |
| 382 | int usesSha1 = db_column_int(&q, 5)!=0; |
| 383 | int usesSha3 = db_column_int(&q, 6)!=0; |
| 384 | static const char *zHashType[] = { "", "sha1", "sha3", "both" }; |
| 385 | const char *zHash = zHashType[usesSha1+usesSha3*2]; |
| 386 | if( cnt==perScreen && !showAll ){ |
| 387 | style_submenu_element("Older", "rcvfromlist?ofst=%d", ofst+perScreen); |
| 388 | }else{ |
| 389 | cnt++; |
| 390 | @ <tr> |
| 391 | if( db_column_int(&q,4) ){ |
| 392 | @ <td style="padding-right: 15px;text-align: right;"> |
| @@ -376,10 +394,11 @@ | |
| 394 | }else{ |
| 395 | @ <td style="padding-right: 15px;text-align: right;">%d(rcvid)</td> |
| 396 | } |
| 397 | @ <td style="padding-right: 15px;text-align: left;">%s(zDate)</td> |
| 398 | @ <td style="padding-right: 15px;text-align: left;">%h(zUser)</td> |
| 399 | @ <td style="padding-right: 15px;text-align: left;">%s(zHash)</td> |
| 400 | @ <td style="text-align: left;">%s(zIpAddr)</td> |
| 401 | @ </tr> |
| 402 | } |
| 403 | } |
| 404 | db_finalize(&q); |
| 405 |