mirror of
https://github.com/status-im/status-go.git
synced 2025-01-09 06:12:55 +00:00
511d6bfc54
* feat(share-links): Add protobuf and encode/decode url data methods * feat(new-links-format): Adds generators for new links format * feat: add parsing for new links format * feat: add messenger-level pubkey serialization and tests * feat: fix and test CreateCommunityURLWithChatKey * feat: impl and test parseCommunityURLWithChatKey * feat: fix and test CreateCommunityURLWithData * feat: impl and test parseCommunityURLWithData (not working) * feat: UrlDataResponse as response share urls api * feat: impl& tested ShareCommunityChannelURLWithChatKey * feat: impl & tested ParseCommunityChannelURLWithChatKey * fix: bring urls to new format * feat: add regexp for community channel urls * feat: impl & test contact urls with chatKey, Ens and data * fix: encodeDataURL/encodeDataURL patch from Samyoul * fix: fix unmarshalling protobufs * fix: fix minor issues, temporary comment TestParseUserURLWithENS * fix: allow url to contain extra `#` in the signature * fix: check signatures with SigToPub * chore: lint fixes * fix: encode the signature * feat: Check provided channelID is Uuid * fix(share-community-url): Remove if community encrypted scope * fix: review fixes * fix: use proto.Unmarshal instead of json.Marshal * feat(share-urls): Adds TagsIndices to community data * feat: support tag indices to community url data --------- Co-authored-by: Boris Melnik <borismelnik@status.im>
92 lines
2.0 KiB
Go
92 lines
2.0 KiB
Go
package urls
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/base64"
|
|
"strings"
|
|
"unicode/utf8"
|
|
|
|
"github.com/andybalholm/brotli"
|
|
)
|
|
|
|
const (
|
|
htmlTagStart = 60 // Unicode `<`
|
|
htmlTagEnd = 62 // Unicode `>`
|
|
)
|
|
|
|
// Taken from https://stackoverflow.com/a/64701836
|
|
// Aggressively strips HTML tags from a string.
|
|
// It will only keep anything between `>` and `<`.
|
|
func stripHTMLTags(s string) string {
|
|
// Setup a string builder and allocate enough memory for the new string.
|
|
var builder strings.Builder
|
|
builder.Grow(len(s) + utf8.UTFMax)
|
|
|
|
in := false // True if we are inside an HTML tag.
|
|
start := 0 // The index of the previous start tag character `<`
|
|
end := 0 // The index of the previous end tag character `>`
|
|
|
|
for i, c := range s {
|
|
// If this is the last character and we are not in an HTML tag, save it.
|
|
if (i+1) == len(s) && end >= start {
|
|
builder.WriteString(s[end:])
|
|
}
|
|
|
|
// Keep going if the character is not `<` or `>`
|
|
if c != htmlTagStart && c != htmlTagEnd {
|
|
continue
|
|
}
|
|
|
|
if c == htmlTagStart {
|
|
// Only update the start if we are not in a tag.
|
|
// This make sure we strip out `<<br>` not just `<br>`
|
|
if !in {
|
|
start = i
|
|
}
|
|
in = true
|
|
|
|
// Write the valid string between the close and start of the two tags.
|
|
builder.WriteString(s[end:start])
|
|
continue
|
|
}
|
|
// else c == htmlTagEnd
|
|
in = false
|
|
end = i + 1
|
|
}
|
|
s = builder.String()
|
|
return s
|
|
}
|
|
|
|
func encodeDataURL(data []byte) (string, error) {
|
|
bb := bytes.NewBuffer([]byte{})
|
|
writer := brotli.NewWriter(bb)
|
|
_, err := writer.Write(data)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
err = writer.Close()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return base64.URLEncoding.EncodeToString(bb.Bytes()), nil
|
|
}
|
|
|
|
func decodeDataURL(data string) ([]byte, error) {
|
|
decoded, err := base64.URLEncoding.DecodeString(data)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
output := make([]byte, 4096)
|
|
bb := bytes.NewBuffer(decoded)
|
|
reader := brotli.NewReader(bb)
|
|
n, err := reader.Read(output)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return output[:n], nil
|
|
}
|