Fossil SCM
Wiki moderation now appears to be working.
Commit
b7ccf110f37cf390e5b8a2c9439a426f73273027
Parent
f7938ebd00ee6d4…
4 files changed
+35
-3
+2
-1
+12
-3
+20
-15
+35
-3
| --- src/info.c | ||
| +++ src/info.c | ||
| @@ -723,10 +723,12 @@ | ||
| 723 | 723 | int rid; |
| 724 | 724 | Manifest *pWiki; |
| 725 | 725 | char *zUuid; |
| 726 | 726 | char *zDate; |
| 727 | 727 | Blob wiki; |
| 728 | + int modPending; | |
| 729 | + const char *zModAction; | |
| 728 | 730 | |
| 729 | 731 | login_check_credentials(); |
| 730 | 732 | if( !g.perm.RdWiki ){ login_needed(); return; } |
| 731 | 733 | rid = name_to_rid_www("name"); |
| 732 | 734 | if( rid==0 || (pWiki = manifest_get(rid, CFTYPE_WIKI))==0 ){ |
| @@ -733,11 +735,21 @@ | ||
| 733 | 735 | style_header("Wiki Page Information Error"); |
| 734 | 736 | @ No such object: %h(P("name")) |
| 735 | 737 | style_footer(); |
| 736 | 738 | return; |
| 737 | 739 | } |
| 738 | - style_header("Edit To %h", pWiki->zWikiTitle); | |
| 740 | + if( g.perm.ModWiki && (zModAction = P("modaction"))!=0 ){ | |
| 741 | + if( strcmp(zModAction,"delete")==0 ){ | |
| 742 | + moderation_disapprove(rid); | |
| 743 | + cgi_redirectf("%R/wiki?name=%T", pWiki->zWikiTitle); | |
| 744 | + /*NOTREACHED*/ | |
| 745 | + } | |
| 746 | + if( strcmp(zModAction,"approve")==0 ){ | |
| 747 | + moderation_approve(rid); | |
| 748 | + } | |
| 749 | + } | |
| 750 | + style_header("Update of \"%h\"", pWiki->zWikiTitle); | |
| 739 | 751 | zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 740 | 752 | zDate = db_text(0, "SELECT datetime(%.17g)", pWiki->rDate); |
| 741 | 753 | style_submenu_element("Raw", "Raw", "artifact/%S", zUuid); |
| 742 | 754 | style_submenu_element("History", "History", "whistory?name=%t", |
| 743 | 755 | pWiki->zWikiTitle); |
| @@ -744,14 +756,19 @@ | ||
| 744 | 756 | style_submenu_element("Page", "Page", "wiki?name=%t", |
| 745 | 757 | pWiki->zWikiTitle); |
| 746 | 758 | login_anonymous_available(); |
| 747 | 759 | @ <div class="section">Overview</div> |
| 748 | 760 | @ <p><table class="label-value"> |
| 749 | - @ <tr><th>Artifact ID:</th><td>%s(zUuid) | |
| 761 | + @ <tr><th>Artifact ID:</th> | |
| 762 | + @ <td>%z(href("%R/artifact/%s",zUuid))%s(zUuid)</a> | |
| 750 | 763 | if( g.perm.Setup ){ |
| 751 | 764 | @ (%d(rid)) |
| 752 | 765 | } |
| 766 | + modPending = moderation_pending(rid); | |
| 767 | + if( modPending ){ | |
| 768 | + @ <span class="modpending">*** Moderation Pending ***</span> | |
| 769 | + } | |
| 753 | 770 | @ </td></tr> |
| 754 | 771 | @ <tr><th>Page Name:</th><td>%h(pWiki->zWikiTitle)</td></tr> |
| 755 | 772 | @ <tr><th>Date:</th><td> |
| 756 | 773 | hyperlink_to_date(zDate, "</td></tr>"); |
| 757 | 774 | @ <tr><th>Original User:</th><td> |
| @@ -764,12 +781,27 @@ | ||
| 764 | 781 | @ %z(href("info/%S",zParent))%s(zParent)</a> |
| 765 | 782 | } |
| 766 | 783 | @ </td></tr> |
| 767 | 784 | } |
| 768 | 785 | @ </table> |
| 769 | - blob_init(&wiki, pWiki->zWiki, -1); | |
| 786 | + | |
| 787 | + if( g.perm.ModWiki && modPending ){ | |
| 788 | + @ <div class="section">Moderation</div> | |
| 789 | + @ <blockquote> | |
| 790 | + @ <form method="POST" action="%R/winfo/%s(zUuid)"> | |
| 791 | + @ <label><input type="radio" name="modaction" value="delete"> | |
| 792 | + @ Delete this change</label><br /> | |
| 793 | + @ <label><input type="radio" name="modaction" value="approve"> | |
| 794 | + @ Approve this change</label><br /> | |
| 795 | + @ <input type="submit" value="Submit"> | |
| 796 | + @ </form> | |
| 797 | + @ </blockquote> | |
| 798 | + } | |
| 799 | + | |
| 800 | + | |
| 770 | 801 | @ <div class="section">Content</div> |
| 802 | + blob_init(&wiki, pWiki->zWiki, -1); | |
| 771 | 803 | wiki_convert(&wiki, 0, 0); |
| 772 | 804 | blob_reset(&wiki); |
| 773 | 805 | manifest_destroy(pWiki); |
| 774 | 806 | style_footer(); |
| 775 | 807 | } |
| 776 | 808 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -723,10 +723,12 @@ | |
| 723 | int rid; |
| 724 | Manifest *pWiki; |
| 725 | char *zUuid; |
| 726 | char *zDate; |
| 727 | Blob wiki; |
| 728 | |
| 729 | login_check_credentials(); |
| 730 | if( !g.perm.RdWiki ){ login_needed(); return; } |
| 731 | rid = name_to_rid_www("name"); |
| 732 | if( rid==0 || (pWiki = manifest_get(rid, CFTYPE_WIKI))==0 ){ |
| @@ -733,11 +735,21 @@ | |
| 733 | style_header("Wiki Page Information Error"); |
| 734 | @ No such object: %h(P("name")) |
| 735 | style_footer(); |
| 736 | return; |
| 737 | } |
| 738 | style_header("Edit To %h", pWiki->zWikiTitle); |
| 739 | zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 740 | zDate = db_text(0, "SELECT datetime(%.17g)", pWiki->rDate); |
| 741 | style_submenu_element("Raw", "Raw", "artifact/%S", zUuid); |
| 742 | style_submenu_element("History", "History", "whistory?name=%t", |
| 743 | pWiki->zWikiTitle); |
| @@ -744,14 +756,19 @@ | |
| 744 | style_submenu_element("Page", "Page", "wiki?name=%t", |
| 745 | pWiki->zWikiTitle); |
| 746 | login_anonymous_available(); |
| 747 | @ <div class="section">Overview</div> |
| 748 | @ <p><table class="label-value"> |
| 749 | @ <tr><th>Artifact ID:</th><td>%s(zUuid) |
| 750 | if( g.perm.Setup ){ |
| 751 | @ (%d(rid)) |
| 752 | } |
| 753 | @ </td></tr> |
| 754 | @ <tr><th>Page Name:</th><td>%h(pWiki->zWikiTitle)</td></tr> |
| 755 | @ <tr><th>Date:</th><td> |
| 756 | hyperlink_to_date(zDate, "</td></tr>"); |
| 757 | @ <tr><th>Original User:</th><td> |
| @@ -764,12 +781,27 @@ | |
| 764 | @ %z(href("info/%S",zParent))%s(zParent)</a> |
| 765 | } |
| 766 | @ </td></tr> |
| 767 | } |
| 768 | @ </table> |
| 769 | blob_init(&wiki, pWiki->zWiki, -1); |
| 770 | @ <div class="section">Content</div> |
| 771 | wiki_convert(&wiki, 0, 0); |
| 772 | blob_reset(&wiki); |
| 773 | manifest_destroy(pWiki); |
| 774 | style_footer(); |
| 775 | } |
| 776 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -723,10 +723,12 @@ | |
| 723 | int rid; |
| 724 | Manifest *pWiki; |
| 725 | char *zUuid; |
| 726 | char *zDate; |
| 727 | Blob wiki; |
| 728 | int modPending; |
| 729 | const char *zModAction; |
| 730 | |
| 731 | login_check_credentials(); |
| 732 | if( !g.perm.RdWiki ){ login_needed(); return; } |
| 733 | rid = name_to_rid_www("name"); |
| 734 | if( rid==0 || (pWiki = manifest_get(rid, CFTYPE_WIKI))==0 ){ |
| @@ -733,11 +735,21 @@ | |
| 735 | style_header("Wiki Page Information Error"); |
| 736 | @ No such object: %h(P("name")) |
| 737 | style_footer(); |
| 738 | return; |
| 739 | } |
| 740 | if( g.perm.ModWiki && (zModAction = P("modaction"))!=0 ){ |
| 741 | if( strcmp(zModAction,"delete")==0 ){ |
| 742 | moderation_disapprove(rid); |
| 743 | cgi_redirectf("%R/wiki?name=%T", pWiki->zWikiTitle); |
| 744 | /*NOTREACHED*/ |
| 745 | } |
| 746 | if( strcmp(zModAction,"approve")==0 ){ |
| 747 | moderation_approve(rid); |
| 748 | } |
| 749 | } |
| 750 | style_header("Update of \"%h\"", pWiki->zWikiTitle); |
| 751 | zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 752 | zDate = db_text(0, "SELECT datetime(%.17g)", pWiki->rDate); |
| 753 | style_submenu_element("Raw", "Raw", "artifact/%S", zUuid); |
| 754 | style_submenu_element("History", "History", "whistory?name=%t", |
| 755 | pWiki->zWikiTitle); |
| @@ -744,14 +756,19 @@ | |
| 756 | style_submenu_element("Page", "Page", "wiki?name=%t", |
| 757 | pWiki->zWikiTitle); |
| 758 | login_anonymous_available(); |
| 759 | @ <div class="section">Overview</div> |
| 760 | @ <p><table class="label-value"> |
| 761 | @ <tr><th>Artifact ID:</th> |
| 762 | @ <td>%z(href("%R/artifact/%s",zUuid))%s(zUuid)</a> |
| 763 | if( g.perm.Setup ){ |
| 764 | @ (%d(rid)) |
| 765 | } |
| 766 | modPending = moderation_pending(rid); |
| 767 | if( modPending ){ |
| 768 | @ <span class="modpending">*** Moderation Pending ***</span> |
| 769 | } |
| 770 | @ </td></tr> |
| 771 | @ <tr><th>Page Name:</th><td>%h(pWiki->zWikiTitle)</td></tr> |
| 772 | @ <tr><th>Date:</th><td> |
| 773 | hyperlink_to_date(zDate, "</td></tr>"); |
| 774 | @ <tr><th>Original User:</th><td> |
| @@ -764,12 +781,27 @@ | |
| 781 | @ %z(href("info/%S",zParent))%s(zParent)</a> |
| 782 | } |
| 783 | @ </td></tr> |
| 784 | } |
| 785 | @ </table> |
| 786 | |
| 787 | if( g.perm.ModWiki && modPending ){ |
| 788 | @ <div class="section">Moderation</div> |
| 789 | @ <blockquote> |
| 790 | @ <form method="POST" action="%R/winfo/%s(zUuid)"> |
| 791 | @ <label><input type="radio" name="modaction" value="delete"> |
| 792 | @ Delete this change</label><br /> |
| 793 | @ <label><input type="radio" name="modaction" value="approve"> |
| 794 | @ Approve this change</label><br /> |
| 795 | @ <input type="submit" value="Submit"> |
| 796 | @ </form> |
| 797 | @ </blockquote> |
| 798 | } |
| 799 | |
| 800 | |
| 801 | @ <div class="section">Content</div> |
| 802 | blob_init(&wiki, pWiki->zWiki, -1); |
| 803 | wiki_convert(&wiki, 0, 0); |
| 804 | blob_reset(&wiki); |
| 805 | manifest_destroy(pWiki); |
| 806 | style_footer(); |
| 807 | } |
| 808 |
+2
-1
| --- src/login.c | ||
| +++ src/login.c | ||
| @@ -977,11 +977,12 @@ | ||
| 977 | 977 | case 's': g.perm.Setup = 1; /* Fall thru into Admin */ |
| 978 | 978 | case 'a': g.perm.Admin = g.perm.RdTkt = g.perm.WrTkt = g.perm.Zip = |
| 979 | 979 | g.perm.RdWiki = g.perm.WrWiki = g.perm.NewWiki = |
| 980 | 980 | g.perm.ApndWiki = g.perm.Hyperlink = g.perm.Clone = |
| 981 | 981 | g.perm.NewTkt = g.perm.Password = g.perm.RdAddr = |
| 982 | - g.perm.TktFmt = g.perm.Attach = g.perm.ApndTkt = 1; | |
| 982 | + g.perm.TktFmt = g.perm.Attach = g.perm.ApndTkt = | |
| 983 | + g.perm.ModWiki = g.perm.ModTkt = 1; | |
| 983 | 984 | /* Fall thru into Read/Write */ |
| 984 | 985 | case 'i': g.perm.Read = g.perm.Write = 1; break; |
| 985 | 986 | case 'o': g.perm.Read = 1; break; |
| 986 | 987 | case 'z': g.perm.Zip = 1; break; |
| 987 | 988 | |
| 988 | 989 |
| --- src/login.c | |
| +++ src/login.c | |
| @@ -977,11 +977,12 @@ | |
| 977 | case 's': g.perm.Setup = 1; /* Fall thru into Admin */ |
| 978 | case 'a': g.perm.Admin = g.perm.RdTkt = g.perm.WrTkt = g.perm.Zip = |
| 979 | g.perm.RdWiki = g.perm.WrWiki = g.perm.NewWiki = |
| 980 | g.perm.ApndWiki = g.perm.Hyperlink = g.perm.Clone = |
| 981 | g.perm.NewTkt = g.perm.Password = g.perm.RdAddr = |
| 982 | g.perm.TktFmt = g.perm.Attach = g.perm.ApndTkt = 1; |
| 983 | /* Fall thru into Read/Write */ |
| 984 | case 'i': g.perm.Read = g.perm.Write = 1; break; |
| 985 | case 'o': g.perm.Read = 1; break; |
| 986 | case 'z': g.perm.Zip = 1; break; |
| 987 | |
| 988 |
| --- src/login.c | |
| +++ src/login.c | |
| @@ -977,11 +977,12 @@ | |
| 977 | case 's': g.perm.Setup = 1; /* Fall thru into Admin */ |
| 978 | case 'a': g.perm.Admin = g.perm.RdTkt = g.perm.WrTkt = g.perm.Zip = |
| 979 | g.perm.RdWiki = g.perm.WrWiki = g.perm.NewWiki = |
| 980 | g.perm.ApndWiki = g.perm.Hyperlink = g.perm.Clone = |
| 981 | g.perm.NewTkt = g.perm.Password = g.perm.RdAddr = |
| 982 | g.perm.TktFmt = g.perm.Attach = g.perm.ApndTkt = |
| 983 | g.perm.ModWiki = g.perm.ModTkt = 1; |
| 984 | /* Fall thru into Read/Write */ |
| 985 | case 'i': g.perm.Read = g.perm.Write = 1; break; |
| 986 | case 'o': g.perm.Read = 1; break; |
| 987 | case 'z': g.perm.Zip = 1; break; |
| 988 | |
| 989 |
+12
-3
| --- src/moderate.c | ||
| +++ src/moderate.c | ||
| @@ -67,10 +67,11 @@ | ||
| 67 | 67 | */ |
| 68 | 68 | void moderation_disapprove(int rid){ |
| 69 | 69 | Stmt q; |
| 70 | 70 | char *zTktid; |
| 71 | 71 | if( !moderation_pending(rid) ) return; |
| 72 | + db_begin_transaction(); | |
| 72 | 73 | if( content_is_private(rid) ){ |
| 73 | 74 | db_prepare(&q, "SELECT rid FROM delta WHERE srcid=%d", rid); |
| 74 | 75 | while( db_step(&q)==SQLITE_ROW ){ |
| 75 | 76 | int ridUser = db_column_int(&q, 0); |
| 76 | 77 | content_undelta(ridUser); |
| @@ -88,39 +89,47 @@ | ||
| 88 | 89 | if( zTktid ){ |
| 89 | 90 | ticket_rebuild_entry(zTktid); |
| 90 | 91 | fossil_free(zTktid); |
| 91 | 92 | } |
| 92 | 93 | } |
| 93 | - db_prepare(&q, "SELECT objid FROM modreq WHERE parent=%d AND " | |
| 94 | + db_prepare(&q, "SELECT objid FROM modreq WHERE parent=%d " | |
| 94 | 95 | "UNION SELECT parent FROM modreq WHERE objid=%d", |
| 95 | 96 | rid, rid); |
| 96 | 97 | while( db_step(&q)==SQLITE_ROW ){ |
| 97 | 98 | int other = db_column_int(&q, 0); |
| 98 | 99 | if( other==rid ) continue; |
| 99 | 100 | moderation_approve(other); |
| 100 | 101 | } |
| 101 | 102 | db_finalize(&q); |
| 102 | 103 | db_multi_exec("DELETE FROM modreq WHERE objid=%d", rid); |
| 104 | + db_end_transaction(0); | |
| 103 | 105 | } |
| 104 | 106 | |
| 105 | 107 | /* |
| 106 | 108 | ** Approve an object held for moderation. |
| 107 | 109 | */ |
| 108 | 110 | void moderation_approve(int rid){ |
| 109 | 111 | Stmt q; |
| 110 | 112 | if( !moderation_pending(rid) ) return; |
| 111 | - db_multi_exec("DELETE FROM private WHERE rid=%d;", rid); | |
| 112 | - db_prepare(&q, "SELECT objid FROM modreq WHERE parent=%d AND " | |
| 113 | + db_begin_transaction(); | |
| 114 | + db_multi_exec( | |
| 115 | + "DELETE FROM private WHERE rid=%d;" | |
| 116 | + "INSERT OR IGNORE INTO unclustered VALUES(%d);" | |
| 117 | + "INSERT OR IGNORE INTO unsent VALUES(%d);", | |
| 118 | + rid, rid, rid | |
| 119 | + ); | |
| 120 | + db_prepare(&q, "SELECT objid FROM modreq WHERE parent=%d " | |
| 113 | 121 | "UNION SELECT parent FROM modreq WHERE objid=%d", |
| 114 | 122 | rid, rid); |
| 115 | 123 | while( db_step(&q)==SQLITE_ROW ){ |
| 116 | 124 | int other = db_column_int(&q, 0); |
| 117 | 125 | if( other==rid ) continue; |
| 118 | 126 | moderation_approve(other); |
| 119 | 127 | } |
| 120 | 128 | db_finalize(&q); |
| 121 | 129 | db_multi_exec("DELETE FROM modreq WHERE objid=%d", rid); |
| 130 | + db_end_transaction(0); | |
| 122 | 131 | } |
| 123 | 132 | |
| 124 | 133 | /* |
| 125 | 134 | ** WEBPAGE: modreq |
| 126 | 135 | ** |
| 127 | 136 |
| --- src/moderate.c | |
| +++ src/moderate.c | |
| @@ -67,10 +67,11 @@ | |
| 67 | */ |
| 68 | void moderation_disapprove(int rid){ |
| 69 | Stmt q; |
| 70 | char *zTktid; |
| 71 | if( !moderation_pending(rid) ) return; |
| 72 | if( content_is_private(rid) ){ |
| 73 | db_prepare(&q, "SELECT rid FROM delta WHERE srcid=%d", rid); |
| 74 | while( db_step(&q)==SQLITE_ROW ){ |
| 75 | int ridUser = db_column_int(&q, 0); |
| 76 | content_undelta(ridUser); |
| @@ -88,39 +89,47 @@ | |
| 88 | if( zTktid ){ |
| 89 | ticket_rebuild_entry(zTktid); |
| 90 | fossil_free(zTktid); |
| 91 | } |
| 92 | } |
| 93 | db_prepare(&q, "SELECT objid FROM modreq WHERE parent=%d AND " |
| 94 | "UNION SELECT parent FROM modreq WHERE objid=%d", |
| 95 | rid, rid); |
| 96 | while( db_step(&q)==SQLITE_ROW ){ |
| 97 | int other = db_column_int(&q, 0); |
| 98 | if( other==rid ) continue; |
| 99 | moderation_approve(other); |
| 100 | } |
| 101 | db_finalize(&q); |
| 102 | db_multi_exec("DELETE FROM modreq WHERE objid=%d", rid); |
| 103 | } |
| 104 | |
| 105 | /* |
| 106 | ** Approve an object held for moderation. |
| 107 | */ |
| 108 | void moderation_approve(int rid){ |
| 109 | Stmt q; |
| 110 | if( !moderation_pending(rid) ) return; |
| 111 | db_multi_exec("DELETE FROM private WHERE rid=%d;", rid); |
| 112 | db_prepare(&q, "SELECT objid FROM modreq WHERE parent=%d AND " |
| 113 | "UNION SELECT parent FROM modreq WHERE objid=%d", |
| 114 | rid, rid); |
| 115 | while( db_step(&q)==SQLITE_ROW ){ |
| 116 | int other = db_column_int(&q, 0); |
| 117 | if( other==rid ) continue; |
| 118 | moderation_approve(other); |
| 119 | } |
| 120 | db_finalize(&q); |
| 121 | db_multi_exec("DELETE FROM modreq WHERE objid=%d", rid); |
| 122 | } |
| 123 | |
| 124 | /* |
| 125 | ** WEBPAGE: modreq |
| 126 | ** |
| 127 |
| --- src/moderate.c | |
| +++ src/moderate.c | |
| @@ -67,10 +67,11 @@ | |
| 67 | */ |
| 68 | void moderation_disapprove(int rid){ |
| 69 | Stmt q; |
| 70 | char *zTktid; |
| 71 | if( !moderation_pending(rid) ) return; |
| 72 | db_begin_transaction(); |
| 73 | if( content_is_private(rid) ){ |
| 74 | db_prepare(&q, "SELECT rid FROM delta WHERE srcid=%d", rid); |
| 75 | while( db_step(&q)==SQLITE_ROW ){ |
| 76 | int ridUser = db_column_int(&q, 0); |
| 77 | content_undelta(ridUser); |
| @@ -88,39 +89,47 @@ | |
| 89 | if( zTktid ){ |
| 90 | ticket_rebuild_entry(zTktid); |
| 91 | fossil_free(zTktid); |
| 92 | } |
| 93 | } |
| 94 | db_prepare(&q, "SELECT objid FROM modreq WHERE parent=%d " |
| 95 | "UNION SELECT parent FROM modreq WHERE objid=%d", |
| 96 | rid, rid); |
| 97 | while( db_step(&q)==SQLITE_ROW ){ |
| 98 | int other = db_column_int(&q, 0); |
| 99 | if( other==rid ) continue; |
| 100 | moderation_approve(other); |
| 101 | } |
| 102 | db_finalize(&q); |
| 103 | db_multi_exec("DELETE FROM modreq WHERE objid=%d", rid); |
| 104 | db_end_transaction(0); |
| 105 | } |
| 106 | |
| 107 | /* |
| 108 | ** Approve an object held for moderation. |
| 109 | */ |
| 110 | void moderation_approve(int rid){ |
| 111 | Stmt q; |
| 112 | if( !moderation_pending(rid) ) return; |
| 113 | db_begin_transaction(); |
| 114 | db_multi_exec( |
| 115 | "DELETE FROM private WHERE rid=%d;" |
| 116 | "INSERT OR IGNORE INTO unclustered VALUES(%d);" |
| 117 | "INSERT OR IGNORE INTO unsent VALUES(%d);", |
| 118 | rid, rid, rid |
| 119 | ); |
| 120 | db_prepare(&q, "SELECT objid FROM modreq WHERE parent=%d " |
| 121 | "UNION SELECT parent FROM modreq WHERE objid=%d", |
| 122 | rid, rid); |
| 123 | while( db_step(&q)==SQLITE_ROW ){ |
| 124 | int other = db_column_int(&q, 0); |
| 125 | if( other==rid ) continue; |
| 126 | moderation_approve(other); |
| 127 | } |
| 128 | db_finalize(&q); |
| 129 | db_multi_exec("DELETE FROM modreq WHERE objid=%d", rid); |
| 130 | db_end_transaction(0); |
| 131 | } |
| 132 | |
| 133 | /* |
| 134 | ** WEBPAGE: modreq |
| 135 | ** |
| 136 |
+20
-15
| --- src/wiki.c | ||
| +++ src/wiki.c | ||
| @@ -255,10 +255,27 @@ | ||
| 255 | 255 | db_finalize(&q); |
| 256 | 256 | |
| 257 | 257 | manifest_destroy(pWiki); |
| 258 | 258 | style_footer(); |
| 259 | 259 | } |
| 260 | + | |
| 261 | +/* | |
| 262 | +** Write a wiki artifact into the repository | |
| 263 | +*/ | |
| 264 | +static void wiki_put(Blob *pWiki, int parent){ | |
| 265 | + int nrid; | |
| 266 | + if( g.perm.ModWiki ){ | |
| 267 | + nrid = content_put_ex(pWiki, 0, 0, 0, 0); | |
| 268 | + if( parent) content_deltify(parent, nrid, 0); | |
| 269 | + }else{ | |
| 270 | + nrid = content_put_ex(pWiki, 0, 0, 0, 1); | |
| 271 | + moderation_table_create(); | |
| 272 | + db_multi_exec("INSERT INTO modreq(objid) VALUES(%d)", nrid); | |
| 273 | + } | |
| 274 | + db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid); | |
| 275 | + manifest_crosslink(nrid, pWiki); | |
| 276 | +} | |
| 260 | 277 | |
| 261 | 278 | /* |
| 262 | 279 | ** WEBPAGE: wikiedit |
| 263 | 280 | ** URL: /wikiedit?name=PAGENAME |
| 264 | 281 | */ |
| @@ -338,15 +355,11 @@ | ||
| 338 | 355 | } |
| 339 | 356 | blob_appendf(&wiki, "W %d\n%s\n", strlen(zBody), zBody); |
| 340 | 357 | md5sum_blob(&wiki, &cksum); |
| 341 | 358 | blob_appendf(&wiki, "Z %b\n", &cksum); |
| 342 | 359 | blob_reset(&cksum); |
| 343 | - nrid = content_put(&wiki); | |
| 344 | - db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid); | |
| 345 | - manifest_crosslink(nrid, &wiki); | |
| 346 | - assert( blob_is_reset(&wiki) ); | |
| 347 | - content_deltify(rid, nrid, 0); | |
| 360 | + wiki_put(&wiki, 0); | |
| 348 | 361 | } |
| 349 | 362 | db_end_transaction(0); |
| 350 | 363 | cgi_redirectf("wiki?name=%T", zPageName); |
| 351 | 364 | } |
| 352 | 365 | if( P("cancel")!=0 ){ |
| @@ -538,15 +551,11 @@ | ||
| 538 | 551 | appendRemark(&body); |
| 539 | 552 | blob_appendf(&wiki, "W %d\n%s\n", blob_size(&body), blob_str(&body)); |
| 540 | 553 | md5sum_blob(&wiki, &cksum); |
| 541 | 554 | blob_appendf(&wiki, "Z %b\n", &cksum); |
| 542 | 555 | blob_reset(&cksum); |
| 543 | - nrid = content_put(&wiki); | |
| 544 | - db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid); | |
| 545 | - manifest_crosslink(nrid, &wiki); | |
| 546 | - assert( blob_is_reset(&wiki) ); | |
| 547 | - content_deltify(rid, nrid, 0); | |
| 556 | + wiki_put(&wiki, rid); | |
| 548 | 557 | db_end_transaction(0); |
| 549 | 558 | } |
| 550 | 559 | cgi_redirectf("wiki?name=%T", zPageName); |
| 551 | 560 | } |
| 552 | 561 | if( P("cancel")!=0 ){ |
| @@ -881,15 +890,11 @@ | ||
| 881 | 890 | blob_str(pContent) ); |
| 882 | 891 | md5sum_blob(&wiki, &cksum); |
| 883 | 892 | blob_appendf(&wiki, "Z %b\n", &cksum); |
| 884 | 893 | blob_reset(&cksum); |
| 885 | 894 | db_begin_transaction(); |
| 886 | - nrid = content_put( &wiki); | |
| 887 | - db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid); | |
| 888 | - manifest_crosslink(nrid,&wiki); | |
| 889 | - assert( blob_is_reset(&wiki) ); | |
| 890 | - content_deltify(rid,nrid,0); | |
| 895 | + wiki_put(&wiki, 0); | |
| 891 | 896 | db_end_transaction(0); |
| 892 | 897 | return 1; |
| 893 | 898 | } |
| 894 | 899 | |
| 895 | 900 | /* |
| 896 | 901 |
| --- src/wiki.c | |
| +++ src/wiki.c | |
| @@ -255,10 +255,27 @@ | |
| 255 | db_finalize(&q); |
| 256 | |
| 257 | manifest_destroy(pWiki); |
| 258 | style_footer(); |
| 259 | } |
| 260 | |
| 261 | /* |
| 262 | ** WEBPAGE: wikiedit |
| 263 | ** URL: /wikiedit?name=PAGENAME |
| 264 | */ |
| @@ -338,15 +355,11 @@ | |
| 338 | } |
| 339 | blob_appendf(&wiki, "W %d\n%s\n", strlen(zBody), zBody); |
| 340 | md5sum_blob(&wiki, &cksum); |
| 341 | blob_appendf(&wiki, "Z %b\n", &cksum); |
| 342 | blob_reset(&cksum); |
| 343 | nrid = content_put(&wiki); |
| 344 | db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid); |
| 345 | manifest_crosslink(nrid, &wiki); |
| 346 | assert( blob_is_reset(&wiki) ); |
| 347 | content_deltify(rid, nrid, 0); |
| 348 | } |
| 349 | db_end_transaction(0); |
| 350 | cgi_redirectf("wiki?name=%T", zPageName); |
| 351 | } |
| 352 | if( P("cancel")!=0 ){ |
| @@ -538,15 +551,11 @@ | |
| 538 | appendRemark(&body); |
| 539 | blob_appendf(&wiki, "W %d\n%s\n", blob_size(&body), blob_str(&body)); |
| 540 | md5sum_blob(&wiki, &cksum); |
| 541 | blob_appendf(&wiki, "Z %b\n", &cksum); |
| 542 | blob_reset(&cksum); |
| 543 | nrid = content_put(&wiki); |
| 544 | db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid); |
| 545 | manifest_crosslink(nrid, &wiki); |
| 546 | assert( blob_is_reset(&wiki) ); |
| 547 | content_deltify(rid, nrid, 0); |
| 548 | db_end_transaction(0); |
| 549 | } |
| 550 | cgi_redirectf("wiki?name=%T", zPageName); |
| 551 | } |
| 552 | if( P("cancel")!=0 ){ |
| @@ -881,15 +890,11 @@ | |
| 881 | blob_str(pContent) ); |
| 882 | md5sum_blob(&wiki, &cksum); |
| 883 | blob_appendf(&wiki, "Z %b\n", &cksum); |
| 884 | blob_reset(&cksum); |
| 885 | db_begin_transaction(); |
| 886 | nrid = content_put( &wiki); |
| 887 | db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid); |
| 888 | manifest_crosslink(nrid,&wiki); |
| 889 | assert( blob_is_reset(&wiki) ); |
| 890 | content_deltify(rid,nrid,0); |
| 891 | db_end_transaction(0); |
| 892 | return 1; |
| 893 | } |
| 894 | |
| 895 | /* |
| 896 |
| --- src/wiki.c | |
| +++ src/wiki.c | |
| @@ -255,10 +255,27 @@ | |
| 255 | db_finalize(&q); |
| 256 | |
| 257 | manifest_destroy(pWiki); |
| 258 | style_footer(); |
| 259 | } |
| 260 | |
| 261 | /* |
| 262 | ** Write a wiki artifact into the repository |
| 263 | */ |
| 264 | static void wiki_put(Blob *pWiki, int parent){ |
| 265 | int nrid; |
| 266 | if( g.perm.ModWiki ){ |
| 267 | nrid = content_put_ex(pWiki, 0, 0, 0, 0); |
| 268 | if( parent) content_deltify(parent, nrid, 0); |
| 269 | }else{ |
| 270 | nrid = content_put_ex(pWiki, 0, 0, 0, 1); |
| 271 | moderation_table_create(); |
| 272 | db_multi_exec("INSERT INTO modreq(objid) VALUES(%d)", nrid); |
| 273 | } |
| 274 | db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid); |
| 275 | manifest_crosslink(nrid, pWiki); |
| 276 | } |
| 277 | |
| 278 | /* |
| 279 | ** WEBPAGE: wikiedit |
| 280 | ** URL: /wikiedit?name=PAGENAME |
| 281 | */ |
| @@ -338,15 +355,11 @@ | |
| 355 | } |
| 356 | blob_appendf(&wiki, "W %d\n%s\n", strlen(zBody), zBody); |
| 357 | md5sum_blob(&wiki, &cksum); |
| 358 | blob_appendf(&wiki, "Z %b\n", &cksum); |
| 359 | blob_reset(&cksum); |
| 360 | wiki_put(&wiki, 0); |
| 361 | } |
| 362 | db_end_transaction(0); |
| 363 | cgi_redirectf("wiki?name=%T", zPageName); |
| 364 | } |
| 365 | if( P("cancel")!=0 ){ |
| @@ -538,15 +551,11 @@ | |
| 551 | appendRemark(&body); |
| 552 | blob_appendf(&wiki, "W %d\n%s\n", blob_size(&body), blob_str(&body)); |
| 553 | md5sum_blob(&wiki, &cksum); |
| 554 | blob_appendf(&wiki, "Z %b\n", &cksum); |
| 555 | blob_reset(&cksum); |
| 556 | wiki_put(&wiki, rid); |
| 557 | db_end_transaction(0); |
| 558 | } |
| 559 | cgi_redirectf("wiki?name=%T", zPageName); |
| 560 | } |
| 561 | if( P("cancel")!=0 ){ |
| @@ -881,15 +890,11 @@ | |
| 890 | blob_str(pContent) ); |
| 891 | md5sum_blob(&wiki, &cksum); |
| 892 | blob_appendf(&wiki, "Z %b\n", &cksum); |
| 893 | blob_reset(&cksum); |
| 894 | db_begin_transaction(); |
| 895 | wiki_put(&wiki, 0); |
| 896 | db_end_transaction(0); |
| 897 | return 1; |
| 898 | } |
| 899 | |
| 900 | /* |
| 901 |