+1
.gitignore
+1
.gitignore
+10
-8
appview/config.go
+10
-8
appview/config.go
···
7
7
)
8
8
9
9
type Config struct {
10
-
CookieSecret string `env:"TANGLED_COOKIE_SECRET, default=00000000000000000000000000000000"`
11
-
DbPath string `env:"TANGLED_DB_PATH, default=appview.db"`
12
-
ListenAddr string `env:"TANGLED_LISTEN_ADDR, default=0.0.0.0:3000"`
13
-
Dev bool `env:"TANGLED_DEV, default=false"`
14
-
JetstreamEndpoint string `env:"TANGLED_JETSTREAM_ENDPOINT, default=wss://jetstream1.us-east.bsky.network/subscribe"`
15
-
ResendApiKey string `env:"TANGLED_RESEND_API_KEY"`
16
-
CamoHost string `env:"TANGLED_CAMO_HOST, default=https://camo.tangled.sh"`
17
-
CamoSharedSecret string `env:"TANGLED_CAMO_SHARED_SECRET"`
10
+
CookieSecret string `env:"TANGLED_COOKIE_SECRET, default=00000000000000000000000000000000"`
11
+
DbPath string `env:"TANGLED_DB_PATH, default=appview.db"`
12
+
ListenAddr string `env:"TANGLED_LISTEN_ADDR, default=0.0.0.0:3000"`
13
+
Dev bool `env:"TANGLED_DEV, default=false"`
14
+
JetstreamEndpoint string `env:"TANGLED_JETSTREAM_ENDPOINT, default=wss://jetstream1.us-east.bsky.network/subscribe"`
15
+
ResendApiKey string `env:"TANGLED_RESEND_API_KEY"`
16
+
CamoHost string `env:"TANGLED_CAMO_HOST, default=https://camo.tangled.sh"`
17
+
CamoSharedSecret string `env:"TANGLED_CAMO_SHARED_SECRET"`
18
+
AvatarSharedSecret string `env:"TANGLED_AVATAR_SHARED_SECRET"`
19
+
AvatarHost string `env:"TANGLED_AVATAR_HOST, default=https://avatar.tangled.sh"`
18
20
}
19
21
20
22
func LoadConfig(ctx context.Context) (*Config, error) {
+12
-5
appview/state/profile.go
+12
-5
appview/state/profile.go
···
1
1
package state
2
2
3
3
import (
4
+
"crypto/hmac"
5
+
"crypto/sha256"
6
+
"encoding/hex"
4
7
"fmt"
5
8
"log"
6
9
"net/http"
···
79
82
followStatus = db.GetFollowStatus(s.db, loggedInUser.Did, ident.DID.String())
80
83
}
81
84
82
-
profileAvatarUri, err := GetAvatarUri(ident.Handle.String())
83
-
if err != nil {
84
-
log.Println("failed to fetch bsky avatar", err)
85
-
}
86
-
85
+
profileAvatarUri := s.GetAvatarUri(ident.Handle.String())
87
86
s.pages.ProfilePage(w, pages.ProfilePageParams{
88
87
LoggedInUser: loggedInUser,
89
88
UserDid: ident.DID.String(),
···
100
99
ProfileTimeline: timeline,
101
100
})
102
101
}
102
+
103
+
func (s *State) GetAvatarUri(handle string) string {
104
+
secret := s.config.AvatarSharedSecret
105
+
h := hmac.New(sha256.New, []byte(secret))
106
+
h.Write([]byte(handle))
107
+
signature := hex.EncodeToString(h.Sum(nil))
108
+
return fmt.Sprintf("%s/%s/%s", s.config.AvatarHost, signature, handle)
109
+
}