Fossil SCM

Create a separate "Log Menu" page that shows all of the available log files.

drh 2024-03-29 12:41 trunk
Commit b28badb7411b90b2203a81212216bc5dc1793ee780b4f5b1af270f94d821770d
--- src/security_audit.c
+++ src/security_audit.c
@@ -751,13 +751,13 @@
751751
752752
style_finish_page();
753753
}
754754
755755
/*
756
-** The maximum number of bytes of log to show
756
+** The maximum number of bytes of the error log to show by default.
757757
*/
758
-#define MXSHOWLOG 50000
758
+#define MXSHOWLOG 500000
759759
760760
/*
761761
** WEBPAGE: errorlog
762762
**
763763
** Show the content of the error log. Only the administrator can view
@@ -773,13 +773,11 @@
773773
return;
774774
}
775775
style_header("Server Error Log");
776776
style_submenu_element("Test", "%R/test-warning");
777777
style_submenu_element("Refresh", "%R/errorlog");
778
- style_submenu_element("Admin-Log", "admin_log");
779
- style_submenu_element("User-Log", "access_log");
780
- style_submenu_element("Artifact-Log", "rcvfromlist");
778
+ style_submenu_element("Log-Menu", "%R/setup-logmenu");
781779
782780
if( g.zErrlog==0 || fossil_strcmp(g.zErrlog,"-")==0 ){
783781
@ <p>To create a server error log:
784782
@ <ol>
785783
@ <li><p>
786784
--- src/security_audit.c
+++ src/security_audit.c
@@ -751,13 +751,13 @@
751
752 style_finish_page();
753 }
754
755 /*
756 ** The maximum number of bytes of log to show
757 */
758 #define MXSHOWLOG 50000
759
760 /*
761 ** WEBPAGE: errorlog
762 **
763 ** Show the content of the error log. Only the administrator can view
@@ -773,13 +773,11 @@
773 return;
774 }
775 style_header("Server Error Log");
776 style_submenu_element("Test", "%R/test-warning");
777 style_submenu_element("Refresh", "%R/errorlog");
778 style_submenu_element("Admin-Log", "admin_log");
779 style_submenu_element("User-Log", "access_log");
780 style_submenu_element("Artifact-Log", "rcvfromlist");
781
782 if( g.zErrlog==0 || fossil_strcmp(g.zErrlog,"-")==0 ){
783 @ <p>To create a server error log:
784 @ <ol>
785 @ <li><p>
786
--- src/security_audit.c
+++ src/security_audit.c
@@ -751,13 +751,13 @@
751
752 style_finish_page();
753 }
754
755 /*
756 ** The maximum number of bytes of the error log to show by default.
757 */
758 #define MXSHOWLOG 500000
759
760 /*
761 ** WEBPAGE: errorlog
762 **
763 ** Show the content of the error log. Only the administrator can view
@@ -773,13 +773,11 @@
773 return;
774 }
775 style_header("Server Error Log");
776 style_submenu_element("Test", "%R/test-warning");
777 style_submenu_element("Refresh", "%R/errorlog");
778 style_submenu_element("Log-Menu", "%R/setup-logmenu");
 
 
779
780 if( g.zErrlog==0 || fossil_strcmp(g.zErrlog,"-")==0 ){
781 @ <p>To create a server error log:
782 @ <ol>
783 @ <li><p>
784
+59 -12
--- src/setup.c
+++ src/setup.c
@@ -49,11 +49,11 @@
4949
const char *zLink,
5050
const char *zDesc
5151
){
5252
@ <tr><td valign="top" align="right">
5353
if( zLink && zLink[0] ){
54
- @ <a href="%s(zLink)">%h(zTitle)</a>
54
+ @ <a href="%s(zLink)"><nobr>%h(zTitle)</nobr></a>
5555
}else{
5656
@ %h(zTitle)
5757
}
5858
@ </td><td width="5"></td><td valign="top">%h(zDesc)</td></tr>
5959
}
@@ -160,18 +160,12 @@
160160
}
161161
setup_menu_entry("Logo", "setup_logo",
162162
"Change the logo and background images for the server");
163163
setup_menu_entry("Shunned", "shun",
164164
"Show artifacts that are shunned by this repository");
165
- setup_menu_entry("Artifact Receipts Log", "rcvfromlist",
166
- "A record of received artifacts and their sources");
167
- setup_menu_entry("User Log", "access_log",
168
- "A record of login attempts");
169
- setup_menu_entry("Administrative Log", "admin_log",
170
- "View the admin_log entries");
171
- setup_menu_entry("Error Log", "errorlog",
172
- "View the Fossil server error log");
165
+ setup_menu_entry("Log Files", "setup-logmenu",
166
+ "A menu of available log files");
173167
setup_menu_entry("Unversioned Files", "uvlist?byage=1",
174168
"Show all unversioned files held");
175169
setup_menu_entry("Stats", "stat",
176170
"Repository Status Reports");
177171
setup_menu_entry("Sitemap", "sitemap",
@@ -185,10 +179,65 @@
185179
@ </table>
186180
187181
style_finish_page();
188182
}
189183
184
+
185
+/*
186
+** WEBPAGE: setup-logmenu
187
+**
188
+** Show a menu of available log renderings accessible to an administrator,
189
+** together with a succinct explanation of each.
190
+**
191
+** This page is only accessible by administrators.
192
+*/
193
+void setup_logmenu_page(void){
194
+ Blob desc;
195
+ blob_init(&desc, 0, 0);
196
+
197
+ /* Administrator access only */
198
+ login_check_credentials();
199
+ if( !g.perm.Admin ){
200
+ login_needed(0);
201
+ return;
202
+ }
203
+ style_header("Log Menu");
204
+ @ <table border="0" cellspacing="3">
205
+ setup_menu_entry("Admin Log", "admin_log",
206
+ "The admin log records configuration changes to the repository.\n"
207
+ "The admin log is stored in the \"admin_log\" table of the repository.\n"
208
+ );
209
+ setup_menu_entry("Artifact Log", "rcvfromlist",
210
+ "The artifact log records when new content is added to the repository.\n"
211
+ "The time and date and origin of the new content is entered into the\n"
212
+ "Log. The artifact log is always on and is stored in the \"rcvfrom\"\n"
213
+ "table of the repository.\n"
214
+ );
215
+
216
+ blob_appendf(&desc,
217
+ "The error log is a separate text file to which warning and error\n"
218
+ "messages are appended. A single error log can and often is shared\n"
219
+ "across multiple repositories.\n"
220
+ );
221
+ if( g.zErrlog==0 || fossil_strcmp(g.zErrlog,"-")==0 ){
222
+ blob_appendf(&desc,"The error log is disabled for this repository.");
223
+ }else{
224
+ blob_appendf(&desc,"In this repository, the error log is in the file"
225
+ "named \"%s\".", g.zErrlog);
226
+ }
227
+ setup_menu_entry("Error Log", "errorlog", blob_str(&desc));
228
+ blob_reset(&desc);
229
+
230
+ setup_menu_entry("User Log", "user_log",
231
+ "The user log is a record of login attempts. The user log is stored\n"
232
+ "in the \"accesslog\" table of the respository.\n"
233
+ );
234
+
235
+ @ </table>
236
+ style_finish_page();
237
+}
238
+
190239
/*
191240
** Generate a checkbox for an attribute.
192241
*/
193242
void onoff_attribute(
194243
const char *zLabel, /* The text label on the checkbox */
@@ -1962,13 +2011,11 @@
19622011
login_needed(0);
19632012
return;
19642013
}
19652014
style_set_current_feature("setup");
19662015
style_header("Admin Log");
1967
- style_submenu_element("User-Log", "access_log");
1968
- style_submenu_element("Artifact-Log", "rcvfromlist");
1969
- style_submenu_element("Error-Log", "errorlog");
2016
+ style_submenu_element("Log-Menu", "setup-logmenu");
19702017
create_admin_log_table();
19712018
limit = atoi(PD("n","200"));
19722019
ofst = atoi(PD("x","0"));
19732020
fLogEnabled = db_get_boolean("admin-log", 0);
19742021
@ <div>Admin logging is %s(fLogEnabled?"on":"off").
19752022
--- src/setup.c
+++ src/setup.c
@@ -49,11 +49,11 @@
49 const char *zLink,
50 const char *zDesc
51 ){
52 @ <tr><td valign="top" align="right">
53 if( zLink && zLink[0] ){
54 @ <a href="%s(zLink)">%h(zTitle)</a>
55 }else{
56 @ %h(zTitle)
57 }
58 @ </td><td width="5"></td><td valign="top">%h(zDesc)</td></tr>
59 }
@@ -160,18 +160,12 @@
160 }
161 setup_menu_entry("Logo", "setup_logo",
162 "Change the logo and background images for the server");
163 setup_menu_entry("Shunned", "shun",
164 "Show artifacts that are shunned by this repository");
165 setup_menu_entry("Artifact Receipts Log", "rcvfromlist",
166 "A record of received artifacts and their sources");
167 setup_menu_entry("User Log", "access_log",
168 "A record of login attempts");
169 setup_menu_entry("Administrative Log", "admin_log",
170 "View the admin_log entries");
171 setup_menu_entry("Error Log", "errorlog",
172 "View the Fossil server error log");
173 setup_menu_entry("Unversioned Files", "uvlist?byage=1",
174 "Show all unversioned files held");
175 setup_menu_entry("Stats", "stat",
176 "Repository Status Reports");
177 setup_menu_entry("Sitemap", "sitemap",
@@ -185,10 +179,65 @@
185 @ </table>
186
187 style_finish_page();
188 }
189
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
190 /*
191 ** Generate a checkbox for an attribute.
192 */
193 void onoff_attribute(
194 const char *zLabel, /* The text label on the checkbox */
@@ -1962,13 +2011,11 @@
1962 login_needed(0);
1963 return;
1964 }
1965 style_set_current_feature("setup");
1966 style_header("Admin Log");
1967 style_submenu_element("User-Log", "access_log");
1968 style_submenu_element("Artifact-Log", "rcvfromlist");
1969 style_submenu_element("Error-Log", "errorlog");
1970 create_admin_log_table();
1971 limit = atoi(PD("n","200"));
1972 ofst = atoi(PD("x","0"));
1973 fLogEnabled = db_get_boolean("admin-log", 0);
1974 @ <div>Admin logging is %s(fLogEnabled?"on":"off").
1975
--- src/setup.c
+++ src/setup.c
@@ -49,11 +49,11 @@
49 const char *zLink,
50 const char *zDesc
51 ){
52 @ <tr><td valign="top" align="right">
53 if( zLink && zLink[0] ){
54 @ <a href="%s(zLink)"><nobr>%h(zTitle)</nobr></a>
55 }else{
56 @ %h(zTitle)
57 }
58 @ </td><td width="5"></td><td valign="top">%h(zDesc)</td></tr>
59 }
@@ -160,18 +160,12 @@
160 }
161 setup_menu_entry("Logo", "setup_logo",
162 "Change the logo and background images for the server");
163 setup_menu_entry("Shunned", "shun",
164 "Show artifacts that are shunned by this repository");
165 setup_menu_entry("Log Files", "setup-logmenu",
166 "A menu of available log files");
 
 
 
 
 
 
167 setup_menu_entry("Unversioned Files", "uvlist?byage=1",
168 "Show all unversioned files held");
169 setup_menu_entry("Stats", "stat",
170 "Repository Status Reports");
171 setup_menu_entry("Sitemap", "sitemap",
@@ -185,10 +179,65 @@
179 @ </table>
180
181 style_finish_page();
182 }
183
184
185 /*
186 ** WEBPAGE: setup-logmenu
187 **
188 ** Show a menu of available log renderings accessible to an administrator,
189 ** together with a succinct explanation of each.
190 **
191 ** This page is only accessible by administrators.
192 */
193 void setup_logmenu_page(void){
194 Blob desc;
195 blob_init(&desc, 0, 0);
196
197 /* Administrator access only */
198 login_check_credentials();
199 if( !g.perm.Admin ){
200 login_needed(0);
201 return;
202 }
203 style_header("Log Menu");
204 @ <table border="0" cellspacing="3">
205 setup_menu_entry("Admin Log", "admin_log",
206 "The admin log records configuration changes to the repository.\n"
207 "The admin log is stored in the \"admin_log\" table of the repository.\n"
208 );
209 setup_menu_entry("Artifact Log", "rcvfromlist",
210 "The artifact log records when new content is added to the repository.\n"
211 "The time and date and origin of the new content is entered into the\n"
212 "Log. The artifact log is always on and is stored in the \"rcvfrom\"\n"
213 "table of the repository.\n"
214 );
215
216 blob_appendf(&desc,
217 "The error log is a separate text file to which warning and error\n"
218 "messages are appended. A single error log can and often is shared\n"
219 "across multiple repositories.\n"
220 );
221 if( g.zErrlog==0 || fossil_strcmp(g.zErrlog,"-")==0 ){
222 blob_appendf(&desc,"The error log is disabled for this repository.");
223 }else{
224 blob_appendf(&desc,"In this repository, the error log is in the file"
225 "named \"%s\".", g.zErrlog);
226 }
227 setup_menu_entry("Error Log", "errorlog", blob_str(&desc));
228 blob_reset(&desc);
229
230 setup_menu_entry("User Log", "user_log",
231 "The user log is a record of login attempts. The user log is stored\n"
232 "in the \"accesslog\" table of the respository.\n"
233 );
234
235 @ </table>
236 style_finish_page();
237 }
238
239 /*
240 ** Generate a checkbox for an attribute.
241 */
242 void onoff_attribute(
243 const char *zLabel, /* The text label on the checkbox */
@@ -1962,13 +2011,11 @@
2011 login_needed(0);
2012 return;
2013 }
2014 style_set_current_feature("setup");
2015 style_header("Admin Log");
2016 style_submenu_element("Log-Menu", "setup-logmenu");
 
 
2017 create_admin_log_table();
2018 limit = atoi(PD("n","200"));
2019 ofst = atoi(PD("x","0"));
2020 fLogEnabled = db_get_boolean("admin-log", 0);
2021 @ <div>Admin logging is %s(fLogEnabled?"on":"off").
2022
+1 -3
--- src/shun.c
+++ src/shun.c
@@ -374,13 +374,11 @@
374374
if( !g.perm.Admin ){
375375
login_needed(0);
376376
return;
377377
}
378378
style_header("Artifact Receipts");
379
- style_submenu_element("Admin-Log", "admin_log");
380
- style_submenu_element("User-Log", "access_log");
381
- style_submenu_element("Error-Log", "errorlog");
379
+ style_submenu_element("Log-Menu", "setup-logmenu");
382380
if( showAll ){
383381
ofst = 0;
384382
}else{
385383
style_submenu_element("All", "rcvfromlist?all=1");
386384
}
387385
--- src/shun.c
+++ src/shun.c
@@ -374,13 +374,11 @@
374 if( !g.perm.Admin ){
375 login_needed(0);
376 return;
377 }
378 style_header("Artifact Receipts");
379 style_submenu_element("Admin-Log", "admin_log");
380 style_submenu_element("User-Log", "access_log");
381 style_submenu_element("Error-Log", "errorlog");
382 if( showAll ){
383 ofst = 0;
384 }else{
385 style_submenu_element("All", "rcvfromlist?all=1");
386 }
387
--- src/shun.c
+++ src/shun.c
@@ -374,13 +374,11 @@
374 if( !g.perm.Admin ){
375 login_needed(0);
376 return;
377 }
378 style_header("Artifact Receipts");
379 style_submenu_element("Log-Menu", "setup-logmenu");
 
 
380 if( showAll ){
381 ofst = 0;
382 }else{
383 style_submenu_element("All", "rcvfromlist?all=1");
384 }
385
+16 -17
--- src/user.c
+++ src/user.c
@@ -667,10 +667,11 @@
667667
fossil_print("[%s]\n", blob_str(&answer));
668668
}
669669
670670
/*
671671
** WEBPAGE: access_log
672
+** WEBPAGE: user_log
672673
**
673674
** Show login attempts, including timestamp and IP address.
674675
** Requires Admin privileges.
675676
**
676677
** Query parameters:
@@ -677,11 +678,11 @@
677678
**
678679
** y=N 1: success only. 2: failure only. 3: both (default: 3)
679680
** n=N Number of entries to show (default: 200)
680681
** o=N Skip this many entries (default: 0)
681682
*/
682
-void access_log_page(void){
683
+void user_log_page(void){
683684
int y = atoi(PD("y","3"));
684685
int n = atoi(PD("n","200"));
685686
int skip = atoi(PD("o","0"));
686687
const char *zUser = P("u");
687688
Blob sql;
@@ -695,34 +696,32 @@
695696
create_accesslog_table();
696697
697698
698699
if( P("delall") && P("delallbtn") ){
699700
db_multi_exec("DELETE FROM accesslog");
700
- cgi_redirectf("%R/access_log?y=%d&n=%d&o=%o", y, n, skip);
701
+ cgi_redirectf("%R/user_log?y=%d&n=%d&o=%o", y, n, skip);
701702
return;
702703
}
703704
if( P("delanon") && P("delanonbtn") ){
704705
db_multi_exec("DELETE FROM accesslog WHERE uname='anonymous'");
705
- cgi_redirectf("%R/access_log?y=%d&n=%d&o=%o", y, n, skip);
706
+ cgi_redirectf("%R/user_log?y=%d&n=%d&o=%o", y, n, skip);
706707
return;
707708
}
708709
if( P("delfail") && P("delfailbtn") ){
709710
db_multi_exec("DELETE FROM accesslog WHERE NOT success");
710
- cgi_redirectf("%R/access_log?y=%d&n=%d&o=%o", y, n, skip);
711
+ cgi_redirectf("%R/user_log?y=%d&n=%d&o=%o", y, n, skip);
711712
return;
712713
}
713714
if( P("delold") && P("deloldbtn") ){
714715
db_multi_exec("DELETE FROM accesslog WHERE rowid in"
715716
"(SELECT rowid FROM accesslog ORDER BY rowid DESC"
716717
" LIMIT -1 OFFSET 200)");
717
- cgi_redirectf("%R/access_log?y=%d&n=%d", y, n);
718
+ cgi_redirectf("%R/user_log?y=%d&n=%d", y, n);
718719
return;
719720
}
720
- style_header("Access Log");
721
- style_submenu_element("Admin-Log", "admin_log");
722
- style_submenu_element("Artifact-Log", "rcvfromlist");
723
- style_submenu_element("Error-Log", "errorlog");
721
+ style_header("User Log");
722
+ style_submenu_element("Log-Menu", "setup-logmenu");
724723
725724
blob_zero(&sql);
726725
blob_append_sql(&sql,
727726
"SELECT uname, ipaddr, datetime(mtime,toLocal()), success"
728727
" FROM accesslog"
@@ -736,16 +735,16 @@
736735
}else if( y==2 ){
737736
blob_append(&sql, " WHERE NOT success", -1);
738737
}
739738
blob_append_sql(&sql," ORDER BY rowid DESC LIMIT %d OFFSET %d", n+1, skip);
740739
if( skip ){
741
- style_submenu_element("Newer", "%R/access_log?o=%d&n=%d&y=%d",
740
+ style_submenu_element("Newer", "%R/user_log?o=%d&n=%d&y=%d",
742741
skip>=n ? skip-n : 0, n, y);
743742
}
744743
rc = db_prepare_ignore_error(&q, "%s", blob_sql_text(&sql));
745744
fLogEnabled = db_get_boolean("access-log", 0);
746
- @ <div align="center">Access logging is %s(fLogEnabled?"on":"off").
745
+ @ <div align="center">User logging is %s(fLogEnabled?"on":"off").
747746
@ (Change this on the <a href="setup_settings">settings</a> page.)</div>
748747
@ <table border="1" cellpadding="5" class="sortable" align="center" \
749748
@ data-column-types='Ttt' data-init-sort='1'>
750749
@ <thead><tr><th width="33%%">Date</th><th width="34%%">User</th>
751750
@ <th width="33%%">IP Address</th></tr></thead><tbody>
@@ -754,11 +753,11 @@
754753
const char *zIP = db_column_text(&q, 1);
755754
const char *zDate = db_column_text(&q, 2);
756755
int bSuccess = db_column_int(&q, 3);
757756
cnt++;
758757
if( cnt>n ){
759
- style_submenu_element("Older", "%R/access_log?o=%d&n=%d&y=%d",
758
+ style_submenu_element("Older", "%R/user_log?o=%d&n=%d&y=%d",
760759
skip+n, n, y);
761760
break;
762761
}
763762
if( bSuccess ){
764763
@ <tr>
@@ -766,33 +765,33 @@
766765
@ <tr bgcolor="#ffacc0">
767766
}
768767
@ <td>%s(zDate)</td><td>%h(zName)</td><td>%h(zIP)</td></tr>
769768
}
770769
if( skip>0 || cnt>n ){
771
- style_submenu_element("All", "%R/access_log?n=10000000");
770
+ style_submenu_element("All", "%R/user_log?n=10000000");
772771
}
773772
@ </tbody></table>
774773
db_finalize(&q);
775774
@ <hr>
776
- @ <form method="post" action="%R/access_log">
775
+ @ <form method="post" action="%R/user_log">
777776
@ <label><input type="checkbox" name="delold">
778777
@ Delete all but the most recent 200 entries</input></label>
779778
@ <input type="submit" name="deloldbtn" value="Delete"></input>
780779
@ </form>
781
- @ <form method="post" action="%R/access_log">
780
+ @ <form method="post" action="%R/user_log">
782781
@ <label><input type="checkbox" name="delanon">
783782
@ Delete all entries for user "anonymous"</input></label>
784783
@ <input type="submit" name="delanonbtn" value="Delete"></input>
785784
@ </form>
786
- @ <form method="post" action="%R/access_log">
785
+ @ <form method="post" action="%R/user_log">
787786
@ <label><input type="checkbox" name="delfail">
788787
@ Delete all failed login attempts</input></label>
789788
@ <input type="submit" name="delfailbtn" value="Delete"></input>
790789
@ </form>
791
- @ <form method="post" action="%R/access_log">
790
+ @ <form method="post" action="%R/user_log">
792791
@ <label><input type="checkbox" name="delall">
793792
@ Delete all entries</input></label>
794793
@ <input type="submit" name="delallbtn" value="Delete"></input>
795794
@ </form>
796795
style_table_sorter();
797796
style_finish_page();
798797
}
799798
--- src/user.c
+++ src/user.c
@@ -667,10 +667,11 @@
667 fossil_print("[%s]\n", blob_str(&answer));
668 }
669
670 /*
671 ** WEBPAGE: access_log
 
672 **
673 ** Show login attempts, including timestamp and IP address.
674 ** Requires Admin privileges.
675 **
676 ** Query parameters:
@@ -677,11 +678,11 @@
677 **
678 ** y=N 1: success only. 2: failure only. 3: both (default: 3)
679 ** n=N Number of entries to show (default: 200)
680 ** o=N Skip this many entries (default: 0)
681 */
682 void access_log_page(void){
683 int y = atoi(PD("y","3"));
684 int n = atoi(PD("n","200"));
685 int skip = atoi(PD("o","0"));
686 const char *zUser = P("u");
687 Blob sql;
@@ -695,34 +696,32 @@
695 create_accesslog_table();
696
697
698 if( P("delall") && P("delallbtn") ){
699 db_multi_exec("DELETE FROM accesslog");
700 cgi_redirectf("%R/access_log?y=%d&n=%d&o=%o", y, n, skip);
701 return;
702 }
703 if( P("delanon") && P("delanonbtn") ){
704 db_multi_exec("DELETE FROM accesslog WHERE uname='anonymous'");
705 cgi_redirectf("%R/access_log?y=%d&n=%d&o=%o", y, n, skip);
706 return;
707 }
708 if( P("delfail") && P("delfailbtn") ){
709 db_multi_exec("DELETE FROM accesslog WHERE NOT success");
710 cgi_redirectf("%R/access_log?y=%d&n=%d&o=%o", y, n, skip);
711 return;
712 }
713 if( P("delold") && P("deloldbtn") ){
714 db_multi_exec("DELETE FROM accesslog WHERE rowid in"
715 "(SELECT rowid FROM accesslog ORDER BY rowid DESC"
716 " LIMIT -1 OFFSET 200)");
717 cgi_redirectf("%R/access_log?y=%d&n=%d", y, n);
718 return;
719 }
720 style_header("Access Log");
721 style_submenu_element("Admin-Log", "admin_log");
722 style_submenu_element("Artifact-Log", "rcvfromlist");
723 style_submenu_element("Error-Log", "errorlog");
724
725 blob_zero(&sql);
726 blob_append_sql(&sql,
727 "SELECT uname, ipaddr, datetime(mtime,toLocal()), success"
728 " FROM accesslog"
@@ -736,16 +735,16 @@
736 }else if( y==2 ){
737 blob_append(&sql, " WHERE NOT success", -1);
738 }
739 blob_append_sql(&sql," ORDER BY rowid DESC LIMIT %d OFFSET %d", n+1, skip);
740 if( skip ){
741 style_submenu_element("Newer", "%R/access_log?o=%d&n=%d&y=%d",
742 skip>=n ? skip-n : 0, n, y);
743 }
744 rc = db_prepare_ignore_error(&q, "%s", blob_sql_text(&sql));
745 fLogEnabled = db_get_boolean("access-log", 0);
746 @ <div align="center">Access logging is %s(fLogEnabled?"on":"off").
747 @ (Change this on the <a href="setup_settings">settings</a> page.)</div>
748 @ <table border="1" cellpadding="5" class="sortable" align="center" \
749 @ data-column-types='Ttt' data-init-sort='1'>
750 @ <thead><tr><th width="33%%">Date</th><th width="34%%">User</th>
751 @ <th width="33%%">IP Address</th></tr></thead><tbody>
@@ -754,11 +753,11 @@
754 const char *zIP = db_column_text(&q, 1);
755 const char *zDate = db_column_text(&q, 2);
756 int bSuccess = db_column_int(&q, 3);
757 cnt++;
758 if( cnt>n ){
759 style_submenu_element("Older", "%R/access_log?o=%d&n=%d&y=%d",
760 skip+n, n, y);
761 break;
762 }
763 if( bSuccess ){
764 @ <tr>
@@ -766,33 +765,33 @@
766 @ <tr bgcolor="#ffacc0">
767 }
768 @ <td>%s(zDate)</td><td>%h(zName)</td><td>%h(zIP)</td></tr>
769 }
770 if( skip>0 || cnt>n ){
771 style_submenu_element("All", "%R/access_log?n=10000000");
772 }
773 @ </tbody></table>
774 db_finalize(&q);
775 @ <hr>
776 @ <form method="post" action="%R/access_log">
777 @ <label><input type="checkbox" name="delold">
778 @ Delete all but the most recent 200 entries</input></label>
779 @ <input type="submit" name="deloldbtn" value="Delete"></input>
780 @ </form>
781 @ <form method="post" action="%R/access_log">
782 @ <label><input type="checkbox" name="delanon">
783 @ Delete all entries for user "anonymous"</input></label>
784 @ <input type="submit" name="delanonbtn" value="Delete"></input>
785 @ </form>
786 @ <form method="post" action="%R/access_log">
787 @ <label><input type="checkbox" name="delfail">
788 @ Delete all failed login attempts</input></label>
789 @ <input type="submit" name="delfailbtn" value="Delete"></input>
790 @ </form>
791 @ <form method="post" action="%R/access_log">
792 @ <label><input type="checkbox" name="delall">
793 @ Delete all entries</input></label>
794 @ <input type="submit" name="delallbtn" value="Delete"></input>
795 @ </form>
796 style_table_sorter();
797 style_finish_page();
798 }
799
--- src/user.c
+++ src/user.c
@@ -667,10 +667,11 @@
667 fossil_print("[%s]\n", blob_str(&answer));
668 }
669
670 /*
671 ** WEBPAGE: access_log
672 ** WEBPAGE: user_log
673 **
674 ** Show login attempts, including timestamp and IP address.
675 ** Requires Admin privileges.
676 **
677 ** Query parameters:
@@ -677,11 +678,11 @@
678 **
679 ** y=N 1: success only. 2: failure only. 3: both (default: 3)
680 ** n=N Number of entries to show (default: 200)
681 ** o=N Skip this many entries (default: 0)
682 */
683 void user_log_page(void){
684 int y = atoi(PD("y","3"));
685 int n = atoi(PD("n","200"));
686 int skip = atoi(PD("o","0"));
687 const char *zUser = P("u");
688 Blob sql;
@@ -695,34 +696,32 @@
696 create_accesslog_table();
697
698
699 if( P("delall") && P("delallbtn") ){
700 db_multi_exec("DELETE FROM accesslog");
701 cgi_redirectf("%R/user_log?y=%d&n=%d&o=%o", y, n, skip);
702 return;
703 }
704 if( P("delanon") && P("delanonbtn") ){
705 db_multi_exec("DELETE FROM accesslog WHERE uname='anonymous'");
706 cgi_redirectf("%R/user_log?y=%d&n=%d&o=%o", y, n, skip);
707 return;
708 }
709 if( P("delfail") && P("delfailbtn") ){
710 db_multi_exec("DELETE FROM accesslog WHERE NOT success");
711 cgi_redirectf("%R/user_log?y=%d&n=%d&o=%o", y, n, skip);
712 return;
713 }
714 if( P("delold") && P("deloldbtn") ){
715 db_multi_exec("DELETE FROM accesslog WHERE rowid in"
716 "(SELECT rowid FROM accesslog ORDER BY rowid DESC"
717 " LIMIT -1 OFFSET 200)");
718 cgi_redirectf("%R/user_log?y=%d&n=%d", y, n);
719 return;
720 }
721 style_header("User Log");
722 style_submenu_element("Log-Menu", "setup-logmenu");
 
 
723
724 blob_zero(&sql);
725 blob_append_sql(&sql,
726 "SELECT uname, ipaddr, datetime(mtime,toLocal()), success"
727 " FROM accesslog"
@@ -736,16 +735,16 @@
735 }else if( y==2 ){
736 blob_append(&sql, " WHERE NOT success", -1);
737 }
738 blob_append_sql(&sql," ORDER BY rowid DESC LIMIT %d OFFSET %d", n+1, skip);
739 if( skip ){
740 style_submenu_element("Newer", "%R/user_log?o=%d&n=%d&y=%d",
741 skip>=n ? skip-n : 0, n, y);
742 }
743 rc = db_prepare_ignore_error(&q, "%s", blob_sql_text(&sql));
744 fLogEnabled = db_get_boolean("access-log", 0);
745 @ <div align="center">User logging is %s(fLogEnabled?"on":"off").
746 @ (Change this on the <a href="setup_settings">settings</a> page.)</div>
747 @ <table border="1" cellpadding="5" class="sortable" align="center" \
748 @ data-column-types='Ttt' data-init-sort='1'>
749 @ <thead><tr><th width="33%%">Date</th><th width="34%%">User</th>
750 @ <th width="33%%">IP Address</th></tr></thead><tbody>
@@ -754,11 +753,11 @@
753 const char *zIP = db_column_text(&q, 1);
754 const char *zDate = db_column_text(&q, 2);
755 int bSuccess = db_column_int(&q, 3);
756 cnt++;
757 if( cnt>n ){
758 style_submenu_element("Older", "%R/user_log?o=%d&n=%d&y=%d",
759 skip+n, n, y);
760 break;
761 }
762 if( bSuccess ){
763 @ <tr>
@@ -766,33 +765,33 @@
765 @ <tr bgcolor="#ffacc0">
766 }
767 @ <td>%s(zDate)</td><td>%h(zName)</td><td>%h(zIP)</td></tr>
768 }
769 if( skip>0 || cnt>n ){
770 style_submenu_element("All", "%R/user_log?n=10000000");
771 }
772 @ </tbody></table>
773 db_finalize(&q);
774 @ <hr>
775 @ <form method="post" action="%R/user_log">
776 @ <label><input type="checkbox" name="delold">
777 @ Delete all but the most recent 200 entries</input></label>
778 @ <input type="submit" name="deloldbtn" value="Delete"></input>
779 @ </form>
780 @ <form method="post" action="%R/user_log">
781 @ <label><input type="checkbox" name="delanon">
782 @ Delete all entries for user "anonymous"</input></label>
783 @ <input type="submit" name="delanonbtn" value="Delete"></input>
784 @ </form>
785 @ <form method="post" action="%R/user_log">
786 @ <label><input type="checkbox" name="delfail">
787 @ Delete all failed login attempts</input></label>
788 @ <input type="submit" name="delfailbtn" value="Delete"></input>
789 @ </form>
790 @ <form method="post" action="%R/user_log">
791 @ <label><input type="checkbox" name="delall">
792 @ Delete all entries</input></label>
793 @ <input type="submit" name="delallbtn" value="Delete"></input>
794 @ </form>
795 style_table_sorter();
796 style_finish_page();
797 }
798

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button