provide more details about a file on upload; update deps
This commit is contained in:
parent
5cdde922f6
commit
8af0bea527
43 changed files with 882 additions and 338 deletions
12
go.mod
12
go.mod
|
|
@ -11,7 +11,7 @@ require (
|
||||||
github.com/etkecc/go-fswatcher v1.0.1
|
github.com/etkecc/go-fswatcher v1.0.1
|
||||||
github.com/etkecc/go-healthchecks/v2 v2.2.2
|
github.com/etkecc/go-healthchecks/v2 v2.2.2
|
||||||
github.com/etkecc/go-kit v1.7.5
|
github.com/etkecc/go-kit v1.7.5
|
||||||
github.com/etkecc/go-linkpearl v0.0.0-20250916123206-78ebb36aa071
|
github.com/etkecc/go-linkpearl v0.0.0-20251009114554-5985fe44a189
|
||||||
github.com/etkecc/go-mxidwc v1.0.1
|
github.com/etkecc/go-mxidwc v1.0.1
|
||||||
github.com/etkecc/go-secgen v1.4.0
|
github.com/etkecc/go-secgen v1.4.0
|
||||||
github.com/etkecc/go-validator/v2 v2.2.6
|
github.com/etkecc/go-validator/v2 v2.2.6
|
||||||
|
|
@ -58,7 +58,7 @@ require (
|
||||||
github.com/mattn/go-runewidth v0.0.19 // indirect
|
github.com/mattn/go-runewidth v0.0.19 // indirect
|
||||||
github.com/mattn/go-sqlite3 v1.14.32 // indirect
|
github.com/mattn/go-sqlite3 v1.14.32 // indirect
|
||||||
github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a // indirect
|
github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a // indirect
|
||||||
github.com/ncruces/go-strftime v0.1.9 // indirect
|
github.com/ncruces/go-strftime v1.0.0 // indirect
|
||||||
github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 // indirect
|
github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 // indirect
|
||||||
github.com/olekukonko/errors v1.1.0 // indirect
|
github.com/olekukonko/errors v1.1.0 // indirect
|
||||||
github.com/olekukonko/ll v0.1.1 // indirect
|
github.com/olekukonko/ll v0.1.1 // indirect
|
||||||
|
|
@ -74,10 +74,10 @@ require (
|
||||||
github.com/tidwall/sjson v1.2.5 // indirect
|
github.com/tidwall/sjson v1.2.5 // indirect
|
||||||
github.com/yuin/goldmark v1.7.13 // indirect
|
github.com/yuin/goldmark v1.7.13 // indirect
|
||||||
go.mau.fi/util v0.9.1 // indirect
|
go.mau.fi/util v0.9.1 // indirect
|
||||||
golang.org/x/crypto v0.42.0 // indirect
|
golang.org/x/crypto v0.43.0 // indirect
|
||||||
golang.org/x/net v0.44.0 // indirect
|
golang.org/x/net v0.46.0 // indirect
|
||||||
golang.org/x/sys v0.36.0 // indirect
|
golang.org/x/sys v0.37.0 // indirect
|
||||||
golang.org/x/text v0.29.0 // indirect
|
golang.org/x/text v0.30.0 // indirect
|
||||||
golang.org/x/tools v0.37.0 // indirect
|
golang.org/x/tools v0.37.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
modernc.org/libc v1.66.10 // indirect
|
modernc.org/libc v1.66.10 // indirect
|
||||||
|
|
|
||||||
28
go.sum
28
go.sum
|
|
@ -39,8 +39,8 @@ github.com/etkecc/go-healthchecks/v2 v2.2.2 h1:YV7e+Ga8JY3aZX4Qf6Q1Ca+DnqbT5Drjl
|
||||||
github.com/etkecc/go-healthchecks/v2 v2.2.2/go.mod h1:IowWGN4F6By6z0eh63+639OscylgtdvT9ITjfN6hnZA=
|
github.com/etkecc/go-healthchecks/v2 v2.2.2/go.mod h1:IowWGN4F6By6z0eh63+639OscylgtdvT9ITjfN6hnZA=
|
||||||
github.com/etkecc/go-kit v1.7.5 h1:DbHTbJ69Jnt2d8mjOyKA9f2ARxvi8xgnYgVMlMZd3gI=
|
github.com/etkecc/go-kit v1.7.5 h1:DbHTbJ69Jnt2d8mjOyKA9f2ARxvi8xgnYgVMlMZd3gI=
|
||||||
github.com/etkecc/go-kit v1.7.5/go.mod h1:ZFeQrvlMIV6OeZ4XJ090kkyNYRRN4+5wcg1vjnOKEGI=
|
github.com/etkecc/go-kit v1.7.5/go.mod h1:ZFeQrvlMIV6OeZ4XJ090kkyNYRRN4+5wcg1vjnOKEGI=
|
||||||
github.com/etkecc/go-linkpearl v0.0.0-20250916123206-78ebb36aa071 h1:wcvjEg8togYMrICjibOrmt0ShBKM2vpwO3Tnt3uxq88=
|
github.com/etkecc/go-linkpearl v0.0.0-20251009114554-5985fe44a189 h1:isSNC9AsMdUMlnE9tVdTk/DRSNOQx2RvLhKxH3GnpXg=
|
||||||
github.com/etkecc/go-linkpearl v0.0.0-20250916123206-78ebb36aa071/go.mod h1:pTOgDOHhro5wOzu1pUYLJMCeyH4CEhijj6tohY5Q2H4=
|
github.com/etkecc/go-linkpearl v0.0.0-20251009114554-5985fe44a189/go.mod h1:ua01SU6PcE7NtTT5d1wFRUcrqcA5RWbvo9yRLu4LKCA=
|
||||||
github.com/etkecc/go-mxidwc v1.0.1 h1:t4Kq3FxSlQjt1i7RpzE5q3cOWjJ0vrTzzGZRSpgh8mg=
|
github.com/etkecc/go-mxidwc v1.0.1 h1:t4Kq3FxSlQjt1i7RpzE5q3cOWjJ0vrTzzGZRSpgh8mg=
|
||||||
github.com/etkecc/go-mxidwc v1.0.1/go.mod h1:WFlntcH4mdual/gNi6X7a6rSJERNuLjdrwM3K/tucQA=
|
github.com/etkecc/go-mxidwc v1.0.1/go.mod h1:WFlntcH4mdual/gNi6X7a6rSJERNuLjdrwM3K/tucQA=
|
||||||
github.com/etkecc/go-secgen v1.4.0 h1:PapLpen3aIqG2LDu+U6KWDb4SMW2UGuvetpJjd86yUc=
|
github.com/etkecc/go-secgen v1.4.0 h1:PapLpen3aIqG2LDu+U6KWDb4SMW2UGuvetpJjd86yUc=
|
||||||
|
|
@ -121,8 +121,8 @@ github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a h1:eU8j/ClY2Ty3qd
|
||||||
github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ=
|
github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ=
|
||||||
github.com/mileusna/crontab v1.2.0 h1:x9ZmE2A4p6CDqMEGQ+GbqsNtnmbdmWMQYShdQu8LvrU=
|
github.com/mileusna/crontab v1.2.0 h1:x9ZmE2A4p6CDqMEGQ+GbqsNtnmbdmWMQYShdQu8LvrU=
|
||||||
github.com/mileusna/crontab v1.2.0/go.mod h1:dbns64w/u3tUnGZGf8pAa76ZqOfeBX4olW4U1ZwExmc=
|
github.com/mileusna/crontab v1.2.0/go.mod h1:dbns64w/u3tUnGZGf8pAa76ZqOfeBX4olW4U1ZwExmc=
|
||||||
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
|
github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w=
|
||||||
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
|
github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
|
||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 h1:zrbMGy9YXpIeTnGj4EljqMiZsIcE09mmF8XsD5AYOJc=
|
github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 h1:zrbMGy9YXpIeTnGj4EljqMiZsIcE09mmF8XsD5AYOJc=
|
||||||
github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6/go.mod h1:rEKTHC9roVVicUIfZK7DYrdIoM0EOr8mK1Hj5s3JjH0=
|
github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6/go.mod h1:rEKTHC9roVVicUIfZK7DYrdIoM0EOr8mK1Hj5s3JjH0=
|
||||||
|
|
@ -177,16 +177,16 @@ go.mau.fi/util v0.9.1 h1:A+XKHRsjKkFi2qOm4RriR1HqY2hoOXNS3WFHaC89r2Y=
|
||||||
go.mau.fi/util v0.9.1/go.mod h1:M0bM9SyaOWJniaHs9hxEzz91r5ql6gYq6o1q5O1SsjQ=
|
go.mau.fi/util v0.9.1/go.mod h1:M0bM9SyaOWJniaHs9hxEzz91r5ql6gYq6o1q5O1SsjQ=
|
||||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||||
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
|
golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
|
||||||
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
|
golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
|
||||||
golang.org/x/exp v0.0.0-20251002181428-27f1f14c8bb9 h1:TQwNpfvNkxAVlItJf6Cr5JTsVZoC/Sj7K3OZv2Pc14A=
|
golang.org/x/exp v0.0.0-20251002181428-27f1f14c8bb9 h1:TQwNpfvNkxAVlItJf6Cr5JTsVZoC/Sj7K3OZv2Pc14A=
|
||||||
golang.org/x/exp v0.0.0-20251002181428-27f1f14c8bb9/go.mod h1:TwQYMMnGpvZyc+JpB/UAuTNIsVJifOlSkrZkhcvpVUk=
|
golang.org/x/exp v0.0.0-20251002181428-27f1f14c8bb9/go.mod h1:TwQYMMnGpvZyc+JpB/UAuTNIsVJifOlSkrZkhcvpVUk=
|
||||||
golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U=
|
golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U=
|
||||||
golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI=
|
golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI=
|
||||||
golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
|
golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
|
||||||
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
|
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
|
||||||
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
|
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
|
||||||
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
|
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
|
||||||
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
|
@ -194,15 +194,15 @@ golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
|
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
|
||||||
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ=
|
golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q=
|
||||||
golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA=
|
golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss=
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
|
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
|
||||||
golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
|
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE=
|
golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE=
|
||||||
golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w=
|
golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w=
|
||||||
|
|
|
||||||
9
vendor/github.com/etkecc/go-linkpearl/send.go
generated
vendored
9
vendor/github.com/etkecc/go-linkpearl/send.go
generated
vendored
|
|
@ -104,8 +104,13 @@ func (l *Linkpearl) SendFile(ctx context.Context, roomID id.RoomID, req *mautrix
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
content := &event.MessageEventContent{
|
content := &event.MessageEventContent{
|
||||||
MsgType: msgtype,
|
MsgType: msgtype,
|
||||||
Body: req.FileName,
|
Body: req.FileName,
|
||||||
|
FileName: req.FileName,
|
||||||
|
Info: &event.FileInfo{
|
||||||
|
Size: int(req.ContentLength),
|
||||||
|
MimeType: req.ContentType,
|
||||||
|
},
|
||||||
URL: resp.ContentURI.CUString(),
|
URL: resp.ContentURI.CUString(),
|
||||||
RelatesTo: relation,
|
RelatesTo: relation,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
150
vendor/github.com/ncruces/go-strftime/pkg.go
generated
vendored
150
vendor/github.com/ncruces/go-strftime/pkg.go
generated
vendored
|
|
@ -1,96 +1,96 @@
|
||||||
/*
|
/*
|
||||||
Package strftime provides strftime/strptime compatible time formatting and parsing.
|
Package strftime provides strftime/strptime compatible time formatting and parsing.
|
||||||
|
|
||||||
The following specifiers are available:
|
The following formatting specifiers are available:
|
||||||
|
|
||||||
Date (Year, Month, Day):
|
Date (Year, Month, Day):
|
||||||
%Y - Year with century (can be negative, 4 digits at least)
|
%Y - Year with century (can be negative, 4 digits at least)
|
||||||
-0001, 0000, 1995, 2009, 14292, etc.
|
-0001, 0000, 1995, 2009, 14292, etc.
|
||||||
%C - year / 100 (round down, 20 in 2009)
|
%C - year / 100 (round down, 20 in 2009)
|
||||||
%y - year % 100 (00..99)
|
%y - year % 100 (00..99)
|
||||||
|
|
||||||
%m - Month of the year, zero-padded (01..12)
|
%m - Month of the year, zero-padded (01..12)
|
||||||
%-m no-padded (1..12)
|
%-m no-padded (1..12)
|
||||||
%B - Full month name (January)
|
%B - Full month name (January)
|
||||||
%b - Abbreviated month name (Jan)
|
%b - Abbreviated month name (Jan)
|
||||||
%h - Equivalent to %b
|
%h - Equivalent to %b
|
||||||
|
|
||||||
%d - Day of the month, zero-padded (01..31)
|
%d - Day of the month, zero-padded (01..31)
|
||||||
%-d no-padded (1..31)
|
%-d no-padded (1..31)
|
||||||
%e - Day of the month, blank-padded ( 1..31)
|
%e - Day of the month, blank-padded ( 1..31)
|
||||||
|
|
||||||
%j - Day of the year (001..366)
|
%j - Day of the year (001..366)
|
||||||
%-j no-padded (1..366)
|
%-j no-padded (1..366)
|
||||||
|
|
||||||
Time (Hour, Minute, Second, Subsecond):
|
Time (Hour, Minute, Second, Subsecond):
|
||||||
%H - Hour of the day, 24-hour clock, zero-padded (00..23)
|
%H - Hour of the day, 24-hour clock, zero-padded (00..23)
|
||||||
%-H no-padded (0..23)
|
%-H no-padded (0..23)
|
||||||
%k - Hour of the day, 24-hour clock, blank-padded ( 0..23)
|
%k - Hour of the day, 24-hour clock, blank-padded ( 0..23)
|
||||||
%I - Hour of the day, 12-hour clock, zero-padded (01..12)
|
%I - Hour of the day, 12-hour clock, zero-padded (01..12)
|
||||||
%-I no-padded (1..12)
|
%-I no-padded (1..12)
|
||||||
%l - Hour of the day, 12-hour clock, blank-padded ( 1..12)
|
%l - Hour of the day, 12-hour clock, blank-padded ( 1..12)
|
||||||
%P - Meridian indicator, lowercase (am or pm)
|
%P - Meridian indicator, lowercase (am or pm)
|
||||||
%p - Meridian indicator, uppercase (AM or PM)
|
%p - Meridian indicator, uppercase (AM or PM)
|
||||||
|
|
||||||
%M - Minute of the hour (00..59)
|
%M - Minute of the hour (00..59)
|
||||||
%-M no-padded (0..59)
|
%-M no-padded (0..59)
|
||||||
|
|
||||||
%S - Second of the minute (00..60)
|
%S - Second of the minute (00..60)
|
||||||
%-S no-padded (0..60)
|
%-S no-padded (0..60)
|
||||||
|
|
||||||
%L - Millisecond of the second (000..999)
|
%L - Millisecond of the second (000..999)
|
||||||
%f - Microsecond of the second (000000..999999)
|
%f - Microsecond of the second (000000..999999)
|
||||||
%N - Nanosecond of the second (000000000..999999999)
|
%N - Nanosecond of the second (000000000..999999999)
|
||||||
|
|
||||||
Time zone:
|
Time zone:
|
||||||
%z - Time zone as hour and minute offset from UTC (e.g. +0900)
|
%z - Time zone as hour and minute offset from UTC (e.g. +0900)
|
||||||
%:z - hour and minute offset from UTC with a colon (e.g. +09:00)
|
%:z - hour and minute offset from UTC with a colon (e.g. +09:00)
|
||||||
%Z - Time zone abbreviation (e.g. MST)
|
%Z - Time zone abbreviation (e.g. MST)
|
||||||
|
|
||||||
Weekday:
|
Weekday:
|
||||||
%A - Full weekday name (Sunday)
|
%A - Full weekday name (Sunday)
|
||||||
%a - Abbreviated weekday name (Sun)
|
%a - Abbreviated weekday name (Sun)
|
||||||
%u - Day of the week (Monday is 1, 1..7)
|
%u - Day of the week (Monday is 1, 1..7)
|
||||||
%w - Day of the week (Sunday is 0, 0..6)
|
%w - Day of the week (Sunday is 0, 0..6)
|
||||||
|
|
||||||
ISO 8601 week-based year and week number:
|
ISO 8601 week-based year and week number:
|
||||||
Week 1 of YYYY starts with a Monday and includes YYYY-01-04.
|
Week 1 of YYYY starts with a Monday and includes YYYY-01-04.
|
||||||
The days in the year before the first week are in the last week of
|
The days in the year before the first week are in the last week of
|
||||||
the previous year.
|
the previous year.
|
||||||
%G - Week-based year
|
%G - Week-based year
|
||||||
%g - Last 2 digits of the week-based year (00..99)
|
%g - Last 2 digits of the week-based year (00..99)
|
||||||
%V - Week number of the week-based year (01..53)
|
%V - Week number of the week-based year (01..53)
|
||||||
%-V no-padded (1..53)
|
%-V no-padded (1..53)
|
||||||
|
|
||||||
Week number:
|
Week number:
|
||||||
Week 1 of YYYY starts with a Sunday or Monday (according to %U or %W).
|
Week 1 of YYYY starts with a Sunday or Monday (according to %U or %W).
|
||||||
The days in the year before the first week are in week 0.
|
The days in the year before the first week are in week 0.
|
||||||
%U - Week number of the year. The week starts with Sunday. (00..53)
|
%U - Week number of the year. The week starts with Sunday. (00..53)
|
||||||
%-U no-padded (0..53)
|
%-U no-padded (0..53)
|
||||||
%W - Week number of the year. The week starts with Monday. (00..53)
|
%W - Week number of the year. The week starts with Monday. (00..53)
|
||||||
%-W no-padded (0..53)
|
%-W no-padded (0..53)
|
||||||
|
|
||||||
Seconds since the Unix Epoch:
|
Seconds since the Unix Epoch:
|
||||||
%s - Number of seconds since 1970-01-01 00:00:00 UTC.
|
%s - Number of seconds since 1970-01-01 00:00:00 UTC.
|
||||||
%Q - Number of milliseconds since 1970-01-01 00:00:00 UTC.
|
%Q - Number of milliseconds since 1970-01-01 00:00:00 UTC.
|
||||||
|
|
||||||
Literal string:
|
Literal string:
|
||||||
%n - Newline character (\n)
|
%n - Newline character (\n)
|
||||||
%t - Tab character (\t)
|
%t - Tab character (\t)
|
||||||
%% - Literal % character
|
%% - Literal % character
|
||||||
|
|
||||||
Combination:
|
Combination:
|
||||||
%c - date and time (%a %b %e %T %Y)
|
%c - date and time (%a %b %e %T %Y)
|
||||||
%D - Date (%m/%d/%y)
|
%D - Date (%m/%d/%y)
|
||||||
%F - ISO 8601 date format (%Y-%m-%d)
|
%F - ISO 8601 date format (%Y-%m-%d)
|
||||||
%v - VMS date (%e-%b-%Y)
|
%v - VMS date (%e-%b-%Y)
|
||||||
%x - Same as %D
|
%x - Same as %D
|
||||||
%X - Same as %T
|
%X - Same as %T
|
||||||
%r - 12-hour time (%I:%M:%S %p)
|
%r - 12-hour time (%I:%M:%S %p)
|
||||||
%R - 24-hour time (%H:%M)
|
%R - 24-hour time (%H:%M)
|
||||||
%T - 24-hour time (%H:%M:%S)
|
%T - 24-hour time (%H:%M:%S)
|
||||||
%+ - date(1) (%a %b %e %H:%M:%S %Z %Y)
|
%+ - date(1) (%a %b %e %H:%M:%S %Z %Y)
|
||||||
|
|
||||||
The modifiers ``E'' and ``O'' are ignored.
|
The modifiers “E” and “O” are ignored.
|
||||||
*/
|
*/
|
||||||
package strftime
|
package strftime
|
||||||
|
|
|
||||||
22
vendor/github.com/ncruces/go-strftime/strftime.go
generated
vendored
22
vendor/github.com/ncruces/go-strftime/strftime.go
generated
vendored
|
|
@ -146,6 +146,15 @@ func AppendFormat(dst []byte, fmt string, t time.Time) []byte {
|
||||||
|
|
||||||
// Parse converts a textual representation of time to the time value it represents
|
// Parse converts a textual representation of time to the time value it represents
|
||||||
// according to the strptime format specification.
|
// according to the strptime format specification.
|
||||||
|
//
|
||||||
|
// The following specifiers are not supported for parsing:
|
||||||
|
//
|
||||||
|
// %g %k %l %s %u %w %C %G %Q %U %V %W
|
||||||
|
//
|
||||||
|
// You must also avoid digits and these letter sequences
|
||||||
|
// in fmt literals:
|
||||||
|
//
|
||||||
|
// Jan Mon MST PM pm
|
||||||
func Parse(fmt, value string) (time.Time, error) {
|
func Parse(fmt, value string) (time.Time, error) {
|
||||||
pattern, err := layout(fmt, true)
|
pattern, err := layout(fmt, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -156,6 +165,15 @@ func Parse(fmt, value string) (time.Time, error) {
|
||||||
|
|
||||||
// Layout converts a strftime format specification
|
// Layout converts a strftime format specification
|
||||||
// to a Go time pattern specification.
|
// to a Go time pattern specification.
|
||||||
|
//
|
||||||
|
// The following specifiers are not supported by Go patterns:
|
||||||
|
//
|
||||||
|
// %f %g %k %l %s %u %w %C %G %L %N %Q %U %V %W
|
||||||
|
//
|
||||||
|
// You must also avoid digits and these letter sequences
|
||||||
|
// in fmt literals:
|
||||||
|
//
|
||||||
|
// Jan Mon MST PM pm
|
||||||
func Layout(fmt string) (string, error) {
|
func Layout(fmt string) (string, error) {
|
||||||
return layout(fmt, false)
|
return layout(fmt, false)
|
||||||
}
|
}
|
||||||
|
|
@ -220,6 +238,10 @@ func layout(fmt string, parsing bool) (string, error) {
|
||||||
|
|
||||||
// UTS35 converts a strftime format specification
|
// UTS35 converts a strftime format specification
|
||||||
// to a Unicode Technical Standard #35 Date Format Pattern.
|
// to a Unicode Technical Standard #35 Date Format Pattern.
|
||||||
|
//
|
||||||
|
// The following specifiers are not supported by UTS35:
|
||||||
|
//
|
||||||
|
// %e %k %l %u %w %C %P %U %W
|
||||||
func UTS35(fmt string) (string, error) {
|
func UTS35(fmt string) (string, error) {
|
||||||
const quote = '\''
|
const quote = '\''
|
||||||
var quoted bool
|
var quoted bool
|
||||||
|
|
|
||||||
11
vendor/golang.org/x/crypto/curve25519/curve25519.go
generated
vendored
11
vendor/golang.org/x/crypto/curve25519/curve25519.go
generated
vendored
|
|
@ -3,11 +3,14 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// Package curve25519 provides an implementation of the X25519 function, which
|
// Package curve25519 provides an implementation of the X25519 function, which
|
||||||
// performs scalar multiplication on the elliptic curve known as Curve25519.
|
// performs scalar multiplication on the elliptic curve known as Curve25519
|
||||||
// See RFC 7748.
|
// according to [RFC 7748].
|
||||||
//
|
//
|
||||||
// This package is a wrapper for the X25519 implementation
|
// The curve25519 package is a wrapper for the X25519 implementation in the
|
||||||
// in the crypto/ecdh package.
|
// crypto/ecdh package. It is [frozen] and is not accepting new features.
|
||||||
|
//
|
||||||
|
// [RFC 7748]: https://datatracker.ietf.org/doc/html/rfc7748
|
||||||
|
// [frozen]: https://go.dev/wiki/Frozen
|
||||||
package curve25519
|
package curve25519
|
||||||
|
|
||||||
import "crypto/ecdh"
|
import "crypto/ecdh"
|
||||||
|
|
|
||||||
11
vendor/golang.org/x/crypto/ed25519/ed25519.go
generated
vendored
11
vendor/golang.org/x/crypto/ed25519/ed25519.go
generated
vendored
|
|
@ -2,16 +2,19 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// Package ed25519 implements the Ed25519 signature algorithm. See
|
// Package ed25519 implements the Ed25519 signature algorithm.
|
||||||
// https://ed25519.cr.yp.to/.
|
|
||||||
//
|
//
|
||||||
// These functions are also compatible with the “Ed25519” function defined in
|
// These functions are also compatible with the “Ed25519” function defined in
|
||||||
// RFC 8032. However, unlike RFC 8032's formulation, this package's private key
|
// [RFC 8032]. However, unlike RFC 8032's formulation, this package's private key
|
||||||
// representation includes a public key suffix to make multiple signing
|
// representation includes a public key suffix to make multiple signing
|
||||||
// operations with the same key more efficient. This package refers to the RFC
|
// operations with the same key more efficient. This package refers to the RFC
|
||||||
// 8032 private key as the “seed”.
|
// 8032 private key as the “seed”.
|
||||||
//
|
//
|
||||||
// This package is a wrapper around the standard library crypto/ed25519 package.
|
// The ed25519 package is a wrapper for the Ed25519 implementation in the
|
||||||
|
// crypto/ed25519 package. It is [frozen] and is not accepting new features.
|
||||||
|
//
|
||||||
|
// [RFC 8032]: https://datatracker.ietf.org/doc/html/rfc8032
|
||||||
|
// [frozen]: https://go.dev/wiki/Frozen
|
||||||
package ed25519
|
package ed25519
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
||||||
56
vendor/golang.org/x/crypto/ssh/cipher.go
generated
vendored
56
vendor/golang.org/x/crypto/ssh/cipher.go
generated
vendored
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"crypto/aes"
|
"crypto/aes"
|
||||||
"crypto/cipher"
|
"crypto/cipher"
|
||||||
"crypto/des"
|
"crypto/des"
|
||||||
|
"crypto/fips140"
|
||||||
"crypto/rc4"
|
"crypto/rc4"
|
||||||
"crypto/subtle"
|
"crypto/subtle"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
|
@ -15,6 +16,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"hash"
|
"hash"
|
||||||
"io"
|
"io"
|
||||||
|
"slices"
|
||||||
|
|
||||||
"golang.org/x/crypto/chacha20"
|
"golang.org/x/crypto/chacha20"
|
||||||
"golang.org/x/crypto/internal/poly1305"
|
"golang.org/x/crypto/internal/poly1305"
|
||||||
|
|
@ -93,41 +95,41 @@ func streamCipherMode(skip int, createFunc func(key, iv []byte) (cipher.Stream,
|
||||||
}
|
}
|
||||||
|
|
||||||
// cipherModes documents properties of supported ciphers. Ciphers not included
|
// cipherModes documents properties of supported ciphers. Ciphers not included
|
||||||
// are not supported and will not be negotiated, even if explicitly requested in
|
// are not supported and will not be negotiated, even if explicitly configured.
|
||||||
// ClientConfig.Crypto.Ciphers.
|
// When FIPS mode is enabled, only FIPS-approved algorithms are included.
|
||||||
var cipherModes = map[string]*cipherMode{
|
var cipherModes = map[string]*cipherMode{}
|
||||||
// Ciphers from RFC 4344, which introduced many CTR-based ciphers. Algorithms
|
|
||||||
// are defined in the order specified in the RFC.
|
|
||||||
CipherAES128CTR: {16, aes.BlockSize, streamCipherMode(0, newAESCTR)},
|
|
||||||
CipherAES192CTR: {24, aes.BlockSize, streamCipherMode(0, newAESCTR)},
|
|
||||||
CipherAES256CTR: {32, aes.BlockSize, streamCipherMode(0, newAESCTR)},
|
|
||||||
|
|
||||||
// Ciphers from RFC 4345, which introduces security-improved arcfour ciphers.
|
func init() {
|
||||||
// They are defined in the order specified in the RFC.
|
cipherModes[CipherAES128CTR] = &cipherMode{16, aes.BlockSize, streamCipherMode(0, newAESCTR)}
|
||||||
InsecureCipherRC4128: {16, 0, streamCipherMode(1536, newRC4)},
|
cipherModes[CipherAES192CTR] = &cipherMode{24, aes.BlockSize, streamCipherMode(0, newAESCTR)}
|
||||||
InsecureCipherRC4256: {32, 0, streamCipherMode(1536, newRC4)},
|
cipherModes[CipherAES256CTR] = &cipherMode{32, aes.BlockSize, streamCipherMode(0, newAESCTR)}
|
||||||
|
// Use of GCM with arbitrary IVs is not allowed in FIPS 140-only mode,
|
||||||
|
// we'll wire it up to NewGCMForSSH in Go 1.26.
|
||||||
|
//
|
||||||
|
// For now it means we'll work with fips140=on but not fips140=only.
|
||||||
|
cipherModes[CipherAES128GCM] = &cipherMode{16, 12, newGCMCipher}
|
||||||
|
cipherModes[CipherAES256GCM] = &cipherMode{32, 12, newGCMCipher}
|
||||||
|
|
||||||
// Cipher defined in RFC 4253, which describes SSH Transport Layer Protocol.
|
if fips140.Enabled() {
|
||||||
// Note that this cipher is not safe, as stated in RFC 4253: "Arcfour (and
|
defaultCiphers = slices.DeleteFunc(defaultCiphers, func(algo string) bool {
|
||||||
// RC4) has problems with weak keys, and should be used with caution."
|
_, ok := cipherModes[algo]
|
||||||
// RFC 4345 introduces improved versions of Arcfour.
|
return !ok
|
||||||
InsecureCipherRC4: {16, 0, streamCipherMode(0, newRC4)},
|
})
|
||||||
|
return
|
||||||
// AEAD ciphers
|
}
|
||||||
CipherAES128GCM: {16, 12, newGCMCipher},
|
|
||||||
CipherAES256GCM: {32, 12, newGCMCipher},
|
|
||||||
CipherChaCha20Poly1305: {64, 0, newChaCha20Cipher},
|
|
||||||
|
|
||||||
|
cipherModes[CipherChaCha20Poly1305] = &cipherMode{64, 0, newChaCha20Cipher}
|
||||||
|
// Insecure ciphers not included in the default configuration.
|
||||||
|
cipherModes[InsecureCipherRC4128] = &cipherMode{16, 0, streamCipherMode(1536, newRC4)}
|
||||||
|
cipherModes[InsecureCipherRC4256] = &cipherMode{32, 0, streamCipherMode(1536, newRC4)}
|
||||||
|
cipherModes[InsecureCipherRC4] = &cipherMode{16, 0, streamCipherMode(0, newRC4)}
|
||||||
// CBC mode is insecure and so is not included in the default config.
|
// CBC mode is insecure and so is not included in the default config.
|
||||||
// (See https://www.ieee-security.org/TC/SP2013/papers/4977a526.pdf). If absolutely
|
// (See https://www.ieee-security.org/TC/SP2013/papers/4977a526.pdf). If absolutely
|
||||||
// needed, it's possible to specify a custom Config to enable it.
|
// needed, it's possible to specify a custom Config to enable it.
|
||||||
// You should expect that an active attacker can recover plaintext if
|
// You should expect that an active attacker can recover plaintext if
|
||||||
// you do.
|
// you do.
|
||||||
InsecureCipherAES128CBC: {16, aes.BlockSize, newAESCBCCipher},
|
cipherModes[InsecureCipherAES128CBC] = &cipherMode{16, aes.BlockSize, newAESCBCCipher}
|
||||||
|
cipherModes[InsecureCipherTripleDESCBC] = &cipherMode{24, des.BlockSize, newTripleDESCBCCipher}
|
||||||
// 3des-cbc is insecure and is not included in the default
|
|
||||||
// config.
|
|
||||||
InsecureCipherTripleDESCBC: {24, des.BlockSize, newTripleDESCBCCipher},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// prefixLen is the length of the packet prefix that contains the packet length
|
// prefixLen is the length of the packet prefix that contains the packet length
|
||||||
|
|
|
||||||
24
vendor/golang.org/x/crypto/ssh/client_auth.go
generated
vendored
24
vendor/golang.org/x/crypto/ssh/client_auth.go
generated
vendored
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -83,7 +84,7 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error {
|
||||||
// success
|
// success
|
||||||
return nil
|
return nil
|
||||||
} else if ok == authFailure {
|
} else if ok == authFailure {
|
||||||
if m := auth.method(); !contains(tried, m) {
|
if m := auth.method(); !slices.Contains(tried, m) {
|
||||||
tried = append(tried, m)
|
tried = append(tried, m)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -97,7 +98,7 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error {
|
||||||
findNext:
|
findNext:
|
||||||
for _, a := range config.Auth {
|
for _, a := range config.Auth {
|
||||||
candidateMethod := a.method()
|
candidateMethod := a.method()
|
||||||
if contains(tried, candidateMethod) {
|
if slices.Contains(tried, candidateMethod) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for _, meth := range methods {
|
for _, meth := range methods {
|
||||||
|
|
@ -117,15 +118,6 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error {
|
||||||
return fmt.Errorf("ssh: unable to authenticate, attempted methods %v, no supported methods remain", tried)
|
return fmt.Errorf("ssh: unable to authenticate, attempted methods %v, no supported methods remain", tried)
|
||||||
}
|
}
|
||||||
|
|
||||||
func contains(list []string, e string) bool {
|
|
||||||
for _, s := range list {
|
|
||||||
if s == e {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// An AuthMethod represents an instance of an RFC 4252 authentication method.
|
// An AuthMethod represents an instance of an RFC 4252 authentication method.
|
||||||
type AuthMethod interface {
|
type AuthMethod interface {
|
||||||
// auth authenticates user over transport t.
|
// auth authenticates user over transport t.
|
||||||
|
|
@ -255,7 +247,7 @@ func pickSignatureAlgorithm(signer Signer, extensions map[string][]byte) (MultiA
|
||||||
// Fallback to use if there is no "server-sig-algs" extension or a
|
// Fallback to use if there is no "server-sig-algs" extension or a
|
||||||
// common algorithm cannot be found. We use the public key format if the
|
// common algorithm cannot be found. We use the public key format if the
|
||||||
// MultiAlgorithmSigner supports it, otherwise we return an error.
|
// MultiAlgorithmSigner supports it, otherwise we return an error.
|
||||||
if !contains(as.Algorithms(), underlyingAlgo(keyFormat)) {
|
if !slices.Contains(as.Algorithms(), underlyingAlgo(keyFormat)) {
|
||||||
return "", fmt.Errorf("ssh: no common public key signature algorithm, server only supports %q for key type %q, signer only supports %v",
|
return "", fmt.Errorf("ssh: no common public key signature algorithm, server only supports %q for key type %q, signer only supports %v",
|
||||||
underlyingAlgo(keyFormat), keyFormat, as.Algorithms())
|
underlyingAlgo(keyFormat), keyFormat, as.Algorithms())
|
||||||
}
|
}
|
||||||
|
|
@ -284,7 +276,7 @@ func pickSignatureAlgorithm(signer Signer, extensions map[string][]byte) (MultiA
|
||||||
// Filter algorithms based on those supported by MultiAlgorithmSigner.
|
// Filter algorithms based on those supported by MultiAlgorithmSigner.
|
||||||
var keyAlgos []string
|
var keyAlgos []string
|
||||||
for _, algo := range algorithmsForKeyFormat(keyFormat) {
|
for _, algo := range algorithmsForKeyFormat(keyFormat) {
|
||||||
if contains(as.Algorithms(), underlyingAlgo(algo)) {
|
if slices.Contains(as.Algorithms(), underlyingAlgo(algo)) {
|
||||||
keyAlgos = append(keyAlgos, algo)
|
keyAlgos = append(keyAlgos, algo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -334,7 +326,7 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand
|
||||||
// the key try to use the obtained algorithm as if "server-sig-algs" had
|
// the key try to use the obtained algorithm as if "server-sig-algs" had
|
||||||
// not been implemented if supported from the algorithm signer.
|
// not been implemented if supported from the algorithm signer.
|
||||||
if !ok && idx < origSignersLen && isRSACert(algo) && algo != CertAlgoRSAv01 {
|
if !ok && idx < origSignersLen && isRSACert(algo) && algo != CertAlgoRSAv01 {
|
||||||
if contains(as.Algorithms(), KeyAlgoRSA) {
|
if slices.Contains(as.Algorithms(), KeyAlgoRSA) {
|
||||||
// We retry using the compat algorithm after all signers have
|
// We retry using the compat algorithm after all signers have
|
||||||
// been tried normally.
|
// been tried normally.
|
||||||
signers = append(signers, &multiAlgorithmSigner{
|
signers = append(signers, &multiAlgorithmSigner{
|
||||||
|
|
@ -385,7 +377,7 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand
|
||||||
// contain the "publickey" method, do not attempt to authenticate with any
|
// contain the "publickey" method, do not attempt to authenticate with any
|
||||||
// other keys. According to RFC 4252 Section 7, the latter can occur when
|
// other keys. According to RFC 4252 Section 7, the latter can occur when
|
||||||
// additional authentication methods are required.
|
// additional authentication methods are required.
|
||||||
if success == authSuccess || !contains(methods, cb.method()) {
|
if success == authSuccess || !slices.Contains(methods, cb.method()) {
|
||||||
return success, methods, err
|
return success, methods, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -434,7 +426,7 @@ func confirmKeyAck(key PublicKey, c packetConn) (bool, error) {
|
||||||
// servers send the key type instead. OpenSSH allows any algorithm
|
// servers send the key type instead. OpenSSH allows any algorithm
|
||||||
// that matches the public key, so we do the same.
|
// that matches the public key, so we do the same.
|
||||||
// https://github.com/openssh/openssh-portable/blob/86bdd385/sshconnect2.c#L709
|
// https://github.com/openssh/openssh-portable/blob/86bdd385/sshconnect2.c#L709
|
||||||
if !contains(algorithmsForKeyFormat(key.Type()), msg.Algo) {
|
if !slices.Contains(algorithmsForKeyFormat(key.Type()), msg.Algo) {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
if !bytes.Equal(msg.PubKey, pubKey) {
|
if !bytes.Equal(msg.PubKey, pubKey) {
|
||||||
|
|
|
||||||
83
vendor/golang.org/x/crypto/ssh/common.go
generated
vendored
83
vendor/golang.org/x/crypto/ssh/common.go
generated
vendored
|
|
@ -6,6 +6,7 @@ package ssh
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto"
|
"crypto"
|
||||||
|
"crypto/fips140"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
@ -256,6 +257,40 @@ type Algorithms struct {
|
||||||
PublicKeyAuths []string
|
PublicKeyAuths []string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
if fips140.Enabled() {
|
||||||
|
defaultHostKeyAlgos = slices.DeleteFunc(defaultHostKeyAlgos, func(algo string) bool {
|
||||||
|
_, err := hashFunc(underlyingAlgo(algo))
|
||||||
|
return err != nil
|
||||||
|
})
|
||||||
|
defaultPubKeyAuthAlgos = slices.DeleteFunc(defaultPubKeyAuthAlgos, func(algo string) bool {
|
||||||
|
_, err := hashFunc(underlyingAlgo(algo))
|
||||||
|
return err != nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func hashFunc(format string) (crypto.Hash, error) {
|
||||||
|
switch format {
|
||||||
|
case KeyAlgoRSASHA256, KeyAlgoECDSA256, KeyAlgoSKED25519, KeyAlgoSKECDSA256:
|
||||||
|
return crypto.SHA256, nil
|
||||||
|
case KeyAlgoECDSA384:
|
||||||
|
return crypto.SHA384, nil
|
||||||
|
case KeyAlgoRSASHA512, KeyAlgoECDSA521:
|
||||||
|
return crypto.SHA512, nil
|
||||||
|
case KeyAlgoED25519:
|
||||||
|
// KeyAlgoED25519 doesn't pre-hash.
|
||||||
|
return 0, nil
|
||||||
|
case KeyAlgoRSA, InsecureKeyAlgoDSA:
|
||||||
|
if fips140.Enabled() {
|
||||||
|
return 0, fmt.Errorf("ssh: hash algorithm for format %q not allowed in FIPS 140 mode", format)
|
||||||
|
}
|
||||||
|
return crypto.SHA1, nil
|
||||||
|
default:
|
||||||
|
return 0, fmt.Errorf("ssh: hash algorithm for format %q not mapped", format)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// SupportedAlgorithms returns algorithms currently implemented by this package,
|
// SupportedAlgorithms returns algorithms currently implemented by this package,
|
||||||
// excluding those with security issues, which are returned by
|
// excluding those with security issues, which are returned by
|
||||||
// InsecureAlgorithms. The algorithms listed here are in preference order.
|
// InsecureAlgorithms. The algorithms listed here are in preference order.
|
||||||
|
|
@ -283,21 +318,6 @@ func InsecureAlgorithms() Algorithms {
|
||||||
|
|
||||||
var supportedCompressions = []string{compressionNone}
|
var supportedCompressions = []string{compressionNone}
|
||||||
|
|
||||||
// hashFuncs keeps the mapping of supported signature algorithms to their
|
|
||||||
// respective hashes needed for signing and verification.
|
|
||||||
var hashFuncs = map[string]crypto.Hash{
|
|
||||||
KeyAlgoRSA: crypto.SHA1,
|
|
||||||
KeyAlgoRSASHA256: crypto.SHA256,
|
|
||||||
KeyAlgoRSASHA512: crypto.SHA512,
|
|
||||||
InsecureKeyAlgoDSA: crypto.SHA1,
|
|
||||||
KeyAlgoECDSA256: crypto.SHA256,
|
|
||||||
KeyAlgoECDSA384: crypto.SHA384,
|
|
||||||
KeyAlgoECDSA521: crypto.SHA512,
|
|
||||||
// KeyAlgoED25519 doesn't pre-hash.
|
|
||||||
KeyAlgoSKECDSA256: crypto.SHA256,
|
|
||||||
KeyAlgoSKED25519: crypto.SHA256,
|
|
||||||
}
|
|
||||||
|
|
||||||
// algorithmsForKeyFormat returns the supported signature algorithms for a given
|
// algorithmsForKeyFormat returns the supported signature algorithms for a given
|
||||||
// public key format (PublicKey.Type), in order of preference. See RFC 8332,
|
// public key format (PublicKey.Type), in order of preference. See RFC 8332,
|
||||||
// Section 2. See also the note in sendKexInit on backwards compatibility.
|
// Section 2. See also the note in sendKexInit on backwards compatibility.
|
||||||
|
|
@ -312,11 +332,40 @@ func algorithmsForKeyFormat(keyFormat string) []string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// keyFormatForAlgorithm returns the key format corresponding to the given
|
||||||
|
// signature algorithm. It returns an empty string if the signature algorithm is
|
||||||
|
// invalid or unsupported.
|
||||||
|
func keyFormatForAlgorithm(sigAlgo string) string {
|
||||||
|
switch sigAlgo {
|
||||||
|
case KeyAlgoRSA, KeyAlgoRSASHA256, KeyAlgoRSASHA512:
|
||||||
|
return KeyAlgoRSA
|
||||||
|
case CertAlgoRSAv01, CertAlgoRSASHA256v01, CertAlgoRSASHA512v01:
|
||||||
|
return CertAlgoRSAv01
|
||||||
|
case KeyAlgoED25519,
|
||||||
|
KeyAlgoSKED25519,
|
||||||
|
KeyAlgoSKECDSA256,
|
||||||
|
KeyAlgoECDSA256,
|
||||||
|
KeyAlgoECDSA384,
|
||||||
|
KeyAlgoECDSA521,
|
||||||
|
InsecureKeyAlgoDSA,
|
||||||
|
InsecureCertAlgoDSAv01,
|
||||||
|
CertAlgoECDSA256v01,
|
||||||
|
CertAlgoECDSA384v01,
|
||||||
|
CertAlgoECDSA521v01,
|
||||||
|
CertAlgoSKECDSA256v01,
|
||||||
|
CertAlgoED25519v01,
|
||||||
|
CertAlgoSKED25519v01:
|
||||||
|
return sigAlgo
|
||||||
|
default:
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// isRSA returns whether algo is a supported RSA algorithm, including certificate
|
// isRSA returns whether algo is a supported RSA algorithm, including certificate
|
||||||
// algorithms.
|
// algorithms.
|
||||||
func isRSA(algo string) bool {
|
func isRSA(algo string) bool {
|
||||||
algos := algorithmsForKeyFormat(KeyAlgoRSA)
|
algos := algorithmsForKeyFormat(KeyAlgoRSA)
|
||||||
return contains(algos, underlyingAlgo(algo))
|
return slices.Contains(algos, underlyingAlgo(algo))
|
||||||
}
|
}
|
||||||
|
|
||||||
func isRSACert(algo string) bool {
|
func isRSACert(algo string) bool {
|
||||||
|
|
@ -515,7 +564,7 @@ func (c *Config) SetDefaults() {
|
||||||
if kexAlgoMap[k] != nil {
|
if kexAlgoMap[k] != nil {
|
||||||
// Ignore the KEX if we have no kexAlgoMap definition.
|
// Ignore the KEX if we have no kexAlgoMap definition.
|
||||||
kexs = append(kexs, k)
|
kexs = append(kexs, k)
|
||||||
if k == KeyExchangeCurve25519 && !contains(c.KeyExchanges, keyExchangeCurve25519LibSSH) {
|
if k == KeyExchangeCurve25519 && !slices.Contains(c.KeyExchanges, keyExchangeCurve25519LibSSH) {
|
||||||
kexs = append(kexs, keyExchangeCurve25519LibSSH)
|
kexs = append(kexs, keyExchangeCurve25519LibSSH)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
10
vendor/golang.org/x/crypto/ssh/doc.go
generated
vendored
10
vendor/golang.org/x/crypto/ssh/doc.go
generated
vendored
|
|
@ -17,8 +17,18 @@ References:
|
||||||
[PROTOCOL.certkeys]: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?rev=HEAD
|
[PROTOCOL.certkeys]: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?rev=HEAD
|
||||||
[SSH-PARAMETERS]: http://www.iana.org/assignments/ssh-parameters/ssh-parameters.xml#ssh-parameters-1
|
[SSH-PARAMETERS]: http://www.iana.org/assignments/ssh-parameters/ssh-parameters.xml#ssh-parameters-1
|
||||||
[SSH-CERTS]: https://datatracker.ietf.org/doc/html/draft-miller-ssh-cert-01
|
[SSH-CERTS]: https://datatracker.ietf.org/doc/html/draft-miller-ssh-cert-01
|
||||||
|
[FIPS 140-3 mode]: https://go.dev/doc/security/fips140
|
||||||
|
|
||||||
This package does not fall under the stability promise of the Go language itself,
|
This package does not fall under the stability promise of the Go language itself,
|
||||||
so its API may be changed when pressing needs arise.
|
so its API may be changed when pressing needs arise.
|
||||||
|
|
||||||
|
# FIPS 140-3 mode
|
||||||
|
|
||||||
|
When the program is in [FIPS 140-3 mode], this package behaves as if only SP
|
||||||
|
800-140C and SP 800-140D approved cipher suites, signature algorithms,
|
||||||
|
certificate public key types and sizes, and key exchange and derivation
|
||||||
|
algorithms were implemented. Others are silently ignored and not negotiated, or
|
||||||
|
rejected. This set may depend on the algorithms supported by the FIPS 140-3 Go
|
||||||
|
Cryptographic Module selected with GOFIPS140, and may change across Go versions.
|
||||||
*/
|
*/
|
||||||
package ssh
|
package ssh
|
||||||
|
|
|
||||||
9
vendor/golang.org/x/crypto/ssh/handshake.go
generated
vendored
9
vendor/golang.org/x/crypto/ssh/handshake.go
generated
vendored
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
@ -527,7 +528,7 @@ func (t *handshakeTransport) sendKexInit() error {
|
||||||
switch s := k.(type) {
|
switch s := k.(type) {
|
||||||
case MultiAlgorithmSigner:
|
case MultiAlgorithmSigner:
|
||||||
for _, algo := range algorithmsForKeyFormat(keyFormat) {
|
for _, algo := range algorithmsForKeyFormat(keyFormat) {
|
||||||
if contains(s.Algorithms(), underlyingAlgo(algo)) {
|
if slices.Contains(s.Algorithms(), underlyingAlgo(algo)) {
|
||||||
msg.ServerHostKeyAlgos = append(msg.ServerHostKeyAlgos, algo)
|
msg.ServerHostKeyAlgos = append(msg.ServerHostKeyAlgos, algo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -679,7 +680,7 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if t.sessionID == nil && ((isClient && contains(serverInit.KexAlgos, kexStrictServer)) || (!isClient && contains(clientInit.KexAlgos, kexStrictClient))) {
|
if t.sessionID == nil && ((isClient && slices.Contains(serverInit.KexAlgos, kexStrictServer)) || (!isClient && slices.Contains(clientInit.KexAlgos, kexStrictClient))) {
|
||||||
t.strictMode = true
|
t.strictMode = true
|
||||||
if err := t.conn.setStrictMode(); err != nil {
|
if err := t.conn.setStrictMode(); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -736,7 +737,7 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error {
|
||||||
// On the server side, after the first SSH_MSG_NEWKEYS, send a SSH_MSG_EXT_INFO
|
// On the server side, after the first SSH_MSG_NEWKEYS, send a SSH_MSG_EXT_INFO
|
||||||
// message with the server-sig-algs extension if the client supports it. See
|
// message with the server-sig-algs extension if the client supports it. See
|
||||||
// RFC 8308, Sections 2.4 and 3.1, and [PROTOCOL], Section 1.9.
|
// RFC 8308, Sections 2.4 and 3.1, and [PROTOCOL], Section 1.9.
|
||||||
if !isClient && firstKeyExchange && contains(clientInit.KexAlgos, "ext-info-c") {
|
if !isClient && firstKeyExchange && slices.Contains(clientInit.KexAlgos, "ext-info-c") {
|
||||||
supportedPubKeyAuthAlgosList := strings.Join(t.publicKeyAuthAlgorithms, ",")
|
supportedPubKeyAuthAlgosList := strings.Join(t.publicKeyAuthAlgorithms, ",")
|
||||||
extInfo := &extInfoMsg{
|
extInfo := &extInfoMsg{
|
||||||
NumExtensions: 2,
|
NumExtensions: 2,
|
||||||
|
|
@ -790,7 +791,7 @@ func (a algorithmSignerWrapper) SignWithAlgorithm(rand io.Reader, data []byte, a
|
||||||
func pickHostKey(hostKeys []Signer, algo string) AlgorithmSigner {
|
func pickHostKey(hostKeys []Signer, algo string) AlgorithmSigner {
|
||||||
for _, k := range hostKeys {
|
for _, k := range hostKeys {
|
||||||
if s, ok := k.(MultiAlgorithmSigner); ok {
|
if s, ok := k.(MultiAlgorithmSigner); ok {
|
||||||
if !contains(s.Algorithms(), underlyingAlgo(algo)) {
|
if !slices.Contains(s.Algorithms(), underlyingAlgo(algo)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
24
vendor/golang.org/x/crypto/ssh/kex.go
generated
vendored
24
vendor/golang.org/x/crypto/ssh/kex.go
generated
vendored
|
|
@ -8,12 +8,14 @@ import (
|
||||||
"crypto"
|
"crypto"
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"crypto/elliptic"
|
"crypto/elliptic"
|
||||||
|
"crypto/fips140"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
"slices"
|
||||||
|
|
||||||
"golang.org/x/crypto/curve25519"
|
"golang.org/x/crypto/curve25519"
|
||||||
)
|
)
|
||||||
|
|
@ -395,9 +397,27 @@ func ecHash(curve elliptic.Curve) crypto.Hash {
|
||||||
return crypto.SHA512
|
return crypto.SHA512
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// kexAlgoMap defines the supported KEXs. KEXs not included are not supported
|
||||||
|
// and will not be negotiated, even if explicitly configured. When FIPS mode is
|
||||||
|
// enabled, only FIPS-approved algorithms are included.
|
||||||
var kexAlgoMap = map[string]kexAlgorithm{}
|
var kexAlgoMap = map[string]kexAlgorithm{}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
// mlkem768x25519-sha256 we'll work with fips140=on but not fips140=only
|
||||||
|
// until Go 1.26.
|
||||||
|
kexAlgoMap[KeyExchangeMLKEM768X25519] = &mlkem768WithCurve25519sha256{}
|
||||||
|
kexAlgoMap[KeyExchangeECDHP521] = &ecdh{elliptic.P521()}
|
||||||
|
kexAlgoMap[KeyExchangeECDHP384] = &ecdh{elliptic.P384()}
|
||||||
|
kexAlgoMap[KeyExchangeECDHP256] = &ecdh{elliptic.P256()}
|
||||||
|
|
||||||
|
if fips140.Enabled() {
|
||||||
|
defaultKexAlgos = slices.DeleteFunc(defaultKexAlgos, func(algo string) bool {
|
||||||
|
_, ok := kexAlgoMap[algo]
|
||||||
|
return !ok
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
p, _ := new(big.Int).SetString(oakleyGroup2, 16)
|
p, _ := new(big.Int).SetString(oakleyGroup2, 16)
|
||||||
kexAlgoMap[InsecureKeyExchangeDH1SHA1] = &dhGroup{
|
kexAlgoMap[InsecureKeyExchangeDH1SHA1] = &dhGroup{
|
||||||
g: new(big.Int).SetInt64(2),
|
g: new(big.Int).SetInt64(2),
|
||||||
|
|
@ -431,14 +451,10 @@ func init() {
|
||||||
hashFunc: crypto.SHA512,
|
hashFunc: crypto.SHA512,
|
||||||
}
|
}
|
||||||
|
|
||||||
kexAlgoMap[KeyExchangeECDHP521] = &ecdh{elliptic.P521()}
|
|
||||||
kexAlgoMap[KeyExchangeECDHP384] = &ecdh{elliptic.P384()}
|
|
||||||
kexAlgoMap[KeyExchangeECDHP256] = &ecdh{elliptic.P256()}
|
|
||||||
kexAlgoMap[KeyExchangeCurve25519] = &curve25519sha256{}
|
kexAlgoMap[KeyExchangeCurve25519] = &curve25519sha256{}
|
||||||
kexAlgoMap[keyExchangeCurve25519LibSSH] = &curve25519sha256{}
|
kexAlgoMap[keyExchangeCurve25519LibSSH] = &curve25519sha256{}
|
||||||
kexAlgoMap[InsecureKeyExchangeDHGEXSHA1] = &dhGEXSHA{hashFunc: crypto.SHA1}
|
kexAlgoMap[InsecureKeyExchangeDHGEXSHA1] = &dhGEXSHA{hashFunc: crypto.SHA1}
|
||||||
kexAlgoMap[KeyExchangeDHGEXSHA256] = &dhGEXSHA{hashFunc: crypto.SHA256}
|
kexAlgoMap[KeyExchangeDHGEXSHA256] = &dhGEXSHA{hashFunc: crypto.SHA256}
|
||||||
kexAlgoMap[KeyExchangeMLKEM768X25519] = &mlkem768WithCurve25519sha256{}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// curve25519sha256 implements the curve25519-sha256 (formerly known as
|
// curve25519sha256 implements the curve25519-sha256 (formerly known as
|
||||||
|
|
|
||||||
69
vendor/golang.org/x/crypto/ssh/keys.go
generated
vendored
69
vendor/golang.org/x/crypto/ssh/keys.go
generated
vendored
|
|
@ -27,6 +27,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/crypto/ssh/internal/bcrypt_pbkdf"
|
"golang.org/x/crypto/ssh/internal/bcrypt_pbkdf"
|
||||||
|
|
@ -89,6 +90,11 @@ func parsePubKey(in []byte, algo string) (pubKey PublicKey, rest []byte, err err
|
||||||
}
|
}
|
||||||
return cert, nil, nil
|
return cert, nil, nil
|
||||||
}
|
}
|
||||||
|
if keyFormat := keyFormatForAlgorithm(algo); keyFormat != "" {
|
||||||
|
return nil, nil, fmt.Errorf("ssh: signature algorithm %q isn't a key format; key is malformed and should be re-encoded with type %q",
|
||||||
|
algo, keyFormat)
|
||||||
|
}
|
||||||
|
|
||||||
return nil, nil, fmt.Errorf("ssh: unknown key algorithm: %v", algo)
|
return nil, nil, fmt.Errorf("ssh: unknown key algorithm: %v", algo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -191,9 +197,10 @@ func ParseKnownHosts(in []byte) (marker string, hosts []string, pubKey PublicKey
|
||||||
return "", nil, nil, "", nil, io.EOF
|
return "", nil, nil, "", nil, io.EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParseAuthorizedKey parses a public key from an authorized_keys
|
// ParseAuthorizedKey parses a public key from an authorized_keys file used in
|
||||||
// file used in OpenSSH according to the sshd(8) manual page.
|
// OpenSSH according to the sshd(8) manual page. Invalid lines are ignored.
|
||||||
func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []string, rest []byte, err error) {
|
func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []string, rest []byte, err error) {
|
||||||
|
var lastErr error
|
||||||
for len(in) > 0 {
|
for len(in) > 0 {
|
||||||
end := bytes.IndexByte(in, '\n')
|
end := bytes.IndexByte(in, '\n')
|
||||||
if end != -1 {
|
if end != -1 {
|
||||||
|
|
@ -222,6 +229,8 @@ func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []str
|
||||||
|
|
||||||
if out, comment, err = parseAuthorizedKey(in[i:]); err == nil {
|
if out, comment, err = parseAuthorizedKey(in[i:]); err == nil {
|
||||||
return out, comment, options, rest, nil
|
return out, comment, options, rest, nil
|
||||||
|
} else {
|
||||||
|
lastErr = err
|
||||||
}
|
}
|
||||||
|
|
||||||
// No key type recognised. Maybe there's an options field at
|
// No key type recognised. Maybe there's an options field at
|
||||||
|
|
@ -264,12 +273,18 @@ func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []str
|
||||||
if out, comment, err = parseAuthorizedKey(in[i:]); err == nil {
|
if out, comment, err = parseAuthorizedKey(in[i:]); err == nil {
|
||||||
options = candidateOptions
|
options = candidateOptions
|
||||||
return out, comment, options, rest, nil
|
return out, comment, options, rest, nil
|
||||||
|
} else {
|
||||||
|
lastErr = err
|
||||||
}
|
}
|
||||||
|
|
||||||
in = rest
|
in = rest
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if lastErr != nil {
|
||||||
|
return nil, "", nil, nil, fmt.Errorf("ssh: no key found; last parsing error for ignored line: %w", lastErr)
|
||||||
|
}
|
||||||
|
|
||||||
return nil, "", nil, nil, errors.New("ssh: no key found")
|
return nil, "", nil, nil, errors.New("ssh: no key found")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -395,11 +410,11 @@ func NewSignerWithAlgorithms(signer AlgorithmSigner, algorithms []string) (Multi
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, algo := range algorithms {
|
for _, algo := range algorithms {
|
||||||
if !contains(supportedAlgos, algo) {
|
if !slices.Contains(supportedAlgos, algo) {
|
||||||
return nil, fmt.Errorf("ssh: algorithm %q is not supported for key type %q",
|
return nil, fmt.Errorf("ssh: algorithm %q is not supported for key type %q",
|
||||||
algo, signer.PublicKey().Type())
|
algo, signer.PublicKey().Type())
|
||||||
}
|
}
|
||||||
if !contains(signerAlgos, algo) {
|
if !slices.Contains(signerAlgos, algo) {
|
||||||
return nil, fmt.Errorf("ssh: algorithm %q is restricted for the provided signer", algo)
|
return nil, fmt.Errorf("ssh: algorithm %q is restricted for the provided signer", algo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -486,10 +501,13 @@ func (r *rsaPublicKey) Marshal() []byte {
|
||||||
|
|
||||||
func (r *rsaPublicKey) Verify(data []byte, sig *Signature) error {
|
func (r *rsaPublicKey) Verify(data []byte, sig *Signature) error {
|
||||||
supportedAlgos := algorithmsForKeyFormat(r.Type())
|
supportedAlgos := algorithmsForKeyFormat(r.Type())
|
||||||
if !contains(supportedAlgos, sig.Format) {
|
if !slices.Contains(supportedAlgos, sig.Format) {
|
||||||
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, r.Type())
|
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, r.Type())
|
||||||
}
|
}
|
||||||
hash := hashFuncs[sig.Format]
|
hash, err := hashFunc(sig.Format)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
h := hash.New()
|
h := hash.New()
|
||||||
h.Write(data)
|
h.Write(data)
|
||||||
digest := h.Sum(nil)
|
digest := h.Sum(nil)
|
||||||
|
|
@ -606,7 +624,11 @@ func (k *dsaPublicKey) Verify(data []byte, sig *Signature) error {
|
||||||
if sig.Format != k.Type() {
|
if sig.Format != k.Type() {
|
||||||
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
|
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
|
||||||
}
|
}
|
||||||
h := hashFuncs[sig.Format].New()
|
hash, err := hashFunc(sig.Format)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
h := hash.New()
|
||||||
h.Write(data)
|
h.Write(data)
|
||||||
digest := h.Sum(nil)
|
digest := h.Sum(nil)
|
||||||
|
|
||||||
|
|
@ -651,7 +673,11 @@ func (k *dsaPrivateKey) SignWithAlgorithm(rand io.Reader, data []byte, algorithm
|
||||||
return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm)
|
return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm)
|
||||||
}
|
}
|
||||||
|
|
||||||
h := hashFuncs[k.PublicKey().Type()].New()
|
hash, err := hashFunc(k.PublicKey().Type())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
h := hash.New()
|
||||||
h.Write(data)
|
h.Write(data)
|
||||||
digest := h.Sum(nil)
|
digest := h.Sum(nil)
|
||||||
r, s, err := dsa.Sign(rand, k.PrivateKey, digest)
|
r, s, err := dsa.Sign(rand, k.PrivateKey, digest)
|
||||||
|
|
@ -801,8 +827,11 @@ func (k *ecdsaPublicKey) Verify(data []byte, sig *Signature) error {
|
||||||
if sig.Format != k.Type() {
|
if sig.Format != k.Type() {
|
||||||
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
|
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
|
||||||
}
|
}
|
||||||
|
hash, err := hashFunc(sig.Format)
|
||||||
h := hashFuncs[sig.Format].New()
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
h := hash.New()
|
||||||
h.Write(data)
|
h.Write(data)
|
||||||
digest := h.Sum(nil)
|
digest := h.Sum(nil)
|
||||||
|
|
||||||
|
|
@ -905,8 +934,11 @@ func (k *skECDSAPublicKey) Verify(data []byte, sig *Signature) error {
|
||||||
if sig.Format != k.Type() {
|
if sig.Format != k.Type() {
|
||||||
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
|
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
|
||||||
}
|
}
|
||||||
|
hash, err := hashFunc(sig.Format)
|
||||||
h := hashFuncs[sig.Format].New()
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
h := hash.New()
|
||||||
h.Write([]byte(k.application))
|
h.Write([]byte(k.application))
|
||||||
appDigest := h.Sum(nil)
|
appDigest := h.Sum(nil)
|
||||||
|
|
||||||
|
|
@ -1009,7 +1041,11 @@ func (k *skEd25519PublicKey) Verify(data []byte, sig *Signature) error {
|
||||||
return fmt.Errorf("invalid size %d for Ed25519 public key", l)
|
return fmt.Errorf("invalid size %d for Ed25519 public key", l)
|
||||||
}
|
}
|
||||||
|
|
||||||
h := hashFuncs[sig.Format].New()
|
hash, err := hashFunc(sig.Format)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
h := hash.New()
|
||||||
h.Write([]byte(k.application))
|
h.Write([]byte(k.application))
|
||||||
appDigest := h.Sum(nil)
|
appDigest := h.Sum(nil)
|
||||||
|
|
||||||
|
|
@ -1112,11 +1148,14 @@ func (s *wrappedSigner) SignWithAlgorithm(rand io.Reader, data []byte, algorithm
|
||||||
algorithm = s.pubKey.Type()
|
algorithm = s.pubKey.Type()
|
||||||
}
|
}
|
||||||
|
|
||||||
if !contains(s.Algorithms(), algorithm) {
|
if !slices.Contains(s.Algorithms(), algorithm) {
|
||||||
return nil, fmt.Errorf("ssh: unsupported signature algorithm %q for key format %q", algorithm, s.pubKey.Type())
|
return nil, fmt.Errorf("ssh: unsupported signature algorithm %q for key format %q", algorithm, s.pubKey.Type())
|
||||||
}
|
}
|
||||||
|
|
||||||
hashFunc := hashFuncs[algorithm]
|
hashFunc, err := hashFunc(algorithm)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
var digest []byte
|
var digest []byte
|
||||||
if hashFunc != 0 {
|
if hashFunc != 0 {
|
||||||
h := hashFunc.New()
|
h := hashFunc.New()
|
||||||
|
|
|
||||||
42
vendor/golang.org/x/crypto/ssh/mac.go
generated
vendored
42
vendor/golang.org/x/crypto/ssh/mac.go
generated
vendored
|
|
@ -7,11 +7,13 @@ package ssh
|
||||||
// Message authentication support
|
// Message authentication support
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/fips140"
|
||||||
"crypto/hmac"
|
"crypto/hmac"
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"crypto/sha512"
|
"crypto/sha512"
|
||||||
"hash"
|
"hash"
|
||||||
|
"slices"
|
||||||
)
|
)
|
||||||
|
|
||||||
type macMode struct {
|
type macMode struct {
|
||||||
|
|
@ -46,23 +48,37 @@ func (t truncatingMAC) Size() int {
|
||||||
|
|
||||||
func (t truncatingMAC) BlockSize() int { return t.hmac.BlockSize() }
|
func (t truncatingMAC) BlockSize() int { return t.hmac.BlockSize() }
|
||||||
|
|
||||||
var macModes = map[string]*macMode{
|
// macModes defines the supported MACs. MACs not included are not supported
|
||||||
HMACSHA512ETM: {64, true, func(key []byte) hash.Hash {
|
// and will not be negotiated, even if explicitly configured. When FIPS mode is
|
||||||
|
// enabled, only FIPS-approved algorithms are included.
|
||||||
|
var macModes = map[string]*macMode{}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
macModes[HMACSHA512ETM] = &macMode{64, true, func(key []byte) hash.Hash {
|
||||||
return hmac.New(sha512.New, key)
|
return hmac.New(sha512.New, key)
|
||||||
}},
|
}}
|
||||||
HMACSHA256ETM: {32, true, func(key []byte) hash.Hash {
|
macModes[HMACSHA256ETM] = &macMode{32, true, func(key []byte) hash.Hash {
|
||||||
return hmac.New(sha256.New, key)
|
return hmac.New(sha256.New, key)
|
||||||
}},
|
}}
|
||||||
HMACSHA512: {64, false, func(key []byte) hash.Hash {
|
macModes[HMACSHA512] = &macMode{64, false, func(key []byte) hash.Hash {
|
||||||
return hmac.New(sha512.New, key)
|
return hmac.New(sha512.New, key)
|
||||||
}},
|
}}
|
||||||
HMACSHA256: {32, false, func(key []byte) hash.Hash {
|
macModes[HMACSHA256] = &macMode{32, false, func(key []byte) hash.Hash {
|
||||||
return hmac.New(sha256.New, key)
|
return hmac.New(sha256.New, key)
|
||||||
}},
|
}}
|
||||||
HMACSHA1: {20, false, func(key []byte) hash.Hash {
|
|
||||||
|
if fips140.Enabled() {
|
||||||
|
defaultMACs = slices.DeleteFunc(defaultMACs, func(algo string) bool {
|
||||||
|
_, ok := macModes[algo]
|
||||||
|
return !ok
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
macModes[HMACSHA1] = &macMode{20, false, func(key []byte) hash.Hash {
|
||||||
return hmac.New(sha1.New, key)
|
return hmac.New(sha1.New, key)
|
||||||
}},
|
}}
|
||||||
InsecureHMACSHA196: {20, false, func(key []byte) hash.Hash {
|
macModes[InsecureHMACSHA196] = &macMode{20, false, func(key []byte) hash.Hash {
|
||||||
return truncatingMAC{12, hmac.New(sha1.New, key)}
|
return truncatingMAC{12, hmac.New(sha1.New, key)}
|
||||||
}},
|
}}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
36
vendor/golang.org/x/crypto/ssh/server.go
generated
vendored
36
vendor/golang.org/x/crypto/ssh/server.go
generated
vendored
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -43,6 +44,9 @@ type Permissions struct {
|
||||||
// pass data from the authentication callbacks to the server
|
// pass data from the authentication callbacks to the server
|
||||||
// application layer.
|
// application layer.
|
||||||
Extensions map[string]string
|
Extensions map[string]string
|
||||||
|
|
||||||
|
// ExtraData allows to store user defined data.
|
||||||
|
ExtraData map[any]any
|
||||||
}
|
}
|
||||||
|
|
||||||
type GSSAPIWithMICConfig struct {
|
type GSSAPIWithMICConfig struct {
|
||||||
|
|
@ -126,6 +130,21 @@ type ServerConfig struct {
|
||||||
// Permissions.Extensions entry.
|
// Permissions.Extensions entry.
|
||||||
PublicKeyCallback func(conn ConnMetadata, key PublicKey) (*Permissions, error)
|
PublicKeyCallback func(conn ConnMetadata, key PublicKey) (*Permissions, error)
|
||||||
|
|
||||||
|
// VerifiedPublicKeyCallback, if non-nil, is called after a client
|
||||||
|
// successfully confirms having control over a key that was previously
|
||||||
|
// approved by PublicKeyCallback. The permissions object passed to the
|
||||||
|
// callback is the one returned by PublicKeyCallback for the given public
|
||||||
|
// key and its ownership is transferred to the callback. The returned
|
||||||
|
// Permissions object can be the same object, optionally modified, or a
|
||||||
|
// completely new object. If VerifiedPublicKeyCallback is non-nil,
|
||||||
|
// PublicKeyCallback is not allowed to return a PartialSuccessError, which
|
||||||
|
// can instead be returned by VerifiedPublicKeyCallback.
|
||||||
|
//
|
||||||
|
// VerifiedPublicKeyCallback does not affect which authentication methods
|
||||||
|
// are included in the list of methods that can be attempted by the client.
|
||||||
|
VerifiedPublicKeyCallback func(conn ConnMetadata, key PublicKey, permissions *Permissions,
|
||||||
|
signatureAlgorithm string) (*Permissions, error)
|
||||||
|
|
||||||
// KeyboardInteractiveCallback, if non-nil, is called when
|
// KeyboardInteractiveCallback, if non-nil, is called when
|
||||||
// keyboard-interactive authentication is selected (RFC
|
// keyboard-interactive authentication is selected (RFC
|
||||||
// 4256). The client object's Challenge function should be
|
// 4256). The client object's Challenge function should be
|
||||||
|
|
@ -246,7 +265,7 @@ func NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewCha
|
||||||
fullConf.PublicKeyAuthAlgorithms = defaultPubKeyAuthAlgos
|
fullConf.PublicKeyAuthAlgorithms = defaultPubKeyAuthAlgos
|
||||||
} else {
|
} else {
|
||||||
for _, algo := range fullConf.PublicKeyAuthAlgorithms {
|
for _, algo := range fullConf.PublicKeyAuthAlgorithms {
|
||||||
if !contains(SupportedAlgorithms().PublicKeyAuths, algo) && !contains(InsecureAlgorithms().PublicKeyAuths, algo) {
|
if !slices.Contains(SupportedAlgorithms().PublicKeyAuths, algo) && !slices.Contains(InsecureAlgorithms().PublicKeyAuths, algo) {
|
||||||
c.Close()
|
c.Close()
|
||||||
return nil, nil, nil, fmt.Errorf("ssh: unsupported public key authentication algorithm %s", algo)
|
return nil, nil, nil, fmt.Errorf("ssh: unsupported public key authentication algorithm %s", algo)
|
||||||
}
|
}
|
||||||
|
|
@ -631,7 +650,7 @@ userAuthLoop:
|
||||||
return nil, parseError(msgUserAuthRequest)
|
return nil, parseError(msgUserAuthRequest)
|
||||||
}
|
}
|
||||||
algo := string(algoBytes)
|
algo := string(algoBytes)
|
||||||
if !contains(config.PublicKeyAuthAlgorithms, underlyingAlgo(algo)) {
|
if !slices.Contains(config.PublicKeyAuthAlgorithms, underlyingAlgo(algo)) {
|
||||||
authErr = fmt.Errorf("ssh: algorithm %q not accepted", algo)
|
authErr = fmt.Errorf("ssh: algorithm %q not accepted", algo)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
@ -652,6 +671,9 @@ userAuthLoop:
|
||||||
candidate.pubKeyData = pubKeyData
|
candidate.pubKeyData = pubKeyData
|
||||||
candidate.perms, candidate.result = authConfig.PublicKeyCallback(s, pubKey)
|
candidate.perms, candidate.result = authConfig.PublicKeyCallback(s, pubKey)
|
||||||
_, isPartialSuccessError := candidate.result.(*PartialSuccessError)
|
_, isPartialSuccessError := candidate.result.(*PartialSuccessError)
|
||||||
|
if isPartialSuccessError && config.VerifiedPublicKeyCallback != nil {
|
||||||
|
return nil, errors.New("ssh: invalid library usage: PublicKeyCallback must not return partial success when VerifiedPublicKeyCallback is defined")
|
||||||
|
}
|
||||||
|
|
||||||
if (candidate.result == nil || isPartialSuccessError) &&
|
if (candidate.result == nil || isPartialSuccessError) &&
|
||||||
candidate.perms != nil &&
|
candidate.perms != nil &&
|
||||||
|
|
@ -695,7 +717,7 @@ userAuthLoop:
|
||||||
// ssh-rsa-cert-v01@openssh.com algorithm with ssh-rsa public
|
// ssh-rsa-cert-v01@openssh.com algorithm with ssh-rsa public
|
||||||
// key type. The algorithm and public key type must be
|
// key type. The algorithm and public key type must be
|
||||||
// consistent: both must be certificate algorithms, or neither.
|
// consistent: both must be certificate algorithms, or neither.
|
||||||
if !contains(algorithmsForKeyFormat(pubKey.Type()), algo) {
|
if !slices.Contains(algorithmsForKeyFormat(pubKey.Type()), algo) {
|
||||||
authErr = fmt.Errorf("ssh: public key type %q not compatible with selected algorithm %q",
|
authErr = fmt.Errorf("ssh: public key type %q not compatible with selected algorithm %q",
|
||||||
pubKey.Type(), algo)
|
pubKey.Type(), algo)
|
||||||
break
|
break
|
||||||
|
|
@ -705,7 +727,7 @@ userAuthLoop:
|
||||||
// algorithm name that corresponds to algo with
|
// algorithm name that corresponds to algo with
|
||||||
// sig.Format. This is usually the same, but
|
// sig.Format. This is usually the same, but
|
||||||
// for certs, the names differ.
|
// for certs, the names differ.
|
||||||
if !contains(config.PublicKeyAuthAlgorithms, sig.Format) {
|
if !slices.Contains(config.PublicKeyAuthAlgorithms, sig.Format) {
|
||||||
authErr = fmt.Errorf("ssh: algorithm %q not accepted", sig.Format)
|
authErr = fmt.Errorf("ssh: algorithm %q not accepted", sig.Format)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
@ -722,6 +744,12 @@ userAuthLoop:
|
||||||
|
|
||||||
authErr = candidate.result
|
authErr = candidate.result
|
||||||
perms = candidate.perms
|
perms = candidate.perms
|
||||||
|
if authErr == nil && config.VerifiedPublicKeyCallback != nil {
|
||||||
|
// Only call VerifiedPublicKeyCallback after the key has been accepted
|
||||||
|
// and successfully verified. If authErr is non-nil, the key is not
|
||||||
|
// considered verified and the callback must not run.
|
||||||
|
perms, authErr = config.VerifiedPublicKeyCallback(s, pubKey, perms, algo)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
case "gssapi-with-mic":
|
case "gssapi-with-mic":
|
||||||
if authConfig.GSSAPIWithMICConfig == nil {
|
if authConfig.GSSAPIWithMICConfig == nil {
|
||||||
|
|
|
||||||
4
vendor/golang.org/x/crypto/ssh/transport.go
generated
vendored
4
vendor/golang.org/x/crypto/ssh/transport.go
generated
vendored
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
)
|
)
|
||||||
|
|
@ -254,6 +255,9 @@ var (
|
||||||
// (to setup server->client keys) or clientKeys (for client->server keys).
|
// (to setup server->client keys) or clientKeys (for client->server keys).
|
||||||
func newPacketCipher(d direction, algs DirectionAlgorithms, kex *kexResult) (packetCipher, error) {
|
func newPacketCipher(d direction, algs DirectionAlgorithms, kex *kexResult) (packetCipher, error) {
|
||||||
cipherMode := cipherModes[algs.Cipher]
|
cipherMode := cipherModes[algs.Cipher]
|
||||||
|
if cipherMode == nil {
|
||||||
|
return nil, fmt.Errorf("ssh: unsupported cipher %v", algs.Cipher)
|
||||||
|
}
|
||||||
|
|
||||||
iv := make([]byte, cipherMode.ivSize)
|
iv := make([]byte, cipherMode.ivSize)
|
||||||
key := make([]byte, cipherMode.keySize)
|
key := make([]byte, cipherMode.keySize)
|
||||||
|
|
|
||||||
2
vendor/golang.org/x/net/html/escape.go
generated
vendored
2
vendor/golang.org/x/net/html/escape.go
generated
vendored
|
|
@ -299,7 +299,7 @@ func escape(w writer, s string) error {
|
||||||
case '\r':
|
case '\r':
|
||||||
esc = " "
|
esc = " "
|
||||||
default:
|
default:
|
||||||
panic("unrecognized escape character")
|
panic("html: unrecognized escape character")
|
||||||
}
|
}
|
||||||
s = s[i+1:]
|
s = s[i+1:]
|
||||||
if _, err := w.WriteString(esc); err != nil {
|
if _, err := w.WriteString(esc); err != nil {
|
||||||
|
|
|
||||||
57
vendor/golang.org/x/net/html/parse.go
generated
vendored
57
vendor/golang.org/x/net/html/parse.go
generated
vendored
|
|
@ -136,7 +136,7 @@ func (p *parser) indexOfElementInScope(s scope, matchTags ...a.Atom) int {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
panic("unreachable")
|
panic(fmt.Sprintf("html: internal error: indexOfElementInScope unknown scope: %d", s))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch s {
|
switch s {
|
||||||
|
|
@ -179,7 +179,7 @@ func (p *parser) clearStackToContext(s scope) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
panic("unreachable")
|
panic(fmt.Sprintf("html: internal error: clearStackToContext unknown scope: %d", s))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -231,7 +231,14 @@ func (p *parser) addChild(n *Node) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if n.Type == ElementNode {
|
if n.Type == ElementNode {
|
||||||
p.oe = append(p.oe, n)
|
p.insertOpenElement(n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *parser) insertOpenElement(n *Node) {
|
||||||
|
p.oe = append(p.oe, n)
|
||||||
|
if len(p.oe) > 512 {
|
||||||
|
panic("html: open stack of elements exceeds 512 nodes")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -810,7 +817,7 @@ func afterHeadIM(p *parser) bool {
|
||||||
p.im = inFramesetIM
|
p.im = inFramesetIM
|
||||||
return true
|
return true
|
||||||
case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title:
|
case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title:
|
||||||
p.oe = append(p.oe, p.head)
|
p.insertOpenElement(p.head)
|
||||||
defer p.oe.remove(p.head)
|
defer p.oe.remove(p.head)
|
||||||
return inHeadIM(p)
|
return inHeadIM(p)
|
||||||
case a.Head:
|
case a.Head:
|
||||||
|
|
@ -1678,7 +1685,7 @@ func inTableBodyIM(p *parser) bool {
|
||||||
return inTableIM(p)
|
return inTableIM(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Section 12.2.6.4.14.
|
// Section 13.2.6.4.14.
|
||||||
func inRowIM(p *parser) bool {
|
func inRowIM(p *parser) bool {
|
||||||
switch p.tok.Type {
|
switch p.tok.Type {
|
||||||
case StartTagToken:
|
case StartTagToken:
|
||||||
|
|
@ -1690,7 +1697,9 @@ func inRowIM(p *parser) bool {
|
||||||
p.im = inCellIM
|
p.im = inCellIM
|
||||||
return true
|
return true
|
||||||
case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Tfoot, a.Thead, a.Tr:
|
case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Tfoot, a.Thead, a.Tr:
|
||||||
if p.popUntil(tableScope, a.Tr) {
|
if p.elementInScope(tableScope, a.Tr) {
|
||||||
|
p.clearStackToContext(tableRowScope)
|
||||||
|
p.oe.pop()
|
||||||
p.im = inTableBodyIM
|
p.im = inTableBodyIM
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
@ -1700,22 +1709,28 @@ func inRowIM(p *parser) bool {
|
||||||
case EndTagToken:
|
case EndTagToken:
|
||||||
switch p.tok.DataAtom {
|
switch p.tok.DataAtom {
|
||||||
case a.Tr:
|
case a.Tr:
|
||||||
if p.popUntil(tableScope, a.Tr) {
|
if p.elementInScope(tableScope, a.Tr) {
|
||||||
|
p.clearStackToContext(tableRowScope)
|
||||||
|
p.oe.pop()
|
||||||
p.im = inTableBodyIM
|
p.im = inTableBodyIM
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// Ignore the token.
|
// Ignore the token.
|
||||||
return true
|
return true
|
||||||
case a.Table:
|
case a.Table:
|
||||||
if p.popUntil(tableScope, a.Tr) {
|
if p.elementInScope(tableScope, a.Tr) {
|
||||||
|
p.clearStackToContext(tableRowScope)
|
||||||
|
p.oe.pop()
|
||||||
p.im = inTableBodyIM
|
p.im = inTableBodyIM
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
// Ignore the token.
|
// Ignore the token.
|
||||||
return true
|
return true
|
||||||
case a.Tbody, a.Tfoot, a.Thead:
|
case a.Tbody, a.Tfoot, a.Thead:
|
||||||
if p.elementInScope(tableScope, p.tok.DataAtom) {
|
if p.elementInScope(tableScope, p.tok.DataAtom) && p.elementInScope(tableScope, a.Tr) {
|
||||||
p.parseImpliedToken(EndTagToken, a.Tr, a.Tr.String())
|
p.clearStackToContext(tableRowScope)
|
||||||
|
p.oe.pop()
|
||||||
|
p.im = inTableBodyIM
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
// Ignore the token.
|
// Ignore the token.
|
||||||
|
|
@ -2222,16 +2237,20 @@ func parseForeignContent(p *parser) bool {
|
||||||
p.acknowledgeSelfClosingTag()
|
p.acknowledgeSelfClosingTag()
|
||||||
}
|
}
|
||||||
case EndTagToken:
|
case EndTagToken:
|
||||||
|
if strings.EqualFold(p.oe[len(p.oe)-1].Data, p.tok.Data) {
|
||||||
|
p.oe = p.oe[:len(p.oe)-1]
|
||||||
|
return true
|
||||||
|
}
|
||||||
for i := len(p.oe) - 1; i >= 0; i-- {
|
for i := len(p.oe) - 1; i >= 0; i-- {
|
||||||
if p.oe[i].Namespace == "" {
|
|
||||||
return p.im(p)
|
|
||||||
}
|
|
||||||
if strings.EqualFold(p.oe[i].Data, p.tok.Data) {
|
if strings.EqualFold(p.oe[i].Data, p.tok.Data) {
|
||||||
p.oe = p.oe[:i]
|
p.oe = p.oe[:i]
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if i > 0 && p.oe[i-1].Namespace == "" {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true
|
return p.im(p)
|
||||||
default:
|
default:
|
||||||
// Ignore the token.
|
// Ignore the token.
|
||||||
}
|
}
|
||||||
|
|
@ -2312,9 +2331,13 @@ func (p *parser) parseCurrentToken() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *parser) parse() error {
|
func (p *parser) parse() (err error) {
|
||||||
|
defer func() {
|
||||||
|
if panicErr := recover(); panicErr != nil {
|
||||||
|
err = fmt.Errorf("%s", panicErr)
|
||||||
|
}
|
||||||
|
}()
|
||||||
// Iterate until EOF. Any other error will cause an early return.
|
// Iterate until EOF. Any other error will cause an early return.
|
||||||
var err error
|
|
||||||
for err != io.EOF {
|
for err != io.EOF {
|
||||||
// CDATA sections are allowed only in foreign content.
|
// CDATA sections are allowed only in foreign content.
|
||||||
n := p.oe.top()
|
n := p.oe.top()
|
||||||
|
|
@ -2343,6 +2366,8 @@ func (p *parser) parse() error {
|
||||||
// <tag>s. Conversely, explicit <tag>s in r's data can be silently dropped,
|
// <tag>s. Conversely, explicit <tag>s in r's data can be silently dropped,
|
||||||
// with no corresponding node in the resulting tree.
|
// with no corresponding node in the resulting tree.
|
||||||
//
|
//
|
||||||
|
// Parse will reject HTML that is nested deeper than 512 elements.
|
||||||
|
//
|
||||||
// The input is assumed to be UTF-8 encoded.
|
// The input is assumed to be UTF-8 encoded.
|
||||||
func Parse(r io.Reader) (*Node, error) {
|
func Parse(r io.Reader) (*Node, error) {
|
||||||
return ParseWithOptions(r)
|
return ParseWithOptions(r)
|
||||||
|
|
|
||||||
2
vendor/golang.org/x/net/html/render.go
generated
vendored
2
vendor/golang.org/x/net/html/render.go
generated
vendored
|
|
@ -184,7 +184,7 @@ func render1(w writer, n *Node) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add initial newline where there is danger of a newline beging ignored.
|
// Add initial newline where there is danger of a newline being ignored.
|
||||||
if c := n.FirstChild; c != nil && c.Type == TextNode && strings.HasPrefix(c.Data, "\n") {
|
if c := n.FirstChild; c != nil && c.Type == TextNode && strings.HasPrefix(c.Data, "\n") {
|
||||||
switch n.Data {
|
switch n.Data {
|
||||||
case "pre", "listing", "textarea":
|
case "pre", "listing", "textarea":
|
||||||
|
|
|
||||||
17
vendor/golang.org/x/net/http2/config.go
generated
vendored
17
vendor/golang.org/x/net/http2/config.go
generated
vendored
|
|
@ -27,6 +27,7 @@ import (
|
||||||
// - If the resulting value is zero or out of range, use a default.
|
// - If the resulting value is zero or out of range, use a default.
|
||||||
type http2Config struct {
|
type http2Config struct {
|
||||||
MaxConcurrentStreams uint32
|
MaxConcurrentStreams uint32
|
||||||
|
StrictMaxConcurrentRequests bool
|
||||||
MaxDecoderHeaderTableSize uint32
|
MaxDecoderHeaderTableSize uint32
|
||||||
MaxEncoderHeaderTableSize uint32
|
MaxEncoderHeaderTableSize uint32
|
||||||
MaxReadFrameSize uint32
|
MaxReadFrameSize uint32
|
||||||
|
|
@ -64,12 +65,13 @@ func configFromServer(h1 *http.Server, h2 *Server) http2Config {
|
||||||
// (the net/http Transport).
|
// (the net/http Transport).
|
||||||
func configFromTransport(h2 *Transport) http2Config {
|
func configFromTransport(h2 *Transport) http2Config {
|
||||||
conf := http2Config{
|
conf := http2Config{
|
||||||
MaxEncoderHeaderTableSize: h2.MaxEncoderHeaderTableSize,
|
StrictMaxConcurrentRequests: h2.StrictMaxConcurrentStreams,
|
||||||
MaxDecoderHeaderTableSize: h2.MaxDecoderHeaderTableSize,
|
MaxEncoderHeaderTableSize: h2.MaxEncoderHeaderTableSize,
|
||||||
MaxReadFrameSize: h2.MaxReadFrameSize,
|
MaxDecoderHeaderTableSize: h2.MaxDecoderHeaderTableSize,
|
||||||
SendPingTimeout: h2.ReadIdleTimeout,
|
MaxReadFrameSize: h2.MaxReadFrameSize,
|
||||||
PingTimeout: h2.PingTimeout,
|
SendPingTimeout: h2.ReadIdleTimeout,
|
||||||
WriteByteTimeout: h2.WriteByteTimeout,
|
PingTimeout: h2.PingTimeout,
|
||||||
|
WriteByteTimeout: h2.WriteByteTimeout,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unlike most config fields, where out-of-range values revert to the default,
|
// Unlike most config fields, where out-of-range values revert to the default,
|
||||||
|
|
@ -128,6 +130,9 @@ func fillNetHTTPConfig(conf *http2Config, h2 *http.HTTP2Config) {
|
||||||
if h2.MaxConcurrentStreams != 0 {
|
if h2.MaxConcurrentStreams != 0 {
|
||||||
conf.MaxConcurrentStreams = uint32(h2.MaxConcurrentStreams)
|
conf.MaxConcurrentStreams = uint32(h2.MaxConcurrentStreams)
|
||||||
}
|
}
|
||||||
|
if http2ConfigStrictMaxConcurrentRequests(h2) {
|
||||||
|
conf.StrictMaxConcurrentRequests = true
|
||||||
|
}
|
||||||
if h2.MaxEncoderHeaderTableSize != 0 {
|
if h2.MaxEncoderHeaderTableSize != 0 {
|
||||||
conf.MaxEncoderHeaderTableSize = uint32(h2.MaxEncoderHeaderTableSize)
|
conf.MaxEncoderHeaderTableSize = uint32(h2.MaxEncoderHeaderTableSize)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
15
vendor/golang.org/x/net/http2/config_go125.go
generated
vendored
Normal file
15
vendor/golang.org/x/net/http2/config_go125.go
generated
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
// Copyright 2025 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build !go1.26
|
||||||
|
|
||||||
|
package http2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func http2ConfigStrictMaxConcurrentRequests(h2 *http.HTTP2Config) bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
15
vendor/golang.org/x/net/http2/config_go126.go
generated
vendored
Normal file
15
vendor/golang.org/x/net/http2/config_go126.go
generated
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
// Copyright 2025 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build go1.26
|
||||||
|
|
||||||
|
package http2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func http2ConfigStrictMaxConcurrentRequests(h2 *http.HTTP2Config) bool {
|
||||||
|
return h2.StrictMaxConcurrentRequests
|
||||||
|
}
|
||||||
25
vendor/golang.org/x/net/http2/frame.go
generated
vendored
25
vendor/golang.org/x/net/http2/frame.go
generated
vendored
|
|
@ -347,7 +347,7 @@ func (fr *Framer) maxHeaderListSize() uint32 {
|
||||||
func (f *Framer) startWrite(ftype FrameType, flags Flags, streamID uint32) {
|
func (f *Framer) startWrite(ftype FrameType, flags Flags, streamID uint32) {
|
||||||
// Write the FrameHeader.
|
// Write the FrameHeader.
|
||||||
f.wbuf = append(f.wbuf[:0],
|
f.wbuf = append(f.wbuf[:0],
|
||||||
0, // 3 bytes of length, filled in in endWrite
|
0, // 3 bytes of length, filled in endWrite
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
byte(ftype),
|
byte(ftype),
|
||||||
|
|
@ -1152,6 +1152,15 @@ type PriorityFrame struct {
|
||||||
PriorityParam
|
PriorityParam
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var defaultRFC9218Priority = PriorityParam{
|
||||||
|
incremental: 0,
|
||||||
|
urgency: 3,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note that HTTP/2 has had two different prioritization schemes, and
|
||||||
|
// PriorityParam struct below is a superset of both schemes. The exported
|
||||||
|
// symbols are from RFC 7540 and the non-exported ones are from RFC 9218.
|
||||||
|
|
||||||
// PriorityParam are the stream prioritzation parameters.
|
// PriorityParam are the stream prioritzation parameters.
|
||||||
type PriorityParam struct {
|
type PriorityParam struct {
|
||||||
// StreamDep is a 31-bit stream identifier for the
|
// StreamDep is a 31-bit stream identifier for the
|
||||||
|
|
@ -1167,6 +1176,20 @@ type PriorityParam struct {
|
||||||
// the spec, "Add one to the value to obtain a weight between
|
// the spec, "Add one to the value to obtain a weight between
|
||||||
// 1 and 256."
|
// 1 and 256."
|
||||||
Weight uint8
|
Weight uint8
|
||||||
|
|
||||||
|
// "The urgency (u) parameter value is Integer (see Section 3.3.1 of
|
||||||
|
// [STRUCTURED-FIELDS]), between 0 and 7 inclusive, in descending order of
|
||||||
|
// priority. The default is 3."
|
||||||
|
urgency uint8
|
||||||
|
|
||||||
|
// "The incremental (i) parameter value is Boolean (see Section 3.3.6 of
|
||||||
|
// [STRUCTURED-FIELDS]). It indicates if an HTTP response can be processed
|
||||||
|
// incrementally, i.e., provide some meaningful output as chunks of the
|
||||||
|
// response arrive."
|
||||||
|
//
|
||||||
|
// We use uint8 (i.e. 0 is false, 1 is true) instead of bool so we can
|
||||||
|
// avoid unnecessary type conversions and because either type takes 1 byte.
|
||||||
|
incremental uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p PriorityParam) IsZero() bool {
|
func (p PriorityParam) IsZero() bool {
|
||||||
|
|
|
||||||
1
vendor/golang.org/x/net/http2/http2.go
generated
vendored
1
vendor/golang.org/x/net/http2/http2.go
generated
vendored
|
|
@ -34,7 +34,6 @@ var (
|
||||||
VerboseLogs bool
|
VerboseLogs bool
|
||||||
logFrameWrites bool
|
logFrameWrites bool
|
||||||
logFrameReads bool
|
logFrameReads bool
|
||||||
inTests bool
|
|
||||||
|
|
||||||
// Enabling extended CONNECT by causes browsers to attempt to use
|
// Enabling extended CONNECT by causes browsers to attempt to use
|
||||||
// WebSockets-over-HTTP/2. This results in problems when the server's websocket
|
// WebSockets-over-HTTP/2. This results in problems when the server's websocket
|
||||||
|
|
|
||||||
61
vendor/golang.org/x/net/http2/server.go
generated
vendored
61
vendor/golang.org/x/net/http2/server.go
generated
vendored
|
|
@ -181,6 +181,10 @@ type Server struct {
|
||||||
type serverInternalState struct {
|
type serverInternalState struct {
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
activeConns map[*serverConn]struct{}
|
activeConns map[*serverConn]struct{}
|
||||||
|
|
||||||
|
// Pool of error channels. This is per-Server rather than global
|
||||||
|
// because channels can't be reused across synctest bubbles.
|
||||||
|
errChanPool sync.Pool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *serverInternalState) registerConn(sc *serverConn) {
|
func (s *serverInternalState) registerConn(sc *serverConn) {
|
||||||
|
|
@ -212,6 +216,27 @@ func (s *serverInternalState) startGracefulShutdown() {
|
||||||
s.mu.Unlock()
|
s.mu.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Global error channel pool used for uninitialized Servers.
|
||||||
|
// We use a per-Server pool when possible to avoid using channels across synctest bubbles.
|
||||||
|
var errChanPool = sync.Pool{
|
||||||
|
New: func() any { return make(chan error, 1) },
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *serverInternalState) getErrChan() chan error {
|
||||||
|
if s == nil {
|
||||||
|
return errChanPool.Get().(chan error) // Server used without calling ConfigureServer
|
||||||
|
}
|
||||||
|
return s.errChanPool.Get().(chan error)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *serverInternalState) putErrChan(ch chan error) {
|
||||||
|
if s == nil {
|
||||||
|
errChanPool.Put(ch) // Server used without calling ConfigureServer
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s.errChanPool.Put(ch)
|
||||||
|
}
|
||||||
|
|
||||||
// ConfigureServer adds HTTP/2 support to a net/http Server.
|
// ConfigureServer adds HTTP/2 support to a net/http Server.
|
||||||
//
|
//
|
||||||
// The configuration conf may be nil.
|
// The configuration conf may be nil.
|
||||||
|
|
@ -224,7 +249,10 @@ func ConfigureServer(s *http.Server, conf *Server) error {
|
||||||
if conf == nil {
|
if conf == nil {
|
||||||
conf = new(Server)
|
conf = new(Server)
|
||||||
}
|
}
|
||||||
conf.state = &serverInternalState{activeConns: make(map[*serverConn]struct{})}
|
conf.state = &serverInternalState{
|
||||||
|
activeConns: make(map[*serverConn]struct{}),
|
||||||
|
errChanPool: sync.Pool{New: func() any { return make(chan error, 1) }},
|
||||||
|
}
|
||||||
if h1, h2 := s, conf; h2.IdleTimeout == 0 {
|
if h1, h2 := s, conf; h2.IdleTimeout == 0 {
|
||||||
if h1.IdleTimeout != 0 {
|
if h1.IdleTimeout != 0 {
|
||||||
h2.IdleTimeout = h1.IdleTimeout
|
h2.IdleTimeout = h1.IdleTimeout
|
||||||
|
|
@ -1124,25 +1152,6 @@ func (sc *serverConn) readPreface() error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var errChanPool = sync.Pool{
|
|
||||||
New: func() interface{} { return make(chan error, 1) },
|
|
||||||
}
|
|
||||||
|
|
||||||
func getErrChan() chan error {
|
|
||||||
if inTests {
|
|
||||||
// Channels cannot be reused across synctest tests.
|
|
||||||
return make(chan error, 1)
|
|
||||||
} else {
|
|
||||||
return errChanPool.Get().(chan error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func putErrChan(ch chan error) {
|
|
||||||
if !inTests {
|
|
||||||
errChanPool.Put(ch)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var writeDataPool = sync.Pool{
|
var writeDataPool = sync.Pool{
|
||||||
New: func() interface{} { return new(writeData) },
|
New: func() interface{} { return new(writeData) },
|
||||||
}
|
}
|
||||||
|
|
@ -1150,7 +1159,7 @@ var writeDataPool = sync.Pool{
|
||||||
// writeDataFromHandler writes DATA response frames from a handler on
|
// writeDataFromHandler writes DATA response frames from a handler on
|
||||||
// the given stream.
|
// the given stream.
|
||||||
func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStream bool) error {
|
func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStream bool) error {
|
||||||
ch := getErrChan()
|
ch := sc.srv.state.getErrChan()
|
||||||
writeArg := writeDataPool.Get().(*writeData)
|
writeArg := writeDataPool.Get().(*writeData)
|
||||||
*writeArg = writeData{stream.id, data, endStream}
|
*writeArg = writeData{stream.id, data, endStream}
|
||||||
err := sc.writeFrameFromHandler(FrameWriteRequest{
|
err := sc.writeFrameFromHandler(FrameWriteRequest{
|
||||||
|
|
@ -1182,7 +1191,7 @@ func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStrea
|
||||||
return errStreamClosed
|
return errStreamClosed
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
putErrChan(ch)
|
sc.srv.state.putErrChan(ch)
|
||||||
if frameWriteDone {
|
if frameWriteDone {
|
||||||
writeDataPool.Put(writeArg)
|
writeDataPool.Put(writeArg)
|
||||||
}
|
}
|
||||||
|
|
@ -2436,7 +2445,7 @@ func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) erro
|
||||||
// waiting for this frame to be written, so an http.Flush mid-handler
|
// waiting for this frame to be written, so an http.Flush mid-handler
|
||||||
// writes out the correct value of keys, before a handler later potentially
|
// writes out the correct value of keys, before a handler later potentially
|
||||||
// mutates it.
|
// mutates it.
|
||||||
errc = getErrChan()
|
errc = sc.srv.state.getErrChan()
|
||||||
}
|
}
|
||||||
if err := sc.writeFrameFromHandler(FrameWriteRequest{
|
if err := sc.writeFrameFromHandler(FrameWriteRequest{
|
||||||
write: headerData,
|
write: headerData,
|
||||||
|
|
@ -2448,7 +2457,7 @@ func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) erro
|
||||||
if errc != nil {
|
if errc != nil {
|
||||||
select {
|
select {
|
||||||
case err := <-errc:
|
case err := <-errc:
|
||||||
putErrChan(errc)
|
sc.srv.state.putErrChan(errc)
|
||||||
return err
|
return err
|
||||||
case <-sc.doneServing:
|
case <-sc.doneServing:
|
||||||
return errClientDisconnected
|
return errClientDisconnected
|
||||||
|
|
@ -3129,7 +3138,7 @@ func (w *responseWriter) Push(target string, opts *http.PushOptions) error {
|
||||||
method: opts.Method,
|
method: opts.Method,
|
||||||
url: u,
|
url: u,
|
||||||
header: cloneHeader(opts.Header),
|
header: cloneHeader(opts.Header),
|
||||||
done: getErrChan(),
|
done: sc.srv.state.getErrChan(),
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
|
|
@ -3146,7 +3155,7 @@ func (w *responseWriter) Push(target string, opts *http.PushOptions) error {
|
||||||
case <-st.cw:
|
case <-st.cw:
|
||||||
return errStreamClosed
|
return errStreamClosed
|
||||||
case err := <-msg.done:
|
case err := <-msg.done:
|
||||||
putErrChan(msg.done)
|
sc.srv.state.putErrChan(msg.done)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
6
vendor/golang.org/x/net/http2/transport.go
generated
vendored
6
vendor/golang.org/x/net/http2/transport.go
generated
vendored
|
|
@ -355,6 +355,7 @@ type ClientConn struct {
|
||||||
readIdleTimeout time.Duration
|
readIdleTimeout time.Duration
|
||||||
pingTimeout time.Duration
|
pingTimeout time.Duration
|
||||||
extendedConnectAllowed bool
|
extendedConnectAllowed bool
|
||||||
|
strictMaxConcurrentStreams bool
|
||||||
|
|
||||||
// rstStreamPingsBlocked works around an unfortunate gRPC behavior.
|
// rstStreamPingsBlocked works around an unfortunate gRPC behavior.
|
||||||
// gRPC strictly limits the number of PING frames that it will receive.
|
// gRPC strictly limits the number of PING frames that it will receive.
|
||||||
|
|
@ -784,7 +785,8 @@ func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, erro
|
||||||
initialWindowSize: 65535, // spec default
|
initialWindowSize: 65535, // spec default
|
||||||
initialStreamRecvWindowSize: conf.MaxUploadBufferPerStream,
|
initialStreamRecvWindowSize: conf.MaxUploadBufferPerStream,
|
||||||
maxConcurrentStreams: initialMaxConcurrentStreams, // "infinite", per spec. Use a smaller value until we have received server settings.
|
maxConcurrentStreams: initialMaxConcurrentStreams, // "infinite", per spec. Use a smaller value until we have received server settings.
|
||||||
peerMaxHeaderListSize: 0xffffffffffffffff, // "infinite", per spec. Use 2^64-1 instead.
|
strictMaxConcurrentStreams: conf.StrictMaxConcurrentRequests,
|
||||||
|
peerMaxHeaderListSize: 0xffffffffffffffff, // "infinite", per spec. Use 2^64-1 instead.
|
||||||
streams: make(map[uint32]*clientStream),
|
streams: make(map[uint32]*clientStream),
|
||||||
singleUse: singleUse,
|
singleUse: singleUse,
|
||||||
seenSettingsChan: make(chan struct{}),
|
seenSettingsChan: make(chan struct{}),
|
||||||
|
|
@ -1018,7 +1020,7 @@ func (cc *ClientConn) idleStateLocked() (st clientConnIdleState) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var maxConcurrentOkay bool
|
var maxConcurrentOkay bool
|
||||||
if cc.t.StrictMaxConcurrentStreams {
|
if cc.strictMaxConcurrentStreams {
|
||||||
// We'll tell the caller we can take a new request to
|
// We'll tell the caller we can take a new request to
|
||||||
// prevent the caller from dialing a new TCP
|
// prevent the caller from dialing a new TCP
|
||||||
// connection, but then we'll block later before
|
// connection, but then we'll block later before
|
||||||
|
|
|
||||||
2
vendor/golang.org/x/net/http2/writesched.go
generated
vendored
2
vendor/golang.org/x/net/http2/writesched.go
generated
vendored
|
|
@ -42,6 +42,8 @@ type OpenStreamOptions struct {
|
||||||
// PusherID is zero if the stream was initiated by the client. Otherwise,
|
// PusherID is zero if the stream was initiated by the client. Otherwise,
|
||||||
// PusherID names the stream that pushed the newly opened stream.
|
// PusherID names the stream that pushed the newly opened stream.
|
||||||
PusherID uint32
|
PusherID uint32
|
||||||
|
// priority is used to set the priority of the newly opened stream.
|
||||||
|
priority PriorityParam
|
||||||
}
|
}
|
||||||
|
|
||||||
// FrameWriteRequest is a request to write a frame.
|
// FrameWriteRequest is a request to write a frame.
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// RFC 7540, Section 5.3.5: the default weight is 16.
|
// RFC 7540, Section 5.3.5: the default weight is 16.
|
||||||
const priorityDefaultWeight = 15 // 16 = 15 + 1
|
const priorityDefaultWeightRFC7540 = 15 // 16 = 15 + 1
|
||||||
|
|
||||||
// PriorityWriteSchedulerConfig configures a priorityWriteScheduler.
|
// PriorityWriteSchedulerConfig configures a priorityWriteScheduler.
|
||||||
type PriorityWriteSchedulerConfig struct {
|
type PriorityWriteSchedulerConfig struct {
|
||||||
|
|
@ -66,8 +66,8 @@ func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ws := &priorityWriteScheduler{
|
ws := &priorityWriteSchedulerRFC7540{
|
||||||
nodes: make(map[uint32]*priorityNode),
|
nodes: make(map[uint32]*priorityNodeRFC7540),
|
||||||
maxClosedNodesInTree: cfg.MaxClosedNodesInTree,
|
maxClosedNodesInTree: cfg.MaxClosedNodesInTree,
|
||||||
maxIdleNodesInTree: cfg.MaxIdleNodesInTree,
|
maxIdleNodesInTree: cfg.MaxIdleNodesInTree,
|
||||||
enableWriteThrottle: cfg.ThrottleOutOfOrderWrites,
|
enableWriteThrottle: cfg.ThrottleOutOfOrderWrites,
|
||||||
|
|
@ -81,32 +81,32 @@ func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler
|
||||||
return ws
|
return ws
|
||||||
}
|
}
|
||||||
|
|
||||||
type priorityNodeState int
|
type priorityNodeStateRFC7540 int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
priorityNodeOpen priorityNodeState = iota
|
priorityNodeOpenRFC7540 priorityNodeStateRFC7540 = iota
|
||||||
priorityNodeClosed
|
priorityNodeClosedRFC7540
|
||||||
priorityNodeIdle
|
priorityNodeIdleRFC7540
|
||||||
)
|
)
|
||||||
|
|
||||||
// priorityNode is a node in an HTTP/2 priority tree.
|
// priorityNodeRFC7540 is a node in an HTTP/2 priority tree.
|
||||||
// Each node is associated with a single stream ID.
|
// Each node is associated with a single stream ID.
|
||||||
// See RFC 7540, Section 5.3.
|
// See RFC 7540, Section 5.3.
|
||||||
type priorityNode struct {
|
type priorityNodeRFC7540 struct {
|
||||||
q writeQueue // queue of pending frames to write
|
q writeQueue // queue of pending frames to write
|
||||||
id uint32 // id of the stream, or 0 for the root of the tree
|
id uint32 // id of the stream, or 0 for the root of the tree
|
||||||
weight uint8 // the actual weight is weight+1, so the value is in [1,256]
|
weight uint8 // the actual weight is weight+1, so the value is in [1,256]
|
||||||
state priorityNodeState // open | closed | idle
|
state priorityNodeStateRFC7540 // open | closed | idle
|
||||||
bytes int64 // number of bytes written by this node, or 0 if closed
|
bytes int64 // number of bytes written by this node, or 0 if closed
|
||||||
subtreeBytes int64 // sum(node.bytes) of all nodes in this subtree
|
subtreeBytes int64 // sum(node.bytes) of all nodes in this subtree
|
||||||
|
|
||||||
// These links form the priority tree.
|
// These links form the priority tree.
|
||||||
parent *priorityNode
|
parent *priorityNodeRFC7540
|
||||||
kids *priorityNode // start of the kids list
|
kids *priorityNodeRFC7540 // start of the kids list
|
||||||
prev, next *priorityNode // doubly-linked list of siblings
|
prev, next *priorityNodeRFC7540 // doubly-linked list of siblings
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *priorityNode) setParent(parent *priorityNode) {
|
func (n *priorityNodeRFC7540) setParent(parent *priorityNodeRFC7540) {
|
||||||
if n == parent {
|
if n == parent {
|
||||||
panic("setParent to self")
|
panic("setParent to self")
|
||||||
}
|
}
|
||||||
|
|
@ -141,7 +141,7 @@ func (n *priorityNode) setParent(parent *priorityNode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *priorityNode) addBytes(b int64) {
|
func (n *priorityNodeRFC7540) addBytes(b int64) {
|
||||||
n.bytes += b
|
n.bytes += b
|
||||||
for ; n != nil; n = n.parent {
|
for ; n != nil; n = n.parent {
|
||||||
n.subtreeBytes += b
|
n.subtreeBytes += b
|
||||||
|
|
@ -154,7 +154,7 @@ func (n *priorityNode) addBytes(b int64) {
|
||||||
//
|
//
|
||||||
// f(n, openParent) takes two arguments: the node to visit, n, and a bool that is true
|
// f(n, openParent) takes two arguments: the node to visit, n, and a bool that is true
|
||||||
// if any ancestor p of n is still open (ignoring the root node).
|
// if any ancestor p of n is still open (ignoring the root node).
|
||||||
func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f func(*priorityNode, bool) bool) bool {
|
func (n *priorityNodeRFC7540) walkReadyInOrder(openParent bool, tmp *[]*priorityNodeRFC7540, f func(*priorityNodeRFC7540, bool) bool) bool {
|
||||||
if !n.q.empty() && f(n, openParent) {
|
if !n.q.empty() && f(n, openParent) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
@ -165,7 +165,7 @@ func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f
|
||||||
// Don't consider the root "open" when updating openParent since
|
// Don't consider the root "open" when updating openParent since
|
||||||
// we can't send data frames on the root stream (only control frames).
|
// we can't send data frames on the root stream (only control frames).
|
||||||
if n.id != 0 {
|
if n.id != 0 {
|
||||||
openParent = openParent || (n.state == priorityNodeOpen)
|
openParent = openParent || (n.state == priorityNodeOpenRFC7540)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Common case: only one kid or all kids have the same weight.
|
// Common case: only one kid or all kids have the same weight.
|
||||||
|
|
@ -195,7 +195,7 @@ func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f
|
||||||
*tmp = append(*tmp, n.kids)
|
*tmp = append(*tmp, n.kids)
|
||||||
n.kids.setParent(nil)
|
n.kids.setParent(nil)
|
||||||
}
|
}
|
||||||
sort.Sort(sortPriorityNodeSiblings(*tmp))
|
sort.Sort(sortPriorityNodeSiblingsRFC7540(*tmp))
|
||||||
for i := len(*tmp) - 1; i >= 0; i-- {
|
for i := len(*tmp) - 1; i >= 0; i-- {
|
||||||
(*tmp)[i].setParent(n) // setParent inserts at the head of n.kids
|
(*tmp)[i].setParent(n) // setParent inserts at the head of n.kids
|
||||||
}
|
}
|
||||||
|
|
@ -207,11 +207,11 @@ func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
type sortPriorityNodeSiblings []*priorityNode
|
type sortPriorityNodeSiblingsRFC7540 []*priorityNodeRFC7540
|
||||||
|
|
||||||
func (z sortPriorityNodeSiblings) Len() int { return len(z) }
|
func (z sortPriorityNodeSiblingsRFC7540) Len() int { return len(z) }
|
||||||
func (z sortPriorityNodeSiblings) Swap(i, k int) { z[i], z[k] = z[k], z[i] }
|
func (z sortPriorityNodeSiblingsRFC7540) Swap(i, k int) { z[i], z[k] = z[k], z[i] }
|
||||||
func (z sortPriorityNodeSiblings) Less(i, k int) bool {
|
func (z sortPriorityNodeSiblingsRFC7540) Less(i, k int) bool {
|
||||||
// Prefer the subtree that has sent fewer bytes relative to its weight.
|
// Prefer the subtree that has sent fewer bytes relative to its weight.
|
||||||
// See sections 5.3.2 and 5.3.4.
|
// See sections 5.3.2 and 5.3.4.
|
||||||
wi, bi := float64(z[i].weight+1), float64(z[i].subtreeBytes)
|
wi, bi := float64(z[i].weight+1), float64(z[i].subtreeBytes)
|
||||||
|
|
@ -225,13 +225,13 @@ func (z sortPriorityNodeSiblings) Less(i, k int) bool {
|
||||||
return bi/bk <= wi/wk
|
return bi/bk <= wi/wk
|
||||||
}
|
}
|
||||||
|
|
||||||
type priorityWriteScheduler struct {
|
type priorityWriteSchedulerRFC7540 struct {
|
||||||
// root is the root of the priority tree, where root.id = 0.
|
// root is the root of the priority tree, where root.id = 0.
|
||||||
// The root queues control frames that are not associated with any stream.
|
// The root queues control frames that are not associated with any stream.
|
||||||
root priorityNode
|
root priorityNodeRFC7540
|
||||||
|
|
||||||
// nodes maps stream ids to priority tree nodes.
|
// nodes maps stream ids to priority tree nodes.
|
||||||
nodes map[uint32]*priorityNode
|
nodes map[uint32]*priorityNodeRFC7540
|
||||||
|
|
||||||
// maxID is the maximum stream id in nodes.
|
// maxID is the maximum stream id in nodes.
|
||||||
maxID uint32
|
maxID uint32
|
||||||
|
|
@ -239,7 +239,7 @@ type priorityWriteScheduler struct {
|
||||||
// lists of nodes that have been closed or are idle, but are kept in
|
// lists of nodes that have been closed or are idle, but are kept in
|
||||||
// the tree for improved prioritization. When the lengths exceed either
|
// the tree for improved prioritization. When the lengths exceed either
|
||||||
// maxClosedNodesInTree or maxIdleNodesInTree, old nodes are discarded.
|
// maxClosedNodesInTree or maxIdleNodesInTree, old nodes are discarded.
|
||||||
closedNodes, idleNodes []*priorityNode
|
closedNodes, idleNodes []*priorityNodeRFC7540
|
||||||
|
|
||||||
// From the config.
|
// From the config.
|
||||||
maxClosedNodesInTree int
|
maxClosedNodesInTree int
|
||||||
|
|
@ -248,19 +248,19 @@ type priorityWriteScheduler struct {
|
||||||
enableWriteThrottle bool
|
enableWriteThrottle bool
|
||||||
|
|
||||||
// tmp is scratch space for priorityNode.walkReadyInOrder to reduce allocations.
|
// tmp is scratch space for priorityNode.walkReadyInOrder to reduce allocations.
|
||||||
tmp []*priorityNode
|
tmp []*priorityNodeRFC7540
|
||||||
|
|
||||||
// pool of empty queues for reuse.
|
// pool of empty queues for reuse.
|
||||||
queuePool writeQueuePool
|
queuePool writeQueuePool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStreamOptions) {
|
func (ws *priorityWriteSchedulerRFC7540) OpenStream(streamID uint32, options OpenStreamOptions) {
|
||||||
// The stream may be currently idle but cannot be opened or closed.
|
// The stream may be currently idle but cannot be opened or closed.
|
||||||
if curr := ws.nodes[streamID]; curr != nil {
|
if curr := ws.nodes[streamID]; curr != nil {
|
||||||
if curr.state != priorityNodeIdle {
|
if curr.state != priorityNodeIdleRFC7540 {
|
||||||
panic(fmt.Sprintf("stream %d already opened", streamID))
|
panic(fmt.Sprintf("stream %d already opened", streamID))
|
||||||
}
|
}
|
||||||
curr.state = priorityNodeOpen
|
curr.state = priorityNodeOpenRFC7540
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -272,11 +272,11 @@ func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStream
|
||||||
if parent == nil {
|
if parent == nil {
|
||||||
parent = &ws.root
|
parent = &ws.root
|
||||||
}
|
}
|
||||||
n := &priorityNode{
|
n := &priorityNodeRFC7540{
|
||||||
q: *ws.queuePool.get(),
|
q: *ws.queuePool.get(),
|
||||||
id: streamID,
|
id: streamID,
|
||||||
weight: priorityDefaultWeight,
|
weight: priorityDefaultWeightRFC7540,
|
||||||
state: priorityNodeOpen,
|
state: priorityNodeOpenRFC7540,
|
||||||
}
|
}
|
||||||
n.setParent(parent)
|
n.setParent(parent)
|
||||||
ws.nodes[streamID] = n
|
ws.nodes[streamID] = n
|
||||||
|
|
@ -285,19 +285,19 @@ func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStream
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *priorityWriteScheduler) CloseStream(streamID uint32) {
|
func (ws *priorityWriteSchedulerRFC7540) CloseStream(streamID uint32) {
|
||||||
if streamID == 0 {
|
if streamID == 0 {
|
||||||
panic("violation of WriteScheduler interface: cannot close stream 0")
|
panic("violation of WriteScheduler interface: cannot close stream 0")
|
||||||
}
|
}
|
||||||
if ws.nodes[streamID] == nil {
|
if ws.nodes[streamID] == nil {
|
||||||
panic(fmt.Sprintf("violation of WriteScheduler interface: unknown stream %d", streamID))
|
panic(fmt.Sprintf("violation of WriteScheduler interface: unknown stream %d", streamID))
|
||||||
}
|
}
|
||||||
if ws.nodes[streamID].state != priorityNodeOpen {
|
if ws.nodes[streamID].state != priorityNodeOpenRFC7540 {
|
||||||
panic(fmt.Sprintf("violation of WriteScheduler interface: stream %d already closed", streamID))
|
panic(fmt.Sprintf("violation of WriteScheduler interface: stream %d already closed", streamID))
|
||||||
}
|
}
|
||||||
|
|
||||||
n := ws.nodes[streamID]
|
n := ws.nodes[streamID]
|
||||||
n.state = priorityNodeClosed
|
n.state = priorityNodeClosedRFC7540
|
||||||
n.addBytes(-n.bytes)
|
n.addBytes(-n.bytes)
|
||||||
|
|
||||||
q := n.q
|
q := n.q
|
||||||
|
|
@ -310,7 +310,7 @@ func (ws *priorityWriteScheduler) CloseStream(streamID uint32) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority PriorityParam) {
|
func (ws *priorityWriteSchedulerRFC7540) AdjustStream(streamID uint32, priority PriorityParam) {
|
||||||
if streamID == 0 {
|
if streamID == 0 {
|
||||||
panic("adjustPriority on root")
|
panic("adjustPriority on root")
|
||||||
}
|
}
|
||||||
|
|
@ -324,11 +324,11 @@ func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority Priorit
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ws.maxID = streamID
|
ws.maxID = streamID
|
||||||
n = &priorityNode{
|
n = &priorityNodeRFC7540{
|
||||||
q: *ws.queuePool.get(),
|
q: *ws.queuePool.get(),
|
||||||
id: streamID,
|
id: streamID,
|
||||||
weight: priorityDefaultWeight,
|
weight: priorityDefaultWeightRFC7540,
|
||||||
state: priorityNodeIdle,
|
state: priorityNodeIdleRFC7540,
|
||||||
}
|
}
|
||||||
n.setParent(&ws.root)
|
n.setParent(&ws.root)
|
||||||
ws.nodes[streamID] = n
|
ws.nodes[streamID] = n
|
||||||
|
|
@ -340,7 +340,7 @@ func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority Priorit
|
||||||
parent := ws.nodes[priority.StreamDep]
|
parent := ws.nodes[priority.StreamDep]
|
||||||
if parent == nil {
|
if parent == nil {
|
||||||
n.setParent(&ws.root)
|
n.setParent(&ws.root)
|
||||||
n.weight = priorityDefaultWeight
|
n.weight = priorityDefaultWeightRFC7540
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -381,8 +381,8 @@ func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority Priorit
|
||||||
n.weight = priority.Weight
|
n.weight = priority.Weight
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *priorityWriteScheduler) Push(wr FrameWriteRequest) {
|
func (ws *priorityWriteSchedulerRFC7540) Push(wr FrameWriteRequest) {
|
||||||
var n *priorityNode
|
var n *priorityNodeRFC7540
|
||||||
if wr.isControl() {
|
if wr.isControl() {
|
||||||
n = &ws.root
|
n = &ws.root
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -401,8 +401,8 @@ func (ws *priorityWriteScheduler) Push(wr FrameWriteRequest) {
|
||||||
n.q.push(wr)
|
n.q.push(wr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *priorityWriteScheduler) Pop() (wr FrameWriteRequest, ok bool) {
|
func (ws *priorityWriteSchedulerRFC7540) Pop() (wr FrameWriteRequest, ok bool) {
|
||||||
ws.root.walkReadyInOrder(false, &ws.tmp, func(n *priorityNode, openParent bool) bool {
|
ws.root.walkReadyInOrder(false, &ws.tmp, func(n *priorityNodeRFC7540, openParent bool) bool {
|
||||||
limit := int32(math.MaxInt32)
|
limit := int32(math.MaxInt32)
|
||||||
if openParent {
|
if openParent {
|
||||||
limit = ws.writeThrottleLimit
|
limit = ws.writeThrottleLimit
|
||||||
|
|
@ -428,7 +428,7 @@ func (ws *priorityWriteScheduler) Pop() (wr FrameWriteRequest, ok bool) {
|
||||||
return wr, ok
|
return wr, ok
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *priorityWriteScheduler) addClosedOrIdleNode(list *[]*priorityNode, maxSize int, n *priorityNode) {
|
func (ws *priorityWriteSchedulerRFC7540) addClosedOrIdleNode(list *[]*priorityNodeRFC7540, maxSize int, n *priorityNodeRFC7540) {
|
||||||
if maxSize == 0 {
|
if maxSize == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -442,7 +442,7 @@ func (ws *priorityWriteScheduler) addClosedOrIdleNode(list *[]*priorityNode, max
|
||||||
*list = append(*list, n)
|
*list = append(*list, n)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *priorityWriteScheduler) removeNode(n *priorityNode) {
|
func (ws *priorityWriteSchedulerRFC7540) removeNode(n *priorityNodeRFC7540) {
|
||||||
for n.kids != nil {
|
for n.kids != nil {
|
||||||
n.kids.setParent(n.parent)
|
n.kids.setParent(n.parent)
|
||||||
}
|
}
|
||||||
209
vendor/golang.org/x/net/http2/writesched_priority_rfc9128.go
generated
vendored
Normal file
209
vendor/golang.org/x/net/http2/writesched_priority_rfc9128.go
generated
vendored
Normal file
|
|
@ -0,0 +1,209 @@
|
||||||
|
// Copyright 2025 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package http2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
|
type streamMetadata struct {
|
||||||
|
location *writeQueue
|
||||||
|
priority PriorityParam
|
||||||
|
}
|
||||||
|
|
||||||
|
type priorityWriteSchedulerRFC9218 struct {
|
||||||
|
// control contains control frames (SETTINGS, PING, etc.).
|
||||||
|
control writeQueue
|
||||||
|
|
||||||
|
// heads contain the head of a circular list of streams.
|
||||||
|
// We put these heads within a nested array that represents urgency and
|
||||||
|
// incremental, as defined in
|
||||||
|
// https://www.rfc-editor.org/rfc/rfc9218.html#name-priority-parameters.
|
||||||
|
// 8 represents u=0 up to u=7, and 2 represents i=false and i=true.
|
||||||
|
heads [8][2]*writeQueue
|
||||||
|
|
||||||
|
// streams contains a mapping between each stream ID and their metadata, so
|
||||||
|
// we can quickly locate them when needing to, for example, adjust their
|
||||||
|
// priority.
|
||||||
|
streams map[uint32]streamMetadata
|
||||||
|
|
||||||
|
// queuePool are empty queues for reuse.
|
||||||
|
queuePool writeQueuePool
|
||||||
|
|
||||||
|
// prioritizeIncremental is used to determine whether we should prioritize
|
||||||
|
// incremental streams or not, when urgency is the same in a given Pop()
|
||||||
|
// call.
|
||||||
|
prioritizeIncremental bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func newPriorityWriteSchedulerRFC9128() WriteScheduler {
|
||||||
|
ws := &priorityWriteSchedulerRFC9218{
|
||||||
|
streams: make(map[uint32]streamMetadata),
|
||||||
|
}
|
||||||
|
return ws
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *priorityWriteSchedulerRFC9218) OpenStream(streamID uint32, opt OpenStreamOptions) {
|
||||||
|
if ws.streams[streamID].location != nil {
|
||||||
|
panic(fmt.Errorf("stream %d already opened", streamID))
|
||||||
|
}
|
||||||
|
q := ws.queuePool.get()
|
||||||
|
ws.streams[streamID] = streamMetadata{
|
||||||
|
location: q,
|
||||||
|
priority: opt.priority,
|
||||||
|
}
|
||||||
|
|
||||||
|
u, i := opt.priority.urgency, opt.priority.incremental
|
||||||
|
if ws.heads[u][i] == nil {
|
||||||
|
ws.heads[u][i] = q
|
||||||
|
q.next = q
|
||||||
|
q.prev = q
|
||||||
|
} else {
|
||||||
|
// Queues are stored in a ring.
|
||||||
|
// Insert the new stream before ws.head, putting it at the end of the list.
|
||||||
|
q.prev = ws.heads[u][i].prev
|
||||||
|
q.next = ws.heads[u][i]
|
||||||
|
q.prev.next = q
|
||||||
|
q.next.prev = q
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *priorityWriteSchedulerRFC9218) CloseStream(streamID uint32) {
|
||||||
|
metadata := ws.streams[streamID]
|
||||||
|
q, u, i := metadata.location, metadata.priority.urgency, metadata.priority.incremental
|
||||||
|
if q == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if q.next == q {
|
||||||
|
// This was the only open stream.
|
||||||
|
ws.heads[u][i] = nil
|
||||||
|
} else {
|
||||||
|
q.prev.next = q.next
|
||||||
|
q.next.prev = q.prev
|
||||||
|
if ws.heads[u][i] == q {
|
||||||
|
ws.heads[u][i] = q.next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete(ws.streams, streamID)
|
||||||
|
ws.queuePool.put(q)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *priorityWriteSchedulerRFC9218) AdjustStream(streamID uint32, priority PriorityParam) {
|
||||||
|
metadata := ws.streams[streamID]
|
||||||
|
q, u, i := metadata.location, metadata.priority.urgency, metadata.priority.incremental
|
||||||
|
if q == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove stream from current location.
|
||||||
|
if q.next == q {
|
||||||
|
// This was the only open stream.
|
||||||
|
ws.heads[u][i] = nil
|
||||||
|
} else {
|
||||||
|
q.prev.next = q.next
|
||||||
|
q.next.prev = q.prev
|
||||||
|
if ws.heads[u][i] == q {
|
||||||
|
ws.heads[u][i] = q.next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert stream to the new queue.
|
||||||
|
u, i = priority.urgency, priority.incremental
|
||||||
|
if ws.heads[u][i] == nil {
|
||||||
|
ws.heads[u][i] = q
|
||||||
|
q.next = q
|
||||||
|
q.prev = q
|
||||||
|
} else {
|
||||||
|
// Queues are stored in a ring.
|
||||||
|
// Insert the new stream before ws.head, putting it at the end of the list.
|
||||||
|
q.prev = ws.heads[u][i].prev
|
||||||
|
q.next = ws.heads[u][i]
|
||||||
|
q.prev.next = q
|
||||||
|
q.next.prev = q
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the metadata.
|
||||||
|
ws.streams[streamID] = streamMetadata{
|
||||||
|
location: q,
|
||||||
|
priority: priority,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *priorityWriteSchedulerRFC9218) Push(wr FrameWriteRequest) {
|
||||||
|
if wr.isControl() {
|
||||||
|
ws.control.push(wr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
q := ws.streams[wr.StreamID()].location
|
||||||
|
if q == nil {
|
||||||
|
// This is a closed stream.
|
||||||
|
// wr should not be a HEADERS or DATA frame.
|
||||||
|
// We push the request onto the control queue.
|
||||||
|
if wr.DataSize() > 0 {
|
||||||
|
panic("add DATA on non-open stream")
|
||||||
|
}
|
||||||
|
ws.control.push(wr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
q.push(wr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *priorityWriteSchedulerRFC9218) Pop() (FrameWriteRequest, bool) {
|
||||||
|
// Control and RST_STREAM frames first.
|
||||||
|
if !ws.control.empty() {
|
||||||
|
return ws.control.shift(), true
|
||||||
|
}
|
||||||
|
|
||||||
|
// On the next Pop(), we want to prioritize incremental if we prioritized
|
||||||
|
// non-incremental request of the same urgency this time. Vice-versa.
|
||||||
|
// i.e. when there are incremental and non-incremental requests at the same
|
||||||
|
// priority, we give 50% of our bandwidth to the incremental ones in
|
||||||
|
// aggregate and 50% to the first non-incremental one (since
|
||||||
|
// non-incremental streams do not use round-robin writes).
|
||||||
|
ws.prioritizeIncremental = !ws.prioritizeIncremental
|
||||||
|
|
||||||
|
// Always prioritize lowest u (i.e. highest urgency level).
|
||||||
|
for u := range ws.heads {
|
||||||
|
for i := range ws.heads[u] {
|
||||||
|
// When we want to prioritize incremental, we try to pop i=true
|
||||||
|
// first before i=false when u is the same.
|
||||||
|
if ws.prioritizeIncremental {
|
||||||
|
i = (i + 1) % 2
|
||||||
|
}
|
||||||
|
q := ws.heads[u][i]
|
||||||
|
if q == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
if wr, ok := q.consume(math.MaxInt32); ok {
|
||||||
|
if i == 1 {
|
||||||
|
// For incremental streams, we update head to q.next so
|
||||||
|
// we can round-robin between multiple streams that can
|
||||||
|
// immediately benefit from partial writes.
|
||||||
|
ws.heads[u][i] = q.next
|
||||||
|
} else {
|
||||||
|
// For non-incremental streams, we try to finish one to
|
||||||
|
// completion rather than doing round-robin. However,
|
||||||
|
// we update head here so that if q.consume() is !ok
|
||||||
|
// (e.g. the stream has no more frame to consume), head
|
||||||
|
// is updated to the next q that has frames to consume
|
||||||
|
// on future iterations. This way, we do not prioritize
|
||||||
|
// writing to unavailable stream on next Pop() calls,
|
||||||
|
// preventing head-of-line blocking.
|
||||||
|
ws.heads[u][i] = q
|
||||||
|
}
|
||||||
|
return wr, true
|
||||||
|
}
|
||||||
|
q = q.next
|
||||||
|
if q == ws.heads[u][i] {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FrameWriteRequest{}, false
|
||||||
|
}
|
||||||
2
vendor/golang.org/x/net/http2/writesched_roundrobin.go
generated
vendored
2
vendor/golang.org/x/net/http2/writesched_roundrobin.go
generated
vendored
|
|
@ -25,7 +25,7 @@ type roundRobinWriteScheduler struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// newRoundRobinWriteScheduler constructs a new write scheduler.
|
// newRoundRobinWriteScheduler constructs a new write scheduler.
|
||||||
// The round robin scheduler priorizes control frames
|
// The round robin scheduler prioritizes control frames
|
||||||
// like SETTINGS and PING over DATA frames.
|
// like SETTINGS and PING over DATA frames.
|
||||||
// When there are no control frames to send, it performs a round-robin
|
// When there are no control frames to send, it performs a round-robin
|
||||||
// selection from the ready streams.
|
// selection from the ready streams.
|
||||||
|
|
|
||||||
4
vendor/golang.org/x/net/internal/httpcommon/request.go
generated
vendored
4
vendor/golang.org/x/net/internal/httpcommon/request.go
generated
vendored
|
|
@ -51,7 +51,7 @@ type EncodeHeadersParam struct {
|
||||||
DefaultUserAgent string
|
DefaultUserAgent string
|
||||||
}
|
}
|
||||||
|
|
||||||
// EncodeHeadersParam is the result of EncodeHeaders.
|
// EncodeHeadersResult is the result of EncodeHeaders.
|
||||||
type EncodeHeadersResult struct {
|
type EncodeHeadersResult struct {
|
||||||
HasBody bool
|
HasBody bool
|
||||||
HasTrailers bool
|
HasTrailers bool
|
||||||
|
|
@ -399,7 +399,7 @@ type ServerRequestResult struct {
|
||||||
|
|
||||||
// If the request should be rejected, this is a short string suitable for passing
|
// If the request should be rejected, this is a short string suitable for passing
|
||||||
// to the http2 package's CountError function.
|
// to the http2 package's CountError function.
|
||||||
// It might be a bit odd to return errors this way rather than returing an error,
|
// It might be a bit odd to return errors this way rather than returning an error,
|
||||||
// but this ensures we don't forget to include a CountError reason.
|
// but this ensures we don't forget to include a CountError reason.
|
||||||
InvalidReason string
|
InvalidReason string
|
||||||
}
|
}
|
||||||
|
|
|
||||||
9
vendor/golang.org/x/sys/unix/affinity_linux.go
generated
vendored
9
vendor/golang.org/x/sys/unix/affinity_linux.go
generated
vendored
|
|
@ -41,6 +41,15 @@ func (s *CPUSet) Zero() {
|
||||||
clear(s[:])
|
clear(s[:])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fill adds all possible CPU bits to the set s. On Linux, [SchedSetaffinity]
|
||||||
|
// will silently ignore any invalid CPU bits in [CPUSet] so this is an
|
||||||
|
// efficient way of resetting the CPU affinity of a process.
|
||||||
|
func (s *CPUSet) Fill() {
|
||||||
|
for i := range s {
|
||||||
|
s[i] = ^cpuMask(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func cpuBitsIndex(cpu int) int {
|
func cpuBitsIndex(cpu int) int {
|
||||||
return cpu / _NCPUBITS
|
return cpu / _NCPUBITS
|
||||||
}
|
}
|
||||||
|
|
|
||||||
4
vendor/golang.org/x/sys/unix/fdset.go
generated
vendored
4
vendor/golang.org/x/sys/unix/fdset.go
generated
vendored
|
|
@ -23,7 +23,5 @@ func (fds *FdSet) IsSet(fd int) bool {
|
||||||
|
|
||||||
// Zero clears the set fds.
|
// Zero clears the set fds.
|
||||||
func (fds *FdSet) Zero() {
|
func (fds *FdSet) Zero() {
|
||||||
for i := range fds.Bits {
|
clear(fds.Bits[:])
|
||||||
fds.Bits[i] = 0
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
4
vendor/golang.org/x/sys/unix/ifreq_linux.go
generated
vendored
4
vendor/golang.org/x/sys/unix/ifreq_linux.go
generated
vendored
|
|
@ -111,9 +111,7 @@ func (ifr *Ifreq) SetUint32(v uint32) {
|
||||||
// clear zeroes the ifreq's union field to prevent trailing garbage data from
|
// clear zeroes the ifreq's union field to prevent trailing garbage data from
|
||||||
// being sent to the kernel if an ifreq is reused.
|
// being sent to the kernel if an ifreq is reused.
|
||||||
func (ifr *Ifreq) clear() {
|
func (ifr *Ifreq) clear() {
|
||||||
for i := range ifr.raw.Ifru {
|
clear(ifr.raw.Ifru[:])
|
||||||
ifr.raw.Ifru[i] = 0
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(mdlayher): export as IfreqData? For now we can provide helpers such as
|
// TODO(mdlayher): export as IfreqData? For now we can provide helpers such as
|
||||||
|
|
|
||||||
1
vendor/golang.org/x/sys/unix/mkall.sh
generated
vendored
1
vendor/golang.org/x/sys/unix/mkall.sh
generated
vendored
|
|
@ -49,6 +49,7 @@ esac
|
||||||
if [[ "$GOOS" = "linux" ]]; then
|
if [[ "$GOOS" = "linux" ]]; then
|
||||||
# Use the Docker-based build system
|
# Use the Docker-based build system
|
||||||
# Files generated through docker (use $cmd so you can Ctl-C the build or run)
|
# Files generated through docker (use $cmd so you can Ctl-C the build or run)
|
||||||
|
set -e
|
||||||
$cmd docker build --tag generate:$GOOS $GOOS
|
$cmd docker build --tag generate:$GOOS $GOOS
|
||||||
$cmd docker run --interactive --tty --volume $(cd -- "$(dirname -- "$0")/.." && pwd):/build generate:$GOOS
|
$cmd docker run --interactive --tty --volume $(cd -- "$(dirname -- "$0")/.." && pwd):/build generate:$GOOS
|
||||||
exit
|
exit
|
||||||
|
|
|
||||||
4
vendor/golang.org/x/sys/unix/syscall_linux.go
generated
vendored
4
vendor/golang.org/x/sys/unix/syscall_linux.go
generated
vendored
|
|
@ -801,9 +801,7 @@ func (sa *SockaddrPPPoE) sockaddr() (unsafe.Pointer, _Socklen, error) {
|
||||||
// one. The kernel expects SID to be in network byte order.
|
// one. The kernel expects SID to be in network byte order.
|
||||||
binary.BigEndian.PutUint16(sa.raw[6:8], sa.SID)
|
binary.BigEndian.PutUint16(sa.raw[6:8], sa.SID)
|
||||||
copy(sa.raw[8:14], sa.Remote)
|
copy(sa.raw[8:14], sa.Remote)
|
||||||
for i := 14; i < 14+IFNAMSIZ; i++ {
|
clear(sa.raw[14 : 14+IFNAMSIZ])
|
||||||
sa.raw[i] = 0
|
|
||||||
}
|
|
||||||
copy(sa.raw[14:], sa.Dev)
|
copy(sa.raw[14:], sa.Dev)
|
||||||
return unsafe.Pointer(&sa.raw), SizeofSockaddrPPPoX, nil
|
return unsafe.Pointer(&sa.raw), SizeofSockaddrPPPoX, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
17
vendor/golang.org/x/sys/unix/syscall_netbsd.go
generated
vendored
17
vendor/golang.org/x/sys/unix/syscall_netbsd.go
generated
vendored
|
|
@ -248,6 +248,23 @@ func Statvfs(path string, buf *Statvfs_t) (err error) {
|
||||||
return Statvfs1(path, buf, ST_WAIT)
|
return Statvfs1(path, buf, ST_WAIT)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Getvfsstat(buf []Statvfs_t, flags int) (n int, err error) {
|
||||||
|
var (
|
||||||
|
_p0 unsafe.Pointer
|
||||||
|
bufsize uintptr
|
||||||
|
)
|
||||||
|
if len(buf) > 0 {
|
||||||
|
_p0 = unsafe.Pointer(&buf[0])
|
||||||
|
bufsize = unsafe.Sizeof(Statvfs_t{}) * uintptr(len(buf))
|
||||||
|
}
|
||||||
|
r0, _, e1 := Syscall(SYS_GETVFSSTAT, uintptr(_p0), bufsize, uintptr(flags))
|
||||||
|
n = int(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = e1
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Exposed directly
|
* Exposed directly
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
2
vendor/golang.org/x/sys/windows/syscall_windows.go
generated
vendored
2
vendor/golang.org/x/sys/windows/syscall_windows.go
generated
vendored
|
|
@ -321,6 +321,8 @@ func NewCallbackCDecl(fn interface{}) uintptr {
|
||||||
//sys SetConsoleOutputCP(cp uint32) (err error) = kernel32.SetConsoleOutputCP
|
//sys SetConsoleOutputCP(cp uint32) (err error) = kernel32.SetConsoleOutputCP
|
||||||
//sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW
|
//sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW
|
||||||
//sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW
|
//sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW
|
||||||
|
//sys GetNumberOfConsoleInputEvents(console Handle, numevents *uint32) (err error) = kernel32.GetNumberOfConsoleInputEvents
|
||||||
|
//sys FlushConsoleInputBuffer(console Handle) (err error) = kernel32.FlushConsoleInputBuffer
|
||||||
//sys resizePseudoConsole(pconsole Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole
|
//sys resizePseudoConsole(pconsole Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole
|
||||||
//sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot
|
//sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot
|
||||||
//sys Module32First(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32FirstW
|
//sys Module32First(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32FirstW
|
||||||
|
|
|
||||||
16
vendor/golang.org/x/sys/windows/types_windows.go
generated
vendored
16
vendor/golang.org/x/sys/windows/types_windows.go
generated
vendored
|
|
@ -65,6 +65,22 @@ var signals = [...]string{
|
||||||
15: "terminated",
|
15: "terminated",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// File flags for [os.OpenFile]. The O_ prefix is used to indicate
|
||||||
|
// that these flags are specific to the OpenFile function.
|
||||||
|
const (
|
||||||
|
O_FILE_FLAG_OPEN_NO_RECALL = FILE_FLAG_OPEN_NO_RECALL
|
||||||
|
O_FILE_FLAG_OPEN_REPARSE_POINT = FILE_FLAG_OPEN_REPARSE_POINT
|
||||||
|
O_FILE_FLAG_SESSION_AWARE = FILE_FLAG_SESSION_AWARE
|
||||||
|
O_FILE_FLAG_POSIX_SEMANTICS = FILE_FLAG_POSIX_SEMANTICS
|
||||||
|
O_FILE_FLAG_BACKUP_SEMANTICS = FILE_FLAG_BACKUP_SEMANTICS
|
||||||
|
O_FILE_FLAG_DELETE_ON_CLOSE = FILE_FLAG_DELETE_ON_CLOSE
|
||||||
|
O_FILE_FLAG_SEQUENTIAL_SCAN = FILE_FLAG_SEQUENTIAL_SCAN
|
||||||
|
O_FILE_FLAG_RANDOM_ACCESS = FILE_FLAG_RANDOM_ACCESS
|
||||||
|
O_FILE_FLAG_NO_BUFFERING = FILE_FLAG_NO_BUFFERING
|
||||||
|
O_FILE_FLAG_OVERLAPPED = FILE_FLAG_OVERLAPPED
|
||||||
|
O_FILE_FLAG_WRITE_THROUGH = FILE_FLAG_WRITE_THROUGH
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
FILE_READ_DATA = 0x00000001
|
FILE_READ_DATA = 0x00000001
|
||||||
FILE_READ_ATTRIBUTES = 0x00000080
|
FILE_READ_ATTRIBUTES = 0x00000080
|
||||||
|
|
|
||||||
18
vendor/golang.org/x/sys/windows/zsyscall_windows.go
generated
vendored
18
vendor/golang.org/x/sys/windows/zsyscall_windows.go
generated
vendored
|
|
@ -238,6 +238,7 @@ var (
|
||||||
procFindResourceW = modkernel32.NewProc("FindResourceW")
|
procFindResourceW = modkernel32.NewProc("FindResourceW")
|
||||||
procFindVolumeClose = modkernel32.NewProc("FindVolumeClose")
|
procFindVolumeClose = modkernel32.NewProc("FindVolumeClose")
|
||||||
procFindVolumeMountPointClose = modkernel32.NewProc("FindVolumeMountPointClose")
|
procFindVolumeMountPointClose = modkernel32.NewProc("FindVolumeMountPointClose")
|
||||||
|
procFlushConsoleInputBuffer = modkernel32.NewProc("FlushConsoleInputBuffer")
|
||||||
procFlushFileBuffers = modkernel32.NewProc("FlushFileBuffers")
|
procFlushFileBuffers = modkernel32.NewProc("FlushFileBuffers")
|
||||||
procFlushViewOfFile = modkernel32.NewProc("FlushViewOfFile")
|
procFlushViewOfFile = modkernel32.NewProc("FlushViewOfFile")
|
||||||
procFormatMessageW = modkernel32.NewProc("FormatMessageW")
|
procFormatMessageW = modkernel32.NewProc("FormatMessageW")
|
||||||
|
|
@ -284,6 +285,7 @@ var (
|
||||||
procGetNamedPipeHandleStateW = modkernel32.NewProc("GetNamedPipeHandleStateW")
|
procGetNamedPipeHandleStateW = modkernel32.NewProc("GetNamedPipeHandleStateW")
|
||||||
procGetNamedPipeInfo = modkernel32.NewProc("GetNamedPipeInfo")
|
procGetNamedPipeInfo = modkernel32.NewProc("GetNamedPipeInfo")
|
||||||
procGetNamedPipeServerProcessId = modkernel32.NewProc("GetNamedPipeServerProcessId")
|
procGetNamedPipeServerProcessId = modkernel32.NewProc("GetNamedPipeServerProcessId")
|
||||||
|
procGetNumberOfConsoleInputEvents = modkernel32.NewProc("GetNumberOfConsoleInputEvents")
|
||||||
procGetOverlappedResult = modkernel32.NewProc("GetOverlappedResult")
|
procGetOverlappedResult = modkernel32.NewProc("GetOverlappedResult")
|
||||||
procGetPriorityClass = modkernel32.NewProc("GetPriorityClass")
|
procGetPriorityClass = modkernel32.NewProc("GetPriorityClass")
|
||||||
procGetProcAddress = modkernel32.NewProc("GetProcAddress")
|
procGetProcAddress = modkernel32.NewProc("GetProcAddress")
|
||||||
|
|
@ -2111,6 +2113,14 @@ func FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func FlushConsoleInputBuffer(console Handle) (err error) {
|
||||||
|
r1, _, e1 := syscall.SyscallN(procFlushConsoleInputBuffer.Addr(), uintptr(console))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func FlushFileBuffers(handle Handle) (err error) {
|
func FlushFileBuffers(handle Handle) (err error) {
|
||||||
r1, _, e1 := syscall.SyscallN(procFlushFileBuffers.Addr(), uintptr(handle))
|
r1, _, e1 := syscall.SyscallN(procFlushFileBuffers.Addr(), uintptr(handle))
|
||||||
if r1 == 0 {
|
if r1 == 0 {
|
||||||
|
|
@ -2481,6 +2491,14 @@ func GetNamedPipeServerProcessId(pipe Handle, serverProcessID *uint32) (err erro
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetNumberOfConsoleInputEvents(console Handle, numevents *uint32) (err error) {
|
||||||
|
r1, _, e1 := syscall.SyscallN(procGetNumberOfConsoleInputEvents.Addr(), uintptr(console), uintptr(unsafe.Pointer(numevents)))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error) {
|
func GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error) {
|
||||||
var _p0 uint32
|
var _p0 uint32
|
||||||
if wait {
|
if wait {
|
||||||
|
|
|
||||||
11
vendor/golang.org/x/text/unicode/bidi/core.go
generated
vendored
11
vendor/golang.org/x/text/unicode/bidi/core.go
generated
vendored
|
|
@ -427,13 +427,6 @@ type isolatingRunSequence struct {
|
||||||
|
|
||||||
func (i *isolatingRunSequence) Len() int { return len(i.indexes) }
|
func (i *isolatingRunSequence) Len() int { return len(i.indexes) }
|
||||||
|
|
||||||
func maxLevel(a, b level) level {
|
|
||||||
if a > b {
|
|
||||||
return a
|
|
||||||
}
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rule X10, second bullet: Determine the start-of-sequence (sos) and end-of-sequence (eos) types,
|
// Rule X10, second bullet: Determine the start-of-sequence (sos) and end-of-sequence (eos) types,
|
||||||
// either L or R, for each isolating run sequence.
|
// either L or R, for each isolating run sequence.
|
||||||
func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence {
|
func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence {
|
||||||
|
|
@ -474,8 +467,8 @@ func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence {
|
||||||
indexes: indexes,
|
indexes: indexes,
|
||||||
types: types,
|
types: types,
|
||||||
level: level,
|
level: level,
|
||||||
sos: typeForLevel(maxLevel(prevLevel, level)),
|
sos: typeForLevel(max(prevLevel, level)),
|
||||||
eos: typeForLevel(maxLevel(succLevel, level)),
|
eos: typeForLevel(max(succLevel, level)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
12
vendor/modules.txt
vendored
12
vendor/modules.txt
vendored
|
|
@ -53,7 +53,7 @@ github.com/etkecc/go-healthchecks/v2
|
||||||
# github.com/etkecc/go-kit v1.7.5
|
# github.com/etkecc/go-kit v1.7.5
|
||||||
## explicit; go 1.22
|
## explicit; go 1.22
|
||||||
github.com/etkecc/go-kit
|
github.com/etkecc/go-kit
|
||||||
# github.com/etkecc/go-linkpearl v0.0.0-20250916123206-78ebb36aa071
|
# github.com/etkecc/go-linkpearl v0.0.0-20251009114554-5985fe44a189
|
||||||
## explicit; go 1.24.0
|
## explicit; go 1.24.0
|
||||||
github.com/etkecc/go-linkpearl
|
github.com/etkecc/go-linkpearl
|
||||||
# github.com/etkecc/go-mxidwc v1.0.1
|
# github.com/etkecc/go-mxidwc v1.0.1
|
||||||
|
|
@ -162,7 +162,7 @@ github.com/mikesmitty/edkey
|
||||||
# github.com/mileusna/crontab v1.2.0
|
# github.com/mileusna/crontab v1.2.0
|
||||||
## explicit; go 1.14
|
## explicit; go 1.14
|
||||||
github.com/mileusna/crontab
|
github.com/mileusna/crontab
|
||||||
# github.com/ncruces/go-strftime v0.1.9
|
# github.com/ncruces/go-strftime v1.0.0
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
github.com/ncruces/go-strftime
|
github.com/ncruces/go-strftime
|
||||||
# github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6
|
# github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6
|
||||||
|
|
@ -253,7 +253,7 @@ go.mau.fi/util/jsontime
|
||||||
go.mau.fi/util/ptr
|
go.mau.fi/util/ptr
|
||||||
go.mau.fi/util/random
|
go.mau.fi/util/random
|
||||||
go.mau.fi/util/retryafter
|
go.mau.fi/util/retryafter
|
||||||
# golang.org/x/crypto v0.42.0
|
# golang.org/x/crypto v0.43.0
|
||||||
## explicit; go 1.24.0
|
## explicit; go 1.24.0
|
||||||
golang.org/x/crypto/argon2
|
golang.org/x/crypto/argon2
|
||||||
golang.org/x/crypto/blake2b
|
golang.org/x/crypto/blake2b
|
||||||
|
|
@ -272,7 +272,7 @@ golang.org/x/crypto/ssh/internal/bcrypt_pbkdf
|
||||||
golang.org/x/exp/constraints
|
golang.org/x/exp/constraints
|
||||||
golang.org/x/exp/maps
|
golang.org/x/exp/maps
|
||||||
golang.org/x/exp/slices
|
golang.org/x/exp/slices
|
||||||
# golang.org/x/net v0.44.0
|
# golang.org/x/net v0.46.0
|
||||||
## explicit; go 1.24.0
|
## explicit; go 1.24.0
|
||||||
golang.org/x/net/html
|
golang.org/x/net/html
|
||||||
golang.org/x/net/html/atom
|
golang.org/x/net/html/atom
|
||||||
|
|
@ -282,13 +282,13 @@ golang.org/x/net/http2/hpack
|
||||||
golang.org/x/net/idna
|
golang.org/x/net/idna
|
||||||
golang.org/x/net/internal/httpcommon
|
golang.org/x/net/internal/httpcommon
|
||||||
golang.org/x/net/publicsuffix
|
golang.org/x/net/publicsuffix
|
||||||
# golang.org/x/sys v0.36.0
|
# golang.org/x/sys v0.37.0
|
||||||
## explicit; go 1.24.0
|
## explicit; go 1.24.0
|
||||||
golang.org/x/sys/cpu
|
golang.org/x/sys/cpu
|
||||||
golang.org/x/sys/execabs
|
golang.org/x/sys/execabs
|
||||||
golang.org/x/sys/unix
|
golang.org/x/sys/unix
|
||||||
golang.org/x/sys/windows
|
golang.org/x/sys/windows
|
||||||
# golang.org/x/text v0.29.0
|
# golang.org/x/text v0.30.0
|
||||||
## explicit; go 1.24.0
|
## explicit; go 1.24.0
|
||||||
golang.org/x/text/cases
|
golang.org/x/text/cases
|
||||||
golang.org/x/text/encoding
|
golang.org/x/text/encoding
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue