Fossil SCM
On the /setup_ucap_list page, show the number of users having each capability, with a link to a list of users. This only works for administrators.
Commit
594421796a9ab8f2ab59250e3f09b704b76e2d9a6efc2f038bcc4a872de1f250
Parent
cc6f7a9257c5c9d…
2 files changed
+67
-35
+12
-7
+67
-35
| --- src/capabilities.c | ||
| +++ src/capabilities.c | ||
| @@ -228,96 +228,128 @@ | ||
| 228 | 228 | ** The following structure holds descriptions of the various capabilities. |
| 229 | 229 | */ |
| 230 | 230 | static struct Caps { |
| 231 | 231 | char cCap; /* The capability letter */ |
| 232 | 232 | unsigned short eClass; /* The "class" for this capability */ |
| 233 | + unsigned nUser; /* Number of users with this capability */ | |
| 233 | 234 | char *zAbbrev; /* Abbreviated mnemonic name */ |
| 234 | 235 | char *zOneLiner; /* One-line summary */ |
| 235 | 236 | } aCap[] = { |
| 236 | - { 'a', CAPCLASS_SUPER, | |
| 237 | + { 'a', CAPCLASS_SUPER, 0, | |
| 237 | 238 | "Admin", "Create and delete users" }, |
| 238 | - { 'b', CAPCLASS_WIKI|CAPCLASS_TKT, | |
| 239 | + { 'b', CAPCLASS_WIKI|CAPCLASS_TKT, 0, | |
| 239 | 240 | "Attach", "Add attchments to wiki or tickets" }, |
| 240 | - { 'c', CAPCLASS_TKT, | |
| 241 | + { 'c', CAPCLASS_TKT, 0, | |
| 241 | 242 | "Append-Tkt", "Append to existing tickets" }, |
| 242 | - { 'd', CAPCLASS_WIKI|CAPCLASS_TKT, | |
| 243 | + { 'd', CAPCLASS_WIKI|CAPCLASS_TKT, 0, | |
| 243 | 244 | "Delete", "Delete wiki or tickets" }, |
| 244 | - { 'e', CAPCLASS_DATA, | |
| 245 | + { 'e', CAPCLASS_DATA, 0, | |
| 245 | 246 | "View-PII", "View sensitive info such as email addresses" }, |
| 246 | - { 'f', CAPCLASS_WIKI, | |
| 247 | + { 'f', CAPCLASS_WIKI, 0, | |
| 247 | 248 | "New-Wiki", "Create new wiki pages" }, |
| 248 | - { 'g', CAPCLASS_DATA, | |
| 249 | + { 'g', CAPCLASS_DATA, 0, | |
| 249 | 250 | "Clone", "Clone the repository" }, |
| 250 | - { 'h', CAPCLASS_OTHER, | |
| 251 | + { 'h', CAPCLASS_OTHER, 0, | |
| 251 | 252 | "Hyperlinks", "Show hyperlinks to detailed repository history" }, |
| 252 | - { 'i', CAPCLASS_CODE, | |
| 253 | + { 'i', CAPCLASS_CODE, 0, | |
| 253 | 254 | "Check-In", "Check-in code changes" }, |
| 254 | - { 'j', CAPCLASS_WIKI, | |
| 255 | + { 'j', CAPCLASS_WIKI, 0, | |
| 255 | 256 | "Read-Wiki", "View wiki pages" }, |
| 256 | - { 'k', CAPCLASS_WIKI, | |
| 257 | + { 'k', CAPCLASS_WIKI, 0, | |
| 257 | 258 | "Write-Wiki", "Edit wiki pages" }, |
| 258 | - { 'l', CAPCLASS_WIKI|CAPCLASS_SUPER, | |
| 259 | + { 'l', CAPCLASS_WIKI|CAPCLASS_SUPER, 0, | |
| 259 | 260 | "Mod-Wiki", "Moderator for wiki pages" }, |
| 260 | - { 'm', CAPCLASS_WIKI, | |
| 261 | + { 'm', CAPCLASS_WIKI, 0, | |
| 261 | 262 | "Append-Wiki", "Append to wiki pages" }, |
| 262 | - { 'n', CAPCLASS_TKT, | |
| 263 | + { 'n', CAPCLASS_TKT, 0, | |
| 263 | 264 | "New-Tkt", "Create new tickets" }, |
| 264 | - { 'o', CAPCLASS_CODE, | |
| 265 | + { 'o', CAPCLASS_CODE, 0, | |
| 265 | 266 | "Check-Out", "Check out code" }, |
| 266 | - { 'p', CAPCLASS_OTHER, | |
| 267 | + { 'p', CAPCLASS_OTHER, 0, | |
| 267 | 268 | "Password", "Change your own password" }, |
| 268 | - { 'q', CAPCLASS_TKT|CAPCLASS_SUPER, | |
| 269 | + { 'q', CAPCLASS_TKT|CAPCLASS_SUPER, 0, | |
| 269 | 270 | "Mod-Tkt", "Moderate tickets" }, |
| 270 | - { 'r', CAPCLASS_TKT, | |
| 271 | + { 'r', CAPCLASS_TKT, 0, | |
| 271 | 272 | "Read-Tkt", "View tickets" }, |
| 272 | - { 's', CAPCLASS_SUPER, | |
| 273 | + { 's', CAPCLASS_SUPER, 0, | |
| 273 | 274 | "Superuser", "Setup and configure the respository" }, |
| 274 | - { 't', CAPCLASS_TKT, | |
| 275 | + { 't', CAPCLASS_TKT, 0, | |
| 275 | 276 | "Reports", "Create new ticket report formats" }, |
| 276 | - { 'u', CAPCLASS_OTHER, | |
| 277 | + { 'u', CAPCLASS_OTHER, 0, | |
| 277 | 278 | "Reader", "Inherit all the capabilities of the \"reader\" user" }, |
| 278 | - { 'v', CAPCLASS_OTHER, | |
| 279 | + { 'v', CAPCLASS_OTHER, 0, | |
| 279 | 280 | "Developer", "Inherit all capabilities of the \"developer\" user" }, |
| 280 | - { 'w', CAPCLASS_TKT, | |
| 281 | + { 'w', CAPCLASS_TKT, 0, | |
| 281 | 282 | "Write-Tkt", "Edit tickets" }, |
| 282 | - { 'x', CAPCLASS_DATA, | |
| 283 | + { 'x', CAPCLASS_DATA, 0, | |
| 283 | 284 | "Private", "Push and/or pull private branches" }, |
| 284 | - { 'y', CAPCLASS_SUPER, | |
| 285 | + { 'y', CAPCLASS_SUPER, 0, | |
| 285 | 286 | "Write-UV", "Push unversioned content" }, |
| 286 | - { 'z', CAPCLASS_CODE, | |
| 287 | + { 'z', CAPCLASS_CODE, 0, | |
| 287 | 288 | "Zip-Download", "Download a ZIP archive, tarball, or SQL archive" }, |
| 288 | - { '2', CAPCLASS_FORUM, | |
| 289 | + { '2', CAPCLASS_FORUM, 0, | |
| 289 | 290 | "Forum-Read", "Read forum posts by others" }, |
| 290 | - { '3', CAPCLASS_FORUM, | |
| 291 | + { '3', CAPCLASS_FORUM, 0, | |
| 291 | 292 | "Forum-Write", "Create new forum messages" }, |
| 292 | - { '4', CAPCLASS_FORUM, | |
| 293 | + { '4', CAPCLASS_FORUM, 0, | |
| 293 | 294 | "Forum-Trusted", "Create forum messages that bypass moderation" }, |
| 294 | - { '5', CAPCLASS_FORUM|CAPCLASS_SUPER, | |
| 295 | + { '5', CAPCLASS_FORUM|CAPCLASS_SUPER, 0, | |
| 295 | 296 | "Forum-Mod", "Moderator for forum messages" }, |
| 296 | - { '6', CAPCLASS_FORUM|CAPCLASS_SUPER, | |
| 297 | + { '6', CAPCLASS_FORUM|CAPCLASS_SUPER, 0, | |
| 297 | 298 | "Forum-Admin", "Set or remove capability '4' from other users" }, |
| 298 | - { '7', CAPCLASS_ALERT, | |
| 299 | + { '7', CAPCLASS_ALERT, 0, | |
| 299 | 300 | "Alerts", "Sign up for email alerts" }, |
| 300 | - { 'A', CAPCLASS_ALERT|CAPCLASS_SUPER, | |
| 301 | + { 'A', CAPCLASS_ALERT|CAPCLASS_SUPER, 0, | |
| 301 | 302 | "Announce", "Send announcements to all subscribers" }, |
| 302 | - { 'D', CAPCLASS_OTHER, | |
| 303 | + { 'D', CAPCLASS_OTHER, 0, | |
| 303 | 304 | "Debug", "Enable debugging features" }, |
| 304 | 305 | }; |
| 306 | + | |
| 307 | +/* | |
| 308 | +** Populate the aCap[].nUser values based on the current content | |
| 309 | +** of the USER table. | |
| 310 | +*/ | |
| 311 | +void capabilities_count(void){ | |
| 312 | + int i; | |
| 313 | + static int done = 0; | |
| 314 | + Stmt q; | |
| 315 | + if( done ) return; | |
| 316 | + db_prepare(&q, "SELECT fullcap(cap) FROM user"); | |
| 317 | + while( db_step(&q)==SQLITE_ROW ){ | |
| 318 | + const char *zCap = db_column_text(&q, 0); | |
| 319 | + if( zCap==0 || zCap[0]==0 ) continue; | |
| 320 | + for(i=0; i<sizeof(aCap)/sizeof(aCap[0]); i++){ | |
| 321 | + if( strchr(zCap, aCap[i].cCap) ) aCap[i].nUser++; | |
| 322 | + } | |
| 323 | + } | |
| 324 | + db_finalize(&q); | |
| 325 | + done = 1; | |
| 326 | +} | |
| 305 | 327 | |
| 306 | 328 | |
| 307 | 329 | /* |
| 308 | 330 | ** Generate HTML that lists all of the capability letters together with |
| 309 | 331 | ** a brief summary of what each letter means. |
| 310 | 332 | */ |
| 311 | 333 | void capabilities_table(unsigned mClass){ |
| 312 | 334 | int i; |
| 335 | + if( g.perm.Admin ) capabilities_count(); | |
| 313 | 336 | @ <table> |
| 337 | + @ <tbody> | |
| 314 | 338 | for(i=0; i<sizeof(aCap)/sizeof(aCap[0]); i++){ |
| 339 | + int n; | |
| 315 | 340 | if( (aCap[i].eClass & mClass)==0 ) continue; |
| 316 | 341 | @ <tr><th valign="top">%c(aCap[i].cCap)</th> |
| 317 | - @ <td><i>%h(aCap[i].zAbbrev):</i> %h(aCap[i].zOneLiner)</td></tr> | |
| 342 | + @ <td>%h(aCap[i].zAbbrev)</td><td>%h(aCap[i].zOneLiner)</td>\ | |
| 343 | + n = aCap[i].nUser; | |
| 344 | + if( n && g.perm.Admin ){ | |
| 345 | + @ <td><a href="%R/setup_ulist?with=%c(aCap[i].cCap)">\ | |
| 346 | + @ %d(n) user%s(n>1?"s":"")</a></td>\ | |
| 347 | + } | |
| 348 | + @ </tr> | |
| 318 | 349 | } |
| 350 | + @ </tbody> | |
| 319 | 351 | @ </table> |
| 320 | 352 | } |
| 321 | 353 | |
| 322 | 354 | /* |
| 323 | 355 | ** Generate a "capability summary table" that shows the major capabilities |
| 324 | 356 |
| --- src/capabilities.c | |
| +++ src/capabilities.c | |
| @@ -228,96 +228,128 @@ | |
| 228 | ** The following structure holds descriptions of the various capabilities. |
| 229 | */ |
| 230 | static struct Caps { |
| 231 | char cCap; /* The capability letter */ |
| 232 | unsigned short eClass; /* The "class" for this capability */ |
| 233 | char *zAbbrev; /* Abbreviated mnemonic name */ |
| 234 | char *zOneLiner; /* One-line summary */ |
| 235 | } aCap[] = { |
| 236 | { 'a', CAPCLASS_SUPER, |
| 237 | "Admin", "Create and delete users" }, |
| 238 | { 'b', CAPCLASS_WIKI|CAPCLASS_TKT, |
| 239 | "Attach", "Add attchments to wiki or tickets" }, |
| 240 | { 'c', CAPCLASS_TKT, |
| 241 | "Append-Tkt", "Append to existing tickets" }, |
| 242 | { 'd', CAPCLASS_WIKI|CAPCLASS_TKT, |
| 243 | "Delete", "Delete wiki or tickets" }, |
| 244 | { 'e', CAPCLASS_DATA, |
| 245 | "View-PII", "View sensitive info such as email addresses" }, |
| 246 | { 'f', CAPCLASS_WIKI, |
| 247 | "New-Wiki", "Create new wiki pages" }, |
| 248 | { 'g', CAPCLASS_DATA, |
| 249 | "Clone", "Clone the repository" }, |
| 250 | { 'h', CAPCLASS_OTHER, |
| 251 | "Hyperlinks", "Show hyperlinks to detailed repository history" }, |
| 252 | { 'i', CAPCLASS_CODE, |
| 253 | "Check-In", "Check-in code changes" }, |
| 254 | { 'j', CAPCLASS_WIKI, |
| 255 | "Read-Wiki", "View wiki pages" }, |
| 256 | { 'k', CAPCLASS_WIKI, |
| 257 | "Write-Wiki", "Edit wiki pages" }, |
| 258 | { 'l', CAPCLASS_WIKI|CAPCLASS_SUPER, |
| 259 | "Mod-Wiki", "Moderator for wiki pages" }, |
| 260 | { 'm', CAPCLASS_WIKI, |
| 261 | "Append-Wiki", "Append to wiki pages" }, |
| 262 | { 'n', CAPCLASS_TKT, |
| 263 | "New-Tkt", "Create new tickets" }, |
| 264 | { 'o', CAPCLASS_CODE, |
| 265 | "Check-Out", "Check out code" }, |
| 266 | { 'p', CAPCLASS_OTHER, |
| 267 | "Password", "Change your own password" }, |
| 268 | { 'q', CAPCLASS_TKT|CAPCLASS_SUPER, |
| 269 | "Mod-Tkt", "Moderate tickets" }, |
| 270 | { 'r', CAPCLASS_TKT, |
| 271 | "Read-Tkt", "View tickets" }, |
| 272 | { 's', CAPCLASS_SUPER, |
| 273 | "Superuser", "Setup and configure the respository" }, |
| 274 | { 't', CAPCLASS_TKT, |
| 275 | "Reports", "Create new ticket report formats" }, |
| 276 | { 'u', CAPCLASS_OTHER, |
| 277 | "Reader", "Inherit all the capabilities of the \"reader\" user" }, |
| 278 | { 'v', CAPCLASS_OTHER, |
| 279 | "Developer", "Inherit all capabilities of the \"developer\" user" }, |
| 280 | { 'w', CAPCLASS_TKT, |
| 281 | "Write-Tkt", "Edit tickets" }, |
| 282 | { 'x', CAPCLASS_DATA, |
| 283 | "Private", "Push and/or pull private branches" }, |
| 284 | { 'y', CAPCLASS_SUPER, |
| 285 | "Write-UV", "Push unversioned content" }, |
| 286 | { 'z', CAPCLASS_CODE, |
| 287 | "Zip-Download", "Download a ZIP archive, tarball, or SQL archive" }, |
| 288 | { '2', CAPCLASS_FORUM, |
| 289 | "Forum-Read", "Read forum posts by others" }, |
| 290 | { '3', CAPCLASS_FORUM, |
| 291 | "Forum-Write", "Create new forum messages" }, |
| 292 | { '4', CAPCLASS_FORUM, |
| 293 | "Forum-Trusted", "Create forum messages that bypass moderation" }, |
| 294 | { '5', CAPCLASS_FORUM|CAPCLASS_SUPER, |
| 295 | "Forum-Mod", "Moderator for forum messages" }, |
| 296 | { '6', CAPCLASS_FORUM|CAPCLASS_SUPER, |
| 297 | "Forum-Admin", "Set or remove capability '4' from other users" }, |
| 298 | { '7', CAPCLASS_ALERT, |
| 299 | "Alerts", "Sign up for email alerts" }, |
| 300 | { 'A', CAPCLASS_ALERT|CAPCLASS_SUPER, |
| 301 | "Announce", "Send announcements to all subscribers" }, |
| 302 | { 'D', CAPCLASS_OTHER, |
| 303 | "Debug", "Enable debugging features" }, |
| 304 | }; |
| 305 | |
| 306 | |
| 307 | /* |
| 308 | ** Generate HTML that lists all of the capability letters together with |
| 309 | ** a brief summary of what each letter means. |
| 310 | */ |
| 311 | void capabilities_table(unsigned mClass){ |
| 312 | int i; |
| 313 | @ <table> |
| 314 | for(i=0; i<sizeof(aCap)/sizeof(aCap[0]); i++){ |
| 315 | if( (aCap[i].eClass & mClass)==0 ) continue; |
| 316 | @ <tr><th valign="top">%c(aCap[i].cCap)</th> |
| 317 | @ <td><i>%h(aCap[i].zAbbrev):</i> %h(aCap[i].zOneLiner)</td></tr> |
| 318 | } |
| 319 | @ </table> |
| 320 | } |
| 321 | |
| 322 | /* |
| 323 | ** Generate a "capability summary table" that shows the major capabilities |
| 324 |
| --- src/capabilities.c | |
| +++ src/capabilities.c | |
| @@ -228,96 +228,128 @@ | |
| 228 | ** The following structure holds descriptions of the various capabilities. |
| 229 | */ |
| 230 | static struct Caps { |
| 231 | char cCap; /* The capability letter */ |
| 232 | unsigned short eClass; /* The "class" for this capability */ |
| 233 | unsigned nUser; /* Number of users with this capability */ |
| 234 | char *zAbbrev; /* Abbreviated mnemonic name */ |
| 235 | char *zOneLiner; /* One-line summary */ |
| 236 | } aCap[] = { |
| 237 | { 'a', CAPCLASS_SUPER, 0, |
| 238 | "Admin", "Create and delete users" }, |
| 239 | { 'b', CAPCLASS_WIKI|CAPCLASS_TKT, 0, |
| 240 | "Attach", "Add attchments to wiki or tickets" }, |
| 241 | { 'c', CAPCLASS_TKT, 0, |
| 242 | "Append-Tkt", "Append to existing tickets" }, |
| 243 | { 'd', CAPCLASS_WIKI|CAPCLASS_TKT, 0, |
| 244 | "Delete", "Delete wiki or tickets" }, |
| 245 | { 'e', CAPCLASS_DATA, 0, |
| 246 | "View-PII", "View sensitive info such as email addresses" }, |
| 247 | { 'f', CAPCLASS_WIKI, 0, |
| 248 | "New-Wiki", "Create new wiki pages" }, |
| 249 | { 'g', CAPCLASS_DATA, 0, |
| 250 | "Clone", "Clone the repository" }, |
| 251 | { 'h', CAPCLASS_OTHER, 0, |
| 252 | "Hyperlinks", "Show hyperlinks to detailed repository history" }, |
| 253 | { 'i', CAPCLASS_CODE, 0, |
| 254 | "Check-In", "Check-in code changes" }, |
| 255 | { 'j', CAPCLASS_WIKI, 0, |
| 256 | "Read-Wiki", "View wiki pages" }, |
| 257 | { 'k', CAPCLASS_WIKI, 0, |
| 258 | "Write-Wiki", "Edit wiki pages" }, |
| 259 | { 'l', CAPCLASS_WIKI|CAPCLASS_SUPER, 0, |
| 260 | "Mod-Wiki", "Moderator for wiki pages" }, |
| 261 | { 'm', CAPCLASS_WIKI, 0, |
| 262 | "Append-Wiki", "Append to wiki pages" }, |
| 263 | { 'n', CAPCLASS_TKT, 0, |
| 264 | "New-Tkt", "Create new tickets" }, |
| 265 | { 'o', CAPCLASS_CODE, 0, |
| 266 | "Check-Out", "Check out code" }, |
| 267 | { 'p', CAPCLASS_OTHER, 0, |
| 268 | "Password", "Change your own password" }, |
| 269 | { 'q', CAPCLASS_TKT|CAPCLASS_SUPER, 0, |
| 270 | "Mod-Tkt", "Moderate tickets" }, |
| 271 | { 'r', CAPCLASS_TKT, 0, |
| 272 | "Read-Tkt", "View tickets" }, |
| 273 | { 's', CAPCLASS_SUPER, 0, |
| 274 | "Superuser", "Setup and configure the respository" }, |
| 275 | { 't', CAPCLASS_TKT, 0, |
| 276 | "Reports", "Create new ticket report formats" }, |
| 277 | { 'u', CAPCLASS_OTHER, 0, |
| 278 | "Reader", "Inherit all the capabilities of the \"reader\" user" }, |
| 279 | { 'v', CAPCLASS_OTHER, 0, |
| 280 | "Developer", "Inherit all capabilities of the \"developer\" user" }, |
| 281 | { 'w', CAPCLASS_TKT, 0, |
| 282 | "Write-Tkt", "Edit tickets" }, |
| 283 | { 'x', CAPCLASS_DATA, 0, |
| 284 | "Private", "Push and/or pull private branches" }, |
| 285 | { 'y', CAPCLASS_SUPER, 0, |
| 286 | "Write-UV", "Push unversioned content" }, |
| 287 | { 'z', CAPCLASS_CODE, 0, |
| 288 | "Zip-Download", "Download a ZIP archive, tarball, or SQL archive" }, |
| 289 | { '2', CAPCLASS_FORUM, 0, |
| 290 | "Forum-Read", "Read forum posts by others" }, |
| 291 | { '3', CAPCLASS_FORUM, 0, |
| 292 | "Forum-Write", "Create new forum messages" }, |
| 293 | { '4', CAPCLASS_FORUM, 0, |
| 294 | "Forum-Trusted", "Create forum messages that bypass moderation" }, |
| 295 | { '5', CAPCLASS_FORUM|CAPCLASS_SUPER, 0, |
| 296 | "Forum-Mod", "Moderator for forum messages" }, |
| 297 | { '6', CAPCLASS_FORUM|CAPCLASS_SUPER, 0, |
| 298 | "Forum-Admin", "Set or remove capability '4' from other users" }, |
| 299 | { '7', CAPCLASS_ALERT, 0, |
| 300 | "Alerts", "Sign up for email alerts" }, |
| 301 | { 'A', CAPCLASS_ALERT|CAPCLASS_SUPER, 0, |
| 302 | "Announce", "Send announcements to all subscribers" }, |
| 303 | { 'D', CAPCLASS_OTHER, 0, |
| 304 | "Debug", "Enable debugging features" }, |
| 305 | }; |
| 306 | |
| 307 | /* |
| 308 | ** Populate the aCap[].nUser values based on the current content |
| 309 | ** of the USER table. |
| 310 | */ |
| 311 | void capabilities_count(void){ |
| 312 | int i; |
| 313 | static int done = 0; |
| 314 | Stmt q; |
| 315 | if( done ) return; |
| 316 | db_prepare(&q, "SELECT fullcap(cap) FROM user"); |
| 317 | while( db_step(&q)==SQLITE_ROW ){ |
| 318 | const char *zCap = db_column_text(&q, 0); |
| 319 | if( zCap==0 || zCap[0]==0 ) continue; |
| 320 | for(i=0; i<sizeof(aCap)/sizeof(aCap[0]); i++){ |
| 321 | if( strchr(zCap, aCap[i].cCap) ) aCap[i].nUser++; |
| 322 | } |
| 323 | } |
| 324 | db_finalize(&q); |
| 325 | done = 1; |
| 326 | } |
| 327 | |
| 328 | |
| 329 | /* |
| 330 | ** Generate HTML that lists all of the capability letters together with |
| 331 | ** a brief summary of what each letter means. |
| 332 | */ |
| 333 | void capabilities_table(unsigned mClass){ |
| 334 | int i; |
| 335 | if( g.perm.Admin ) capabilities_count(); |
| 336 | @ <table> |
| 337 | @ <tbody> |
| 338 | for(i=0; i<sizeof(aCap)/sizeof(aCap[0]); i++){ |
| 339 | int n; |
| 340 | if( (aCap[i].eClass & mClass)==0 ) continue; |
| 341 | @ <tr><th valign="top">%c(aCap[i].cCap)</th> |
| 342 | @ <td>%h(aCap[i].zAbbrev)</td><td>%h(aCap[i].zOneLiner)</td>\ |
| 343 | n = aCap[i].nUser; |
| 344 | if( n && g.perm.Admin ){ |
| 345 | @ <td><a href="%R/setup_ulist?with=%c(aCap[i].cCap)">\ |
| 346 | @ %d(n) user%s(n>1?"s":"")</a></td>\ |
| 347 | } |
| 348 | @ </tr> |
| 349 | } |
| 350 | @ </tbody> |
| 351 | @ </table> |
| 352 | } |
| 353 | |
| 354 | /* |
| 355 | ** Generate a "capability summary table" that shows the major capabilities |
| 356 |
+12
-7
| --- src/setupuser.c | ||
| +++ src/setupuser.c | ||
| @@ -42,15 +42,15 @@ | ||
| 42 | 42 | if( !g.perm.Admin ){ |
| 43 | 43 | login_needed(0); |
| 44 | 44 | return; |
| 45 | 45 | } |
| 46 | 46 | |
| 47 | + style_submenu_element("Add", "setup_uedit"); | |
| 48 | + style_submenu_element("Log", "access_log"); | |
| 49 | + style_submenu_element("Help", "setup_ulist_notes"); | |
| 50 | + style_header("User List"); | |
| 47 | 51 | if( zWith==0 || zWith[0]==0 ){ |
| 48 | - style_submenu_element("Add", "setup_uedit"); | |
| 49 | - style_submenu_element("Log", "access_log"); | |
| 50 | - style_submenu_element("Help", "setup_ulist_notes"); | |
| 51 | - style_header("User List"); | |
| 52 | 52 | @ <table border=1 cellpadding=2 cellspacing=0 class='userTable'> |
| 53 | 53 | @ <thead><tr> |
| 54 | 54 | @ <th>Category |
| 55 | 55 | @ <th>Capabilities (<a href='%R/setup_ucap_list'>key</a>) |
| 56 | 56 | @ <th>Info <th>Last Change</tr></thead> |
| @@ -87,15 +87,20 @@ | ||
| 87 | 87 | @ <td> |
| 88 | 88 | } |
| 89 | 89 | @ </tr> |
| 90 | 90 | } |
| 91 | 91 | db_finalize(&s); |
| 92 | + @ </tbody></table> | |
| 93 | + @ <div class='section'>Users</div> | |
| 92 | 94 | }else{ |
| 93 | - style_header("Users With Capabilities \"%h\"", zWith); | |
| 95 | + style_submenu_element("All Users", "setup_ulist"); | |
| 96 | + if( zWith[1]==0 ){ | |
| 97 | + @ <div class='section'>Users with capability "%h(zWith)"</div> | |
| 98 | + }else{ | |
| 99 | + @ <div class='section'>Users with any capability in "%h(zWith)"</div> | |
| 100 | + } | |
| 94 | 101 | } |
| 95 | - @ </tbody></table> | |
| 96 | - @ <div class='section'>Users</div> | |
| 97 | 102 | @ <table border=1 cellpadding=2 cellspacing=0 class='userTable sortable' \ |
| 98 | 103 | @ data-column-types='ktxTTK' data-init-sort='2'> |
| 99 | 104 | @ <thead><tr> |
| 100 | 105 | @ <th>Login Name<th>Caps<th>Info<th>Date<th>Expire<th>Last Login</tr></thead> |
| 101 | 106 | @ <tbody> |
| 102 | 107 |
| --- src/setupuser.c | |
| +++ src/setupuser.c | |
| @@ -42,15 +42,15 @@ | |
| 42 | if( !g.perm.Admin ){ |
| 43 | login_needed(0); |
| 44 | return; |
| 45 | } |
| 46 | |
| 47 | if( zWith==0 || zWith[0]==0 ){ |
| 48 | style_submenu_element("Add", "setup_uedit"); |
| 49 | style_submenu_element("Log", "access_log"); |
| 50 | style_submenu_element("Help", "setup_ulist_notes"); |
| 51 | style_header("User List"); |
| 52 | @ <table border=1 cellpadding=2 cellspacing=0 class='userTable'> |
| 53 | @ <thead><tr> |
| 54 | @ <th>Category |
| 55 | @ <th>Capabilities (<a href='%R/setup_ucap_list'>key</a>) |
| 56 | @ <th>Info <th>Last Change</tr></thead> |
| @@ -87,15 +87,20 @@ | |
| 87 | @ <td> |
| 88 | } |
| 89 | @ </tr> |
| 90 | } |
| 91 | db_finalize(&s); |
| 92 | }else{ |
| 93 | style_header("Users With Capabilities \"%h\"", zWith); |
| 94 | } |
| 95 | @ </tbody></table> |
| 96 | @ <div class='section'>Users</div> |
| 97 | @ <table border=1 cellpadding=2 cellspacing=0 class='userTable sortable' \ |
| 98 | @ data-column-types='ktxTTK' data-init-sort='2'> |
| 99 | @ <thead><tr> |
| 100 | @ <th>Login Name<th>Caps<th>Info<th>Date<th>Expire<th>Last Login</tr></thead> |
| 101 | @ <tbody> |
| 102 |
| --- src/setupuser.c | |
| +++ src/setupuser.c | |
| @@ -42,15 +42,15 @@ | |
| 42 | if( !g.perm.Admin ){ |
| 43 | login_needed(0); |
| 44 | return; |
| 45 | } |
| 46 | |
| 47 | style_submenu_element("Add", "setup_uedit"); |
| 48 | style_submenu_element("Log", "access_log"); |
| 49 | style_submenu_element("Help", "setup_ulist_notes"); |
| 50 | style_header("User List"); |
| 51 | if( zWith==0 || zWith[0]==0 ){ |
| 52 | @ <table border=1 cellpadding=2 cellspacing=0 class='userTable'> |
| 53 | @ <thead><tr> |
| 54 | @ <th>Category |
| 55 | @ <th>Capabilities (<a href='%R/setup_ucap_list'>key</a>) |
| 56 | @ <th>Info <th>Last Change</tr></thead> |
| @@ -87,15 +87,20 @@ | |
| 87 | @ <td> |
| 88 | } |
| 89 | @ </tr> |
| 90 | } |
| 91 | db_finalize(&s); |
| 92 | @ </tbody></table> |
| 93 | @ <div class='section'>Users</div> |
| 94 | }else{ |
| 95 | style_submenu_element("All Users", "setup_ulist"); |
| 96 | if( zWith[1]==0 ){ |
| 97 | @ <div class='section'>Users with capability "%h(zWith)"</div> |
| 98 | }else{ |
| 99 | @ <div class='section'>Users with any capability in "%h(zWith)"</div> |
| 100 | } |
| 101 | } |
| 102 | @ <table border=1 cellpadding=2 cellspacing=0 class='userTable sortable' \ |
| 103 | @ data-column-types='ktxTTK' data-init-sort='2'> |
| 104 | @ <thead><tr> |
| 105 | @ <th>Login Name<th>Caps<th>Info<th>Date<th>Expire<th>Last Login</tr></thead> |
| 106 | @ <tbody> |
| 107 |