mirror of
https://git.mills.io/saltyim/saltyim.git
synced 2024-06-20 13:58:22 +00:00
ddd16c202f
Alternative to #177 The way this works is: Client: - Client creates a normal `net/http.Request{}` object using the `Request()` function in `utils.go`. The `http.Request{}` object is then signed using the Client's Ed25519 private key. - The HTTP Method and Path (_note this is important_) are hashed, as well as the request body (if any) using the FNV128a hashing algorithm. - This hash is then signed by the Client's's Ed25519 private key. - The resulting signature is then encoded to Base64 (_standard encoding_) and added to the HTTP headers as a `Signature:` header. - In addition the Client's Ed25519 public key is added to the HTTP headers as `Signer:` Server: - The server calculates the same FNV128a hash of the HTTP Request Method and Path and the body (if any) - The server decodes the HTTP header `Signature:` - The server then uses the Client's Ed25519 public key in the HTTP header `Signer:` to verify the signature of the `Signature:` HTTP header which gives us back the original FNV128a hash the Client calculated for the request. - The server then compares the Client's hash with the expected hash to see if they compare equally. Co-authored-by: James Mills <1290234+prologic@users.noreply.github.com> Co-authored-by: Jon Lundy <jon@xuu.cc> Reviewed-on: https://git.mills.io/saltyim/saltyim/pulls/178 Reviewed-by: xuu <xuu@noreply@mills.io>
56 lines
1013 B
Go
56 lines
1013 B
Go
package internal
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
var (
|
|
ErrInvalidStore = errors.New("error: invalid store")
|
|
ErrPollNotFound = errors.New("error: poll not found")
|
|
)
|
|
|
|
type StoreURI struct {
|
|
Type string
|
|
Path string
|
|
}
|
|
|
|
func (u StoreURI) IsZero() bool {
|
|
return u.Type == "" && u.Path == ""
|
|
}
|
|
|
|
func (u StoreURI) String() string {
|
|
return fmt.Sprintf("%s://%s", u.Type, u.Path)
|
|
}
|
|
|
|
func ParseStoreURI(uri string) (*StoreURI, error) {
|
|
parts := strings.Split(uri, "://")
|
|
if len(parts) == 2 {
|
|
return &StoreURI{Type: strings.ToLower(parts[0]), Path: parts[1]}, nil
|
|
}
|
|
return nil, fmt.Errorf("invalid uri: %s", uri)
|
|
}
|
|
|
|
type Store interface {
|
|
Merge() error
|
|
Close() error
|
|
Sync() error
|
|
}
|
|
|
|
func NewStore(store string) (Store, error) {
|
|
u, err := ParseStoreURI(store)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error parsing store uri: %s", err)
|
|
}
|
|
|
|
switch u.Type {
|
|
case "bitcask":
|
|
return newBitcaskStore(u.Path)
|
|
case "memory":
|
|
return newMemoryStore(), nil
|
|
default:
|
|
return nil, ErrInvalidStore
|
|
}
|
|
}
|