plugins/viewhtml: convert mailto links
This commit is contained in:
parent
62660f8d1d
commit
02faf6174b
2 changed files with 32 additions and 9 deletions
|
@ -431,6 +431,7 @@ func handleCompose(ctx *koushin.Context, msg *OutgoingMessage, draft *messagePat
|
||||||
|
|
||||||
func handleComposeNew(ctx *koushin.Context) error {
|
func handleComposeNew(ctx *koushin.Context) error {
|
||||||
// These are common mailto URL query parameters
|
// These are common mailto URL query parameters
|
||||||
|
// TODO: cc, bcc
|
||||||
return handleCompose(ctx, &OutgoingMessage{
|
return handleCompose(ctx, &OutgoingMessage{
|
||||||
To: strings.Split(ctx.QueryParam("to"), ","),
|
To: strings.Split(ctx.QueryParam("to"), ","),
|
||||||
Subject: ctx.QueryParam("subject"),
|
Subject: ctx.QueryParam("subject"),
|
||||||
|
|
|
@ -70,6 +70,14 @@ var allowedStyles = map[string]bool{
|
||||||
"list-style-position": true,
|
"list-style-position": true,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var mailtoParams = []string{
|
||||||
|
"subject",
|
||||||
|
"cc",
|
||||||
|
"bcc",
|
||||||
|
"body",
|
||||||
|
"in-reply-to",
|
||||||
|
}
|
||||||
|
|
||||||
type sanitizer struct {
|
type sanitizer struct {
|
||||||
msg *koushinbase.IMAPMessage
|
msg *koushinbase.IMAPMessage
|
||||||
}
|
}
|
||||||
|
@ -80,17 +88,31 @@ func (san *sanitizer) sanitizeImageURL(src string) string {
|
||||||
return "about:blank"
|
return "about:blank"
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: mid support?
|
switch strings.ToLower(u.Scheme) {
|
||||||
if !strings.EqualFold(u.Scheme, "cid") || san.msg == nil {
|
case "mailto":
|
||||||
|
mailtoQuery := u.Query()
|
||||||
|
|
||||||
|
composeURL := url.URL{Path: "/compose"}
|
||||||
|
composeQuery := make(url.Values)
|
||||||
|
composeQuery.Set("to", u.Opaque)
|
||||||
|
for _, k := range mailtoParams {
|
||||||
|
if v := mailtoQuery.Get(k); v != "" {
|
||||||
|
composeQuery.Set(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
composeURL.RawQuery = composeQuery.Encode()
|
||||||
|
return composeURL.String()
|
||||||
|
case "cid":
|
||||||
|
// TODO: mid support?
|
||||||
|
part := san.msg.PartByID(u.Opaque)
|
||||||
|
if part == nil || !strings.HasPrefix(part.MIMEType, "image/") {
|
||||||
|
return "about:blank"
|
||||||
|
}
|
||||||
|
|
||||||
|
return part.URL(true).String()
|
||||||
|
default:
|
||||||
return "about:blank"
|
return "about:blank"
|
||||||
}
|
}
|
||||||
|
|
||||||
part := san.msg.PartByID(u.Opaque)
|
|
||||||
if part == nil || !strings.HasPrefix(part.MIMEType, "image/") {
|
|
||||||
return "about:blank"
|
|
||||||
}
|
|
||||||
|
|
||||||
return part.URL(true).String()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (san *sanitizer) sanitizeCSSDecls(decls []*css.Declaration) []*css.Declaration {
|
func (san *sanitizer) sanitizeCSSDecls(decls []*css.Declaration) []*css.Declaration {
|
||||||
|
|
Loading…
Reference in a new issue