Fossil SCM
Add the email address editing to the subscriber information screen (/alerts). Improved cross-linking between subscriber and user editing screens for administrators.
Commit
54a6f098ec4e41c2bbf4d6daf1be4de861190206c763491fba00c20a6f083cb1
Parent
77a7078f74bc74a…
2 files changed
+57
-45
+17
-3
+57
-45
| --- src/alerts.c | ||
| +++ src/alerts.c | ||
| @@ -183,11 +183,11 @@ | ||
| 183 | 183 | ** is an administrator. |
| 184 | 184 | */ |
| 185 | 185 | void alert_submenu_common(void){ |
| 186 | 186 | if( g.perm.Admin ){ |
| 187 | 187 | if( fossil_strcmp(g.zPath,"subscribers") ){ |
| 188 | - style_submenu_element("List Subscribers","%R/subscribers"); | |
| 188 | + style_submenu_element("Subscribers","%R/subscribers"); | |
| 189 | 189 | } |
| 190 | 190 | if( fossil_strcmp(g.zPath,"subscribe") ){ |
| 191 | 191 | style_submenu_element("Add New Subscriber","%R/subscribe"); |
| 192 | 192 | } |
| 193 | 193 | } |
| @@ -1514,10 +1514,11 @@ | ||
| 1514 | 1514 | void alert_page(void){ |
| 1515 | 1515 | const char *zName = P("name"); |
| 1516 | 1516 | Stmt q; |
| 1517 | 1517 | int sa, sc, sf, st, sw; |
| 1518 | 1518 | int sdigest, sdonotcall, sverified; |
| 1519 | + int isLogin; /* Logged in as an individual */ | |
| 1519 | 1520 | const char *ssub; |
| 1520 | 1521 | const char *semail; |
| 1521 | 1522 | const char *smip; |
| 1522 | 1523 | const char *suname; |
| 1523 | 1524 | const char *mtime; |
| @@ -1529,11 +1530,12 @@ | ||
| 1529 | 1530 | login_check_credentials(); |
| 1530 | 1531 | if( !g.perm.EmailAlert ){ |
| 1531 | 1532 | login_needed(g.anon.EmailAlert); |
| 1532 | 1533 | return; |
| 1533 | 1534 | } |
| 1534 | - if( zName==0 && login_is_individual() ){ | |
| 1535 | + isLogin = login_is_individual(); | |
| 1536 | + if( zName==0 && isLogin ){ | |
| 1535 | 1537 | zName = db_text(0, "SELECT hex(subscriberCode) FROM subscriber" |
| 1536 | 1538 | " WHERE suname=%Q", g.zLogin); |
| 1537 | 1539 | } |
| 1538 | 1540 | if( zName==0 || !validate16(zName, -1) ){ |
| 1539 | 1541 | cgi_redirect("subscribe"); |
| @@ -1543,54 +1545,46 @@ | ||
| 1543 | 1545 | if( P("submit")!=0 && cgi_csrf_safe(1) ){ |
| 1544 | 1546 | int sdonotcall = PB("sdonotcall"); |
| 1545 | 1547 | int sdigest = PB("sdigest"); |
| 1546 | 1548 | char ssub[10]; |
| 1547 | 1549 | int nsub = 0; |
| 1550 | + Blob update; | |
| 1548 | 1551 | if( PB("sa") ) ssub[nsub++] = 'a'; |
| 1549 | 1552 | if( g.perm.Read && PB("sc") ) ssub[nsub++] = 'c'; |
| 1550 | 1553 | if( g.perm.RdForum && PB("sf") ) ssub[nsub++] = 'f'; |
| 1551 | 1554 | if( g.perm.RdTkt && PB("st") ) ssub[nsub++] = 't'; |
| 1552 | 1555 | if( g.perm.RdWiki && PB("sw") ) ssub[nsub++] = 'w'; |
| 1553 | 1556 | ssub[nsub] = 0; |
| 1554 | - if( g.perm.Admin ){ | |
| 1555 | - const char *suname = PT("suname"); | |
| 1556 | - int sverified = PB("sverified"); | |
| 1557 | - if( suname && suname[0]==0 ) suname = 0; | |
| 1558 | - db_multi_exec( | |
| 1559 | - "UPDATE subscriber SET" | |
| 1560 | - " sdonotcall=%d," | |
| 1561 | - " sdigest=%d," | |
| 1562 | - " ssub=%Q," | |
| 1563 | - " mtime=strftime('%%s','now')," | |
| 1564 | - " smip=%Q," | |
| 1565 | - " suname=%Q," | |
| 1566 | - " sverified=%d" | |
| 1567 | - " WHERE subscriberCode=hextoblob(%Q)", | |
| 1568 | - sdonotcall, | |
| 1569 | - sdigest, | |
| 1570 | - ssub, | |
| 1571 | - g.zIpAddr, | |
| 1572 | - suname, | |
| 1573 | - sverified, | |
| 1574 | - zName | |
| 1575 | - ); | |
| 1576 | - }else{ | |
| 1577 | - db_multi_exec( | |
| 1578 | - "UPDATE subscriber SET" | |
| 1579 | - " sdonotcall=%d," | |
| 1580 | - " sdigest=%d," | |
| 1581 | - " ssub=%Q," | |
| 1582 | - " mtime=strftime('%%s','now')," | |
| 1583 | - " smip=%Q" | |
| 1584 | - " WHERE subscriberCode=hextoblob(%Q)", | |
| 1585 | - sdonotcall, | |
| 1586 | - sdigest, | |
| 1587 | - ssub, | |
| 1588 | - g.zIpAddr, | |
| 1589 | - zName | |
| 1590 | - ); | |
| 1591 | - } | |
| 1557 | + blob_init(&update, "UPDATE subscriber SET", -1); | |
| 1558 | + blob_append_sql(&update, | |
| 1559 | + " sdonotcall=%d," | |
| 1560 | + " sdigest=%d," | |
| 1561 | + " ssub=%Q," | |
| 1562 | + " mtime=strftime('%%s','now')," | |
| 1563 | + " smip=%Q", | |
| 1564 | + sdonotcall, | |
| 1565 | + sdigest, | |
| 1566 | + ssub, | |
| 1567 | + g.zIpAddr | |
| 1568 | + ); | |
| 1569 | + if( g.perm.Admin ){ | |
| 1570 | + const char *suname = PT("suname"); | |
| 1571 | + int sverified = PB("sverified"); | |
| 1572 | + if( suname && suname[0]==0 ) suname = 0; | |
| 1573 | + blob_append_sql(&update, | |
| 1574 | + ", suname=%Q," | |
| 1575 | + " sverified=%d", | |
| 1576 | + suname, | |
| 1577 | + sverified | |
| 1578 | + ); | |
| 1579 | + } | |
| 1580 | + if( isLogin ){ | |
| 1581 | + blob_append_sql(&update, ", semail=%Q", P("semail")); | |
| 1582 | + } | |
| 1583 | + blob_append_sql(&update," WHERE subscriberCode=hextoblob(%Q)", zName); | |
| 1584 | + db_exec_sql(blob_str(&update)); | |
| 1585 | + blob_reset(&update); | |
| 1592 | 1586 | } |
| 1593 | 1587 | if( P("delete")!=0 && cgi_csrf_safe(1) ){ |
| 1594 | 1588 | if( !PB("dodelete") ){ |
| 1595 | 1589 | eErr = 9; |
| 1596 | 1590 | zErr = mprintf("Select this checkbox and press \"Unsubscribe\" again to" |
| @@ -1647,13 +1641,18 @@ | ||
| 1647 | 1641 | form_begin(0, "%R/alerts"); |
| 1648 | 1642 | @ <input type="hidden" name="name" value="%h(zName)"> |
| 1649 | 1643 | @ <table class="subscribe"> |
| 1650 | 1644 | @ <tr> |
| 1651 | 1645 | @ <td class="form_label">Email Address:</td> |
| 1652 | - @ <td>%h(semail)</td> | |
| 1646 | + if( isLogin ){ | |
| 1647 | + @ <td><input type="text" name="semail" value="%h(semail)" size="30"></td> | |
| 1648 | + }else{ | |
| 1649 | + @ <td>%h(semail)</td> | |
| 1650 | + } | |
| 1653 | 1651 | @ </tr> |
| 1654 | 1652 | if( g.perm.Admin ){ |
| 1653 | + int uid; | |
| 1655 | 1654 | @ <tr> |
| 1656 | 1655 | @ <td class='form_label'>Created:</td> |
| 1657 | 1656 | @ <td>%h(sctime)</td> |
| 1658 | 1657 | @ </tr> |
| 1659 | 1658 | @ <tr> |
| @@ -1665,11 +1664,16 @@ | ||
| 1665 | 1664 | @ <td>%h(smip)</td> |
| 1666 | 1665 | @ </tr> |
| 1667 | 1666 | @ <tr> |
| 1668 | 1667 | @ <td class="form_label">User:</td> |
| 1669 | 1668 | @ <td><input type="text" name="suname" value="%h(suname?suname:"")" \ |
| 1670 | - @ size="30"></td> | |
| 1669 | + @ size="30">\ | |
| 1670 | + uid = db_int(0, "SELECT uid FROM user WHERE login=%Q", suname); | |
| 1671 | + if( uid ){ | |
| 1672 | + @ <a href='%R/setup_uedit?id=%d(uid)'>\ | |
| 1673 | + @ (login info for %h(suname))</a>\ | |
| 1674 | + } | |
| 1671 | 1675 | @ </tr> |
| 1672 | 1676 | } |
| 1673 | 1677 | @ <tr> |
| 1674 | 1678 | @ <td class="form_label">Topics:</td> |
| 1675 | 1679 | @ <td><label><input type="checkbox" name="sa" %s(sa?"checked":"")>\ |
| @@ -1704,11 +1708,11 @@ | ||
| 1704 | 1708 | #endif |
| 1705 | 1709 | if( g.perm.Admin ){ |
| 1706 | 1710 | @ <tr> |
| 1707 | 1711 | @ <td class="form_label">Admin Options:</td><td> |
| 1708 | 1712 | @ <label><input type="checkbox" name="sdonotcall" \ |
| 1709 | - @ %s(sdonotcall?"checked":"")> Do not call</label><br> | |
| 1713 | + @ %s(sdonotcall?"checked":"")> Do not disturb</label><br> | |
| 1710 | 1714 | @ <label><input type="checkbox" name="sverified" \ |
| 1711 | 1715 | @ %s(sverified?"checked":"")>\ |
| 1712 | 1716 | @ Verified</label></td></tr> |
| 1713 | 1717 | } |
| 1714 | 1718 | if( eErr==9 ){ |
| @@ -1903,10 +1907,11 @@ | ||
| 1903 | 1907 | if( !g.perm.Admin ){ |
| 1904 | 1908 | login_needed(0); |
| 1905 | 1909 | return; |
| 1906 | 1910 | } |
| 1907 | 1911 | alert_submenu_common(); |
| 1912 | + style_submenu_element("Users","setup_ulist"); | |
| 1908 | 1913 | style_header("Subscriber List"); |
| 1909 | 1914 | blob_init(&sql, 0, 0); |
| 1910 | 1915 | blob_append_sql(&sql, |
| 1911 | 1916 | "SELECT hex(subscriberCode)," /* 0 */ |
| 1912 | 1917 | " semail," /* 1 */ |
| @@ -1913,11 +1918,12 @@ | ||
| 1913 | 1918 | " ssub," /* 2 */ |
| 1914 | 1919 | " suname," /* 3 */ |
| 1915 | 1920 | " sverified," /* 4 */ |
| 1916 | 1921 | " sdigest," /* 5 */ |
| 1917 | 1922 | " mtime," /* 6 */ |
| 1918 | - " date(sctime,'unixepoch')" /* 7 */ | |
| 1923 | + " date(sctime,'unixepoch')," /* 7 */ | |
| 1924 | + " (SELECT uid FROM user WHERE login=subscriber.suname)" /* 8 */ | |
| 1919 | 1925 | " FROM subscriber" |
| 1920 | 1926 | ); |
| 1921 | 1927 | if( P("only")!=0 ){ |
| 1922 | 1928 | blob_append_sql(&sql, " WHERE ssub LIKE '%%%q%%'", P("only")); |
| 1923 | 1929 | style_submenu_element("Show All","%R/subscribers"); |
| @@ -1939,16 +1945,22 @@ | ||
| 1939 | 1945 | @ </tr> |
| 1940 | 1946 | @ </thead><tbody> |
| 1941 | 1947 | while( db_step(&q)==SQLITE_ROW ){ |
| 1942 | 1948 | sqlite3_int64 iMtime = db_column_int64(&q, 6); |
| 1943 | 1949 | double rAge = (iNow - iMtime)/86400.0; |
| 1950 | + int uid = db_column_int(&q, 8); | |
| 1951 | + const char *zUname = db_column_text(&q, 3); | |
| 1944 | 1952 | @ <tr> |
| 1945 | 1953 | @ <td><a href='%R/alerts/%s(db_column_text(&q,0))'>\ |
| 1946 | 1954 | @ %h(db_column_text(&q,1))</a></td> |
| 1947 | 1955 | @ <td>%h(db_column_text(&q,2))</td> |
| 1948 | 1956 | @ <td>%s(db_column_int(&q,5)?"digest":"")</td> |
| 1949 | - @ <td>%h(db_column_text(&q,3))</td> | |
| 1957 | + if( uid ){ | |
| 1958 | + @ <td><a href='%R/setup_uedit?id=%d(uid)'>%h(zUname)</a> | |
| 1959 | + }else{ | |
| 1960 | + @ <td>%h(zUname)</td> | |
| 1961 | + } | |
| 1950 | 1962 | @ <td>%s(db_column_int(&q,4)?"yes":"pending")</td> |
| 1951 | 1963 | @ <td data-sortkey='%010llx(iMtime)'>%z(human_readable_age(rAge))</td> |
| 1952 | 1964 | @ <td>%h(db_column_text(&q,7))</td> |
| 1953 | 1965 | @ </tr> |
| 1954 | 1966 | } |
| 1955 | 1967 |
| --- src/alerts.c | |
| +++ src/alerts.c | |
| @@ -183,11 +183,11 @@ | |
| 183 | ** is an administrator. |
| 184 | */ |
| 185 | void alert_submenu_common(void){ |
| 186 | if( g.perm.Admin ){ |
| 187 | if( fossil_strcmp(g.zPath,"subscribers") ){ |
| 188 | style_submenu_element("List Subscribers","%R/subscribers"); |
| 189 | } |
| 190 | if( fossil_strcmp(g.zPath,"subscribe") ){ |
| 191 | style_submenu_element("Add New Subscriber","%R/subscribe"); |
| 192 | } |
| 193 | } |
| @@ -1514,10 +1514,11 @@ | |
| 1514 | void alert_page(void){ |
| 1515 | const char *zName = P("name"); |
| 1516 | Stmt q; |
| 1517 | int sa, sc, sf, st, sw; |
| 1518 | int sdigest, sdonotcall, sverified; |
| 1519 | const char *ssub; |
| 1520 | const char *semail; |
| 1521 | const char *smip; |
| 1522 | const char *suname; |
| 1523 | const char *mtime; |
| @@ -1529,11 +1530,12 @@ | |
| 1529 | login_check_credentials(); |
| 1530 | if( !g.perm.EmailAlert ){ |
| 1531 | login_needed(g.anon.EmailAlert); |
| 1532 | return; |
| 1533 | } |
| 1534 | if( zName==0 && login_is_individual() ){ |
| 1535 | zName = db_text(0, "SELECT hex(subscriberCode) FROM subscriber" |
| 1536 | " WHERE suname=%Q", g.zLogin); |
| 1537 | } |
| 1538 | if( zName==0 || !validate16(zName, -1) ){ |
| 1539 | cgi_redirect("subscribe"); |
| @@ -1543,54 +1545,46 @@ | |
| 1543 | if( P("submit")!=0 && cgi_csrf_safe(1) ){ |
| 1544 | int sdonotcall = PB("sdonotcall"); |
| 1545 | int sdigest = PB("sdigest"); |
| 1546 | char ssub[10]; |
| 1547 | int nsub = 0; |
| 1548 | if( PB("sa") ) ssub[nsub++] = 'a'; |
| 1549 | if( g.perm.Read && PB("sc") ) ssub[nsub++] = 'c'; |
| 1550 | if( g.perm.RdForum && PB("sf") ) ssub[nsub++] = 'f'; |
| 1551 | if( g.perm.RdTkt && PB("st") ) ssub[nsub++] = 't'; |
| 1552 | if( g.perm.RdWiki && PB("sw") ) ssub[nsub++] = 'w'; |
| 1553 | ssub[nsub] = 0; |
| 1554 | if( g.perm.Admin ){ |
| 1555 | const char *suname = PT("suname"); |
| 1556 | int sverified = PB("sverified"); |
| 1557 | if( suname && suname[0]==0 ) suname = 0; |
| 1558 | db_multi_exec( |
| 1559 | "UPDATE subscriber SET" |
| 1560 | " sdonotcall=%d," |
| 1561 | " sdigest=%d," |
| 1562 | " ssub=%Q," |
| 1563 | " mtime=strftime('%%s','now')," |
| 1564 | " smip=%Q," |
| 1565 | " suname=%Q," |
| 1566 | " sverified=%d" |
| 1567 | " WHERE subscriberCode=hextoblob(%Q)", |
| 1568 | sdonotcall, |
| 1569 | sdigest, |
| 1570 | ssub, |
| 1571 | g.zIpAddr, |
| 1572 | suname, |
| 1573 | sverified, |
| 1574 | zName |
| 1575 | ); |
| 1576 | }else{ |
| 1577 | db_multi_exec( |
| 1578 | "UPDATE subscriber SET" |
| 1579 | " sdonotcall=%d," |
| 1580 | " sdigest=%d," |
| 1581 | " ssub=%Q," |
| 1582 | " mtime=strftime('%%s','now')," |
| 1583 | " smip=%Q" |
| 1584 | " WHERE subscriberCode=hextoblob(%Q)", |
| 1585 | sdonotcall, |
| 1586 | sdigest, |
| 1587 | ssub, |
| 1588 | g.zIpAddr, |
| 1589 | zName |
| 1590 | ); |
| 1591 | } |
| 1592 | } |
| 1593 | if( P("delete")!=0 && cgi_csrf_safe(1) ){ |
| 1594 | if( !PB("dodelete") ){ |
| 1595 | eErr = 9; |
| 1596 | zErr = mprintf("Select this checkbox and press \"Unsubscribe\" again to" |
| @@ -1647,13 +1641,18 @@ | |
| 1647 | form_begin(0, "%R/alerts"); |
| 1648 | @ <input type="hidden" name="name" value="%h(zName)"> |
| 1649 | @ <table class="subscribe"> |
| 1650 | @ <tr> |
| 1651 | @ <td class="form_label">Email Address:</td> |
| 1652 | @ <td>%h(semail)</td> |
| 1653 | @ </tr> |
| 1654 | if( g.perm.Admin ){ |
| 1655 | @ <tr> |
| 1656 | @ <td class='form_label'>Created:</td> |
| 1657 | @ <td>%h(sctime)</td> |
| 1658 | @ </tr> |
| 1659 | @ <tr> |
| @@ -1665,11 +1664,16 @@ | |
| 1665 | @ <td>%h(smip)</td> |
| 1666 | @ </tr> |
| 1667 | @ <tr> |
| 1668 | @ <td class="form_label">User:</td> |
| 1669 | @ <td><input type="text" name="suname" value="%h(suname?suname:"")" \ |
| 1670 | @ size="30"></td> |
| 1671 | @ </tr> |
| 1672 | } |
| 1673 | @ <tr> |
| 1674 | @ <td class="form_label">Topics:</td> |
| 1675 | @ <td><label><input type="checkbox" name="sa" %s(sa?"checked":"")>\ |
| @@ -1704,11 +1708,11 @@ | |
| 1704 | #endif |
| 1705 | if( g.perm.Admin ){ |
| 1706 | @ <tr> |
| 1707 | @ <td class="form_label">Admin Options:</td><td> |
| 1708 | @ <label><input type="checkbox" name="sdonotcall" \ |
| 1709 | @ %s(sdonotcall?"checked":"")> Do not call</label><br> |
| 1710 | @ <label><input type="checkbox" name="sverified" \ |
| 1711 | @ %s(sverified?"checked":"")>\ |
| 1712 | @ Verified</label></td></tr> |
| 1713 | } |
| 1714 | if( eErr==9 ){ |
| @@ -1903,10 +1907,11 @@ | |
| 1903 | if( !g.perm.Admin ){ |
| 1904 | login_needed(0); |
| 1905 | return; |
| 1906 | } |
| 1907 | alert_submenu_common(); |
| 1908 | style_header("Subscriber List"); |
| 1909 | blob_init(&sql, 0, 0); |
| 1910 | blob_append_sql(&sql, |
| 1911 | "SELECT hex(subscriberCode)," /* 0 */ |
| 1912 | " semail," /* 1 */ |
| @@ -1913,11 +1918,12 @@ | |
| 1913 | " ssub," /* 2 */ |
| 1914 | " suname," /* 3 */ |
| 1915 | " sverified," /* 4 */ |
| 1916 | " sdigest," /* 5 */ |
| 1917 | " mtime," /* 6 */ |
| 1918 | " date(sctime,'unixepoch')" /* 7 */ |
| 1919 | " FROM subscriber" |
| 1920 | ); |
| 1921 | if( P("only")!=0 ){ |
| 1922 | blob_append_sql(&sql, " WHERE ssub LIKE '%%%q%%'", P("only")); |
| 1923 | style_submenu_element("Show All","%R/subscribers"); |
| @@ -1939,16 +1945,22 @@ | |
| 1939 | @ </tr> |
| 1940 | @ </thead><tbody> |
| 1941 | while( db_step(&q)==SQLITE_ROW ){ |
| 1942 | sqlite3_int64 iMtime = db_column_int64(&q, 6); |
| 1943 | double rAge = (iNow - iMtime)/86400.0; |
| 1944 | @ <tr> |
| 1945 | @ <td><a href='%R/alerts/%s(db_column_text(&q,0))'>\ |
| 1946 | @ %h(db_column_text(&q,1))</a></td> |
| 1947 | @ <td>%h(db_column_text(&q,2))</td> |
| 1948 | @ <td>%s(db_column_int(&q,5)?"digest":"")</td> |
| 1949 | @ <td>%h(db_column_text(&q,3))</td> |
| 1950 | @ <td>%s(db_column_int(&q,4)?"yes":"pending")</td> |
| 1951 | @ <td data-sortkey='%010llx(iMtime)'>%z(human_readable_age(rAge))</td> |
| 1952 | @ <td>%h(db_column_text(&q,7))</td> |
| 1953 | @ </tr> |
| 1954 | } |
| 1955 |
| --- src/alerts.c | |
| +++ src/alerts.c | |
| @@ -183,11 +183,11 @@ | |
| 183 | ** is an administrator. |
| 184 | */ |
| 185 | void alert_submenu_common(void){ |
| 186 | if( g.perm.Admin ){ |
| 187 | if( fossil_strcmp(g.zPath,"subscribers") ){ |
| 188 | style_submenu_element("Subscribers","%R/subscribers"); |
| 189 | } |
| 190 | if( fossil_strcmp(g.zPath,"subscribe") ){ |
| 191 | style_submenu_element("Add New Subscriber","%R/subscribe"); |
| 192 | } |
| 193 | } |
| @@ -1514,10 +1514,11 @@ | |
| 1514 | void alert_page(void){ |
| 1515 | const char *zName = P("name"); |
| 1516 | Stmt q; |
| 1517 | int sa, sc, sf, st, sw; |
| 1518 | int sdigest, sdonotcall, sverified; |
| 1519 | int isLogin; /* Logged in as an individual */ |
| 1520 | const char *ssub; |
| 1521 | const char *semail; |
| 1522 | const char *smip; |
| 1523 | const char *suname; |
| 1524 | const char *mtime; |
| @@ -1529,11 +1530,12 @@ | |
| 1530 | login_check_credentials(); |
| 1531 | if( !g.perm.EmailAlert ){ |
| 1532 | login_needed(g.anon.EmailAlert); |
| 1533 | return; |
| 1534 | } |
| 1535 | isLogin = login_is_individual(); |
| 1536 | if( zName==0 && isLogin ){ |
| 1537 | zName = db_text(0, "SELECT hex(subscriberCode) FROM subscriber" |
| 1538 | " WHERE suname=%Q", g.zLogin); |
| 1539 | } |
| 1540 | if( zName==0 || !validate16(zName, -1) ){ |
| 1541 | cgi_redirect("subscribe"); |
| @@ -1543,54 +1545,46 @@ | |
| 1545 | if( P("submit")!=0 && cgi_csrf_safe(1) ){ |
| 1546 | int sdonotcall = PB("sdonotcall"); |
| 1547 | int sdigest = PB("sdigest"); |
| 1548 | char ssub[10]; |
| 1549 | int nsub = 0; |
| 1550 | Blob update; |
| 1551 | if( PB("sa") ) ssub[nsub++] = 'a'; |
| 1552 | if( g.perm.Read && PB("sc") ) ssub[nsub++] = 'c'; |
| 1553 | if( g.perm.RdForum && PB("sf") ) ssub[nsub++] = 'f'; |
| 1554 | if( g.perm.RdTkt && PB("st") ) ssub[nsub++] = 't'; |
| 1555 | if( g.perm.RdWiki && PB("sw") ) ssub[nsub++] = 'w'; |
| 1556 | ssub[nsub] = 0; |
| 1557 | blob_init(&update, "UPDATE subscriber SET", -1); |
| 1558 | blob_append_sql(&update, |
| 1559 | " sdonotcall=%d," |
| 1560 | " sdigest=%d," |
| 1561 | " ssub=%Q," |
| 1562 | " mtime=strftime('%%s','now')," |
| 1563 | " smip=%Q", |
| 1564 | sdonotcall, |
| 1565 | sdigest, |
| 1566 | ssub, |
| 1567 | g.zIpAddr |
| 1568 | ); |
| 1569 | if( g.perm.Admin ){ |
| 1570 | const char *suname = PT("suname"); |
| 1571 | int sverified = PB("sverified"); |
| 1572 | if( suname && suname[0]==0 ) suname = 0; |
| 1573 | blob_append_sql(&update, |
| 1574 | ", suname=%Q," |
| 1575 | " sverified=%d", |
| 1576 | suname, |
| 1577 | sverified |
| 1578 | ); |
| 1579 | } |
| 1580 | if( isLogin ){ |
| 1581 | blob_append_sql(&update, ", semail=%Q", P("semail")); |
| 1582 | } |
| 1583 | blob_append_sql(&update," WHERE subscriberCode=hextoblob(%Q)", zName); |
| 1584 | db_exec_sql(blob_str(&update)); |
| 1585 | blob_reset(&update); |
| 1586 | } |
| 1587 | if( P("delete")!=0 && cgi_csrf_safe(1) ){ |
| 1588 | if( !PB("dodelete") ){ |
| 1589 | eErr = 9; |
| 1590 | zErr = mprintf("Select this checkbox and press \"Unsubscribe\" again to" |
| @@ -1647,13 +1641,18 @@ | |
| 1641 | form_begin(0, "%R/alerts"); |
| 1642 | @ <input type="hidden" name="name" value="%h(zName)"> |
| 1643 | @ <table class="subscribe"> |
| 1644 | @ <tr> |
| 1645 | @ <td class="form_label">Email Address:</td> |
| 1646 | if( isLogin ){ |
| 1647 | @ <td><input type="text" name="semail" value="%h(semail)" size="30"></td> |
| 1648 | }else{ |
| 1649 | @ <td>%h(semail)</td> |
| 1650 | } |
| 1651 | @ </tr> |
| 1652 | if( g.perm.Admin ){ |
| 1653 | int uid; |
| 1654 | @ <tr> |
| 1655 | @ <td class='form_label'>Created:</td> |
| 1656 | @ <td>%h(sctime)</td> |
| 1657 | @ </tr> |
| 1658 | @ <tr> |
| @@ -1665,11 +1664,16 @@ | |
| 1664 | @ <td>%h(smip)</td> |
| 1665 | @ </tr> |
| 1666 | @ <tr> |
| 1667 | @ <td class="form_label">User:</td> |
| 1668 | @ <td><input type="text" name="suname" value="%h(suname?suname:"")" \ |
| 1669 | @ size="30">\ |
| 1670 | uid = db_int(0, "SELECT uid FROM user WHERE login=%Q", suname); |
| 1671 | if( uid ){ |
| 1672 | @ <a href='%R/setup_uedit?id=%d(uid)'>\ |
| 1673 | @ (login info for %h(suname))</a>\ |
| 1674 | } |
| 1675 | @ </tr> |
| 1676 | } |
| 1677 | @ <tr> |
| 1678 | @ <td class="form_label">Topics:</td> |
| 1679 | @ <td><label><input type="checkbox" name="sa" %s(sa?"checked":"")>\ |
| @@ -1704,11 +1708,11 @@ | |
| 1708 | #endif |
| 1709 | if( g.perm.Admin ){ |
| 1710 | @ <tr> |
| 1711 | @ <td class="form_label">Admin Options:</td><td> |
| 1712 | @ <label><input type="checkbox" name="sdonotcall" \ |
| 1713 | @ %s(sdonotcall?"checked":"")> Do not disturb</label><br> |
| 1714 | @ <label><input type="checkbox" name="sverified" \ |
| 1715 | @ %s(sverified?"checked":"")>\ |
| 1716 | @ Verified</label></td></tr> |
| 1717 | } |
| 1718 | if( eErr==9 ){ |
| @@ -1903,10 +1907,11 @@ | |
| 1907 | if( !g.perm.Admin ){ |
| 1908 | login_needed(0); |
| 1909 | return; |
| 1910 | } |
| 1911 | alert_submenu_common(); |
| 1912 | style_submenu_element("Users","setup_ulist"); |
| 1913 | style_header("Subscriber List"); |
| 1914 | blob_init(&sql, 0, 0); |
| 1915 | blob_append_sql(&sql, |
| 1916 | "SELECT hex(subscriberCode)," /* 0 */ |
| 1917 | " semail," /* 1 */ |
| @@ -1913,11 +1918,12 @@ | |
| 1918 | " ssub," /* 2 */ |
| 1919 | " suname," /* 3 */ |
| 1920 | " sverified," /* 4 */ |
| 1921 | " sdigest," /* 5 */ |
| 1922 | " mtime," /* 6 */ |
| 1923 | " date(sctime,'unixepoch')," /* 7 */ |
| 1924 | " (SELECT uid FROM user WHERE login=subscriber.suname)" /* 8 */ |
| 1925 | " FROM subscriber" |
| 1926 | ); |
| 1927 | if( P("only")!=0 ){ |
| 1928 | blob_append_sql(&sql, " WHERE ssub LIKE '%%%q%%'", P("only")); |
| 1929 | style_submenu_element("Show All","%R/subscribers"); |
| @@ -1939,16 +1945,22 @@ | |
| 1945 | @ </tr> |
| 1946 | @ </thead><tbody> |
| 1947 | while( db_step(&q)==SQLITE_ROW ){ |
| 1948 | sqlite3_int64 iMtime = db_column_int64(&q, 6); |
| 1949 | double rAge = (iNow - iMtime)/86400.0; |
| 1950 | int uid = db_column_int(&q, 8); |
| 1951 | const char *zUname = db_column_text(&q, 3); |
| 1952 | @ <tr> |
| 1953 | @ <td><a href='%R/alerts/%s(db_column_text(&q,0))'>\ |
| 1954 | @ %h(db_column_text(&q,1))</a></td> |
| 1955 | @ <td>%h(db_column_text(&q,2))</td> |
| 1956 | @ <td>%s(db_column_int(&q,5)?"digest":"")</td> |
| 1957 | if( uid ){ |
| 1958 | @ <td><a href='%R/setup_uedit?id=%d(uid)'>%h(zUname)</a> |
| 1959 | }else{ |
| 1960 | @ <td>%h(zUname)</td> |
| 1961 | } |
| 1962 | @ <td>%s(db_column_int(&q,4)?"yes":"pending")</td> |
| 1963 | @ <td data-sortkey='%010llx(iMtime)'>%z(human_readable_age(rAge))</td> |
| 1964 | @ <td>%h(db_column_text(&q,7))</td> |
| 1965 | @ </tr> |
| 1966 | } |
| 1967 |
+17
-3
| --- src/setupuser.c | ||
| +++ src/setupuser.c | ||
| @@ -45,10 +45,13 @@ | ||
| 45 | 45 | } |
| 46 | 46 | |
| 47 | 47 | style_submenu_element("Add", "setup_uedit"); |
| 48 | 48 | style_submenu_element("Log", "access_log"); |
| 49 | 49 | style_submenu_element("Help", "setup_ulist_notes"); |
| 50 | + if( alert_tables_exist() ){ | |
| 51 | + style_submenu_element("Subscribers", "subscribers"); | |
| 52 | + } | |
| 50 | 53 | style_header("User List"); |
| 51 | 54 | if( zWith==0 || zWith[0]==0 ){ |
| 52 | 55 | @ <table border=1 cellpadding=2 cellspacing=0 class='userTable'> |
| 53 | 56 | @ <thead><tr> |
| 54 | 57 | @ <th>Category |
| @@ -517,22 +520,33 @@ | ||
| 517 | 520 | @ <input type="hidden" name="referer" value="%h(cgi_referer("setup_ulist"))"> |
| 518 | 521 | @ <table width="100%%"> |
| 519 | 522 | @ <tr> |
| 520 | 523 | @ <td class="usetupEditLabel">User ID:</td> |
| 521 | 524 | if( uid ){ |
| 522 | - @ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" /></td> | |
| 525 | + @ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" />\ | |
| 526 | + @ </td> | |
| 523 | 527 | }else{ |
| 524 | 528 | @ <td>(new user)<input type="hidden" name="id" value="0" /></td> |
| 525 | 529 | } |
| 526 | 530 | @ </tr> |
| 527 | 531 | @ <tr> |
| 528 | 532 | @ <td class="usetupEditLabel">Login:</td> |
| 529 | 533 | if( login_is_special(zLogin) ){ |
| 530 | 534 | @ <td><b>%h(zLogin)</b></td> |
| 531 | 535 | }else{ |
| 532 | - @ <td><input type="text" name="login" value="%h(zLogin)" /></td> | |
| 533 | - @ </tr> | |
| 536 | + @ <td><input type="text" name="login" value="%h(zLogin)" />\ | |
| 537 | + if( alert_tables_exist() ){ | |
| 538 | + char *zSCode; /* Subscriber Code */ | |
| 539 | + zSCode = db_text(0, "SELECT hex(subscriberCode) FROM subscriber" | |
| 540 | + " WHERE suname=%Q", zLogin); | |
| 541 | + if( zSCode && zSCode[0] ){ | |
| 542 | + @ <a href="%R/alerts/%s(zSCode)">\ | |
| 543 | + @ (subscription info for %h(zLogin))</a>\ | |
| 544 | + } | |
| 545 | + fossil_free(zSCode); | |
| 546 | + } | |
| 547 | + @ </td></tr> | |
| 534 | 548 | @ <tr> |
| 535 | 549 | @ <td class="usetupEditLabel">Contact Info:</td> |
| 536 | 550 | @ <td><textarea name="info" cols="40" rows="2">%h(zInfo)</textarea></td> |
| 537 | 551 | } |
| 538 | 552 | @ </tr> |
| 539 | 553 |
| --- src/setupuser.c | |
| +++ src/setupuser.c | |
| @@ -45,10 +45,13 @@ | |
| 45 | } |
| 46 | |
| 47 | style_submenu_element("Add", "setup_uedit"); |
| 48 | style_submenu_element("Log", "access_log"); |
| 49 | style_submenu_element("Help", "setup_ulist_notes"); |
| 50 | style_header("User List"); |
| 51 | if( zWith==0 || zWith[0]==0 ){ |
| 52 | @ <table border=1 cellpadding=2 cellspacing=0 class='userTable'> |
| 53 | @ <thead><tr> |
| 54 | @ <th>Category |
| @@ -517,22 +520,33 @@ | |
| 517 | @ <input type="hidden" name="referer" value="%h(cgi_referer("setup_ulist"))"> |
| 518 | @ <table width="100%%"> |
| 519 | @ <tr> |
| 520 | @ <td class="usetupEditLabel">User ID:</td> |
| 521 | if( uid ){ |
| 522 | @ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" /></td> |
| 523 | }else{ |
| 524 | @ <td>(new user)<input type="hidden" name="id" value="0" /></td> |
| 525 | } |
| 526 | @ </tr> |
| 527 | @ <tr> |
| 528 | @ <td class="usetupEditLabel">Login:</td> |
| 529 | if( login_is_special(zLogin) ){ |
| 530 | @ <td><b>%h(zLogin)</b></td> |
| 531 | }else{ |
| 532 | @ <td><input type="text" name="login" value="%h(zLogin)" /></td> |
| 533 | @ </tr> |
| 534 | @ <tr> |
| 535 | @ <td class="usetupEditLabel">Contact Info:</td> |
| 536 | @ <td><textarea name="info" cols="40" rows="2">%h(zInfo)</textarea></td> |
| 537 | } |
| 538 | @ </tr> |
| 539 |
| --- src/setupuser.c | |
| +++ src/setupuser.c | |
| @@ -45,10 +45,13 @@ | |
| 45 | } |
| 46 | |
| 47 | style_submenu_element("Add", "setup_uedit"); |
| 48 | style_submenu_element("Log", "access_log"); |
| 49 | style_submenu_element("Help", "setup_ulist_notes"); |
| 50 | if( alert_tables_exist() ){ |
| 51 | style_submenu_element("Subscribers", "subscribers"); |
| 52 | } |
| 53 | style_header("User List"); |
| 54 | if( zWith==0 || zWith[0]==0 ){ |
| 55 | @ <table border=1 cellpadding=2 cellspacing=0 class='userTable'> |
| 56 | @ <thead><tr> |
| 57 | @ <th>Category |
| @@ -517,22 +520,33 @@ | |
| 520 | @ <input type="hidden" name="referer" value="%h(cgi_referer("setup_ulist"))"> |
| 521 | @ <table width="100%%"> |
| 522 | @ <tr> |
| 523 | @ <td class="usetupEditLabel">User ID:</td> |
| 524 | if( uid ){ |
| 525 | @ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" />\ |
| 526 | @ </td> |
| 527 | }else{ |
| 528 | @ <td>(new user)<input type="hidden" name="id" value="0" /></td> |
| 529 | } |
| 530 | @ </tr> |
| 531 | @ <tr> |
| 532 | @ <td class="usetupEditLabel">Login:</td> |
| 533 | if( login_is_special(zLogin) ){ |
| 534 | @ <td><b>%h(zLogin)</b></td> |
| 535 | }else{ |
| 536 | @ <td><input type="text" name="login" value="%h(zLogin)" />\ |
| 537 | if( alert_tables_exist() ){ |
| 538 | char *zSCode; /* Subscriber Code */ |
| 539 | zSCode = db_text(0, "SELECT hex(subscriberCode) FROM subscriber" |
| 540 | " WHERE suname=%Q", zLogin); |
| 541 | if( zSCode && zSCode[0] ){ |
| 542 | @ <a href="%R/alerts/%s(zSCode)">\ |
| 543 | @ (subscription info for %h(zLogin))</a>\ |
| 544 | } |
| 545 | fossil_free(zSCode); |
| 546 | } |
| 547 | @ </td></tr> |
| 548 | @ <tr> |
| 549 | @ <td class="usetupEditLabel">Contact Info:</td> |
| 550 | @ <td><textarea name="info" cols="40" rows="2">%h(zInfo)</textarea></td> |
| 551 | } |
| 552 | @ </tr> |
| 553 |