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.
Commit
50645bf5e9baeb39f4e6af7f8113f80e83a9d2b803db216357801d3d117151b0
Parent
bd00fbe81a7a81d…
2 files changed
+47
-22
+16
-1
+47
-22
| --- src/attach.c | ||
| +++ src/attach.c | ||
| @@ -31,23 +31,32 @@ | ||
| 31 | 31 | ** if needed, they resolve zTarget using forumpost_head_rid2() so that |
| 32 | 32 | ** they get the RID of the earliest version of the post, as that is |
| 33 | 33 | ** the only one which attachments should target. |
| 34 | 34 | */ |
| 35 | 35 | int attachment_target_type(const char *zTarget){ |
| 36 | + static Stmt q = empty_Stmt_m; | |
| 37 | + int rc = 0; | |
| 36 | 38 | if( forumpost_head_rid2(zTarget)>0 ){ |
| 37 | 39 | return CFTYPE_FORUM; |
| 38 | 40 | } |
| 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; | |
| 49 | 58 | } |
| 50 | 59 | |
| 51 | 60 | /* |
| 52 | 61 | ** WEBPAGE: attachlist |
| 53 | 62 | ** List attachments. |
| @@ -96,19 +105,19 @@ | ||
| 96 | 105 | zUuid = rid_to_uuid(fnid); |
| 97 | 106 | blob_append_sql(&sql, " WHERE target=%Q", zUuid); |
| 98 | 107 | fossil_free(zUuid); |
| 99 | 108 | }else if( zPage ){ |
| 100 | 109 | 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); | |
| 102 | 111 | blob_append_sql(&sql, " WHERE target=%Q", zPage); |
| 103 | 112 | }else if( zTkt ){ |
| 104 | 113 | if( g.perm.RdTkt==0 ){ login_needed(g.anon.RdTkt); return; } |
| 105 | 114 | style_header("Attachments To Ticket %S", zTkt); |
| 106 | 115 | blob_append_sql(&sql, " WHERE target GLOB '%q*'", zTkt); |
| 107 | 116 | }else if( zTechNote ){ |
| 108 | 117 | 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); | |
| 110 | 119 | blob_append_sql(&sql, " WHERE target GLOB '%q*'", |
| 111 | 120 | zTechNote); |
| 112 | 121 | }else{ |
| 113 | 122 | if( g.perm.RdTkt==0 && g.perm.RdWiki==0 ){ |
| 114 | 123 | login_needed(g.anon.RdTkt || g.anon.RdWiki); |
| @@ -631,13 +640,13 @@ | ||
| 631 | 640 | @ <input type="submit" name="confirm" value="Confirm"> |
| 632 | 641 | @ </form> |
| 633 | 642 | } |
| 634 | 643 | |
| 635 | 644 | 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); | |
| 639 | 648 | zModAction = P("modaction"); |
| 640 | 649 | if( zModAction!=0 ){ |
| 641 | 650 | if( strcmp(zModAction,"delete")==0 ){ |
| 642 | 651 | if( isModerator ){ |
| 643 | 652 | moderation_disapprove(rid); |
| @@ -644,13 +653,15 @@ | ||
| 644 | 653 | } |
| 645 | 654 | if( zForumPost ){ |
| 646 | 655 | cgi_redirectf("%R/forumpost/%!S", zForumPost); |
| 647 | 656 | }else if( zTktUuid ){ |
| 648 | 657 | cgi_redirectf("%R/tktview/%!S", zTktUuid); |
| 649 | - }else{ | |
| 658 | + }else if( zWikiName ) { | |
| 650 | 659 | cgi_redirectf("%R/wiki?name=%t", zWikiName); |
| 651 | 660 | } |
| 661 | + /* zTNUuid is intentionally unhandled. Tech note attachments | |
| 662 | + ** don't go through moderation. */ | |
| 652 | 663 | return; |
| 653 | 664 | } |
| 654 | 665 | if( isModerator && strcmp(zModAction,"approve")==0 ){ |
| 655 | 666 | moderation_approve('a', rid); |
| 656 | 667 | } |
| @@ -746,13 +757,14 @@ | ||
| 746 | 757 | #if INTERFACE |
| 747 | 758 | /* |
| 748 | 759 | ** Flags for use with attachment_list(). ATTACHLIST_HRULE_ABOVE |
| 749 | 760 | ** must have a value of 1 for historical call compatibility. |
| 750 | 761 | */ |
| 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 */ | |
| 754 | 766 | #endif |
| 755 | 767 | |
| 756 | 768 | /* |
| 757 | 769 | ** Output HTML to show a list of attachments. |
| 758 | 770 | */ |
| @@ -766,11 +778,12 @@ | ||
| 766 | 778 | const char * zLinkTgt = (ATTACHLIST_TARGET_BLANK & flags) |
| 767 | 779 | ? " target=\"_blank\"" : ""; |
| 768 | 780 | Stmt q; |
| 769 | 781 | db_prepare(&q, |
| 770 | 782 | "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 " | |
| 772 | 785 | " FROM attachment" |
| 773 | 786 | " WHERE isLatest AND src!='' AND target=%Q" |
| 774 | 787 | " ORDER BY mtime DESC", |
| 775 | 788 | zTarget |
| 776 | 789 | ); |
| @@ -781,20 +794,32 @@ | ||
| 781 | 794 | const char *zUuid = db_column_text(&q, 3); |
| 782 | 795 | const char *zSrc = db_column_text(&q, 4); |
| 783 | 796 | const char *zTarget = db_column_text(&q, 5); |
| 784 | 797 | const char *zDispUser = zUser && zUser[0] ? zUser : "anonymous"; |
| 785 | 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 | + } | |
| 786 | 811 | if( cnt==0 ){ |
| 787 | 812 | @ <section class='attachlist'> |
| 788 | 813 | if( flags & ATTACHLIST_HRULE_ABOVE ){ |
| 789 | 814 | @ <hr> |
| 790 | 815 | } |
| 791 | 816 | @ %s(zHeader) |
| 792 | 817 | @ <ul> |
| 793 | 818 | } |
| 794 | 819 | cnt++; |
| 795 | - switch( attachment_target_type(zTarget) ){ | |
| 820 | + switch( iAType ){ | |
| 796 | 821 | case CFTYPE_TICKET: zTypeArg = "tkt"; break; |
| 797 | 822 | case CFTYPE_FORUM: zTypeArg = "forumpost"; break; |
| 798 | 823 | case CFTYPE_EVENT: zTypeArg = "event"; break; |
| 799 | 824 | case CFTYPE_WIKI: |
| 800 | 825 | default: zTypeArg = "page"; break; |
| @@ -808,18 +833,18 @@ | ||
| 808 | 833 | @ [<a href="%R/attachdownload/%t(zFile)?%s(zTypeArg)=%t(zTarget)\ |
| 809 | 834 | @&file=%t(zFile)%s(zLinkTgt)">download</a>%s(szBuf)] |
| 810 | 835 | @ added by %h(zDispUser) on |
| 811 | 836 | hyperlink_to_date(zDate, "."); |
| 812 | 837 | @ [<a href="%R/ainfo/%!S(zUuid)"%s(zLinkTgt)>details</a>] |
| 838 | + moderation_pending_www(aid); | |
| 813 | 839 | @ </li> |
| 814 | 840 | } |
| 815 | 841 | if( cnt ){ |
| 816 | 842 | @ </ul> |
| 817 | 843 | @ </section> |
| 818 | 844 | } |
| 819 | 845 | db_finalize(&q); |
| 820 | - | |
| 821 | 846 | } |
| 822 | 847 | |
| 823 | 848 | /* |
| 824 | 849 | ** COMMAND: attachment* |
| 825 | 850 | ** |
| 826 | 851 |
| --- 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 @@ | ||
| 835 | 835 | return p->zDisplayName; |
| 836 | 836 | } |
| 837 | 837 | |
| 838 | 838 | static void forum_render_attachment_list(ForumPost *p){ |
| 839 | 839 | 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); | |
| 841 | 842 | } |
| 842 | 843 | |
| 843 | 844 | /* |
| 844 | 845 | ** Display a single post in a forum thread. |
| 845 | 846 | */ |
| @@ -1668,10 +1669,22 @@ | ||
| 1668 | 1669 | @ <br><label><input type="checkbox" name="fpsilent" %s(PCK("fpsilent"))> \ |
| 1669 | 1670 | @ Do not send notification emails</label> |
| 1670 | 1671 | @ </div> |
| 1671 | 1672 | } |
| 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 | +} | |
| 1673 | 1686 | |
| 1674 | 1687 | /* |
| 1675 | 1688 | ** WEBPAGE: forume1 |
| 1676 | 1689 | ** |
| 1677 | 1690 | ** Start a new forum thread. |
| @@ -1707,10 +1720,11 @@ | ||
| 1707 | 1720 | @ <input type="submit" name="submit" value="Submit" disabled> |
| 1708 | 1721 | } |
| 1709 | 1722 | forum_render_debug_options(); |
| 1710 | 1723 | login_insert_csrf_secret(); |
| 1711 | 1724 | @ </form> |
| 1725 | + forum_render_attachment_notice(0); | |
| 1712 | 1726 | forum_emit_js(); |
| 1713 | 1727 | style_finish_page(); |
| 1714 | 1728 | } |
| 1715 | 1729 | |
| 1716 | 1730 | /* |
| @@ -1900,10 +1914,11 @@ | ||
| 1900 | 1914 | } |
| 1901 | 1915 | } |
| 1902 | 1916 | forum_render_debug_options(); |
| 1903 | 1917 | login_insert_csrf_secret(); |
| 1904 | 1918 | @ </form> |
| 1919 | + forum_render_attachment_notice(); | |
| 1905 | 1920 | forum_emit_js(); |
| 1906 | 1921 | style_finish_page(); |
| 1907 | 1922 | } |
| 1908 | 1923 | |
| 1909 | 1924 | /* |
| 1910 | 1925 |
| --- 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 |