Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| SHA1 Hash: | c3d7df650ba1bf488dad512c3039fec8f4e50205 |
|---|---|
| Date: | 2010-03-16 21:33:16 |
| User: | drh |
| Comment: | Work toward adding support for attachments. Keep this on an experimental branch until it is actually working. |
Tags And Properties
- bgcolor=#c0ffc0 propagates to descendants
- branch=experimental propagates to descendants
- sym-experimental propagates to descendants
- sym-trunk cancelled
Changes
Added src/attach.c
> 1 /* > 2 ** Copyright (c) 2010 D. Richard Hipp > 3 ** > 4 ** This program is free software; you can redistribute it and/or > 5 ** modify it under the terms of the GNU General Public > 6 ** License version 2 as published by the Free Software Foundation. > 7 ** > 8 ** This program is distributed in the hope that it will be useful, > 9 ** but WITHOUT ANY WARRANTY; without even the implied warranty of > 10 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > 11 ** General Public License for more details. > 12 ** > 13 ** You should have received a copy of the GNU General Public > 14 ** License along with this library; if not, write to the > 15 ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, > 16 ** Boston, MA 02111-1307, USA. > 17 ** > 18 ** Author contact information: > 19 ** drh@hwaci.com > 20 ** http://www.hwaci.com/drh/ > 21 ** > 22 ******************************************************************************* > 23 ** > 24 ** This file contains code for dealing with attachments. > 25 */ > 26 #include "config.h" > 27 #include "attach.h" > 28 #include <assert.h> > 29 > 30 /* > 31 ** WEBPAGE: attachlist > 32 ** > 33 ** tkt=TICKETUUID > 34 ** page=WIKIPAGE > 35 ** > 36 ** List attachments. > 37 */ > 38 void attachlist_page(void){ > 39 const char *zPage = P("page"); > 40 const char *zTkt = P("tkt"); > 41 Blob sql; > 42 Stmt q; > 43 > 44 if( zPage && zTkt ) zTkt = 0; > 45 login_check_credentials(); > 46 blob_zero(&sql); > 47 blob_append(&sql, > 48 "SELECT datetime(mtime,'localtime'), src, filename, comment, user" > 49 " FROM attachment", > 50 -1 > 51 ); > 52 if( zPage ){ > 53 if( g.okRdWiki==0 ) login_needed(); > 54 style_header("Attachments To %h", zPage); > 55 blob_appendf(&sql, " WHERE target=%Q", zPage); > 56 }else if( zTkt ){ > 57 if( g.okRdTkt==0 ) login_needed(); > 58 style_header("Attachments To Ticket %.10s", zTkt); > 59 blob_appendf(&sql, " WHERE target GLOB '%q*'", zTkt); > 60 }else{ > 61 if( g.okRdTkt==0 && g.okRdWiki==0 ) login_needed(); > 62 style_header("All Attachments"); > 63 } > 64 blob_appendf(&sql, " ORDER BY mtime DESC"); > 65 db_prepare(&q, "%s", blob_str(&sql)); > 66 while( db_step(&q)==SQLITE_ROW ){ > 67 const char *zDate = db_column_text(&q, 0); > 68 const char *zSrc = db_column_text(&q, 1); > 69 const char *zFilename = db_column_text(&q, 2); > 70 const char *zComment = db_column_text(&q, 3); > 71 const char *zUser = db_column_text(&q, 4); > 72 int i; > 73 for(i=0; zFilename[i]; i++){ > 74 if( zFilename[i]=='/' && zFilename[i+1]!=0 ){ > 75 zFilename = &zFilename[i+1]; > 76 i = -1; > 77 } > 78 } > 79 @ <p><b>%h(zFilename)</b> > 80 @ %w(zComment)<br> > 81 @ Added by %h(zUser) on %s(zDate)</p> > 82 @ > 83 } > 84 db_finalize(&q); > 85 style_footer(); > 86 > 87 return; > 88 }
Changes to src/login.c
474 for(i=0; zCap[i]; i++){ 474 for(i=0; zCap[i]; i++){ 475 switch( zCap[i] ){ 475 switch( zCap[i] ){ 476 case 's': g.okSetup = 1; /* Fall thru into Admin */ 476 case 's': g.okSetup = 1; /* Fall thru into Admin */ 477 case 'a': g.okAdmin = g.okRdTkt = g.okWrTkt = g.okZip = 477 case 'a': g.okAdmin = g.okRdTkt = g.okWrTkt = g.okZip = 478 g.okRdWiki = g.okWrWiki = g.okNewWiki = 478 g.okRdWiki = g.okWrWiki = g.okNewWiki = 479 g.okApndWiki = g.okHistory = g.okClone = 479 g.okApndWiki = g.okHistory = g.okClone = 480 g.okNewTkt = g.okPassword = g.okRdAddr = 480 g.okNewTkt = g.okPassword = g.okRdAddr = > 481 g.okTktFmt = g.okAttach = 1; 481 g.okTktFmt = 1; /* Fall thru into Read/Write */ | 482 /* Fall thru into Read/Write */ 482 case 'i': g.okRead = g.okWrite = 1; break; 483 case 'i': g.okRead = g.okWrite = 1; break; 483 case 'o': g.okRead = 1; break; 484 case 'o': g.okRead = 1; break; 484 case 'z': g.okZip = 1; break; 485 case 'z': g.okZip = 1; break; 485 486 486 case 'd': g.okDelete = 1; break; 487 case 'd': g.okDelete = 1; break; 487 case 'h': g.okHistory = 1; break; 488 case 'h': g.okHistory = 1; break; 488 case 'g': g.okClone = 1; break; 489 case 'g': g.okClone = 1; break; ................................................................................................................................................................................ 496 case 'e': g.okRdAddr = 1; break; 497 case 'e': g.okRdAddr = 1; break; 497 case 'r': g.okRdTkt = 1; break; 498 case 'r': g.okRdTkt = 1; break; 498 case 'n': g.okNewTkt = 1; break; 499 case 'n': g.okNewTkt = 1; break; 499 case 'w': g.okWrTkt = g.okRdTkt = g.okNewTkt = 500 case 'w': g.okWrTkt = g.okRdTkt = g.okNewTkt = 500 g.okApndTkt = 1; break; 501 g.okApndTkt = 1; break; 501 case 'c': g.okApndTkt = 1; break; 502 case 'c': g.okApndTkt = 1; break; 502 case 't': g.okTktFmt = 1; break; 503 case 't': g.okTktFmt = 1; break; > 504 case 'b': g.okAttach = 1; break; 503 505 504 /* The "u" privileges is a little different. It recursively 506 /* The "u" privileges is a little different. It recursively 505 ** inherits all privileges of the user named "reader" */ 507 ** inherits all privileges of the user named "reader" */ 506 case 'u': { 508 case 'u': { 507 if( zUser==0 ){ 509 if( zUser==0 ){ 508 zUser = db_text("", "SELECT cap FROM user WHERE login='reader'"); 510 zUser = db_text("", "SELECT cap FROM user WHERE login='reader'"); 509 login_set_capabilities(zUser); 511 login_set_capabilities(zUser); ................................................................................................................................................................................ 532 int login_has_capability(const char *zCap, int nCap){ 534 int login_has_capability(const char *zCap, int nCap){ 533 int i; 535 int i; 534 int rc = 1; 536 int rc = 1; 535 if( nCap<0 ) nCap = strlen(zCap); 537 if( nCap<0 ) nCap = strlen(zCap); 536 for(i=0; i<nCap && rc && zCap[i]; i++){ 538 for(i=0; i<nCap && rc && zCap[i]; i++){ 537 switch( zCap[i] ){ 539 switch( zCap[i] ){ 538 case 'a': rc = g.okAdmin; break; 540 case 'a': rc = g.okAdmin; break; 539 /* case 'b': */ | 541 case 'b': rc = g.okAttach; break; 540 case 'c': rc = g.okApndTkt; break; 542 case 'c': rc = g.okApndTkt; break; 541 case 'd': rc = g.okDelete; break; 543 case 'd': rc = g.okDelete; break; 542 case 'e': rc = g.okRdAddr; break; 544 case 'e': rc = g.okRdAddr; break; 543 case 'f': rc = g.okNewWiki; break; 545 case 'f': rc = g.okNewWiki; break; 544 case 'g': rc = g.okClone; break; 546 case 'g': rc = g.okClone; break; 545 case 'h': rc = g.okHistory; break; 547 case 'h': rc = g.okHistory; break; 546 case 'i': rc = g.okWrite; break; 548 case 'i': rc = g.okWrite; break;
Changes to src/main.c
128 int okNewWiki; /* f: create new wiki via web */ 128 int okNewWiki; /* f: create new wiki via web */ 129 int okApndWiki; /* m: append to wiki via web */ 129 int okApndWiki; /* m: append to wiki via web */ 130 int okWrWiki; /* k: edit wiki via web */ 130 int okWrWiki; /* k: edit wiki via web */ 131 int okRdTkt; /* r: view tickets via web */ 131 int okRdTkt; /* r: view tickets via web */ 132 int okNewTkt; /* n: create new tickets */ 132 int okNewTkt; /* n: create new tickets */ 133 int okApndTkt; /* c: append to tickets via the web */ 133 int okApndTkt; /* c: append to tickets via the web */ 134 int okWrTkt; /* w: make changes to tickets via web */ 134 int okWrTkt; /* w: make changes to tickets via web */ > 135 int okAttach; /* b: add attachments */ 135 int okTktFmt; /* t: create new ticket report formats */ 136 int okTktFmt; /* t: create new ticket report formats */ 136 int okRdAddr; /* e: read email addresses or other private data */ 137 int okRdAddr; /* e: read email addresses or other private data */ 137 int okZip; /* z: download zipped artifact via /zip URL */ 138 int okZip; /* z: download zipped artifact via /zip URL */ 138 139 139 /* For defense against Cross-site Request Forgery attacks */ 140 /* For defense against Cross-site Request Forgery attacks */ 140 char zCsrfToken[12]; /* Value of the anti-CSRF token */ 141 char zCsrfToken[12]; /* Value of the anti-CSRF token */ 141 int okCsrf; /* Anti-CSRF token is present and valid */ 142 int okCsrf; /* Anti-CSRF token is present and valid */
Changes to src/main.mk
11 11 12 XTCC = $(TCC) $(CFLAGS) -I. -I$(SRCDIR) 12 XTCC = $(TCC) $(CFLAGS) -I. -I$(SRCDIR) 13 13 14 14 15 SRC = \ 15 SRC = \ 16 $(SRCDIR)/add.c \ 16 $(SRCDIR)/add.c \ 17 $(SRCDIR)/allrepo.c \ 17 $(SRCDIR)/allrepo.c \ > 18 $(SRCDIR)/attach.c \ 18 $(SRCDIR)/bag.c \ 19 $(SRCDIR)/bag.c \ 19 $(SRCDIR)/blob.c \ 20 $(SRCDIR)/blob.c \ 20 $(SRCDIR)/branch.c \ 21 $(SRCDIR)/branch.c \ 21 $(SRCDIR)/browse.c \ 22 $(SRCDIR)/browse.c \ 22 $(SRCDIR)/captcha.c \ 23 $(SRCDIR)/captcha.c \ 23 $(SRCDIR)/cgi.c \ 24 $(SRCDIR)/cgi.c \ 24 $(SRCDIR)/checkin.c \ 25 $(SRCDIR)/checkin.c \ ................................................................................................................................................................................ 84 $(SRCDIR)/winhttp.c \ 85 $(SRCDIR)/winhttp.c \ 85 $(SRCDIR)/xfer.c \ 86 $(SRCDIR)/xfer.c \ 86 $(SRCDIR)/zip.c 87 $(SRCDIR)/zip.c 87 88 88 TRANS_SRC = \ 89 TRANS_SRC = \ 89 add_.c \ 90 add_.c \ 90 allrepo_.c \ 91 allrepo_.c \ > 92 attach_.c \ 91 bag_.c \ 93 bag_.c \ 92 blob_.c \ 94 blob_.c \ 93 branch_.c \ 95 branch_.c \ 94 browse_.c \ 96 browse_.c \ 95 captcha_.c \ 97 captcha_.c \ 96 cgi_.c \ 98 cgi_.c \ 97 checkin_.c \ 99 checkin_.c \ ................................................................................................................................................................................ 157 winhttp_.c \ 159 winhttp_.c \ 158 xfer_.c \ 160 xfer_.c \ 159 zip_.c 161 zip_.c 160 162 161 OBJ = \ 163 OBJ = \ 162 $(OBJDIR)/add.o \ 164 $(OBJDIR)/add.o \ 163 $(OBJDIR)/allrepo.o \ 165 $(OBJDIR)/allrepo.o \ > 166 $(OBJDIR)/attach.o \ 164 $(OBJDIR)/bag.o \ 167 $(OBJDIR)/bag.o \ 165 $(OBJDIR)/blob.o \ 168 $(OBJDIR)/blob.o \ 166 $(OBJDIR)/branch.o \ 169 $(OBJDIR)/branch.o \ 167 $(OBJDIR)/browse.o \ 170 $(OBJDIR)/browse.o \ 168 $(OBJDIR)/captcha.o \ 171 $(OBJDIR)/captcha.o \ 169 $(OBJDIR)/cgi.o \ 172 $(OBJDIR)/cgi.o \ 170 $(OBJDIR)/checkin.o \ 173 $(OBJDIR)/checkin.o \ ................................................................................................................................................................................ 271 # 274 # 272 $(SRCDIR)/../manifest: 275 $(SRCDIR)/../manifest: 273 # noop 276 # noop 274 277 275 clean: 278 clean: 276 rm -f $(OBJDIR)/*.o *_.c $(APPNAME) VERSION.h 279 rm -f $(OBJDIR)/*.o *_.c $(APPNAME) VERSION.h 277 rm -f translate makeheaders mkindex page_index.h headers 280 rm -f translate makeheaders mkindex page_index.h headers 278 rm -f add.h allrepo.h bag.h blob.h branch.h browse.h captcha.h cgi.h che | 281 rm -f add.h allrepo.h attach.h bag.h blob.h branch.h browse.h captcha.h 279 282 280 page_index.h: $(TRANS_SRC) mkindex 283 page_index.h: $(TRANS_SRC) mkindex 281 ./mkindex $(TRANS_SRC) >$@ 284 ./mkindex $(TRANS_SRC) >$@ 282 headers: page_index.h makeheaders VERSION.h 285 headers: page_index.h makeheaders VERSION.h 283 ./makeheaders add_.c:add.h allrepo_.c:allrepo.h bag_.c:bag.h blob_.c:bl | 286 ./makeheaders add_.c:add.h allrepo_.c:allrepo.h attach_.c:attach.h bag_ 284 touch headers 287 touch headers 285 headers: Makefile 288 headers: Makefile 286 Makefile: 289 Makefile: 287 add_.c: $(SRCDIR)/add.c translate 290 add_.c: $(SRCDIR)/add.c translate 288 ./translate $(SRCDIR)/add.c >add_.c 291 ./translate $(SRCDIR)/add.c >add_.c 289 292 290 $(OBJDIR)/add.o: add_.c add.h $(SRCDIR)/config.h 293 $(OBJDIR)/add.o: add_.c add.h $(SRCDIR)/config.h ................................................................................................................................................................................ 294 allrepo_.c: $(SRCDIR)/allrepo.c translate 297 allrepo_.c: $(SRCDIR)/allrepo.c translate 295 ./translate $(SRCDIR)/allrepo.c >allrepo_.c 298 ./translate $(SRCDIR)/allrepo.c >allrepo_.c 296 299 297 $(OBJDIR)/allrepo.o: allrepo_.c allrepo.h $(SRCDIR)/config.h 300 $(OBJDIR)/allrepo.o: allrepo_.c allrepo.h $(SRCDIR)/config.h 298 $(XTCC) -o $(OBJDIR)/allrepo.o -c allrepo_.c 301 $(XTCC) -o $(OBJDIR)/allrepo.o -c allrepo_.c 299 302 300 allrepo.h: headers 303 allrepo.h: headers > 304 attach_.c: $(SRCDIR)/attach.c translate > 305 ./translate $(SRCDIR)/attach.c >attach_.c > 306 > 307 $(OBJDIR)/attach.o: attach_.c attach.h $(SRCDIR)/config.h > 308 $(XTCC) -o $(OBJDIR)/attach.o -c attach_.c > 309 > 310 attach.h: headers 301 bag_.c: $(SRCDIR)/bag.c translate 311 bag_.c: $(SRCDIR)/bag.c translate 302 ./translate $(SRCDIR)/bag.c >bag_.c 312 ./translate $(SRCDIR)/bag.c >bag_.c 303 313 304 $(OBJDIR)/bag.o: bag_.c bag.h $(SRCDIR)/config.h 314 $(OBJDIR)/bag.o: bag_.c bag.h $(SRCDIR)/config.h 305 $(XTCC) -o $(OBJDIR)/bag.o -c bag_.c 315 $(XTCC) -o $(OBJDIR)/bag.o -c bag_.c 306 316 307 bag.h: headers 317 bag.h: headers
Changes to src/makemake.tcl
5 5 6 # Basenames of all source files that get preprocessed using 6 # Basenames of all source files that get preprocessed using 7 # "translate" and "makeheaders" 7 # "translate" and "makeheaders" 8 # 8 # 9 set src { 9 set src { 10 add 10 add 11 allrepo 11 allrepo > 12 attach 12 bag 13 bag 13 blob 14 blob 14 branch 15 branch 15 browse 16 browse 16 captcha 17 captcha 17 cgi 18 cgi 18 checkin 19 checkin
Changes to src/setup.c
145 @ <td valign="top"> 145 @ <td valign="top"> 146 @ <b>Notes:</b> 146 @ <b>Notes:</b> 147 @ <ol> 147 @ <ol> 148 @ <li><p>The permission flags are as follows:</p> 148 @ <li><p>The permission flags are as follows:</p> 149 @ <table> 149 @ <table> 150 @ <tr><td valign="top"><b>a</b></td> 150 @ <tr><td valign="top"><b>a</b></td> 151 @ <td><i>Admin:</i> Create and delete users</td></tr> 151 @ <td><i>Admin:</i> Create and delete users</td></tr> > 152 @ <tr><td valign="top"><b>b</b></td> > 153 @ <td><i>Attach:</i> Add attachments to wiki or tickets</td></tr> 152 @ <tr><td valign="top"><b>c</b></td> 154 @ <tr><td valign="top"><b>c</b></td> 153 @ <td><i>Append-Tkt:</i> Append to tickets</td></tr> 155 @ <td><i>Append-Tkt:</i> Append to tickets</td></tr> 154 @ <tr><td valign="top"><b>d</b></td> 156 @ <tr><td valign="top"><b>d</b></td> 155 @ <td><i>Delete:</i> Delete wiki and tickets</td></tr> 157 @ <td><i>Delete:</i> Delete wiki and tickets</td></tr> 156 @ <tr><td valign="top"><b>e</b></td> 158 @ <tr><td valign="top"><b>e</b></td> 157 @ <td><i>Email:</i> View sensitive data such as EMail addresses</td></tr> 159 @ <td><i>Email:</i> View sensitive data such as EMail addresses</td></tr> 158 @ <tr><td valign="top"><b>f</b></td> 160 @ <tr><td valign="top"><b>f</b></td> ................................................................................................................................................................................ 237 /* 239 /* 238 ** WEBPAGE: /setup_uedit 240 ** WEBPAGE: /setup_uedit 239 */ 241 */ 240 void user_edit(void){ 242 void user_edit(void){ 241 const char *zId, *zLogin, *zInfo, *zCap, *zPw; 243 const char *zId, *zLogin, *zInfo, *zCap, *zPw; 242 char *oaa, *oas, *oar, *oaw, *oan, *oai, *oaj, *oao, *oap; 244 char *oaa, *oas, *oar, *oaw, *oan, *oai, *oaj, *oao, *oap; 243 char *oak, *oad, *oac, *oaf, *oam, *oah, *oag, *oae; 245 char *oak, *oad, *oac, *oaf, *oam, *oah, *oag, *oae; 244 char *oat, *oau, *oav, *oaz; | 246 char *oat, *oau, *oav, *oab, *oaz; 245 const char *inherit[128]; 247 const char *inherit[128]; 246 int doWrite; 248 int doWrite; 247 int uid; 249 int uid; 248 int higherUser = 0; /* True if user being edited is SETUP and the */ 250 int higherUser = 0; /* True if user being edited is SETUP and the */ 249 /* user doing the editing is ADMIN. Disallow editing */ 251 /* user doing the editing is ADMIN. Disallow editing */ 250 252 251 /* Must have ADMIN privleges to access this page 253 /* Must have ADMIN privleges to access this page ................................................................................................................................................................................ 274 ** to the page that displays a list of users. 276 ** to the page that displays a list of users. 275 */ 277 */ 276 doWrite = cgi_all("login","info","pw") && !higherUser; 278 doWrite = cgi_all("login","info","pw") && !higherUser; 277 if( doWrite ){ 279 if( doWrite ){ 278 char zCap[50]; 280 char zCap[50]; 279 int i = 0; 281 int i = 0; 280 int aa = P("aa")!=0; 282 int aa = P("aa")!=0; > 283 int ab = P("ab")!=0; 281 int ad = P("ad")!=0; 284 int ad = P("ad")!=0; 282 int ae = P("ae")!=0; 285 int ae = P("ae")!=0; 283 int ai = P("ai")!=0; 286 int ai = P("ai")!=0; 284 int aj = P("aj")!=0; 287 int aj = P("aj")!=0; 285 int ak = P("ak")!=0; 288 int ak = P("ak")!=0; 286 int an = P("an")!=0; 289 int an = P("an")!=0; 287 int ao = P("ao")!=0; 290 int ao = P("ao")!=0; ................................................................................................................................................................................ 295 int ah = P("ah")!=0; 298 int ah = P("ah")!=0; 296 int ag = P("ag")!=0; 299 int ag = P("ag")!=0; 297 int at = P("at")!=0; 300 int at = P("at")!=0; 298 int au = P("au")!=0; 301 int au = P("au")!=0; 299 int av = P("av")!=0; 302 int av = P("av")!=0; 300 int az = P("az")!=0; 303 int az = P("az")!=0; 301 if( aa ){ zCap[i++] = 'a'; } 304 if( aa ){ zCap[i++] = 'a'; } > 305 if( ab ){ zCap[i++] = 'b'; } 302 if( ac ){ zCap[i++] = 'c'; } 306 if( ac ){ zCap[i++] = 'c'; } 303 if( ad ){ zCap[i++] = 'd'; } 307 if( ad ){ zCap[i++] = 'd'; } 304 if( ae ){ zCap[i++] = 'e'; } 308 if( ae ){ zCap[i++] = 'e'; } 305 if( af ){ zCap[i++] = 'f'; } 309 if( af ){ zCap[i++] = 'f'; } 306 if( ah ){ zCap[i++] = 'h'; } 310 if( ah ){ zCap[i++] = 'h'; } 307 if( ag ){ zCap[i++] = 'g'; } 311 if( ag ){ zCap[i++] = 'g'; } 308 if( ai ){ zCap[i++] = 'i'; } 312 if( ai ){ zCap[i++] = 'i'; } ................................................................................................................................................................................ 351 355 352 /* Load the existing information about the user, if any 356 /* Load the existing information about the user, if any 353 */ 357 */ 354 zLogin = ""; 358 zLogin = ""; 355 zInfo = ""; 359 zInfo = ""; 356 zCap = ""; 360 zCap = ""; 357 zPw = ""; 361 zPw = ""; 358 oaa = oac = oad = oae = oaf = oag = oah = oai = oaj = oak = oam = | 362 oaa = oab = oac = oad = oae = oaf = oag = oah = oai = oaj = oak = oam = 359 oan = oao = oap = oar = oas = oat = oau = oav = oaw = oaz = ""; 363 oan = oao = oap = oar = oas = oat = oau = oav = oaw = oaz = ""; 360 if( uid ){ 364 if( uid ){ 361 zLogin = db_text("", "SELECT login FROM user WHERE uid=%d", uid); 365 zLogin = db_text("", "SELECT login FROM user WHERE uid=%d", uid); 362 zInfo = db_text("", "SELECT info FROM user WHERE uid=%d", uid); 366 zInfo = db_text("", "SELECT info FROM user WHERE uid=%d", uid); 363 zCap = db_text("", "SELECT cap FROM user WHERE uid=%d", uid); 367 zCap = db_text("", "SELECT cap FROM user WHERE uid=%d", uid); 364 zPw = db_text("", "SELECT pw FROM user WHERE uid=%d", uid); 368 zPw = db_text("", "SELECT pw FROM user WHERE uid=%d", uid); 365 if( strchr(zCap, 'a') ) oaa = " checked"; 369 if( strchr(zCap, 'a') ) oaa = " checked"; > 370 if( strchr(zCap, 'b') ) oab = " checked"; 366 if( strchr(zCap, 'c') ) oac = " checked"; 371 if( strchr(zCap, 'c') ) oac = " checked"; 367 if( strchr(zCap, 'd') ) oad = " checked"; 372 if( strchr(zCap, 'd') ) oad = " checked"; 368 if( strchr(zCap, 'e') ) oae = " checked"; 373 if( strchr(zCap, 'e') ) oae = " checked"; 369 if( strchr(zCap, 'f') ) oaf = " checked"; 374 if( strchr(zCap, 'f') ) oaf = " checked"; 370 if( strchr(zCap, 'g') ) oag = " checked"; 375 if( strchr(zCap, 'g') ) oag = " checked"; 371 if( strchr(zCap, 'h') ) oah = " checked"; 376 if( strchr(zCap, 'h') ) oah = " checked"; 372 if( strchr(zCap, 'i') ) oai = " checked"; 377 if( strchr(zCap, 'i') ) oai = " checked"; ................................................................................................................................................................................ 465 @ <input type="checkbox" name="au"%s(oau)/>%s(B('u'))Reader<br> 470 @ <input type="checkbox" name="au"%s(oau)/>%s(B('u'))Reader<br> 466 @ <input type="checkbox" name="av"%s(oav)/>%s(B('v'))Developer<br> 471 @ <input type="checkbox" name="av"%s(oav)/>%s(B('v'))Developer<br> 467 @ <input type="checkbox" name="ag"%s(oag)/>%s(B('g'))Clone<br> 472 @ <input type="checkbox" name="ag"%s(oag)/>%s(B('g'))Clone<br> 468 @ <input type="checkbox" name="aj"%s(oaj)/>%s(B('j'))Read Wiki<br> 473 @ <input type="checkbox" name="aj"%s(oaj)/>%s(B('j'))Read Wiki<br> 469 @ <input type="checkbox" name="af"%s(oaf)/>%s(B('f'))New Wiki<br> 474 @ <input type="checkbox" name="af"%s(oaf)/>%s(B('f'))New Wiki<br> 470 @ <input type="checkbox" name="am"%s(oam)/>%s(B('m'))Append Wiki<br> 475 @ <input type="checkbox" name="am"%s(oam)/>%s(B('m'))Append Wiki<br> 471 @ <input type="checkbox" name="ak"%s(oak)/>%s(B('k'))Write Wiki<br> 476 @ <input type="checkbox" name="ak"%s(oak)/>%s(B('k'))Write Wiki<br> > 477 @ <input type="checkbox" name="ab"%s(oab)/>%s(B('b'))Attachments<br> 472 @ <input type="checkbox" name="ar"%s(oar)/>%s(B('r'))Read Tkt<br> | 478 @ <input type="checkbox" name="ar"%s(oar)/>%s(B('r'))Read Ticket<br> 473 @ <input type="checkbox" name="an"%s(oan)/>%s(B('n'))New Tkt<br> | 479 @ <input type="checkbox" name="an"%s(oan)/>%s(B('n'))New Ticket<br> 474 @ <input type="checkbox" name="ac"%s(oac)/>%s(B('c'))Append Tkt<br> | 480 @ <input type="checkbox" name="ac"%s(oac)/>%s(B('c'))Append Ticket<br> 475 @ <input type="checkbox" name="aw"%s(oaw)/>%s(B('w'))Write Tkt<br> | 481 @ <input type="checkbox" name="aw"%s(oaw)/>%s(B('w'))Write Ticket<br> 476 @ <input type="checkbox" name="at"%s(oat)/>%s(B('t'))Tkt Report<br> | 482 @ <input type="checkbox" name="at"%s(oat)/>%s(B('t'))Ticket Report<br> 477 @ <input type="checkbox" name="az"%s(oaz)/>%s(B('z'))Download Zip 483 @ <input type="checkbox" name="az"%s(oaz)/>%s(B('z'))Download Zip 478 @ </td> 484 @ </td> 479 @ </tr> 485 @ </tr> 480 @ <tr> 486 @ <tr> 481 @ <td align="right">Password:</td> 487 @ <td align="right">Password:</td> 482 if( zPw[0] ){ 488 if( zPw[0] ){ 483 /* Obscure the password for all users */ 489 /* Obscure the password for all users */ ................................................................................................................................................................................ 562 @ The <b>Check-out</b> privilege allows remote users to "pull". 568 @ The <b>Check-out</b> privilege allows remote users to "pull". 563 @ The <b>Clone</b> privilege allows remote users to "clone". 569 @ The <b>Clone</b> privilege allows remote users to "clone". 564 @ </li><p> 570 @ </li><p> 565 @ 571 @ 566 @ <li><p> 572 @ <li><p> 567 @ The <b>Read Wiki</b>, <b>New Wiki</b>, <b>Append Wiki</b>, and 573 @ The <b>Read Wiki</b>, <b>New Wiki</b>, <b>Append Wiki</b>, and 568 @ <b>Write Wiki</b> privileges control access to wiki pages. The 574 @ <b>Write Wiki</b> privileges control access to wiki pages. The 569 @ <b>Read Tkt</b>, <b>New Tkt</b>, <b>Append Tkt</b>, and | 575 @ <b>Read Ticket</b>, <b>New Ticket</b>, <b>Append Ticket</b>, and 570 @ <b>Write Tkt</b> privileges control access to trouble tickets. | 576 @ <b>Write Ticket</b> privileges control access to trouble tickets. 571 @ The <b>Tkt Report</b> privilege allows the user to create or edit | 577 @ The <b>Ticket Report</b> privilege allows the user to create or edit 572 @ ticket report formats. 578 @ ticket report formats. 573 @ </p></li> 579 @ </p></li> 574 @ 580 @ 575 @ <li><p> 581 @ <li><p> 576 @ Users with the <b>Password</b> privilege are allowed to change their 582 @ Users with the <b>Password</b> privilege are allowed to change their 577 @ own password. Recommended ON for most users but OFF for special 583 @ own password. Recommended ON for most users but OFF for special 578 @ users "developer", "anonymous", and "nobody". 584 @ users "developer", "anonymous", and "nobody". ................................................................................................................................................................................ 581 @ <li><p> 587 @ <li><p> 582 @ The <b>EMail</b> privilege allows the display of sensitive information 588 @ The <b>EMail</b> privilege allows the display of sensitive information 583 @ such as the email address of users and contact information on tickets. 589 @ such as the email address of users and contact information on tickets. 584 @ Recommended OFF for "anonymous" and for "nobody" but ON for 590 @ Recommended OFF for "anonymous" and for "nobody" but ON for 585 @ "developer". 591 @ "developer". 586 @ </p></li> 592 @ </p></li> 587 @ 593 @ > 594 @ <li><p> > 595 @ The <b>Attachment</b> privilege is needed in order to add attachments > 596 @ to tickets or wiki. Write privilege on the ticket or wiki is also > 597 @ required.</p></li> > 598 @ 588 @ <li><p> 599 @ <li><p> 589 @ Login is prohibited if the password is an empty string. 600 @ Login is prohibited if the password is an empty string. 590 @ </p></li> 601 @ </p></li> 591 @ </ul> 602 @ </ul> 592 @ 603 @ 593 @ <h2>Special Logins</h2> 604 @ <h2>Special Logins</h2> 594 @ 605 @