Fossil SCM

Improvements to on-line subscription management.

drh 2018-06-22 19:48 email-alerts
Commit e649820ba1fdb2d1f69643f7a9df142f8eeb7a9ddce32c7d1578483837273ef8
1 file changed +69 -29
+69 -29
--- src/email.c
+++ src/email.c
@@ -131,18 +131,25 @@
131131
int email_enabled(void){
132132
if( !db_table_exists("repository", "subscriber") ) return 0;
133133
if( fossil_strcmp(db_get("email-send-method","off"),"off")==0 ) return 0;
134134
return 1;
135135
}
136
+
137
+
136138
137139
/*
138140
** Insert a "Subscriber List" submenu link if the current user
139141
** is an administrator.
140142
*/
141
-void email_subscriber_list_link(void){
143
+void email_submenu_common(void){
142144
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
+ }
144151
}
145152
}
146153
147154
148155
/*
@@ -162,11 +169,11 @@
162169
login_needed(0);
163170
return;
164171
}
165172
db_begin_transaction();
166173
167
- email_subscriber_list_link();
174
+ email_submenu_common();
168175
style_header("Email Notification Setup");
169176
@ <form action="%R/setup_email" method="post"><div>
170177
@ <input type="submit" name="submit" value="Apply Changes" /><hr>
171178
login_insert_csrf_secret();
172179
@@ -752,15 +759,26 @@
752759
if( login_is_individual()
753760
&& db_exists("SELECT 1 FROM subscriber WHERE suname=%Q",g.zLogin)
754761
){
755762
/* This person is already signed up for email alerts. Jump
756763
** 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.
757766
*/
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
+ }
760778
}
761
- email_subscriber_list_link();
779
+ email_submenu_common();
762780
needCaptcha = !login_is_individual();
763781
if( P("submit")
764782
&& cgi_csrf_safe(1)
765783
&& subscribe_error_check(&eErr,&zErr,needCaptcha)
766784
){
@@ -768,10 +786,13 @@
768786
char ssub[20];
769787
const char *zEAddr = P("e");
770788
sqlite3_int64 id; /* New subscriber Id */
771789
const char *zCode; /* New subscriber code (in hex) */
772790
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;
773794
if( PB("sa") ) ssub[nsub++] = 'a';
774795
if( PB("sc") ) ssub[nsub++] = 'c';
775796
if( PB("st") ) ssub[nsub++] = 't';
776797
if( PB("sw") ) ssub[nsub++] = 'w';
777798
ssub[nsub] = 0;
@@ -779,11 +800,11 @@
779800
"INSERT INTO subscriber(subscriberCode,semail,suname,"
780801
" sverified,sdonotcall,sdigest,ssub,sctime,smtime,smip)"
781802
"VALUES(randomblob(32),%Q,%Q,%d,0,%d,%Q,"
782803
" julianday('now'),julianday('now'),%Q)",
783804
/* semail */ zEAddr,
784
- /* suname */ needCaptcha==0 ? g.zLogin : 0,
805
+ /* suname */ suname,
785806
/* sverified */ needCaptcha==0,
786807
/* sdigest */ PB("di"),
787808
/* ssub */ ssub,
788809
/* smip */ g.zIpAddr
789810
);
@@ -954,42 +975,59 @@
954975
}
955976
if( zName==0 || !validate16(zName, -1) ){
956977
cgi_redirect("subscribe");
957978
return;
958979
}
959
- email_subscriber_list_link();
980
+ email_submenu_common();
960981
if( P("submit")!=0 && cgi_csrf_safe(1) ){
961982
int sdonotcall = PB("sdonotcall");
962983
int sdigest = PB("sdigest");
963984
char ssub[10];
964985
int nsub = 0;
965
- const char *suname = 0;
966986
if( PB("sa") ) ssub[nsub++] = 'a';
967987
if( PB("sc") ) ssub[nsub++] = 'c';
968988
if( PB("st") ) ssub[nsub++] = 't';
969989
if( PB("sw") ) ssub[nsub++] = 'w';
970990
ssub[nsub] = 0;
971991
if( g.perm.Admin ){
972
- suname = PT("suname");
992
+ const char *suname = PT("suname");
973993
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
+ }
9911029
}
9921030
if( P("delete")!=0 && cgi_csrf_safe(1) ){
9931031
if( !PB("dodelete") ){
9941032
eErr = 9;
9951033
zErr = mprintf("Select this checkbox and press \"Unsubscribe\" to"
@@ -1049,12 +1087,13 @@
10491087
@ <tr>
10501088
@ <td class='form_label'>IP Address:</td>
10511089
@ <td>%h(smip)</td>
10521090
@ </tr>
10531091
@ <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>
10561095
@ </tr>
10571096
}
10581097
@ <tr>
10591098
@ <td class="form_label">Options:</td>
10601099
@ <td><label><input type="checkbox" name="sa" %s(sa?"checked":"")>\
@@ -1248,10 +1287,11 @@
12481287
login_check_credentials();
12491288
if( !g.perm.Admin ){
12501289
fossil_redirect_home();
12511290
return;
12521291
}
1292
+ email_submenu_common();
12531293
style_header("Subscriber List");
12541294
blob_init(&sql, 0, 0);
12551295
blob_append_sql(&sql,
12561296
"SELECT hex(subscriberCode),"
12571297
" semail,"
12581298
--- 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

Keyboard Shortcuts

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