Fossil SCM

Add flag to attachment_list() to filter pending-moderation attachments out of view except for their owner and forum moderators. This should argaubly be the default. Add a note to the bottom of the forum post editor explaining that attachments can be added after saving.

stephan 2026-05-23 13:24 UTC forum-attachments
Commit 50645bf5e9baeb39f4e6af7f8113f80e83a9d2b803db216357801d3d117151b0
2 files changed +47 -22 +16 -1
+47 -22
--- src/attach.c
+++ src/attach.c
@@ -31,23 +31,32 @@
3131
** if needed, they resolve zTarget using forumpost_head_rid2() so that
3232
** they get the RID of the earliest version of the post, as that is
3333
** the only one which attachments should target.
3434
*/
3535
int attachment_target_type(const char *zTarget){
36
+ static Stmt q = empty_Stmt_m;
37
+ int rc = 0;
3638
if( forumpost_head_rid2(zTarget)>0 ){
3739
return CFTYPE_FORUM;
3840
}
39
- return db_int(0,
40
- "SELECT CASE "
41
- "WHEN 'tkt-'||%Q IN (SELECT tagname FROM tag) THEN %d "
42
- "WHEN 'event-'||%Q IN (SELECT tagname FROM tag) THEN %d "
43
- "WHEN 'wiki-'||%Q IN (SELECT tagname FROM tag) THEN %d "
44
- "ELSE 0 END",
45
- zTarget, CFTYPE_TICKET,
46
- zTarget, CFTYPE_TECHNOTE,
47
- zTarget, CFTYPE_WIKI
48
- );
41
+ if( !q.pStmt ){
42
+ db_static_prepare(
43
+ &q,
44
+ "SELECT CASE "
45
+ "WHEN 'tkt-'||:tgt IN (SELECT tagname FROM tag) THEN %d "
46
+ "WHEN 'event-'||:tgt IN (SELECT tagname FROM tag) THEN %d "
47
+ "WHEN 'wiki-'||:tgt IN (SELECT tagname FROM tag) THEN %d "
48
+ "ELSE 0 END",
49
+ CFTYPE_TICKET, CFTYPE_TECHNOTE, CFTYPE_WIKI
50
+ );
51
+ }
52
+ db_bind_text(&q, ":tgt", zTarget);
53
+ if( SQLITE_ROW==db_step(&q) ){
54
+ rc = db_column_int(&q, 0);
55
+ }
56
+ db_reset(&q);
57
+ return rc;
4958
}
5059
5160
/*
5261
** WEBPAGE: attachlist
5362
** List attachments.
@@ -96,19 +105,19 @@
96105
zUuid = rid_to_uuid(fnid);
97106
blob_append_sql(&sql, " WHERE target=%Q", zUuid);
98107
fossil_free(zUuid);
99108
}else if( zPage ){
100109
if( g.perm.RdWiki==0 ){ login_needed(g.anon.RdWiki); return; }
101
- style_header("Attachments To %h", zPage);
110
+ style_header("Attachments To Wiki page %h", zPage);
102111
blob_append_sql(&sql, " WHERE target=%Q", zPage);
103112
}else if( zTkt ){
104113
if( g.perm.RdTkt==0 ){ login_needed(g.anon.RdTkt); return; }
105114
style_header("Attachments To Ticket %S", zTkt);
106115
blob_append_sql(&sql, " WHERE target GLOB '%q*'", zTkt);
107116
}else if( zTechNote ){
108117
if( g.perm.RdWiki==0 ){ login_needed(g.anon.RdWiki); return; }
109
- style_header("Attachments to Tech Note %S", zTechNote);
118
+ style_header("Attachments To Tech Note %S", zTechNote);
110119
blob_append_sql(&sql, " WHERE target GLOB '%q*'",
111120
zTechNote);
112121
}else{
113122
if( g.perm.RdTkt==0 && g.perm.RdWiki==0 ){
114123
login_needed(g.anon.RdTkt || g.anon.RdWiki);
@@ -631,13 +640,13 @@
631640
@ <input type="submit" name="confirm" value="Confirm">
632641
@ </form>
633642
}
634643
635644
isModerator = g.perm.Admin ||
636
- (zForumPost && g.perm.ModForum) ||
637
- (zTktUuid && g.perm.ModTkt) ||
638
- (zWikiName && g.perm.ModWiki);
645
+ (zForumPost && g.perm.ModForum) ||
646
+ (zTktUuid && g.perm.ModTkt) ||
647
+ (zWikiName && g.perm.ModWiki);
639648
zModAction = P("modaction");
640649
if( zModAction!=0 ){
641650
if( strcmp(zModAction,"delete")==0 ){
642651
if( isModerator ){
643652
moderation_disapprove(rid);
@@ -644,13 +653,15 @@
644653
}
645654
if( zForumPost ){
646655
cgi_redirectf("%R/forumpost/%!S", zForumPost);
647656
}else if( zTktUuid ){
648657
cgi_redirectf("%R/tktview/%!S", zTktUuid);
649
- }else{
658
+ }else if( zWikiName ) {
650659
cgi_redirectf("%R/wiki?name=%t", zWikiName);
651660
}
661
+ /* zTNUuid is intentionally unhandled. Tech note attachments
662
+ ** don't go through moderation. */
652663
return;
653664
}
654665
if( isModerator && strcmp(zModAction,"approve")==0 ){
655666
moderation_approve('a', rid);
656667
}
@@ -746,13 +757,14 @@
746757
#if INTERFACE
747758
/*
748759
** Flags for use with attachment_list(). ATTACHLIST_HRULE_ABOVE
749760
** must have a value of 1 for historical call compatibility.
750761
*/
751
-#define ATTACHLIST_HRULE_ABOVE 0x01 /* Insert <hr> above header. */
752
-#define ATTACHLIST_TARGET_BLANK 0x02 /* use target=_blank for links */
753
-#define ATTACHLIST_SIZE 0x04 /* add size */
762
+#define ATTACHLIST_HRULE_ABOVE 0x01 /* Insert <hr> above header */
763
+#define ATTACHLIST_TARGET_BLANK 0x02 /* use target=_blank for links */
764
+#define ATTACHLIST_SIZE 0x04 /* add size */
765
+#define ATTACHLIST_HIDE_UNAPPROVED 0x08 /* Hide pending-moderation files */
754766
#endif
755767
756768
/*
757769
** Output HTML to show a list of attachments.
758770
*/
@@ -766,11 +778,12 @@
766778
const char * zLinkTgt = (ATTACHLIST_TARGET_BLANK & flags)
767779
? " target=\"_blank\"" : "";
768780
Stmt q;
769781
db_prepare(&q,
770782
"SELECT datetime(mtime,toLocal()), filename, user,"
771
- " (SELECT uuid FROM blob WHERE rid=attachid), src, target"
783
+ " (SELECT uuid FROM blob WHERE rid=attachid), src, target, "
784
+ " attachid "
772785
" FROM attachment"
773786
" WHERE isLatest AND src!='' AND target=%Q"
774787
" ORDER BY mtime DESC",
775788
zTarget
776789
);
@@ -781,20 +794,32 @@
781794
const char *zUuid = db_column_text(&q, 3);
782795
const char *zSrc = db_column_text(&q, 4);
783796
const char *zTarget = db_column_text(&q, 5);
784797
const char *zDispUser = zUser && zUser[0] ? zUser : "anonymous";
785798
const char *zTypeArg = 0; /* URL arg name for /attachdownload */
799
+ const int aid = db_column_int(&q, 6);
800
+ const int iAType = attachment_target_type(zTarget);
801
+ if( (flags & ATTACHLIST_HIDE_UNAPPROVED)
802
+ && moderation_pending(aid)
803
+ && !(g.perm.Admin
804
+ || (g.perm.ModForum && CFTYPE_FORUM==iAType)
805
+ || (g.perm.ModTkt && CFTYPE_TICKET==iAType)
806
+ || (g.perm.ModWiki && CFTYPE_WIKI==iAType)
807
+ || 0==fossil_strcmp(login_name(), zUser)
808
+ ) ){
809
+ continue;
810
+ }
786811
if( cnt==0 ){
787812
@ <section class='attachlist'>
788813
if( flags & ATTACHLIST_HRULE_ABOVE ){
789814
@ <hr>
790815
}
791816
@ %s(zHeader)
792817
@ <ul>
793818
}
794819
cnt++;
795
- switch( attachment_target_type(zTarget) ){
820
+ switch( iAType ){
796821
case CFTYPE_TICKET: zTypeArg = "tkt"; break;
797822
case CFTYPE_FORUM: zTypeArg = "forumpost"; break;
798823
case CFTYPE_EVENT: zTypeArg = "event"; break;
799824
case CFTYPE_WIKI:
800825
default: zTypeArg = "page"; break;
@@ -808,18 +833,18 @@
808833
@ [<a href="%R/attachdownload/%t(zFile)?%s(zTypeArg)=%t(zTarget)\
809834
@&file=%t(zFile)%s(zLinkTgt)">download</a>%s(szBuf)]
810835
@ added by %h(zDispUser) on
811836
hyperlink_to_date(zDate, ".");
812837
@ [<a href="%R/ainfo/%!S(zUuid)"%s(zLinkTgt)>details</a>]
838
+ moderation_pending_www(aid);
813839
@ </li>
814840
}
815841
if( cnt ){
816842
@ </ul>
817843
@ </section>
818844
}
819845
db_finalize(&q);
820
-
821846
}
822847
823848
/*
824849
** COMMAND: attachment*
825850
**
826851
--- src/attach.c
+++ src/attach.c
@@ -31,23 +31,32 @@
31 ** if needed, they resolve zTarget using forumpost_head_rid2() so that
32 ** they get the RID of the earliest version of the post, as that is
33 ** the only one which attachments should target.
34 */
35 int attachment_target_type(const char *zTarget){
 
 
36 if( forumpost_head_rid2(zTarget)>0 ){
37 return CFTYPE_FORUM;
38 }
39 return db_int(0,
40 "SELECT CASE "
41 "WHEN 'tkt-'||%Q IN (SELECT tagname FROM tag) THEN %d "
42 "WHEN 'event-'||%Q IN (SELECT tagname FROM tag) THEN %d "
43 "WHEN 'wiki-'||%Q IN (SELECT tagname FROM tag) THEN %d "
44 "ELSE 0 END",
45 zTarget, CFTYPE_TICKET,
46 zTarget, CFTYPE_TECHNOTE,
47 zTarget, CFTYPE_WIKI
48 );
 
 
 
 
 
 
 
49 }
50
51 /*
52 ** WEBPAGE: attachlist
53 ** List attachments.
@@ -96,19 +105,19 @@
96 zUuid = rid_to_uuid(fnid);
97 blob_append_sql(&sql, " WHERE target=%Q", zUuid);
98 fossil_free(zUuid);
99 }else if( zPage ){
100 if( g.perm.RdWiki==0 ){ login_needed(g.anon.RdWiki); return; }
101 style_header("Attachments To %h", zPage);
102 blob_append_sql(&sql, " WHERE target=%Q", zPage);
103 }else if( zTkt ){
104 if( g.perm.RdTkt==0 ){ login_needed(g.anon.RdTkt); return; }
105 style_header("Attachments To Ticket %S", zTkt);
106 blob_append_sql(&sql, " WHERE target GLOB '%q*'", zTkt);
107 }else if( zTechNote ){
108 if( g.perm.RdWiki==0 ){ login_needed(g.anon.RdWiki); return; }
109 style_header("Attachments to Tech Note %S", zTechNote);
110 blob_append_sql(&sql, " WHERE target GLOB '%q*'",
111 zTechNote);
112 }else{
113 if( g.perm.RdTkt==0 && g.perm.RdWiki==0 ){
114 login_needed(g.anon.RdTkt || g.anon.RdWiki);
@@ -631,13 +640,13 @@
631 @ <input type="submit" name="confirm" value="Confirm">
632 @ </form>
633 }
634
635 isModerator = g.perm.Admin ||
636 (zForumPost && g.perm.ModForum) ||
637 (zTktUuid && g.perm.ModTkt) ||
638 (zWikiName && g.perm.ModWiki);
639 zModAction = P("modaction");
640 if( zModAction!=0 ){
641 if( strcmp(zModAction,"delete")==0 ){
642 if( isModerator ){
643 moderation_disapprove(rid);
@@ -644,13 +653,15 @@
644 }
645 if( zForumPost ){
646 cgi_redirectf("%R/forumpost/%!S", zForumPost);
647 }else if( zTktUuid ){
648 cgi_redirectf("%R/tktview/%!S", zTktUuid);
649 }else{
650 cgi_redirectf("%R/wiki?name=%t", zWikiName);
651 }
 
 
652 return;
653 }
654 if( isModerator && strcmp(zModAction,"approve")==0 ){
655 moderation_approve('a', rid);
656 }
@@ -746,13 +757,14 @@
746 #if INTERFACE
747 /*
748 ** Flags for use with attachment_list(). ATTACHLIST_HRULE_ABOVE
749 ** must have a value of 1 for historical call compatibility.
750 */
751 #define ATTACHLIST_HRULE_ABOVE 0x01 /* Insert <hr> above header. */
752 #define ATTACHLIST_TARGET_BLANK 0x02 /* use target=_blank for links */
753 #define ATTACHLIST_SIZE 0x04 /* add size */
 
754 #endif
755
756 /*
757 ** Output HTML to show a list of attachments.
758 */
@@ -766,11 +778,12 @@
766 const char * zLinkTgt = (ATTACHLIST_TARGET_BLANK & flags)
767 ? " target=\"_blank\"" : "";
768 Stmt q;
769 db_prepare(&q,
770 "SELECT datetime(mtime,toLocal()), filename, user,"
771 " (SELECT uuid FROM blob WHERE rid=attachid), src, target"
 
772 " FROM attachment"
773 " WHERE isLatest AND src!='' AND target=%Q"
774 " ORDER BY mtime DESC",
775 zTarget
776 );
@@ -781,20 +794,32 @@
781 const char *zUuid = db_column_text(&q, 3);
782 const char *zSrc = db_column_text(&q, 4);
783 const char *zTarget = db_column_text(&q, 5);
784 const char *zDispUser = zUser && zUser[0] ? zUser : "anonymous";
785 const char *zTypeArg = 0; /* URL arg name for /attachdownload */
 
 
 
 
 
 
 
 
 
 
 
 
786 if( cnt==0 ){
787 @ <section class='attachlist'>
788 if( flags & ATTACHLIST_HRULE_ABOVE ){
789 @ <hr>
790 }
791 @ %s(zHeader)
792 @ <ul>
793 }
794 cnt++;
795 switch( attachment_target_type(zTarget) ){
796 case CFTYPE_TICKET: zTypeArg = "tkt"; break;
797 case CFTYPE_FORUM: zTypeArg = "forumpost"; break;
798 case CFTYPE_EVENT: zTypeArg = "event"; break;
799 case CFTYPE_WIKI:
800 default: zTypeArg = "page"; break;
@@ -808,18 +833,18 @@
808 @ [<a href="%R/attachdownload/%t(zFile)?%s(zTypeArg)=%t(zTarget)\
809 @&file=%t(zFile)%s(zLinkTgt)">download</a>%s(szBuf)]
810 @ added by %h(zDispUser) on
811 hyperlink_to_date(zDate, ".");
812 @ [<a href="%R/ainfo/%!S(zUuid)"%s(zLinkTgt)>details</a>]
 
813 @ </li>
814 }
815 if( cnt ){
816 @ </ul>
817 @ </section>
818 }
819 db_finalize(&q);
820
821 }
822
823 /*
824 ** COMMAND: attachment*
825 **
826
--- src/attach.c
+++ src/attach.c
@@ -31,23 +31,32 @@
31 ** if needed, they resolve zTarget using forumpost_head_rid2() so that
32 ** they get the RID of the earliest version of the post, as that is
33 ** the only one which attachments should target.
34 */
35 int attachment_target_type(const char *zTarget){
36 static Stmt q = empty_Stmt_m;
37 int rc = 0;
38 if( forumpost_head_rid2(zTarget)>0 ){
39 return CFTYPE_FORUM;
40 }
41 if( !q.pStmt ){
42 db_static_prepare(
43 &q,
44 "SELECT CASE "
45 "WHEN 'tkt-'||:tgt IN (SELECT tagname FROM tag) THEN %d "
46 "WHEN 'event-'||:tgt IN (SELECT tagname FROM tag) THEN %d "
47 "WHEN 'wiki-'||:tgt IN (SELECT tagname FROM tag) THEN %d "
48 "ELSE 0 END",
49 CFTYPE_TICKET, CFTYPE_TECHNOTE, CFTYPE_WIKI
50 );
51 }
52 db_bind_text(&q, ":tgt", zTarget);
53 if( SQLITE_ROW==db_step(&q) ){
54 rc = db_column_int(&q, 0);
55 }
56 db_reset(&q);
57 return rc;
58 }
59
60 /*
61 ** WEBPAGE: attachlist
62 ** List attachments.
@@ -96,19 +105,19 @@
105 zUuid = rid_to_uuid(fnid);
106 blob_append_sql(&sql, " WHERE target=%Q", zUuid);
107 fossil_free(zUuid);
108 }else if( zPage ){
109 if( g.perm.RdWiki==0 ){ login_needed(g.anon.RdWiki); return; }
110 style_header("Attachments To Wiki page %h", zPage);
111 blob_append_sql(&sql, " WHERE target=%Q", zPage);
112 }else if( zTkt ){
113 if( g.perm.RdTkt==0 ){ login_needed(g.anon.RdTkt); return; }
114 style_header("Attachments To Ticket %S", zTkt);
115 blob_append_sql(&sql, " WHERE target GLOB '%q*'", zTkt);
116 }else if( zTechNote ){
117 if( g.perm.RdWiki==0 ){ login_needed(g.anon.RdWiki); return; }
118 style_header("Attachments To Tech Note %S", zTechNote);
119 blob_append_sql(&sql, " WHERE target GLOB '%q*'",
120 zTechNote);
121 }else{
122 if( g.perm.RdTkt==0 && g.perm.RdWiki==0 ){
123 login_needed(g.anon.RdTkt || g.anon.RdWiki);
@@ -631,13 +640,13 @@
640 @ <input type="submit" name="confirm" value="Confirm">
641 @ </form>
642 }
643
644 isModerator = g.perm.Admin ||
645 (zForumPost && g.perm.ModForum) ||
646 (zTktUuid && g.perm.ModTkt) ||
647 (zWikiName && g.perm.ModWiki);
648 zModAction = P("modaction");
649 if( zModAction!=0 ){
650 if( strcmp(zModAction,"delete")==0 ){
651 if( isModerator ){
652 moderation_disapprove(rid);
@@ -644,13 +653,15 @@
653 }
654 if( zForumPost ){
655 cgi_redirectf("%R/forumpost/%!S", zForumPost);
656 }else if( zTktUuid ){
657 cgi_redirectf("%R/tktview/%!S", zTktUuid);
658 }else if( zWikiName ) {
659 cgi_redirectf("%R/wiki?name=%t", zWikiName);
660 }
661 /* zTNUuid is intentionally unhandled. Tech note attachments
662 ** don't go through moderation. */
663 return;
664 }
665 if( isModerator && strcmp(zModAction,"approve")==0 ){
666 moderation_approve('a', rid);
667 }
@@ -746,13 +757,14 @@
757 #if INTERFACE
758 /*
759 ** Flags for use with attachment_list(). ATTACHLIST_HRULE_ABOVE
760 ** must have a value of 1 for historical call compatibility.
761 */
762 #define ATTACHLIST_HRULE_ABOVE 0x01 /* Insert <hr> above header */
763 #define ATTACHLIST_TARGET_BLANK 0x02 /* use target=_blank for links */
764 #define ATTACHLIST_SIZE 0x04 /* add size */
765 #define ATTACHLIST_HIDE_UNAPPROVED 0x08 /* Hide pending-moderation files */
766 #endif
767
768 /*
769 ** Output HTML to show a list of attachments.
770 */
@@ -766,11 +778,12 @@
778 const char * zLinkTgt = (ATTACHLIST_TARGET_BLANK & flags)
779 ? " target=\"_blank\"" : "";
780 Stmt q;
781 db_prepare(&q,
782 "SELECT datetime(mtime,toLocal()), filename, user,"
783 " (SELECT uuid FROM blob WHERE rid=attachid), src, target, "
784 " attachid "
785 " FROM attachment"
786 " WHERE isLatest AND src!='' AND target=%Q"
787 " ORDER BY mtime DESC",
788 zTarget
789 );
@@ -781,20 +794,32 @@
794 const char *zUuid = db_column_text(&q, 3);
795 const char *zSrc = db_column_text(&q, 4);
796 const char *zTarget = db_column_text(&q, 5);
797 const char *zDispUser = zUser && zUser[0] ? zUser : "anonymous";
798 const char *zTypeArg = 0; /* URL arg name for /attachdownload */
799 const int aid = db_column_int(&q, 6);
800 const int iAType = attachment_target_type(zTarget);
801 if( (flags & ATTACHLIST_HIDE_UNAPPROVED)
802 && moderation_pending(aid)
803 && !(g.perm.Admin
804 || (g.perm.ModForum && CFTYPE_FORUM==iAType)
805 || (g.perm.ModTkt && CFTYPE_TICKET==iAType)
806 || (g.perm.ModWiki && CFTYPE_WIKI==iAType)
807 || 0==fossil_strcmp(login_name(), zUser)
808 ) ){
809 continue;
810 }
811 if( cnt==0 ){
812 @ <section class='attachlist'>
813 if( flags & ATTACHLIST_HRULE_ABOVE ){
814 @ <hr>
815 }
816 @ %s(zHeader)
817 @ <ul>
818 }
819 cnt++;
820 switch( iAType ){
821 case CFTYPE_TICKET: zTypeArg = "tkt"; break;
822 case CFTYPE_FORUM: zTypeArg = "forumpost"; break;
823 case CFTYPE_EVENT: zTypeArg = "event"; break;
824 case CFTYPE_WIKI:
825 default: zTypeArg = "page"; break;
@@ -808,18 +833,18 @@
833 @ [<a href="%R/attachdownload/%t(zFile)?%s(zTypeArg)=%t(zTarget)\
834 @&file=%t(zFile)%s(zLinkTgt)">download</a>%s(szBuf)]
835 @ added by %h(zDispUser) on
836 hyperlink_to_date(zDate, ".");
837 @ [<a href="%R/ainfo/%!S(zUuid)"%s(zLinkTgt)>details</a>]
838 moderation_pending_www(aid);
839 @ </li>
840 }
841 if( cnt ){
842 @ </ul>
843 @ </section>
844 }
845 db_finalize(&q);
 
846 }
847
848 /*
849 ** COMMAND: attachment*
850 **
851
+16 -1
--- src/forum.c
+++ src/forum.c
@@ -835,11 +835,12 @@
835835
return p->zDisplayName;
836836
}
837837
838838
static void forum_render_attachment_list(ForumPost *p){
839839
if( p->pEditHead ) p = p->pEditHead;
840
- attachment_list(p->zUuid, "Attachments:", ATTACHLIST_SIZE);
840
+ attachment_list(p->zUuid, "Attachments:",
841
+ ATTACHLIST_SIZE | ATTACHLIST_HIDE_UNAPPROVED);
841842
}
842843
843844
/*
844845
** Display a single post in a forum thread.
845846
*/
@@ -1668,10 +1669,22 @@
16681669
@ <br><label><input type="checkbox" name="fpsilent" %s(PCK("fpsilent"))> \
16691670
@ Do not send notification emails</label>
16701671
@ </div>
16711672
}
16721673
}
1674
+
1675
+/*
1676
+** If the user has AttachForum permissions, emit a notice that
1677
+** attachments may be added after saving. If p is not NULL,
1678
+** also emit its list of attachments.
1679
+*/
1680
+static void forum_render_attachment_notice(){
1681
+ if( g.perm.AttachForum ){
1682
+ @ <div>You will be able to attach files to this post after saving
1683
+ @ it.</div>
1684
+ }
1685
+}
16731686
16741687
/*
16751688
** WEBPAGE: forume1
16761689
**
16771690
** Start a new forum thread.
@@ -1707,10 +1720,11 @@
17071720
@ <input type="submit" name="submit" value="Submit" disabled>
17081721
}
17091722
forum_render_debug_options();
17101723
login_insert_csrf_secret();
17111724
@ </form>
1725
+ forum_render_attachment_notice(0);
17121726
forum_emit_js();
17131727
style_finish_page();
17141728
}
17151729
17161730
/*
@@ -1900,10 +1914,11 @@
19001914
}
19011915
}
19021916
forum_render_debug_options();
19031917
login_insert_csrf_secret();
19041918
@ </form>
1919
+ forum_render_attachment_notice();
19051920
forum_emit_js();
19061921
style_finish_page();
19071922
}
19081923
19091924
/*
19101925
--- src/forum.c
+++ src/forum.c
@@ -835,11 +835,12 @@
835 return p->zDisplayName;
836 }
837
838 static void forum_render_attachment_list(ForumPost *p){
839 if( p->pEditHead ) p = p->pEditHead;
840 attachment_list(p->zUuid, "Attachments:", ATTACHLIST_SIZE);
 
841 }
842
843 /*
844 ** Display a single post in a forum thread.
845 */
@@ -1668,10 +1669,22 @@
1668 @ <br><label><input type="checkbox" name="fpsilent" %s(PCK("fpsilent"))> \
1669 @ Do not send notification emails</label>
1670 @ </div>
1671 }
1672 }
 
 
 
 
 
 
 
 
 
 
 
 
1673
1674 /*
1675 ** WEBPAGE: forume1
1676 **
1677 ** Start a new forum thread.
@@ -1707,10 +1720,11 @@
1707 @ <input type="submit" name="submit" value="Submit" disabled>
1708 }
1709 forum_render_debug_options();
1710 login_insert_csrf_secret();
1711 @ </form>
 
1712 forum_emit_js();
1713 style_finish_page();
1714 }
1715
1716 /*
@@ -1900,10 +1914,11 @@
1900 }
1901 }
1902 forum_render_debug_options();
1903 login_insert_csrf_secret();
1904 @ </form>
 
1905 forum_emit_js();
1906 style_finish_page();
1907 }
1908
1909 /*
1910
--- src/forum.c
+++ src/forum.c
@@ -835,11 +835,12 @@
835 return p->zDisplayName;
836 }
837
838 static void forum_render_attachment_list(ForumPost *p){
839 if( p->pEditHead ) p = p->pEditHead;
840 attachment_list(p->zUuid, "Attachments:",
841 ATTACHLIST_SIZE | ATTACHLIST_HIDE_UNAPPROVED);
842 }
843
844 /*
845 ** Display a single post in a forum thread.
846 */
@@ -1668,10 +1669,22 @@
1669 @ <br><label><input type="checkbox" name="fpsilent" %s(PCK("fpsilent"))> \
1670 @ Do not send notification emails</label>
1671 @ </div>
1672 }
1673 }
1674
1675 /*
1676 ** If the user has AttachForum permissions, emit a notice that
1677 ** attachments may be added after saving. If p is not NULL,
1678 ** also emit its list of attachments.
1679 */
1680 static void forum_render_attachment_notice(){
1681 if( g.perm.AttachForum ){
1682 @ <div>You will be able to attach files to this post after saving
1683 @ it.</div>
1684 }
1685 }
1686
1687 /*
1688 ** WEBPAGE: forume1
1689 **
1690 ** Start a new forum thread.
@@ -1707,10 +1720,11 @@
1720 @ <input type="submit" name="submit" value="Submit" disabled>
1721 }
1722 forum_render_debug_options();
1723 login_insert_csrf_secret();
1724 @ </form>
1725 forum_render_attachment_notice(0);
1726 forum_emit_js();
1727 style_finish_page();
1728 }
1729
1730 /*
@@ -1900,10 +1914,11 @@
1914 }
1915 }
1916 forum_render_debug_options();
1917 login_insert_csrf_secret();
1918 @ </form>
1919 forum_render_attachment_notice();
1920 forum_emit_js();
1921 style_finish_page();
1922 }
1923
1924 /*
1925

Keyboard Shortcuts

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