@@ -55,11 +55,11 @@
55 55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** tkt=HASH
56 56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** page=WIKIPAGE
57 57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** technote=HASH
58 58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** forumpost=HASH
59 59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** At most one of technote=, tkt= or page= may be supplied.
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** At most one of technote=, tkt=, forumpost=, or page= may be supplied.
61 61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
62 62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If none are given, all attachments are listed. If one is given, only
63 63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** attachments for the designated technote, ticket or wiki page are shown.
64 64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
65 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** HASH may be just a prefix of the relevant technical note or ticket
@@ -130,23 +130,30 @@
130 130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const int attachid = db_column_int(&q, 7);
131 131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* type 0 is a wiki page, 1 is a ticket, 2 is a tech note */
132 132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const int type = attachment_target_type(zTarget);
133 133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zDispUser = zUser && zUser[0] ? zUser : "anonymous";
134 134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zUrlTail;
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zUrlTail = 0;
136 136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; zFilename[i]; i++){
137 137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zFilename[i]=='/' && zFilename[i+1]!=0 ){
138 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zFilename = &zFilename[i+1];
139 139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i = -1;
140 140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
141 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( type==1 ){
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zUrlTail = mprintf("tkt=%s&file=%t", zTarget, zFilename);
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( type==2 ){
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zUrlTail = mprintf("technote=%s&file=%t", zTarget, zFilename);
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zUrlTail = mprintf("page=%t&file=%t", zTarget, zFilename);
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch( type ){
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case CFTYPE_TICKET:
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zUrlTail = mprintf("tkt=%s&file=%t", zTarget, zFilename);
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case CFTYPE_TECHNOTE:
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zUrlTail = mprintf("technote=%s&file=%t", zTarget, zFilename);
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case CFTYPE_FORUM:
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zUrlTail = mprintf("forumpost=%t&file=%t", zTarget, zFilename);
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case CFTYPE_WIKI:
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zUrlTail = mprintf("page=%t&file=%t", zTarget, zFilename);
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
148 155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
149 156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <li><p>
150 157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ Attachment %z(href("%R/ainfo/%!S",zUuid))%S(zUuid)</a>
151 158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
moderation_pending_www(attachid);
152 159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <br><a href="%R/attachview?%s(zUrlTail)">%h(zFilename)</a>
@@ -210,27 +217,36 @@
210 217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Query parameters:
211 218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
212 219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** tkt=HASH
213 220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** page=WIKIPAGE
214 221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** technote=HASH
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** forumpost=HASH
215 223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** file=FILENAME
216 224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** attachid=ID
217 225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
218 226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
219 227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void attachview_page(void){
220 228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zPage = P("page");
221 229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zTkt = P("tkt");
222 230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zTechNote = P("technote");
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zForumPost = P("forumpost");
223 232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zFile = P("file");
224 233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zTarget = 0;
225 234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int attachid = atoi(PD("attachid","0"));
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zUUID;
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zUUID = 0;
227 236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
228 237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zFile==0 ) fossil_redirect_home();
229 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
login_check_credentials();
230 239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_set_current_feature("attach");
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zPage ){
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zForumPost ){
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int fnid;
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.perm.RdForum==0 ){ login_needed(g.anon.RdForum); return; }
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Forum attachments are always tied to the post's initial version */
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fnid = forumpost_head_rid2(zForumPost);
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fnid>0 ) zTarget = rid_to_uuid(fnid);
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ DEBUG: fnid=%d(fnid) zForumPost=%h(zForumPost) zUUID=%s(zUUID)<br>
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( zPage ){
232 248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.perm.RdWiki==0 ){ login_needed(g.anon.RdWiki); return; }
233 249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zTarget = zPage;
234 250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( zTkt ){
235 251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.perm.RdTkt==0 ){ login_needed(g.anon.RdTkt); return; }
236 252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zTarget = zTkt;
@@ -375,27 +391,27 @@
375 391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zTechNote = P("technote");
376 392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zFrom = P("from");
377 393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *aContent = P("f");
378 394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName = PD("f:filename","unknown");
379 395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zTarget;
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char * zTo = 0;
380 397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zTargetType;
381 398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zExtraFree = 0;
382 399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int szContent = atoi(PD("f:bytes","0"));
383 400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int goodCaptcha = 1;
384 401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int szLimit = 0;
385 402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
386 403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zFrom==0 ) zFrom = mprintf("%R/home");
387 404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( P("cancel") ) cgi_redirect(zFrom);
388 405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (!!zPage + !!zTkt + !!zTechNote + !!zForumPost)!=1 ){
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- //fossil_redirect_home();
390 406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_fatal("Requires exactly one one: page=X, tkt=X, forumpost=X, or technote=X");
391 407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
392 408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
login_check_credentials();
393 409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
szLimit = db_get_int("attachment-size-limit", 0);
394 410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( szContent<0 || (szLimit && szContent>szLimit) ){
395 411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_fatal("Attachment %s is too large. Limit is %d bytes.", zName,
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (szLimit>0 && szContent>0) ? szLimit : 0x7fffffff);
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ szLimit ? szLimit : 0x7fffffff);
397 413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
398 414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zForumPost ){
399 415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fpid;
400 416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.perm.AttachForum==0 ){
401 417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
login_needed(g.anon.AttachForum);
@@ -402,14 +418,19 @@
402 418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
403 419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
404 420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fpid = forumpost_head_rid2(zForumPost);
405 421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fpid<=0 ){
406 422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_fatal("Invalid forum post ID: %h", zForumPost);
423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( !g.perm.Admin && !forumpost_is_owner(fpid, 0) ){
424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("Only admins can attach files to other users' "
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "forum posts.");
407 426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
408 427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zTarget = zExtraFree = rid_to_uuid(fpid);
409 428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zTargetType = mprintf("Forum post <a href=\"%R/forumpost/%S\">%h</a>",
410 429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zTarget, zForumPost);
430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zTo = mprintf("%R/attachview?forumpost=%T&file=%T",
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zTarget, zName);
411 432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( zPage ){
412 433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.perm.ApndWiki==0 || g.perm.Attach==0 ){
413 434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
login_needed(g.anon.ApndWiki && g.anon.Attach);
414 435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
415 436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -452,11 +473,11 @@
452 473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int needModerator = (zForumPost!=0 && forum_need_moderation()) ||
453 474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(zTkt!=0 && ticket_need_moderation(0)) ||
454 475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(zPage!=0 && wiki_need_moderation(0));
455 476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zComment = PD("comment", "");
456 477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
attach_commit(zName, zTarget, aContent, szContent, needModerator, zComment);
457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cgi_redirect(zFrom);
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_redirect(zTo ? zTo : zFrom);
458 479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
459 480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_set_current_feature("attach");
460 481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_header("Add Attachment");
461 482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !goodCaptcha ){
462 483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <p class="generalError">Error: Incorrect security code.</p>
@@ -512,11 +533,11 @@
512 533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zModAction; /* Moderation action or NULL */
513 534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isModerator; /* TRUE if user is the moderator */
514 535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zMime; /* MIME Type */
515 536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob attach; /* Content of the attachment */
516 537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fShowContent = 0;
517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int bUserIsOwner = 0;
538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bUserIsOwner = 0; /* True if pAttach->zUser is login_name() */
518 539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int showDelMenu = 0;
519 540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zLn = P("ln");
520 541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
521 542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
login_check_credentials();
522 543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !g.perm.RdTkt && !g.perm.RdWiki ){
@@ -572,10 +593,14 @@
572 593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zNewDate;
573 594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob manifest;
574 595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob cksum;
575 596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zFile = zName;
576 597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !g.perm.Admin && !bUserIsOwner ){
599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("Only admins can delete other users' attachments from "
600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "forum posts.");
601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
577 602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_begin_transaction();
578 603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&manifest);
579 604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=n=0; zFile[i]; i++){
580 605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zFile[i]=='/' || zFile[i]=='\\' ) n = i;
581 606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
582 607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!