[chore] update dependencies (#4361)

- codeberg.org/gruf/go-kv/v2 v2.0.5 => v2.0.6
- github.com/coreos/go-oidc/v3 v3.14.1 => v3.15.0
- github.com/miekg/dns v1.1.67 => v1.1.68
- github.com/tdewolff/minify/v2 v2.23.9 => v2.23.11
- github.com/yuin/goldmark v1.7.12 => v1.7.13
- golang.org/x/crypto v0.40.0 => v0.41.0
- golang.org/x/image v0.29.0 => v0.30.0
- golang.org/x/net v0.42.0 => v0.43.0
- golang.org/x/sys v0.34.0 => v0.35.0
- golang.org/x/text v0.27.0 => v0.28.0
- modernc.org/sqlite v1.38.0 => v1.38.2

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4361
Co-authored-by: kim <grufwub@gmail.com>
Co-committed-by: kim <grufwub@gmail.com>
This commit is contained in:
kim 2025-08-10 15:05:54 +02:00 committed by kim
commit 67100809b3
111 changed files with 49874 additions and 40191 deletions

View file

@ -1,15 +1,11 @@
package oidc
import (
"bytes"
"context"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"strings"
"time"
jose "github.com/go-jose/go-jose/v4"
@ -145,18 +141,6 @@ func (p *Provider) newVerifier(keySet KeySet, config *Config) *IDTokenVerifier {
return NewVerifier(p.issuer, keySet, config)
}
func parseJWT(p string) ([]byte, error) {
parts := strings.Split(p, ".")
if len(parts) < 2 {
return nil, fmt.Errorf("oidc: malformed jwt, expected 3 parts got %d", len(parts))
}
payload, err := base64.RawURLEncoding.DecodeString(parts[1])
if err != nil {
return nil, fmt.Errorf("oidc: malformed jwt payload: %v", err)
}
return payload, nil
}
func contains(sli []string, ele string) bool {
for _, s := range sli {
if s == ele {
@ -219,12 +203,49 @@ func resolveDistributedClaim(ctx context.Context, verifier *IDTokenVerifier, src
//
// token, err := verifier.Verify(ctx, rawIDToken)
func (v *IDTokenVerifier) Verify(ctx context.Context, rawIDToken string) (*IDToken, error) {
// Throw out tokens with invalid claims before trying to verify the token. This lets
// us do cheap checks before possibly re-syncing keys.
payload, err := parseJWT(rawIDToken)
var supportedSigAlgs []jose.SignatureAlgorithm
for _, alg := range v.config.SupportedSigningAlgs {
supportedSigAlgs = append(supportedSigAlgs, jose.SignatureAlgorithm(alg))
}
if len(supportedSigAlgs) == 0 {
// If no algorithms were specified by both the config and discovery, default
// to the one mandatory algorithm "RS256".
supportedSigAlgs = []jose.SignatureAlgorithm{jose.RS256}
}
if v.config.InsecureSkipSignatureCheck {
// "none" is a required value to even parse a JWT with the "none" algorithm
// using go-jose.
supportedSigAlgs = append(supportedSigAlgs, "none")
}
// Parse and verify the signature first. This at least forces the user to have
// a valid, signed ID token before we do any other processing.
jws, err := jose.ParseSigned(rawIDToken, supportedSigAlgs)
if err != nil {
return nil, fmt.Errorf("oidc: malformed jwt: %v", err)
}
switch len(jws.Signatures) {
case 0:
return nil, fmt.Errorf("oidc: id token not signed")
case 1:
default:
return nil, fmt.Errorf("oidc: multiple signatures on id token not supported")
}
sig := jws.Signatures[0]
var payload []byte
if v.config.InsecureSkipSignatureCheck {
// Yolo mode.
payload = jws.UnsafePayloadWithoutVerification()
} else {
// The JWT is attached here for the happy path to avoid the verifier from
// having to parse the JWT twice.
ctx = context.WithValue(ctx, parsedJWTKey, jws)
payload, err = v.keySet.VerifySignature(ctx, rawIDToken)
if err != nil {
return nil, fmt.Errorf("failed to verify signature: %v", err)
}
}
var token idToken
if err := json.Unmarshal(payload, &token); err != nil {
return nil, fmt.Errorf("oidc: failed to unmarshal claims: %v", err)
@ -254,6 +275,7 @@ func (v *IDTokenVerifier) Verify(ctx context.Context, rawIDToken string) (*IDTok
AccessTokenHash: token.AtHash,
claims: payload,
distributedClaims: distributedClaims,
sigAlgorithm: sig.Header.Algorithm,
}
// Check issuer.
@ -306,45 +328,6 @@ func (v *IDTokenVerifier) Verify(ctx context.Context, rawIDToken string) (*IDTok
}
}
if v.config.InsecureSkipSignatureCheck {
return t, nil
}
var supportedSigAlgs []jose.SignatureAlgorithm
for _, alg := range v.config.SupportedSigningAlgs {
supportedSigAlgs = append(supportedSigAlgs, jose.SignatureAlgorithm(alg))
}
if len(supportedSigAlgs) == 0 {
// If no algorithms were specified by both the config and discovery, default
// to the one mandatory algorithm "RS256".
supportedSigAlgs = []jose.SignatureAlgorithm{jose.RS256}
}
jws, err := jose.ParseSigned(rawIDToken, supportedSigAlgs)
if err != nil {
return nil, fmt.Errorf("oidc: malformed jwt: %v", err)
}
switch len(jws.Signatures) {
case 0:
return nil, fmt.Errorf("oidc: id token not signed")
case 1:
default:
return nil, fmt.Errorf("oidc: multiple signatures on id token not supported")
}
sig := jws.Signatures[0]
t.sigAlgorithm = sig.Header.Algorithm
ctx = context.WithValue(ctx, parsedJWTKey, jws)
gotPayload, err := v.keySet.VerifySignature(ctx, rawIDToken)
if err != nil {
return nil, fmt.Errorf("failed to verify signature: %v", err)
}
// Ensure that the payload returned by the square actually matches the payload parsed earlier.
if !bytes.Equal(gotPayload, payload) {
return nil, errors.New("oidc: internal error, payload parsed did not match previous payload")
}
return t, nil
}

View file

@ -44,8 +44,6 @@ type ResponseWriter interface {
LocalAddr() net.Addr
// RemoteAddr returns the net.Addr of the client that sent the current request.
RemoteAddr() net.Addr
// Network returns the value of the Net field of the Server (e.g., "tcp", "tcp-tls").
Network() string
// WriteMsg writes a reply back to the client.
WriteMsg(*Msg) error
// Write writes a raw buffer back to the client.
@ -79,7 +77,6 @@ type response struct {
udpSession *SessionUDP // oob data to get egress interface right
pcSession net.Addr // address to use when writing to a generic net.PacketConn
writer Writer // writer to output the raw DNS bits
network string // corresponding Server.Net value
}
// handleRefused returns a HandlerFunc that returns REFUSED for every request it gets.
@ -560,7 +557,7 @@ func (srv *Server) serveUDP(l net.PacketConn) error {
// Serve a new TCP connection.
func (srv *Server) serveTCPConn(wg *sync.WaitGroup, rw net.Conn) {
w := &response{tsigProvider: srv.tsigProvider(), tcp: rw, network: srv.Net}
w := &response{tsigProvider: srv.tsigProvider(), tcp: rw}
if srv.DecorateWriter != nil {
w.writer = srv.DecorateWriter(w)
} else {
@ -615,7 +612,7 @@ func (srv *Server) serveTCPConn(wg *sync.WaitGroup, rw net.Conn) {
// Serve a new UDP request.
func (srv *Server) serveUDPPacket(wg *sync.WaitGroup, m []byte, u net.PacketConn, udpSession *SessionUDP, pcSession net.Addr) {
w := &response{tsigProvider: srv.tsigProvider(), udp: u, udpSession: udpSession, pcSession: pcSession, network: srv.Net}
w := &response{tsigProvider: srv.tsigProvider(), udp: u, udpSession: udpSession, pcSession: pcSession}
if srv.DecorateWriter != nil {
w.writer = srv.DecorateWriter(w)
} else {
@ -821,9 +818,6 @@ func (w *response) RemoteAddr() net.Addr {
}
}
// Network implements the ResponseWriter.Network method.
func (w *response) Network() string { return w.network }
// TsigStatus implements the ResponseWriter.TsigStatus method.
func (w *response) TsigStatus() error { return w.tsigStatus }

View file

@ -3,7 +3,7 @@ package dns
import "fmt"
// Version is current version of this library.
var Version = v{1, 1, 67}
var Version = v{1, 1, 68}
// v holds the version of this library.
type v struct {

View file

@ -1,14 +1,12 @@
package html
// generated by hasher -type=Hash -file=hash.go; DO NOT EDIT, except for adding more constants to the list and rerun go generate
// uses github.com/tdewolff/hasher
//go:generate hasher -type=Hash -file=hash.go
// Hash defines perfect hashes for a predefined list of strings
type Hash uint32
// Unique hash definitions to be used instead of strings
// Identifiers for the hashes associated with the text in the comments.
const (
A Hash = 0x1 // a
Abbr Hash = 0x40004 // abbr
@ -277,22 +275,297 @@ const (
Xmp Hash = 0x7903 // xmp
)
// String returns the hash' name.
//var HashMap = map[string]Hash{
// "a": A,
// "abbr": Abbr,
// "about": About,
// "accept": Accept,
// "accept-charset": Accept_Charset,
// "accesskey": Accesskey,
// "acronym": Acronym,
// "action": Action,
// "address": Address,
// "allow": Allow,
// "allowfullscreen": Allowfullscreen,
// "amp-boilerplate": Amp_Boilerplate,
// "applet": Applet,
// "area": Area,
// "article": Article,
// "as": As,
// "aside": Aside,
// "async": Async,
// "audio": Audio,
// "autocapitalize": Autocapitalize,
// "autocomplete": Autocomplete,
// "autofocus": Autofocus,
// "autoplay": Autoplay,
// "b": B,
// "base": Base,
// "basefont": Basefont,
// "bb": Bb,
// "bdi": Bdi,
// "bdo": Bdo,
// "big": Big,
// "blocking": Blocking,
// "blockquote": Blockquote,
// "body": Body,
// "br": Br,
// "button": Button,
// "canvas": Canvas,
// "caption": Caption,
// "capture": Capture,
// "center": Center,
// "charset": Charset,
// "checked": Checked,
// "cite": Cite,
// "class": Class,
// "code": Code,
// "col": Col,
// "colgroup": Colgroup,
// "color": Color,
// "cols": Cols,
// "colspan": Colspan,
// "content": Content,
// "contenteditable": Contenteditable,
// "controls": Controls,
// "coords": Coords,
// "crossorigin": Crossorigin,
// "data": Data,
// "datalist": Datalist,
// "datatype": Datatype,
// "datetime": Datetime,
// "dd": Dd,
// "decoding": Decoding,
// "default": Default,
// "defer": Defer,
// "del": Del,
// "details": Details,
// "dfn": Dfn,
// "dialog": Dialog,
// "dir": Dir,
// "disabled": Disabled,
// "div": Div,
// "dl": Dl,
// "draggable": Draggable,
// "dt": Dt,
// "em": Em,
// "embed": Embed,
// "enctype": Enctype,
// "enterkeyhint": Enterkeyhint,
// "fetchpriority": Fetchpriority,
// "fieldset": Fieldset,
// "figcaption": Figcaption,
// "figure": Figure,
// "font": Font,
// "footer": Footer,
// "for": For,
// "form": Form,
// "formaction": Formaction,
// "formenctype": Formenctype,
// "formmethod": Formmethod,
// "formnovalidate": Formnovalidate,
// "formtarget": Formtarget,
// "frame": Frame,
// "frameset": Frameset,
// "h1": H1,
// "h2": H2,
// "h3": H3,
// "h4": H4,
// "h5": H5,
// "h6": H6,
// "head": Head,
// "header": Header,
// "headers": Headers,
// "height": Height,
// "hgroup": Hgroup,
// "hidden": Hidden,
// "high": High,
// "hr": Hr,
// "href": Href,
// "hreflang": Hreflang,
// "html": Html,
// "http-equiv": Http_Equiv,
// "i": I,
// "id": Id,
// "iframe": Iframe,
// "image": Image,
// "imagesizes": Imagesizes,
// "imagesrcset": Imagesrcset,
// "img": Img,
// "inert": Inert,
// "inlist": Inlist,
// "input": Input,
// "inputmode": Inputmode,
// "ins": Ins,
// "is": Is,
// "ismap": Ismap,
// "itemid": Itemid,
// "itemprop": Itemprop,
// "itemref": Itemref,
// "itemscope": Itemscope,
// "itemtype": Itemtype,
// "kbd": Kbd,
// "kind": Kind,
// "label": Label,
// "lang": Lang,
// "legend": Legend,
// "li": Li,
// "link": Link,
// "list": List,
// "loading": Loading,
// "loop": Loop,
// "low": Low,
// "main": Main,
// "map": Map,
// "mark": Mark,
// "marquee": Marquee,
// "math": Math,
// "max": Max,
// "maxlength": Maxlength,
// "media": Media,
// "menu": Menu,
// "menuitem": Menuitem,
// "meta": Meta,
// "meter": Meter,
// "method": Method,
// "min": Min,
// "minlength": Minlength,
// "multiple": Multiple,
// "muted": Muted,
// "name": Name,
// "nav": Nav,
// "nobr": Nobr,
// "noembed": Noembed,
// "noframes": Noframes,
// "nomodule": Nomodule,
// "noscript": Noscript,
// "novalidate": Novalidate,
// "object": Object,
// "ol": Ol,
// "open": Open,
// "optgroup": Optgroup,
// "optimum": Optimum,
// "option": Option,
// "output": Output,
// "p": P,
// "param": Param,
// "pattern": Pattern,
// "picture": Picture,
// "ping": Ping,
// "plaintext": Plaintext,
// "playsinline": Playsinline,
// "popover": Popover,
// "popovertarget": Popovertarget,
// "popovertargetaction": Popovertargetaction,
// "portal": Portal,
// "poster": Poster,
// "pre": Pre,
// "prefix": Prefix,
// "preload": Preload,
// "profile": Profile,
// "progress": Progress,
// "property": Property,
// "q": Q,
// "rb": Rb,
// "readonly": Readonly,
// "referrerpolicy": Referrerpolicy,
// "rel": Rel,
// "required": Required,
// "resource": Resource,
// "rev": Rev,
// "reversed": Reversed,
// "rows": Rows,
// "rowspan": Rowspan,
// "rp": Rp,
// "rt": Rt,
// "rtc": Rtc,
// "ruby": Ruby,
// "s": S,
// "samp": Samp,
// "sandbox": Sandbox,
// "scope": Scope,
// "script": Script,
// "section": Section,
// "select": Select,
// "selected": Selected,
// "shadowrootdelegatesfocus": Shadowrootdelegatesfocus,
// "shadowrootmode": Shadowrootmode,
// "shape": Shape,
// "size": Size,
// "sizes": Sizes,
// "slot": Slot,
// "small": Small,
// "source": Source,
// "span": Span,
// "spellcheck": Spellcheck,
// "src": Src,
// "srclang": Srclang,
// "srcset": Srcset,
// "start": Start,
// "step": Step,
// "strike": Strike,
// "strong": Strong,
// "style": Style,
// "sub": Sub,
// "summary": Summary,
// "sup": Sup,
// "svg": Svg,
// "tabindex": Tabindex,
// "table": Table,
// "target": Target,
// "tbody": Tbody,
// "td": Td,
// "template": Template,
// "text": Text,
// "textarea": Textarea,
// "tfoot": Tfoot,
// "th": Th,
// "thead": Thead,
// "time": Time,
// "title": Title,
// "tr": Tr,
// "track": Track,
// "translate": Translate,
// "tt": Tt,
// "type": Type,
// "typeof": Typeof,
// "u": U,
// "ul": Ul,
// "usemap": Usemap,
// "value": Value,
// "var": Var,
// "video": Video,
// "vocab": Vocab,
// "wbr": Wbr,
// "width": Width,
// "wrap": Wrap,
// "xmlns": Xmlns,
// "xmp": Xmp,
//}
// String returns the text associated with the hash.
func (i Hash) String() string {
return string(i.Bytes())
}
// Bytes returns the text associated with the hash.
func (i Hash) Bytes() []byte {
start := uint32(i >> 8)
n := uint32(i & 0xff)
if start+n > uint32(len(_Hash_text)) {
return ""
return []byte{}
}
return _Hash_text[start : start+n]
}
// ToHash returns the hash whose name is s. It returns zero if there is no
// such hash. It is case sensitive.
// ToHash returns a hash Hash for a given []byte. Hash is a uint32 that is associated with the text in []byte. It returns zero if no match found.
func ToHash(s []byte) Hash {
if len(s) == 0 || len(s) > _Hash_maxLen {
return 0
}
//if 3 < len(s) {
// return HashMap[string(s)]
//}
h := uint32(_Hash_hash0)
for i := 0; i < len(s); i++ {
h ^= uint32(s[i])
@ -320,9 +593,11 @@ NEXT:
return 0
}
const _Hash_hash0 = 0x51243bbc
const _Hash_hash0 = 0x87d8a7d9
const _Hash_maxLen = 24
const _Hash_text = "aboutputbodyaccept-charsetfooterbasefontitleaccesskeyacronym" +
var _Hash_text = []byte("" +
"aboutputbodyaccept-charsetfooterbasefontitleaccesskeyacronym" +
"ainputmodeferowspanametabindexmlnsamp-boilerplateaddressandb" +
"oxmparamarkbdirubyasyncanvasidecodingaudiobjectrackindatalis" +
"tepatternavalueautocapitalizeautocompletemplateautofocusemap" +
@ -339,272 +614,272 @@ const _Hash_text = "aboutputbodyaccept-charsetfooterbasefontitleaccesskeyacronym
"mreferrerpolicyitemscopenitemtypematheaderspellcheckedmaxlen" +
"gth2meterminlength3multiplemutedprefixpreloadingprofileprogr" +
"essrclangstrikestrongstylesubdoptimumarqueesummarysuportalsv" +
"gvocabbrwbrwidth4wraposter"
"gvocabbrwbrwidth4wraposter")
var _Hash_table = [1 << 9]Hash{
0x0: 0x4405, // defer
0x5: 0x18002, // ol
0x6: 0x3720a, // spellcheck
0x7: 0x40b02, // h4
0x8: 0x40705, // width
0x9: 0x9402, // id
0xb: 0x14904, // nobr
0xc: 0x31d05, // small
0xf: 0x2b506, // hgroup
0x10: 0x27702, // th
0x15: 0x24f06, // center
0x18: 0xd10c, // autocomplete
0x1b: 0x2c304, // area
0x1e: 0x17f03, // col
0x1f: 0x2a106, // height
0x21: 0x4b04, // span
0x22: 0x37e03, // max
0x23: 0x3cf06, // strong
0x24: 0x501, // p
0x29: 0x24b06, // source
0x2c: 0x8e06, // canvas
0x2d: 0x2c09, // accesskey
0x2e: 0x18607, // picture
0x30: 0x3a403, // pre
0x31: 0x5d04, // samp
0x34: 0x40902, // dt
0x36: 0x30505, // sizes
0x37: 0x1a908, // nomodule
0x39: 0x2a504, // html
0x3a: 0x31203, // src
0x3c: 0x28d06, // dialog
0x3e: 0x3ab03, // rel
0x40: 0x1a06, // footer
0x43: 0x30d0b, // imagesrcset
0x46: 0x3c906, // strike
0x47: 0x2e805, // video
0x4a: 0x2d702, // hr
0x4b: 0x36108, // itemtype
0x4c: 0x1c804, // link
0x4e: 0x6702, // rp
0x4f: 0x2801, // i
0x50: 0xee06, // applet
0x51: 0x17f08, // colgroup
0x53: 0x1905, // tfoot
0x54: 0xc06, // accept
0x57: 0x14d04, // cite
0x58: 0x1307, // charset
0x59: 0x17604, // code
0x5a: 0x4e04, // name
0x5b: 0x2bf04, // text
0x5d: 0x31f05, // allow
0x5e: 0x36c04, // head
0x61: 0x16605, // embed
0x62: 0x3fa03, // svg
0x63: 0x3fd05, // vocab
0x64: 0x5e0f, // amp-boilerplate
0x65: 0x38805, // meter
0x67: 0x3320d, // popovertarget
0x69: 0x3b04, // main
0x6a: 0x41006, // poster
0x6c: 0x1c302, // dl
0x6e: 0x26006, // action
0x71: 0x17807, // default
0x72: 0x3d05, // input
0x74: 0xb202, // is
0x75: 0x27506, // method
0x79: 0x7903, // xmp
0x7a: 0x101, // b
0x7b: 0x21f06, // inlist
0x7c: 0x25c0a, // formaction
0x7e: 0x39708, // multiple
0x80: 0x1f203, // del
0x81: 0x26a07, // enctype
0x83: 0x27b0e, // formnovalidate
0x84: 0x2404, // font
0x85: 0x11d06, // typeof
0x86: 0x2d704, // href
0x87: 0x13a0a, // blockquote
0x88: 0x4807, // rowspan
0x89: 0x3aa07, // preload
0x8a: 0x12f03, // big
0x8c: 0x38d09, // minlength
0x90: 0x1bb05, // table
0x91: 0x39f05, // muted
0x92: 0x3e407, // marquee
0x94: 0x3507, // acronym
0x96: 0x40d04, // wrap
0x98: 0x14b02, // br
0x9a: 0x10b02, // rt
0x9e: 0xa602, // tr
0x9f: 0x35709, // itemscope
0xa4: 0xad04, // data
0xa5: 0x29706, // target
0xac: 0x11908, // datatype
0xae: 0xb304, // step
0xb3: 0x1cc08, // controls
0xb5: 0xbe05, // value
0xb6: 0x2ba09, // plaintext
0xb7: 0x1da09, // draggable
0xc0: 0x8a05, // async
0xc2: 0x2a804, // loop
0xc3: 0x28904, // time
0xc6: 0x2004, // base
0xc7: 0x23f06, // script
0xce: 0x32103, // low
0xcf: 0x3dc03, // bdo
0xd1: 0x18b03, // rev
0xd2: 0x1e306, // coords
0xd3: 0x8403, // dir
0xd4: 0x2f608, // menuitem
0xd6: 0x22507, // article
0xd8: 0x11d04, // type
0xda: 0x18b08, // reversed
0xdb: 0x23707, // caption
0xdc: 0x35d04, // open
0xdd: 0x1701, // s
0xe0: 0x2705, // title
0xe1: 0x9508, // decoding
0xe3: 0xc0e, // accept-charset
0xe4: 0x15a05, // class
0xe5: 0x3f203, // sup
0xe6: 0xdb08, // template
0xe7: 0x16c08, // noframes
0xe8: 0x3ad07, // loading
0xeb: 0xa106, // object
0xee: 0x3da03, // sub
0xef: 0x2fa06, // itemid
0xf0: 0x30904, // slot
0xf1: 0x8604, // ruby
0xf4: 0x1f102, // td
0xf5: 0x11208, // required
0xf9: 0x16e05, // frame
0xfc: 0x2102, // as
0xfd: 0x37e09, // maxlength
0xff: 0x31f0f, // allowfullscreen
0x101: 0x2160b, // crossorigin
0x102: 0xed03, // map
0x104: 0x6e02, // dd
0x105: 0x705, // tbody
0x107: 0x2d502, // h1
0x109: 0x5004, // meta
0x10a: 0x1, // a
0x10c: 0x16a03, // dfn
0x10e: 0x34507, // itemref
0x110: 0x38d03, // min
0x111: 0x28508, // datetime
0x114: 0xdc02, // em
0x115: 0x7f04, // mark
0x119: 0x2d708, // hreflang
0x11a: 0x3de07, // optimum
0x11c: 0x1220d, // fetchpriority
0x11d: 0x39502, // h3
0x11e: 0x5905, // xmlns
0x11f: 0x19903, // div
0x121: 0x40403, // wbr
0x128: 0x2bf08, // textarea
0x129: 0x3d505, // style
0x12a: 0x3f406, // portal
0x12b: 0x1b107, // content
0x12d: 0x19b03, // var
0x12f: 0x40004, // abbr
0x133: 0x31803, // img
0x138: 0x35b05, // scope
0x13b: 0x30504, // size
0x13e: 0x29f02, // h6
0x141: 0xfc08, // autoplay
0x142: 0x2c408, // readonly
0x143: 0x3d09, // inputmode
0x144: 0x19208, // disabled
0x145: 0x4804, // rows
0x149: 0x3490e, // referrerpolicy
0x14a: 0x1c405, // label
0x14b: 0x36c06, // header
0x14c: 0xad08, // datalist
0x14d: 0xe309, // autofocus
0x14e: 0xb607, // pattern
0x150: 0x2cc06, // hidden
0x151: 0x5, // about
0x152: 0x14406, // button
0x154: 0x2f206, // iframe
0x155: 0x1d308, // selected
0x156: 0x3c207, // srclang
0x15b: 0xb102, // li
0x15c: 0x22305, // start
0x15d: 0x7307, // sandbox
0x15e: 0x31b03, // ins
0x162: 0x1a307, // colspan
0x163: 0x1ff0e, // shadowrootmode
0x164: 0xb104, // list
0x166: 0x5208, // tabindex
0x169: 0x3b407, // profile
0x16b: 0x301, // u
0x16c: 0x23d08, // noscript
0x16e: 0x2660b, // formenctype
0x16f: 0x16e08, // frameset
0x170: 0x28b05, // media
0x174: 0x2008, // basefont
0x176: 0x2b104, // ping
0x177: 0x3bb08, // progress
0x178: 0x206, // output
0x17a: 0x36904, // math
0x17b: 0x2930a, // formtarget
0x17d: 0x7b05, // param
0x180: 0x13208, // blocking
0x185: 0x37707, // checked
0x188: 0x32e05, // ismap
0x18a: 0x38602, // h2
0x18c: 0x2df0a, // http-equiv
0x18e: 0x10d07, // capture
0x190: 0x2db04, // lang
0x195: 0x27f0a, // novalidate
0x197: 0x1a304, // cols
0x198: 0x804, // body
0x199: 0xbc03, // nav
0x19a: 0x1b10f, // contenteditable
0x19b: 0x15e07, // section
0x19e: 0x14e08, // itemprop
0x19f: 0x15208, // property
0x1a1: 0xc30e, // autocapitalize
0x1a4: 0x3eb07, // summary
0x1a6: 0x1000b, // playsinline
0x1a9: 0x8303, // bdi
0x1ab: 0x29d02, // h5
0x1ac: 0x6d07, // address
0x1b0: 0x2d204, // high
0x1b1: 0x33207, // popover
0x1b3: 0xa605, // track
0x1b6: 0x8203, // kbd
0x1b7: 0x11401, // q
0x1b8: 0x2340a, // figcaption
0x1b9: 0x30005, // image
0x1ba: 0x25c04, // form
0x1c1: 0x3000a, // imagesizes
0x1c4: 0x1e818, // shadowrootdelegatesfocus
0x1c5: 0x2ec06, // option
0x1c6: 0x9d05, // audio
0x1c8: 0x40102, // bb
0x1c9: 0x16407, // noembed
0x1cc: 0x10805, // inert
0x1cf: 0x1d306, // select
0x1d1: 0x22c08, // fieldset
0x1d2: 0x31206, // srcset
0x1d3: 0x2f604, // menu
0x1d5: 0x36c07, // headers
0x1dd: 0x1be06, // legend
0x1de: 0xaa04, // kind
0x1e0: 0x24908, // resource
0x1e2: 0xf309, // translate
0x1e4: 0x2aa08, // optgroup
0x1e6: 0x33213, // popovertargetaction
0x1e7: 0x2710a, // formmethod
0x1e9: 0xb802, // tt
0x1ea: 0x36b05, // thead
0x1eb: 0x17c02, // ul
0x1ee: 0x3a406, // prefix
0x1ef: 0x19e05, // color
0x1f1: 0x21105, // shape
0x1f3: 0x25c03, // for
0x1f4: 0x2500c, // enterkeyhint
0x1f7: 0xea06, // usemap
0x1f8: 0x1f02, // rb
0x1fa: 0x20b07, // details
0x1fb: 0x10b03, // rtc
0x1fc: 0x9205, // aside
0x1fe: 0x24506, // figure
0x3: 0xb304, // step
0x4: 0x2004, // base
0x5: 0xb607, // pattern
0x8: 0x8403, // dir
0xa: 0xe309, // autofocus
0xc: 0x3b04, // main
0xf: 0x2801, // i
0x10: 0x1, // a
0x12: 0x40004, // abbr
0x13: 0x40705, // width
0x15: 0x24506, // figure
0x16: 0x23f06, // script
0x17: 0x5e0f, // amp-boilerplate
0x18: 0x3d09, // inputmode
0x19: 0xb802, // tt
0x1c: 0x2d704, // href
0x1d: 0x22305, // start
0x21: 0x4807, // rowspan
0x23: 0x1e306, // coords
0x25: 0xb104, // list
0x28: 0x3fa03, // svg
0x29: 0x2d502, // h1
0x2a: 0x15a05, // class
0x2b: 0x2e805, // video
0x2c: 0x3490e, // referrerpolicy
0x2d: 0x2f608, // menuitem
0x2e: 0x38805, // meter
0x30: 0x17604, // code
0x33: 0x2c408, // readonly
0x35: 0x3c207, // srclang
0x37: 0x3320d, // popovertarget
0x39: 0x2db04, // lang
0x3a: 0x3a403, // pre
0x3d: 0x2f206, // iframe
0x3e: 0x1b107, // content
0x3f: 0x2fa06, // itemid
0x40: 0x27f0a, // novalidate
0x41: 0x1d306, // select
0x43: 0x3c906, // strike
0x44: 0x1a304, // cols
0x46: 0x36b05, // thead
0x48: 0x32103, // low
0x4b: 0x1000b, // playsinline
0x4d: 0x31206, // srcset
0x51: 0x1c405, // label
0x52: 0x3bb08, // progress
0x53: 0x6702, // rp
0x54: 0x19903, // div
0x55: 0xad08, // datalist
0x5b: 0x28d06, // dialog
0x5c: 0x5208, // tabindex
0x5d: 0x40d04, // wrap
0x61: 0x16e05, // frame
0x64: 0x3000a, // imagesizes
0x67: 0x6d07, // address
0x69: 0x3da03, // sub
0x6d: 0x4b04, // span
0x6f: 0x16a03, // dfn
0x70: 0xf309, // translate
0x71: 0x1f203, // del
0x72: 0x705, // tbody
0x74: 0x15208, // property
0x7b: 0x38d09, // minlength
0x7d: 0x2cc06, // hidden
0x7e: 0x18b03, // rev
0x7f: 0xdb08, // template
0x81: 0x20b07, // details
0x82: 0x8303, // bdi
0x86: 0x22507, // article
0x88: 0x2ec06, // option
0x89: 0x40902, // dt
0x8b: 0x31b03, // ins
0x8d: 0x18607, // picture
0x8f: 0x18b08, // reversed
0x92: 0x19b03, // var
0x93: 0xad04, // data
0x95: 0x8e06, // canvas
0x96: 0x7b05, // param
0x97: 0x3eb07, // summary
0x98: 0x15e07, // section
0x9a: 0x2c09, // accesskey
0x9b: 0x26006, // action
0x9c: 0x9402, // id
0x9e: 0x1701, // s
0x9f: 0x10b02, // rt
0xa0: 0x2c304, // area
0xa2: 0x3b407, // profile
0xa5: 0x31203, // src
0xa6: 0xea06, // usemap
0xa8: 0x1be06, // legend
0xa9: 0x8604, // ruby
0xaf: 0x26a07, // enctype
0xb0: 0x2a106, // height
0xb1: 0x2340a, // figcaption
0xb2: 0x3aa07, // preload
0xb4: 0x10b03, // rtc
0xb5: 0x40b02, // h4
0xb6: 0xa106, // object
0xb8: 0x3fd05, // vocab
0xb9: 0x19208, // disabled
0xba: 0x16605, // embed
0xbc: 0x9508, // decoding
0xc1: 0x2102, // as
0xc2: 0x14904, // nobr
0xc4: 0x16c08, // noframes
0xc5: 0x3507, // acronym
0xc6: 0x2930a, // formtarget
0xc7: 0x35b05, // scope
0xc8: 0x30504, // size
0xcb: 0x3ad07, // loading
0xcd: 0x17f03, // col
0xd0: 0x2a804, // loop
0xd1: 0x1307, // charset
0xd2: 0x1bb05, // table
0xd5: 0x3a406, // prefix
0xd6: 0x3de07, // optimum
0xd8: 0x24f06, // center
0xdb: 0xdc02, // em
0xdc: 0x2aa08, // optgroup
0xde: 0x40403, // wbr
0xe2: 0x3cf06, // strong
0xe6: 0xbe05, // value
0xe9: 0x14b02, // br
0xed: 0xee06, // applet
0xf0: 0x206, // output
0xf1: 0x22c08, // fieldset
0xfb: 0x14406, // button
0xfc: 0x30d0b, // imagesrcset
0xfd: 0xc06, // accept
0x100: 0x31d05, // small
0x102: 0x3f406, // portal
0x103: 0x8a05, // async
0x104: 0x11208, // required
0x105: 0x35d04, // open
0x107: 0xaa04, // kind
0x108: 0x33213, // popovertargetaction
0x109: 0x2a504, // html
0x10b: 0x501, // p
0x10c: 0x7f04, // mark
0x10d: 0x32e05, // ismap
0x10f: 0x1cc08, // controls
0x110: 0xa605, // track
0x112: 0x38d03, // min
0x113: 0x16407, // noembed
0x116: 0x21f06, // inlist
0x118: 0x1da09, // draggable
0x119: 0x14e08, // itemprop
0x11a: 0x1f02, // rb
0x11c: 0x17c02, // ul
0x11e: 0xa602, // tr
0x11f: 0x27702, // th
0x122: 0x29d02, // h5
0x126: 0x1905, // tfoot
0x127: 0x37e03, // max
0x129: 0x2d702, // hr
0x12b: 0x1ff0e, // shadowrootmode
0x12c: 0x29706, // target
0x12f: 0x3f203, // sup
0x134: 0x11d06, // typeof
0x136: 0x18002, // ol
0x137: 0x36c04, // head
0x138: 0x7307, // sandbox
0x13a: 0x2b506, // hgroup
0x13f: 0x5004, // meta
0x141: 0x5905, // xmlns
0x143: 0x38602, // h2
0x144: 0xc0e, // accept-charset
0x146: 0x2bf04, // text
0x147: 0x13a0a, // blockquote
0x149: 0x1f102, // td
0x14a: 0x37707, // checked
0x14d: 0x2b104, // ping
0x14e: 0x2f604, // menu
0x150: 0x5d04, // samp
0x151: 0x2008, // basefont
0x152: 0x2710a, // formmethod
0x155: 0xed03, // map
0x156: 0x27b0e, // formnovalidate
0x159: 0x6e02, // dd
0x15c: 0xc30e, // autocapitalize
0x15d: 0x2660b, // formenctype
0x15e: 0xbc03, // nav
0x161: 0x101, // b
0x163: 0x1a06, // footer
0x164: 0x24b06, // source
0x166: 0x35709, // itemscope
0x16a: 0x10d07, // capture
0x16c: 0x36c06, // header
0x16d: 0x1c804, // link
0x171: 0x2160b, // crossorigin
0x172: 0x4405, // defer
0x175: 0x2705, // title
0x177: 0x28b05, // media
0x178: 0x11401, // q
0x179: 0x21105, // shape
0x17c: 0x25c03, // for
0x17d: 0x30904, // slot
0x17e: 0x7903, // xmp
0x184: 0x2404, // font
0x187: 0x13208, // blocking
0x188: 0x8203, // kbd
0x18a: 0x1a908, // nomodule
0x18b: 0x4e04, // name
0x18f: 0x29f02, // h6
0x191: 0x31f05, // allow
0x194: 0x39708, // multiple
0x196: 0x30505, // sizes
0x199: 0x23707, // caption
0x19b: 0x34507, // itemref
0x19c: 0x19e05, // color
0x19f: 0x1220d, // fetchpriority
0x1a7: 0xd10c, // autocomplete
0x1a8: 0x1a307, // colspan
0x1aa: 0x16e08, // frameset
0x1ab: 0x31f0f, // allowfullscreen
0x1ac: 0x14d04, // cite
0x1ae: 0x3ab03, // rel
0x1b0: 0x39502, // h3
0x1b1: 0x25c0a, // formaction
0x1b3: 0x36904, // math
0x1b4: 0x39f05, // muted
0x1b5: 0x1e818, // shadowrootdelegatesfocus
0x1b6: 0x24908, // resource
0x1b9: 0x40102, // bb
0x1ba: 0x2df0a, // http-equiv
0x1be: 0x30005, // image
0x1bf: 0x2bf08, // textarea
0x1c1: 0x28904, // time
0x1c2: 0x5, // about
0x1c3: 0x25c04, // form
0x1c4: 0x301, // u
0x1c5: 0x41006, // poster
0x1c8: 0x1d308, // selected
0x1c9: 0x2d204, // high
0x1ca: 0x3d505, // style
0x1cc: 0x4804, // rows
0x1cd: 0x36c07, // headers
0x1cf: 0x3720a, // spellcheck
0x1d1: 0x11d04, // type
0x1d3: 0xfc08, // autoplay
0x1d4: 0x28508, // datetime
0x1d7: 0x9d05, // audio
0x1d9: 0xb202, // is
0x1de: 0x3dc03, // bdo
0x1df: 0x3d05, // input
0x1e0: 0x31803, // img
0x1e1: 0x11908, // datatype
0x1e2: 0x36108, // itemtype
0x1e3: 0x33207, // popover
0x1e4: 0x2ba09, // plaintext
0x1e6: 0x12f03, // big
0x1e9: 0x2500c, // enterkeyhint
0x1ea: 0x17807, // default
0x1ec: 0x27506, // method
0x1ed: 0x37e09, // maxlength
0x1f0: 0x2d708, // hreflang
0x1f1: 0x1c302, // dl
0x1f2: 0xb102, // li
0x1f4: 0x17f08, // colgroup
0x1f6: 0x1b10f, // contenteditable
0x1f7: 0x3e407, // marquee
0x1f9: 0x9205, // aside
0x1fa: 0x804, // body
0x1fb: 0x10805, // inert
0x1fd: 0x23d08, // noscript
}

View file

@ -23,6 +23,7 @@ var (
svgMimeBytes = []byte("image/svg+xml")
formMimeBytes = []byte("application/x-www-form-urlencoded")
mathMimeBytes = []byte("application/mathml+xml")
xmlMimeBytes = []byte("text/xml")
dataSchemeBytes = []byte("data:")
jsSchemeBytes = []byte("javascript:")
httpBytes = []byte("http")
@ -129,7 +130,7 @@ func (o *Minifier) Minify(m *minify.M, w io.Writer, r io.Reader, _ map[string]st
w.Write(t.Data)
}
}
case html.SvgToken:
case html.SVGToken:
if err := m.MinifyMimetype(svgMimeBytes, w, buffer.NewReader(t.Data), inlineParams); err != nil {
if err != minify.ErrNotExist {
return minify.UpdateErrorPosition(err, z, t.Offset)
@ -145,6 +146,14 @@ func (o *Minifier) Minify(m *minify.M, w io.Writer, r io.Reader, _ map[string]st
w.Write(t.Data)
}
omitSpace = false
case html.XMLToken:
if err := m.MinifyMimetype(xmlMimeBytes, w, buffer.NewReader(t.Data), nil); err != nil {
if err != minify.ErrNotExist {
return minify.UpdateErrorPosition(err, z, t.Offset)
}
w.Write(t.Data)
}
omitSpace = false
case html.TemplateToken:
w.Write(t.Data)
omitSpace = false
@ -199,7 +208,7 @@ func (o *Minifier) Minify(m *minify.M, w io.Writer, r io.Reader, _ map[string]st
} else if next.TokenType == html.TextToken && !parse.IsAllWhitespace(next.Data) || next.TokenType == html.TemplateToken {
// stop looking when text encountered
break
} else if next.TokenType == html.StartTagToken || next.TokenType == html.EndTagToken || next.TokenType == html.SvgToken || next.TokenType == html.MathToken {
} else if next.TokenType == html.StartTagToken || next.TokenType == html.EndTagToken || next.TokenType == html.SVGToken || next.TokenType == html.MathToken || next.TokenType == html.XMLToken {
if o.KeepWhitespace {
break
}
@ -208,7 +217,7 @@ func (o *Minifier) Minify(m *minify.M, w io.Writer, r io.Reader, _ map[string]st
t.Data = t.Data[:len(t.Data)-1]
omitSpace = false
break
} else if next.TokenType == html.StartTagToken || next.TokenType == html.SvgToken || next.TokenType == html.MathToken {
} else if next.TokenType == html.StartTagToken || next.TokenType == html.SVGToken || next.TokenType == html.MathToken || next.TokenType == html.XMLToken {
break
}
}

View file

@ -9,6 +9,9 @@ wget -q --show-progress https://github.com/tdewolff/minify/archive/v$VERSION.tar
SHA256=`sha256sum v$VERSION.tar.gz`
SHA256=( $SHA256 )
GOMODCACHE="$PWD"/go-mod go mod download -modcacherw -x
tar -caf minify-v$VERSION-deps.tar.xz go-mod
echo ""
echo "Releasing for AUR..."
cd /home/taco/dev/aur/minify

View file

@ -1,42 +1,61 @@
package html
// generated by hasher -type=Hash -file=hash.go; DO NOT EDIT, except for adding more constants to the list and rerun go generate
// uses github.com/tdewolff/hasher
//go:generate hasher -type=Hash -file=hash.go
// Hash defines perfect hashes for a predefined list of strings
type Hash uint32
// Unique hash definitions to be used instead of strings
// Identifiers for the hashes associated with the text in the comments.
const (
Iframe Hash = 0x6 // iframe
Math Hash = 0x604 // math
Plaintext Hash = 0x1e09 // plaintext
Plaintext Hash = 0x2109 // plaintext
Script Hash = 0xa06 // script
Style Hash = 0x1405 // style
Svg Hash = 0x1903 // svg
Textarea Hash = 0x2308 // textarea
Textarea Hash = 0x2608 // textarea
Title Hash = 0xf05 // title
Xmp Hash = 0x1c03 // xmp
Xml Hash = 0x1c03 // xml
Xmp Hash = 0x1f03 // xmp
)
// String returns the hash' name.
//var HashMap = map[string]Hash{
// "iframe": Iframe,
// "math": Math,
// "plaintext": Plaintext,
// "script": Script,
// "style": Style,
// "svg": Svg,
// "textarea": Textarea,
// "title": Title,
// "xml": Xml,
// "xmp": Xmp,
//}
// String returns the text associated with the hash.
func (i Hash) String() string {
return string(i.Bytes())
}
// Bytes returns the text associated with the hash.
func (i Hash) Bytes() []byte {
start := uint32(i >> 8)
n := uint32(i & 0xff)
if start+n > uint32(len(_Hash_text)) {
return ""
return []byte{}
}
return _Hash_text[start : start+n]
}
// ToHash returns the hash whose name is s. It returns zero if there is no
// such hash. It is case sensitive.
// ToHash returns a hash Hash for a given []byte. Hash is a uint32 that is associated with the text in []byte. It returns zero if no match found.
func ToHash(s []byte) Hash {
if len(s) == 0 || len(s) > _Hash_maxLen {
return 0
}
//if 3 < len(s) {
// return HashMap[string(s)]
//}
h := uint32(_Hash_hash0)
for i := 0; i < len(s); i++ {
h ^= uint32(s[i])
@ -64,18 +83,21 @@ NEXT:
return 0
}
const _Hash_hash0 = 0x9acb0442
const _Hash_hash0 = 0xb4b790b3
const _Hash_maxLen = 9
const _Hash_text = "iframemathscriptitlestylesvgxmplaintextarea"
var _Hash_text = []byte("" +
"iframemathscriptitlestylesvgxmlxmplaintextarea")
var _Hash_table = [1 << 4]Hash{
0x0: 0x2308, // textarea
0x2: 0x6, // iframe
0x4: 0xf05, // title
0x5: 0x1e09, // plaintext
0x7: 0x1405, // style
0x8: 0x604, // math
0x9: 0xa06, // script
0xa: 0x1903, // svg
0xb: 0x1c03, // xmp
0x2: 0xa06, // script
0x3: 0xf05, // title
0x4: 0x1405, // style
0x5: 0x604, // math
0x6: 0x6, // iframe
0x8: 0x1c03, // xml
0x9: 0x2608, // textarea
0xc: 0x1f03, // xmp
0xe: 0x2109, // plaintext
0xf: 0x1903, // svg
}

View file

@ -21,8 +21,9 @@ const (
EndTagToken
AttributeToken
TextToken
SvgToken
SVGToken
MathToken
XMLToken
TemplateToken
)
@ -47,10 +48,14 @@ func (tt TokenType) String() string {
return "Attribute"
case TextToken:
return "Text"
case SvgToken:
return "Svg"
case SVGToken:
return "SVG"
case MathToken:
return "Math"
case XMLToken:
return "XML"
case TemplateToken:
return "Template"
}
return "Invalid(" + strconv.Itoa(int(tt)) + ")"
}
@ -371,8 +376,8 @@ func (l *Lexer) shiftStartTag() (TokenType, []byte) {
l.r.Move(1)
}
l.text = parse.ToLower(l.r.Lexeme()[1:])
if h := ToHash(l.text); h == Textarea || h == Title || h == Style || h == Xmp || h == Iframe || h == Script || h == Plaintext || h == Svg || h == Math {
if h == Svg || h == Math {
if h := ToHash(l.text); h == Textarea || h == Title || h == Style || h == Xmp || h == Iframe || h == Script || h == Plaintext || h == Svg || h == Math || h == Xml {
if h == Svg || h == Math || h == Xml {
data := l.shiftXML(h)
if l.err != nil {
return ErrorToken, nil
@ -380,9 +385,11 @@ func (l *Lexer) shiftStartTag() (TokenType, []byte) {
l.inTag = false
if h == Svg {
return SvgToken, data
return SVGToken, data
} else if h == Math {
return MathToken, data
}
return MathToken, data
return XMLToken, data
}
l.rawTag = h
}

View file

@ -496,6 +496,7 @@ Extensions
- [goldmark-enclave](https://github.com/quailyquaily/goldmark-enclave): Adds support for embedding youtube/bilibili video, X's [oembed X](https://publish.x.com/), [tradingview chart](https://www.tradingview.com/widget/)'s chart, [quaily widget](https://quaily.com), [spotify embeds](https://developer.spotify.com/documentation/embeds), [dify embed](https://dify.ai/) and html audio into the document.
- [goldmark-wiki-table](https://github.com/movsb/goldmark-wiki-table): Adds support for embedding Wiki Tables.
- [goldmark-tgmd](https://github.com/Mad-Pixels/goldmark-tgmd): A Telegram markdown renderer that can be passed to `goldmark.WithRenderer()`.
- [goldmark-treeblood](https://github.com/Wyatt915/goldmark-treeblood): Renders $\LaTeX$ expressions as MathML (pure Go, no external dependencies).
### Loading extensions at runtime
[goldmark-dynamic](https://github.com/yuin/goldmark-dynamic) allows you to write a goldmark extension in Lua and load it at runtime without re-compilation.

View file

@ -89,10 +89,7 @@ func (b *fencedCodeBlockParser) Continue(node ast.Node, reader text.Reader, pc C
}
pos, padding := util.IndentPositionPadding(line, reader.LineOffset(), segment.Padding, fdata.indent)
if pos < 0 {
pos = util.FirstNonSpacePosition(line)
if pos < 0 {
pos = 0
}
pos = max(0, util.FirstNonSpacePosition(line)) - segment.Padding
padding = 0
}
seg := text.NewSegmentPadding(segment.Start+pos, segment.Stop, padding)