Fossil SCM
Improvements to on-line subscription management.
Commit
e649820ba1fdb2d1f69643f7a9df142f8eeb7a9ddce32c7d1578483837273ef8
Parent
ba60f8744c69d61…
1 file changed
+69
-29
+69
-29
| --- src/email.c | ||
| +++ src/email.c | ||
| @@ -131,18 +131,25 @@ | ||
| 131 | 131 | int email_enabled(void){ |
| 132 | 132 | if( !db_table_exists("repository", "subscriber") ) return 0; |
| 133 | 133 | if( fossil_strcmp(db_get("email-send-method","off"),"off")==0 ) return 0; |
| 134 | 134 | return 1; |
| 135 | 135 | } |
| 136 | + | |
| 137 | + | |
| 136 | 138 | |
| 137 | 139 | /* |
| 138 | 140 | ** Insert a "Subscriber List" submenu link if the current user |
| 139 | 141 | ** is an administrator. |
| 140 | 142 | */ |
| 141 | -void email_subscriber_list_link(void){ | |
| 143 | +void email_submenu_common(void){ | |
| 142 | 144 | if( g.perm.Admin ){ |
| 143 | - style_submenu_element("Subscriber List","%R/subscribers"); | |
| 145 | + if( fossil_strcmp(g.zPath,"subscribers") ){ | |
| 146 | + style_submenu_element("List Subscribers","%R/subscribers"); | |
| 147 | + } | |
| 148 | + if( fossil_strcmp(g.zPath,"subscribe") ){ | |
| 149 | + style_submenu_element("Add New Subscriber","%R/subscribe"); | |
| 150 | + } | |
| 144 | 151 | } |
| 145 | 152 | } |
| 146 | 153 | |
| 147 | 154 | |
| 148 | 155 | /* |
| @@ -162,11 +169,11 @@ | ||
| 162 | 169 | login_needed(0); |
| 163 | 170 | return; |
| 164 | 171 | } |
| 165 | 172 | db_begin_transaction(); |
| 166 | 173 | |
| 167 | - email_subscriber_list_link(); | |
| 174 | + email_submenu_common(); | |
| 168 | 175 | style_header("Email Notification Setup"); |
| 169 | 176 | @ <form action="%R/setup_email" method="post"><div> |
| 170 | 177 | @ <input type="submit" name="submit" value="Apply Changes" /><hr> |
| 171 | 178 | login_insert_csrf_secret(); |
| 172 | 179 | |
| @@ -752,15 +759,26 @@ | ||
| 752 | 759 | if( login_is_individual() |
| 753 | 760 | && db_exists("SELECT 1 FROM subscriber WHERE suname=%Q",g.zLogin) |
| 754 | 761 | ){ |
| 755 | 762 | /* This person is already signed up for email alerts. Jump |
| 756 | 763 | ** to the screen that lets them edit their alert preferences. |
| 764 | + ** Except, administrators can create subscriptions for others so | |
| 765 | + ** do not jump for them. | |
| 757 | 766 | */ |
| 758 | - cgi_redirectf("%R/alerts"); | |
| 759 | - return; | |
| 767 | + if( g.perm.Admin ){ | |
| 768 | + /* Admins get a link to admin their own account, but they | |
| 769 | + ** stay on this page so that they can create subscriptions | |
| 770 | + ** for other people. */ | |
| 771 | + style_submenu_element("My Subscription","%R/alerts"); | |
| 772 | + }else{ | |
| 773 | + /* Everybody else jumps to the page to administer their own | |
| 774 | + ** account only. */ | |
| 775 | + cgi_redirectf("%R/alerts"); | |
| 776 | + return; | |
| 777 | + } | |
| 760 | 778 | } |
| 761 | - email_subscriber_list_link(); | |
| 779 | + email_submenu_common(); | |
| 762 | 780 | needCaptcha = !login_is_individual(); |
| 763 | 781 | if( P("submit") |
| 764 | 782 | && cgi_csrf_safe(1) |
| 765 | 783 | && subscribe_error_check(&eErr,&zErr,needCaptcha) |
| 766 | 784 | ){ |
| @@ -768,10 +786,13 @@ | ||
| 768 | 786 | char ssub[20]; |
| 769 | 787 | const char *zEAddr = P("e"); |
| 770 | 788 | sqlite3_int64 id; /* New subscriber Id */ |
| 771 | 789 | const char *zCode; /* New subscriber code (in hex) */ |
| 772 | 790 | int nsub = 0; |
| 791 | + const char *suname = PT("suname"); | |
| 792 | + if( suname==0 && needCaptcha==0 && !g.perm.Admin ) suname = g.zLogin; | |
| 793 | + if( suname && suname[0]==0 ) suname = 0; | |
| 773 | 794 | if( PB("sa") ) ssub[nsub++] = 'a'; |
| 774 | 795 | if( PB("sc") ) ssub[nsub++] = 'c'; |
| 775 | 796 | if( PB("st") ) ssub[nsub++] = 't'; |
| 776 | 797 | if( PB("sw") ) ssub[nsub++] = 'w'; |
| 777 | 798 | ssub[nsub] = 0; |
| @@ -779,11 +800,11 @@ | ||
| 779 | 800 | "INSERT INTO subscriber(subscriberCode,semail,suname," |
| 780 | 801 | " sverified,sdonotcall,sdigest,ssub,sctime,smtime,smip)" |
| 781 | 802 | "VALUES(randomblob(32),%Q,%Q,%d,0,%d,%Q," |
| 782 | 803 | " julianday('now'),julianday('now'),%Q)", |
| 783 | 804 | /* semail */ zEAddr, |
| 784 | - /* suname */ needCaptcha==0 ? g.zLogin : 0, | |
| 805 | + /* suname */ suname, | |
| 785 | 806 | /* sverified */ needCaptcha==0, |
| 786 | 807 | /* sdigest */ PB("di"), |
| 787 | 808 | /* ssub */ ssub, |
| 788 | 809 | /* smip */ g.zIpAddr |
| 789 | 810 | ); |
| @@ -954,42 +975,59 @@ | ||
| 954 | 975 | } |
| 955 | 976 | if( zName==0 || !validate16(zName, -1) ){ |
| 956 | 977 | cgi_redirect("subscribe"); |
| 957 | 978 | return; |
| 958 | 979 | } |
| 959 | - email_subscriber_list_link(); | |
| 980 | + email_submenu_common(); | |
| 960 | 981 | if( P("submit")!=0 && cgi_csrf_safe(1) ){ |
| 961 | 982 | int sdonotcall = PB("sdonotcall"); |
| 962 | 983 | int sdigest = PB("sdigest"); |
| 963 | 984 | char ssub[10]; |
| 964 | 985 | int nsub = 0; |
| 965 | - const char *suname = 0; | |
| 966 | 986 | if( PB("sa") ) ssub[nsub++] = 'a'; |
| 967 | 987 | if( PB("sc") ) ssub[nsub++] = 'c'; |
| 968 | 988 | if( PB("st") ) ssub[nsub++] = 't'; |
| 969 | 989 | if( PB("sw") ) ssub[nsub++] = 'w'; |
| 970 | 990 | ssub[nsub] = 0; |
| 971 | 991 | if( g.perm.Admin ){ |
| 972 | - suname = PT("suname"); | |
| 992 | + const char *suname = PT("suname"); | |
| 973 | 993 | if( suname && suname[0]==0 ) suname = 0; |
| 974 | - } | |
| 975 | - db_multi_exec( | |
| 976 | - "UPDATE subscriber SET" | |
| 977 | - " sdonotcall=%d," | |
| 978 | - " sdigest=%d," | |
| 979 | - " ssub=%Q," | |
| 980 | - " smtime=julianday('now')," | |
| 981 | - " smip=%Q," | |
| 982 | - " suname=COALESCE(%Q,suname)" | |
| 983 | - " WHERE subscriberCode=hextoblob(%Q)", | |
| 984 | - sdonotcall, | |
| 985 | - sdigest, | |
| 986 | - ssub, | |
| 987 | - g.zIpAddr, | |
| 988 | - suname, | |
| 989 | - zName | |
| 990 | - ); | |
| 994 | + int sverified = PB("sverified"); | |
| 995 | + db_multi_exec( | |
| 996 | + "UPDATE subscriber SET" | |
| 997 | + " sdonotcall=%d," | |
| 998 | + " sdigest=%d," | |
| 999 | + " ssub=%Q," | |
| 1000 | + " smtime=julianday('now')," | |
| 1001 | + " smip=%Q," | |
| 1002 | + " suname=%Q," | |
| 1003 | + " sverified=%d" | |
| 1004 | + " WHERE subscriberCode=hextoblob(%Q)", | |
| 1005 | + sdonotcall, | |
| 1006 | + sdigest, | |
| 1007 | + ssub, | |
| 1008 | + g.zIpAddr, | |
| 1009 | + suname, | |
| 1010 | + sverified, | |
| 1011 | + zName | |
| 1012 | + ); | |
| 1013 | + }else{ | |
| 1014 | + db_multi_exec( | |
| 1015 | + "UPDATE subscriber SET" | |
| 1016 | + " sdonotcall=%d," | |
| 1017 | + " sdigest=%d," | |
| 1018 | + " ssub=%Q," | |
| 1019 | + " smtime=julianday('now')," | |
| 1020 | + " smip=%Q," | |
| 1021 | + " WHERE subscriberCode=hextoblob(%Q)", | |
| 1022 | + sdonotcall, | |
| 1023 | + sdigest, | |
| 1024 | + ssub, | |
| 1025 | + g.zIpAddr, | |
| 1026 | + zName | |
| 1027 | + ); | |
| 1028 | + } | |
| 991 | 1029 | } |
| 992 | 1030 | if( P("delete")!=0 && cgi_csrf_safe(1) ){ |
| 993 | 1031 | if( !PB("dodelete") ){ |
| 994 | 1032 | eErr = 9; |
| 995 | 1033 | zErr = mprintf("Select this checkbox and press \"Unsubscribe\" to" |
| @@ -1049,12 +1087,13 @@ | ||
| 1049 | 1087 | @ <tr> |
| 1050 | 1088 | @ <td class='form_label'>IP Address:</td> |
| 1051 | 1089 | @ <td>%h(smip)</td> |
| 1052 | 1090 | @ </tr> |
| 1053 | 1091 | @ <tr> |
| 1054 | - @ <td class='form_label'>User:</td> | |
| 1055 | - @ <td>%h(suname?suname:"")</td> | |
| 1092 | + @ <td class="form_label">User:</td> | |
| 1093 | + @ <td><input type="text" name="suname" value="%h(suname?suname:"")" \ | |
| 1094 | + @ size="30"></td> | |
| 1056 | 1095 | @ </tr> |
| 1057 | 1096 | } |
| 1058 | 1097 | @ <tr> |
| 1059 | 1098 | @ <td class="form_label">Options:</td> |
| 1060 | 1099 | @ <td><label><input type="checkbox" name="sa" %s(sa?"checked":"")>\ |
| @@ -1248,10 +1287,11 @@ | ||
| 1248 | 1287 | login_check_credentials(); |
| 1249 | 1288 | if( !g.perm.Admin ){ |
| 1250 | 1289 | fossil_redirect_home(); |
| 1251 | 1290 | return; |
| 1252 | 1291 | } |
| 1292 | + email_submenu_common(); | |
| 1253 | 1293 | style_header("Subscriber List"); |
| 1254 | 1294 | blob_init(&sql, 0, 0); |
| 1255 | 1295 | blob_append_sql(&sql, |
| 1256 | 1296 | "SELECT hex(subscriberCode)," |
| 1257 | 1297 | " semail," |
| 1258 | 1298 |
| --- src/email.c | |
| +++ src/email.c | |
| @@ -131,18 +131,25 @@ | |
| 131 | int email_enabled(void){ |
| 132 | if( !db_table_exists("repository", "subscriber") ) return 0; |
| 133 | if( fossil_strcmp(db_get("email-send-method","off"),"off")==0 ) return 0; |
| 134 | return 1; |
| 135 | } |
| 136 | |
| 137 | /* |
| 138 | ** Insert a "Subscriber List" submenu link if the current user |
| 139 | ** is an administrator. |
| 140 | */ |
| 141 | void email_subscriber_list_link(void){ |
| 142 | if( g.perm.Admin ){ |
| 143 | style_submenu_element("Subscriber List","%R/subscribers"); |
| 144 | } |
| 145 | } |
| 146 | |
| 147 | |
| 148 | /* |
| @@ -162,11 +169,11 @@ | |
| 162 | login_needed(0); |
| 163 | return; |
| 164 | } |
| 165 | db_begin_transaction(); |
| 166 | |
| 167 | email_subscriber_list_link(); |
| 168 | style_header("Email Notification Setup"); |
| 169 | @ <form action="%R/setup_email" method="post"><div> |
| 170 | @ <input type="submit" name="submit" value="Apply Changes" /><hr> |
| 171 | login_insert_csrf_secret(); |
| 172 | |
| @@ -752,15 +759,26 @@ | |
| 752 | if( login_is_individual() |
| 753 | && db_exists("SELECT 1 FROM subscriber WHERE suname=%Q",g.zLogin) |
| 754 | ){ |
| 755 | /* This person is already signed up for email alerts. Jump |
| 756 | ** to the screen that lets them edit their alert preferences. |
| 757 | */ |
| 758 | cgi_redirectf("%R/alerts"); |
| 759 | return; |
| 760 | } |
| 761 | email_subscriber_list_link(); |
| 762 | needCaptcha = !login_is_individual(); |
| 763 | if( P("submit") |
| 764 | && cgi_csrf_safe(1) |
| 765 | && subscribe_error_check(&eErr,&zErr,needCaptcha) |
| 766 | ){ |
| @@ -768,10 +786,13 @@ | |
| 768 | char ssub[20]; |
| 769 | const char *zEAddr = P("e"); |
| 770 | sqlite3_int64 id; /* New subscriber Id */ |
| 771 | const char *zCode; /* New subscriber code (in hex) */ |
| 772 | int nsub = 0; |
| 773 | if( PB("sa") ) ssub[nsub++] = 'a'; |
| 774 | if( PB("sc") ) ssub[nsub++] = 'c'; |
| 775 | if( PB("st") ) ssub[nsub++] = 't'; |
| 776 | if( PB("sw") ) ssub[nsub++] = 'w'; |
| 777 | ssub[nsub] = 0; |
| @@ -779,11 +800,11 @@ | |
| 779 | "INSERT INTO subscriber(subscriberCode,semail,suname," |
| 780 | " sverified,sdonotcall,sdigest,ssub,sctime,smtime,smip)" |
| 781 | "VALUES(randomblob(32),%Q,%Q,%d,0,%d,%Q," |
| 782 | " julianday('now'),julianday('now'),%Q)", |
| 783 | /* semail */ zEAddr, |
| 784 | /* suname */ needCaptcha==0 ? g.zLogin : 0, |
| 785 | /* sverified */ needCaptcha==0, |
| 786 | /* sdigest */ PB("di"), |
| 787 | /* ssub */ ssub, |
| 788 | /* smip */ g.zIpAddr |
| 789 | ); |
| @@ -954,42 +975,59 @@ | |
| 954 | } |
| 955 | if( zName==0 || !validate16(zName, -1) ){ |
| 956 | cgi_redirect("subscribe"); |
| 957 | return; |
| 958 | } |
| 959 | email_subscriber_list_link(); |
| 960 | if( P("submit")!=0 && cgi_csrf_safe(1) ){ |
| 961 | int sdonotcall = PB("sdonotcall"); |
| 962 | int sdigest = PB("sdigest"); |
| 963 | char ssub[10]; |
| 964 | int nsub = 0; |
| 965 | const char *suname = 0; |
| 966 | if( PB("sa") ) ssub[nsub++] = 'a'; |
| 967 | if( PB("sc") ) ssub[nsub++] = 'c'; |
| 968 | if( PB("st") ) ssub[nsub++] = 't'; |
| 969 | if( PB("sw") ) ssub[nsub++] = 'w'; |
| 970 | ssub[nsub] = 0; |
| 971 | if( g.perm.Admin ){ |
| 972 | suname = PT("suname"); |
| 973 | if( suname && suname[0]==0 ) suname = 0; |
| 974 | } |
| 975 | db_multi_exec( |
| 976 | "UPDATE subscriber SET" |
| 977 | " sdonotcall=%d," |
| 978 | " sdigest=%d," |
| 979 | " ssub=%Q," |
| 980 | " smtime=julianday('now')," |
| 981 | " smip=%Q," |
| 982 | " suname=COALESCE(%Q,suname)" |
| 983 | " WHERE subscriberCode=hextoblob(%Q)", |
| 984 | sdonotcall, |
| 985 | sdigest, |
| 986 | ssub, |
| 987 | g.zIpAddr, |
| 988 | suname, |
| 989 | zName |
| 990 | ); |
| 991 | } |
| 992 | if( P("delete")!=0 && cgi_csrf_safe(1) ){ |
| 993 | if( !PB("dodelete") ){ |
| 994 | eErr = 9; |
| 995 | zErr = mprintf("Select this checkbox and press \"Unsubscribe\" to" |
| @@ -1049,12 +1087,13 @@ | |
| 1049 | @ <tr> |
| 1050 | @ <td class='form_label'>IP Address:</td> |
| 1051 | @ <td>%h(smip)</td> |
| 1052 | @ </tr> |
| 1053 | @ <tr> |
| 1054 | @ <td class='form_label'>User:</td> |
| 1055 | @ <td>%h(suname?suname:"")</td> |
| 1056 | @ </tr> |
| 1057 | } |
| 1058 | @ <tr> |
| 1059 | @ <td class="form_label">Options:</td> |
| 1060 | @ <td><label><input type="checkbox" name="sa" %s(sa?"checked":"")>\ |
| @@ -1248,10 +1287,11 @@ | |
| 1248 | login_check_credentials(); |
| 1249 | if( !g.perm.Admin ){ |
| 1250 | fossil_redirect_home(); |
| 1251 | return; |
| 1252 | } |
| 1253 | style_header("Subscriber List"); |
| 1254 | blob_init(&sql, 0, 0); |
| 1255 | blob_append_sql(&sql, |
| 1256 | "SELECT hex(subscriberCode)," |
| 1257 | " semail," |
| 1258 |
| --- src/email.c | |
| +++ src/email.c | |
| @@ -131,18 +131,25 @@ | |
| 131 | int email_enabled(void){ |
| 132 | if( !db_table_exists("repository", "subscriber") ) return 0; |
| 133 | if( fossil_strcmp(db_get("email-send-method","off"),"off")==0 ) return 0; |
| 134 | return 1; |
| 135 | } |
| 136 | |
| 137 | |
| 138 | |
| 139 | /* |
| 140 | ** Insert a "Subscriber List" submenu link if the current user |
| 141 | ** is an administrator. |
| 142 | */ |
| 143 | void email_submenu_common(void){ |
| 144 | if( g.perm.Admin ){ |
| 145 | if( fossil_strcmp(g.zPath,"subscribers") ){ |
| 146 | style_submenu_element("List Subscribers","%R/subscribers"); |
| 147 | } |
| 148 | if( fossil_strcmp(g.zPath,"subscribe") ){ |
| 149 | style_submenu_element("Add New Subscriber","%R/subscribe"); |
| 150 | } |
| 151 | } |
| 152 | } |
| 153 | |
| 154 | |
| 155 | /* |
| @@ -162,11 +169,11 @@ | |
| 169 | login_needed(0); |
| 170 | return; |
| 171 | } |
| 172 | db_begin_transaction(); |
| 173 | |
| 174 | email_submenu_common(); |
| 175 | style_header("Email Notification Setup"); |
| 176 | @ <form action="%R/setup_email" method="post"><div> |
| 177 | @ <input type="submit" name="submit" value="Apply Changes" /><hr> |
| 178 | login_insert_csrf_secret(); |
| 179 | |
| @@ -752,15 +759,26 @@ | |
| 759 | if( login_is_individual() |
| 760 | && db_exists("SELECT 1 FROM subscriber WHERE suname=%Q",g.zLogin) |
| 761 | ){ |
| 762 | /* This person is already signed up for email alerts. Jump |
| 763 | ** to the screen that lets them edit their alert preferences. |
| 764 | ** Except, administrators can create subscriptions for others so |
| 765 | ** do not jump for them. |
| 766 | */ |
| 767 | if( g.perm.Admin ){ |
| 768 | /* Admins get a link to admin their own account, but they |
| 769 | ** stay on this page so that they can create subscriptions |
| 770 | ** for other people. */ |
| 771 | style_submenu_element("My Subscription","%R/alerts"); |
| 772 | }else{ |
| 773 | /* Everybody else jumps to the page to administer their own |
| 774 | ** account only. */ |
| 775 | cgi_redirectf("%R/alerts"); |
| 776 | return; |
| 777 | } |
| 778 | } |
| 779 | email_submenu_common(); |
| 780 | needCaptcha = !login_is_individual(); |
| 781 | if( P("submit") |
| 782 | && cgi_csrf_safe(1) |
| 783 | && subscribe_error_check(&eErr,&zErr,needCaptcha) |
| 784 | ){ |
| @@ -768,10 +786,13 @@ | |
| 786 | char ssub[20]; |
| 787 | const char *zEAddr = P("e"); |
| 788 | sqlite3_int64 id; /* New subscriber Id */ |
| 789 | const char *zCode; /* New subscriber code (in hex) */ |
| 790 | int nsub = 0; |
| 791 | const char *suname = PT("suname"); |
| 792 | if( suname==0 && needCaptcha==0 && !g.perm.Admin ) suname = g.zLogin; |
| 793 | if( suname && suname[0]==0 ) suname = 0; |
| 794 | if( PB("sa") ) ssub[nsub++] = 'a'; |
| 795 | if( PB("sc") ) ssub[nsub++] = 'c'; |
| 796 | if( PB("st") ) ssub[nsub++] = 't'; |
| 797 | if( PB("sw") ) ssub[nsub++] = 'w'; |
| 798 | ssub[nsub] = 0; |
| @@ -779,11 +800,11 @@ | |
| 800 | "INSERT INTO subscriber(subscriberCode,semail,suname," |
| 801 | " sverified,sdonotcall,sdigest,ssub,sctime,smtime,smip)" |
| 802 | "VALUES(randomblob(32),%Q,%Q,%d,0,%d,%Q," |
| 803 | " julianday('now'),julianday('now'),%Q)", |
| 804 | /* semail */ zEAddr, |
| 805 | /* suname */ suname, |
| 806 | /* sverified */ needCaptcha==0, |
| 807 | /* sdigest */ PB("di"), |
| 808 | /* ssub */ ssub, |
| 809 | /* smip */ g.zIpAddr |
| 810 | ); |
| @@ -954,42 +975,59 @@ | |
| 975 | } |
| 976 | if( zName==0 || !validate16(zName, -1) ){ |
| 977 | cgi_redirect("subscribe"); |
| 978 | return; |
| 979 | } |
| 980 | email_submenu_common(); |
| 981 | if( P("submit")!=0 && cgi_csrf_safe(1) ){ |
| 982 | int sdonotcall = PB("sdonotcall"); |
| 983 | int sdigest = PB("sdigest"); |
| 984 | char ssub[10]; |
| 985 | int nsub = 0; |
| 986 | if( PB("sa") ) ssub[nsub++] = 'a'; |
| 987 | if( PB("sc") ) ssub[nsub++] = 'c'; |
| 988 | if( PB("st") ) ssub[nsub++] = 't'; |
| 989 | if( PB("sw") ) ssub[nsub++] = 'w'; |
| 990 | ssub[nsub] = 0; |
| 991 | if( g.perm.Admin ){ |
| 992 | const char *suname = PT("suname"); |
| 993 | if( suname && suname[0]==0 ) suname = 0; |
| 994 | int sverified = PB("sverified"); |
| 995 | db_multi_exec( |
| 996 | "UPDATE subscriber SET" |
| 997 | " sdonotcall=%d," |
| 998 | " sdigest=%d," |
| 999 | " ssub=%Q," |
| 1000 | " smtime=julianday('now')," |
| 1001 | " smip=%Q," |
| 1002 | " suname=%Q," |
| 1003 | " sverified=%d" |
| 1004 | " WHERE subscriberCode=hextoblob(%Q)", |
| 1005 | sdonotcall, |
| 1006 | sdigest, |
| 1007 | ssub, |
| 1008 | g.zIpAddr, |
| 1009 | suname, |
| 1010 | sverified, |
| 1011 | zName |
| 1012 | ); |
| 1013 | }else{ |
| 1014 | db_multi_exec( |
| 1015 | "UPDATE subscriber SET" |
| 1016 | " sdonotcall=%d," |
| 1017 | " sdigest=%d," |
| 1018 | " ssub=%Q," |
| 1019 | " smtime=julianday('now')," |
| 1020 | " smip=%Q," |
| 1021 | " WHERE subscriberCode=hextoblob(%Q)", |
| 1022 | sdonotcall, |
| 1023 | sdigest, |
| 1024 | ssub, |
| 1025 | g.zIpAddr, |
| 1026 | zName |
| 1027 | ); |
| 1028 | } |
| 1029 | } |
| 1030 | if( P("delete")!=0 && cgi_csrf_safe(1) ){ |
| 1031 | if( !PB("dodelete") ){ |
| 1032 | eErr = 9; |
| 1033 | zErr = mprintf("Select this checkbox and press \"Unsubscribe\" to" |
| @@ -1049,12 +1087,13 @@ | |
| 1087 | @ <tr> |
| 1088 | @ <td class='form_label'>IP Address:</td> |
| 1089 | @ <td>%h(smip)</td> |
| 1090 | @ </tr> |
| 1091 | @ <tr> |
| 1092 | @ <td class="form_label">User:</td> |
| 1093 | @ <td><input type="text" name="suname" value="%h(suname?suname:"")" \ |
| 1094 | @ size="30"></td> |
| 1095 | @ </tr> |
| 1096 | } |
| 1097 | @ <tr> |
| 1098 | @ <td class="form_label">Options:</td> |
| 1099 | @ <td><label><input type="checkbox" name="sa" %s(sa?"checked":"")>\ |
| @@ -1248,10 +1287,11 @@ | |
| 1287 | login_check_credentials(); |
| 1288 | if( !g.perm.Admin ){ |
| 1289 | fossil_redirect_home(); |
| 1290 | return; |
| 1291 | } |
| 1292 | email_submenu_common(); |
| 1293 | style_header("Subscriber List"); |
| 1294 | blob_init(&sql, 0, 0); |
| 1295 | blob_append_sql(&sql, |
| 1296 | "SELECT hex(subscriberCode)," |
| 1297 | " semail," |
| 1298 |