Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Comment: | prefill the tktnew page email field with user emailaddr
If the logged-in user has a valid email address in their contact-info, use it to prefill the email field in the /tktnew page when submitting a new ticket. As discussed in /chat, enhance the Fossil builtin find_emailaddr() SQL function--suggested by wyoung@--to parse strings for well-formed email addresses not necessarily wrapped in <...>. Requested by jose i cabrera on the forum. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
f974583f903a17f64f0f626072bd4a98 |
User & Date: | mark 2023-02-03 07:21:28 |
2023-02-03
| ||
14:32 | Add the /deltachain page, indented for analysis of the delta compression and future improvements to that algorithm. There are links to the delta chain on the /timeline and /finfo when the showid query parameter is used. ... (check-in: 00c62a11 user: drh tags: trunk) | |
07:21 |
prefill the tktnew page email field with user emailaddr
If the logged-in user has a valid email address in their contact-info, use it to prefill the email field in the /tktnew page when submitting a new ticket. As discussed in /chat, enhance the Fossil builtin find_emailaddr() SQL function--suggested by wyoung@--to parse strings for well-formed email addresses not necessarily wrapped in <...>. Requested by jose i cabrera on the forum. ... (check-in: f974583f user: mark tags: trunk) | |
00:31 | Enable SELECT statements for the ticket_schema_auth() authorizer. This is required for the new FTS5 search and the fts5_api_from_db() routine. ... (check-in: 3fe8a8cd user: drh tags: trunk) | |
Changes to src/alerts.c.
︙ | ︙ | |||
712 713 714 715 716 717 718 | return i; } /* ** Make a copy of the input string up to but not including the ** first cTerm character. ** | | | | > > > | | | | < | < | 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 | return i; } /* ** Make a copy of the input string up to but not including the ** first cTerm character. ** ** Verify that the string to be copied really is a valid ** email address. If it is not, then return NULL. ** ** This routine is more restrictive than necessary. It does not ** allow comments, IP address, quoted strings, or certain uncommon ** characters. The only non-alphanumerics allowed in the local ** part are "_", "+", "-" and "+". */ char *email_copy_addr(const char *z, char cTerm ){ int i = email_address_is_valid(z, cTerm); return i==0 ? 0 : mprintf("%.*s", i, z); } /* ** Scan the input string for a valid email address that may be ** enclosed in <...>, or delimited by ',' or ':' or '=' or ' '. ** If the string contains one or more email addresses, extract the first ** one into memory obtained from mprintf() and return a pointer to it. ** If no valid email address can be found, return NULL. */ char *alert_find_emailaddr(const char *zIn){ char *zOut = 0; do{ zOut = email_copy_addr(zIn, zIn[strcspn(zIn, ">,:= ")]); if( zOut!=0 ) break; zIn = (const char *)strpbrk(zIn, "<,:= "); if( zIn==0 ) break; zIn++; }while( zIn!=0 ); return zOut; } /* ** SQL function: find_emailaddr(X) ** ** Return the first valid email address of the form <...> in input string |
︙ | ︙ |
Changes to src/tkt.c.
︙ | ︙ | |||
993 994 995 996 997 998 999 | ** tktnew_template in the ticket configuration. /debug_tktnew works ** just like /tktnew except that it does not really save the new ticket ** when you press submit - it just prints the ticket artifact at the ** top of the screen. */ void tktnew_page(void){ const char *zScript; | | > | 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 | ** tktnew_template in the ticket configuration. /debug_tktnew works ** just like /tktnew except that it does not really save the new ticket ** when you press submit - it just prints the ticket artifact at the ** top of the screen. */ void tktnew_page(void){ const char *zScript; char *zEmail = 0, *zNewUuid = 0; int uid; login_check_credentials(); if( !g.perm.NewTkt ){ login_needed(g.anon.NewTkt); return; } if( P("cancel") ){ cgi_redirect("home"); } style_set_current_feature("tkt"); |
︙ | ︙ | |||
1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 | if( g.zPath[0]=='d' ) showAllFields(); form_begin(0, "%R/%s", g.zPath); login_insert_csrf_secret(); if( P("date_override") && g.perm.Setup ){ @ <input type="hidden" name="date_override" value="%h(P("date_override"))"> } zScript = ticket_newpage_code(); Th_Store("login", login_name()); Th_Store("date", db_text(0, "SELECT datetime('now')")); Th_CreateCommand(g.interp, "submit_ticket", submitTicketCmd, (void*)&zNewUuid, 0); if( g.thTrace ) Th_Trace("BEGIN_TKTNEW_SCRIPT<br />\n", -1); if( Th_Render(zScript)==TH_RETURN && !g.thTrace && zNewUuid ){ cgi_redirect(mprintf("%R/tktview/%s", zNewUuid)); | > > > > > > > > > > | 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 | if( g.zPath[0]=='d' ) showAllFields(); form_begin(0, "%R/%s", g.zPath); login_insert_csrf_secret(); if( P("date_override") && g.perm.Setup ){ @ <input type="hidden" name="date_override" value="%h(P("date_override"))"> } zScript = ticket_newpage_code(); if( g.zLogin && g.zLogin[0] ){ uid = db_int(0, "SELECT uid FROM user WHERE login=%Q", g.zLogin); if( uid ){ zEmail = db_text(0, "SELECT find_emailaddr(info) FROM user WHERE uid=%d", uid); if( zEmail ){ Th_Store("private_contact", zEmail); } } } Th_Store("login", login_name()); Th_Store("date", db_text(0, "SELECT datetime('now')")); Th_CreateCommand(g.interp, "submit_ticket", submitTicketCmd, (void*)&zNewUuid, 0); if( g.thTrace ) Th_Trace("BEGIN_TKTNEW_SCRIPT<br />\n", -1); if( Th_Render(zScript)==TH_RETURN && !g.thTrace && zNewUuid ){ cgi_redirect(mprintf("%R/tktview/%s", zNewUuid)); |
︙ | ︙ |