mirror of
https://github.com/superseriousbusiness/gotosocial
synced 2025-06-05 21:59:39 +02:00
* [feature] add TOTP two-factor authentication (2FA) * use byteutil.S2B to avoid allocations when comparing + generating password hashes * don't bother with string conversion for consts * use io.ReadFull * use MustGenerateSecret for backup codes * rename util functions
36 lines
800 B
Go
36 lines
800 B
Go
package internal
|
|
|
|
import (
|
|
"net/url"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
// EncodeQuery is a copy-paste of url.Values.Encode, except it uses %20 instead
|
|
// of + to encode spaces. This is necessary to correctly render spaces in some
|
|
// authenticator apps, like Google Authenticator.
|
|
func EncodeQuery(v url.Values) string {
|
|
if v == nil {
|
|
return ""
|
|
}
|
|
var buf strings.Builder
|
|
keys := make([]string, 0, len(v))
|
|
for k := range v {
|
|
keys = append(keys, k)
|
|
}
|
|
sort.Strings(keys)
|
|
for _, k := range keys {
|
|
vs := v[k]
|
|
keyEscaped := url.PathEscape(k) // changed from url.QueryEscape
|
|
for _, v := range vs {
|
|
if buf.Len() > 0 {
|
|
buf.WriteByte('&')
|
|
}
|
|
buf.WriteString(keyEscaped)
|
|
buf.WriteByte('=')
|
|
buf.WriteString(url.PathEscape(v)) // changed from url.QueryEscape
|
|
}
|
|
}
|
|
return buf.String()
|
|
}
|