Vow, uncensorable PDS written in Go

refactor: rename to vow

+321 -579
+9 -9
.env.example
··· 1 - COCOON_DID="did:web:cocoon.example.com" 2 - COCOON_HOSTNAME="cocoon.example.com" 3 - COCOON_ROTATION_KEY_PATH="./rotation.key" 4 - COCOON_JWK_PATH="./jwk.key" 5 - COCOON_CONTACT_EMAIL="me@example.com" 6 - COCOON_RELAYS=https://bsky.network 1 + VOW_DID="did:web:vow.example.com" 2 + VOW_HOSTNAME="vow.example.com" 3 + VOW_ROTATION_KEY_PATH="./rotation.key" 4 + VOW_JWK_PATH="./jwk.key" 5 + VOW_CONTACT_EMAIL="me@example.com" 6 + VOW_RELAYS=https://bsky.network 7 7 # Generate with `openssl rand -hex 16` 8 - COCOON_ADMIN_PASSWORD= 8 + VOW_ADMIN_PASSWORD= 9 9 # Generate with `openssl rand -hex 32` 10 - COCOON_SESSION_SECRET= 10 + VOW_SESSION_SECRET= 11 11 # Optional: Change the session cookie name (default: session) 12 - # COCOON_SESSION_COOKIE_KEY=cocoon_session 12 + # VOW_SESSION_COOKIE_KEY=vow_session
+1 -1
.gitignore
··· 1 1 *.db 2 2 .env 3 - /cocoon 3 + /vow 4 4 *.key 5 5 *.secret 6 6 .DS_Store
-10
Caddyfile
··· 1 - {$COCOON_HOSTNAME} { 2 - reverse_proxy localhost:8080 3 - 4 - encode gzip 5 - 6 - log { 7 - output file /data/access.log 8 - format json 9 - } 10 - }
+6 -6
Dockerfile
··· 6 6 7 7 RUN GIT_VERSION=$(git describe --tags --long --always || echo "dev-local") && \ 8 8 go mod tidy && \ 9 - go build -ldflags "-X main.Version=$GIT_VERSION" -o cocoon ./cmd/cocoon 9 + go build -ldflags "-X main.Version=$GIT_VERSION" -o vow ./cmd/vow 10 10 11 11 ### Run stage 12 12 FROM debian:bookworm-slim AS run ··· 15 15 ENTRYPOINT ["dumb-init", "--"] 16 16 17 17 WORKDIR / 18 - RUN mkdir -p data/cocoon 19 - COPY --from=build-env /dockerbuild/cocoon / 18 + RUN mkdir -p data/vow 19 + COPY --from=build-env /dockerbuild/vow / 20 20 21 - CMD ["/cocoon", "run"] 21 + CMD ["/vow", "run"] 22 22 23 - LABEL org.opencontainers.image.source=https://github.com/haileyok/cocoon 24 - LABEL org.opencontainers.image.description="Cocoon ATProto PDS" 23 + LABEL org.opencontainers.image.source=https://pkg.rbrt.fr/vow 24 + LABEL org.opencontainers.image.description="Vow ATProto PDS" 25 25 LABEL org.opencontainers.image.licenses=MIT
+5 -5
Makefile
··· 29 29 30 30 .PHONY: build 31 31 build: ## Build all executables 32 - go build -ldflags "-X main.Version=$(VERSION)" -o cocoon ./cmd/cocoon 32 + go build -ldflags "-X main.Version=$(VERSION)" -o vow ./cmd/vow 33 33 34 34 .PHONY: build-release 35 35 build-all: ## Build binaries for all architectures ··· 39 39 $(eval OS := $(word 1,$(subst /, ,$(platform)))) \ 40 40 $(eval ARCH := $(word 2,$(subst /, ,$(platform)))) \ 41 41 $(eval EXT := $(if $(filter windows,$(OS)),.exe,)) \ 42 - $(eval OUTPUT := $(BUILD_DIR)/cocoon-$(VERSION)-$(OS)-$(ARCH)$(EXT)) \ 42 + $(eval OUTPUT := $(BUILD_DIR)/vow-$(VERSION)-$(OS)-$(ARCH)$(EXT)) \ 43 43 echo "Building $(OS)/$(ARCH)..."; \ 44 - GOOS=$(OS) GOARCH=$(ARCH) go build -ldflags "-X main.Version=$(VERSION)" -o $(OUTPUT) ./cmd/cocoon && \ 44 + GOOS=$(OS) GOARCH=$(ARCH) go build -ldflags "-X main.Version=$(VERSION)" -o $(OUTPUT) ./cmd/vow && \ 45 45 echo " ✓ $(OUTPUT)" || echo " ✗ Failed: $(OS)/$(ARCH)"; \ 46 46 ) 47 47 @echo "Done! Binaries are in $(BUILD_DIR)/" ··· 52 52 53 53 .PHONY: run 54 54 run: 55 - go build -ldflags "-X main.Version=dev-local" -o cocoon ./cmd/cocoon && ./cocoon run 55 + go build -ldflags "-X main.Version=dev-local" -o vow ./cmd/vow && ./vow run 56 56 57 57 .PHONY: all 58 58 all: build ··· 79 79 80 80 .PHONY: docker-build 81 81 docker-build: 82 - docker build -t cocoon . 82 + docker build -t vow .
+56 -105
README.md
··· 1 - # Cocoon 1 + # Vow 2 2 3 3 > [!WARNING] 4 - I migrated and have been running my main account on this PDS for months now without issue, however, I am still not responsible if things go awry, particularly during account migration. Please use caution. 4 + > This is highly experimental software. Use with caution, especially during account migration. 5 5 6 - Cocoon is a PDS implementation in Go. It is highly experimental, and is not ready for any production use. 6 + Vow is a PDS (Personal Data Server) implementation in Go for the AT Protocol. 7 7 8 8 ## Quick Start with Docker Compose 9 9 10 10 ### Prerequisites 11 11 12 12 - Docker and Docker Compose installed 13 - - A domain name pointing to your server (for automatic HTTPS) 14 - - Ports 80 and 443 open in i.e. UFW 13 + - A domain name pointing to your server 14 + - Ports 80 and 443 open 15 15 16 16 ### Installation 17 17 18 18 1. **Clone the repository** 19 + 19 20 ```bash 20 - git clone https://github.com/haileyok/cocoon.git 21 - cd cocoon 21 + git clone https://pkg.rbrt.fr/vow.git 22 + cd vow 22 23 ``` 23 24 24 25 2. **Create your configuration file** 26 + 25 27 ```bash 26 28 cp .env.example .env 27 29 ``` 28 30 29 31 3. **Edit `.env` with your settings** 30 32 31 - Required settings: 32 33 ```bash 33 - COCOON_DID="did:web:your-domain.com" 34 - COCOON_HOSTNAME="your-domain.com" 35 - COCOON_CONTACT_EMAIL="you@example.com" 36 - COCOON_RELAYS="https://bsky.network" 34 + VOW_DID="did:web:your-domain.com" 35 + VOW_HOSTNAME="your-domain.com" 36 + VOW_CONTACT_EMAIL="you@example.com" 37 + VOW_RELAYS="https://bsky.network" 37 38 38 39 # Generate with: openssl rand -hex 16 39 - COCOON_ADMIN_PASSWORD="your-secure-password" 40 + VOW_ADMIN_PASSWORD="your-secure-password" 40 41 41 42 # Generate with: openssl rand -hex 32 42 - COCOON_SESSION_SECRET="your-session-secret" 43 + VOW_SESSION_SECRET="your-session-secret" 43 44 ``` 44 45 45 46 4. **Start the services** 46 - ```bash 47 - # Pull pre-built image from GitHub Container Registry 48 - docker-compose pull 49 - docker-compose up -d 50 - ``` 51 47 52 - Or build locally: 53 48 ```bash 54 - docker-compose build 49 + docker-compose pull 55 50 docker-compose up -d 56 51 ``` 57 52 58 - **For PostgreSQL deployment:** 59 - ```bash 60 - # Add POSTGRES_PASSWORD to your .env file first! 61 - docker-compose -f docker-compose.postgres.yaml up -d 62 - ``` 63 - 64 53 5. **Get your invite code** 65 54 66 55 On first run, an invite code is automatically created. View it with: 56 + 67 57 ```bash 68 58 docker-compose logs create-invite 69 59 ``` 70 60 71 61 Or check the saved file: 62 + 72 63 ```bash 73 64 cat keys/initial-invite-code.txt 74 65 ``` 75 66 76 - **IMPORTANT**: Save this invite code! You'll need it to create your first account. 77 - 78 67 6. **Monitor the services** 79 68 ```bash 80 69 docker-compose logs -f ··· 82 71 83 72 ### What Gets Set Up 84 73 85 - The Docker Compose setup includes: 86 - 87 - - **init-keys**: Automatically generates cryptographic keys (rotation key and JWK) on first run 88 - - **cocoon**: The main PDS service running on port 8080 89 - - **create-invite**: Automatically creates an initial invite code after Cocoon starts (first run only) 90 - - **caddy**: Reverse proxy with automatic HTTPS via Let's Encrypt 74 + - **init-keys**: Generates cryptographic keys (rotation key and JWK) on first run 75 + - **vow**: The main PDS service running on port 8080 76 + - **create-invite**: Creates an initial invite code on first run 91 77 92 78 ### Data Persistence 93 79 94 - The following directories will be created automatically: 95 - 96 - - `./keys/` - Cryptographic keys (generated automatically) 97 - - `rotation.key` - PDS rotation key 98 - - `jwk.key` - JWK private key 99 - - `initial-invite-code.txt` - Your first invite code (first run only) 100 - - `./data/` - SQLite database and blockstore 101 - - Docker volumes for Caddy configuration and certificates 80 + - `./keys/` — Cryptographic keys (generated automatically) 81 + - `rotation.key` — PDS rotation key 82 + - `jwk.key` — JWK private key 83 + - `initial-invite-code.txt` — Your first invite code (first run only) 84 + - `./data/` — SQLite database and blockstore 102 85 103 - ### Optional Configuration 86 + ## Configuration 104 87 105 - #### Database Configuration 88 + ### Database 106 89 107 - By default, Cocoon uses SQLite which requires no additional setup. For production deployments with higher traffic, you can use PostgreSQL: 90 + Vow uses SQLite by default. No additional setup required. 108 91 109 92 ```bash 110 - # Database type: sqlite (default) or postgres 111 - COCOON_DB_TYPE="postgres" 112 - 113 - # PostgreSQL connection string (required if db-type is postgres) 114 - # Format: postgres://user:password@host:port/database?sslmode=disable 115 - COCOON_DATABASE_URL="postgres://cocoon:password@localhost:5432/cocoon?sslmode=disable" 116 - 117 - # Or use the standard DATABASE_URL environment variable 118 - DATABASE_URL="postgres://cocoon:password@localhost:5432/cocoon?sslmode=disable" 119 - ``` 120 - 121 - For SQLite (default): 122 - ```bash 123 - COCOON_DB_TYPE="sqlite" 124 - COCOON_DB_NAME="/data/cocoon/cocoon.db" 93 + VOW_DB_NAME="/data/vow/vow.db" 125 94 ``` 126 95 127 - > **Note**: When using PostgreSQL, database backups to S3 are not handled by Cocoon. Use `pg_dump` or your database provider's backup solution instead. 96 + ### SMTP Email 128 97 129 - #### SMTP Email Settings 130 98 ```bash 131 - COCOON_SMTP_USER="your-smtp-username" 132 - COCOON_SMTP_PASS="your-smtp-password" 133 - COCOON_SMTP_HOST="smtp.example.com" 134 - COCOON_SMTP_PORT="587" 135 - COCOON_SMTP_EMAIL="noreply@example.com" 136 - COCOON_SMTP_NAME="Cocoon PDS" 99 + VOW_SMTP_USER="your-smtp-username" 100 + VOW_SMTP_PASS="your-smtp-password" 101 + VOW_SMTP_HOST="smtp.example.com" 102 + VOW_SMTP_PORT="587" 103 + VOW_SMTP_EMAIL="noreply@example.com" 104 + VOW_SMTP_NAME="Vow PDS" 137 105 ``` 138 106 139 - #### S3 Storage 107 + ### IPFS Blob Storage 140 108 141 - Cocoon supports S3-compatible storage for both database backups (SQLite only) and blob storage (images, videos, etc.): 109 + By default blobs are stored in SQLite. Optionally, blobs can be stored on IPFS via a local [Kubo](https://github.com/ipfs/kubo) node: 142 110 143 111 ```bash 144 - # Enable S3 backups (SQLite databases only - hourly backups) 145 - COCOON_S3_BACKUPS_ENABLED=true 112 + VOW_IPFS_BLOBSTORE_ENABLED=true 146 113 147 - # Enable S3 for blob storage (images, videos, etc.) 148 - # When enabled, blobs are stored in S3 instead of the database 149 - COCOON_S3_BLOBSTORE_ENABLED=true 114 + # URL of the local Kubo RPC API (default: http://127.0.0.1:5001) 115 + VOW_IPFS_NODE_URL="http://127.0.0.1:5001" 150 116 151 - # S3 configuration (works with AWS S3, MinIO, Cloudflare R2, etc.) 152 - COCOON_S3_REGION="us-east-1" 153 - COCOON_S3_BUCKET="your-bucket" 154 - COCOON_S3_ENDPOINT="https://s3.amazonaws.com" 155 - COCOON_S3_ACCESS_KEY="your-access-key" 156 - COCOON_S3_SECRET_KEY="your-secret-key" 117 + # Optional: redirect getBlob to a public gateway instead of proxying 118 + VOW_IPFS_GATEWAY_URL="https://ipfs.io" 157 119 158 - # Optional: CDN/public URL for blob redirects 159 - # When set, com.atproto.sync.getBlob redirects to this URL instead of proxying 160 - COCOON_S3_CDN_URL="https://cdn.example.com" 120 + # Optional: remote pinning service 121 + VOW_IPFS_PINNING_SERVICE_URL="https://api.pinata.cloud/psa" 122 + VOW_IPFS_PINNING_SERVICE_TOKEN="your-token" 161 123 ``` 162 124 163 - **Blob Storage Options:** 164 - - `COCOON_S3_BLOBSTORE_ENABLED=false` (default): Blobs stored in the database 165 - - `COCOON_S3_BLOBSTORE_ENABLED=true`: Blobs stored in S3 bucket under `blobs/{did}/{cid}` 166 - 167 - **Blob Serving Options:** 168 - - Without `COCOON_S3_CDN_URL`: Blobs are proxied through the PDS server 169 - - With `COCOON_S3_CDN_URL`: `getBlob` returns a 302 redirect to `{CDN_URL}/blobs/{did}/{cid}` 170 - 171 - > **Tip**: For Cloudflare R2, you can use the public bucket URL as the CDN URL. For AWS S3, you can use CloudFront or the S3 bucket URL directly if public access is enabled. 125 + ## Management Commands 172 126 173 - ### Management Commands 127 + Create an invite code: 174 128 175 - Create an invite code: 176 129 ```bash 177 - docker exec cocoon-pds /cocoon create-invite-code --uses 1 130 + docker exec vow-pds /vow create-invite-code --uses 1 178 131 ``` 179 132 180 133 Reset a user's password: 134 + 181 135 ```bash 182 - docker exec cocoon-pds /cocoon reset-password --did "did:plc:xxx" 136 + docker exec vow-pds /vow reset-password --did "did:plc:xxx" 183 137 ``` 184 138 185 - ### Updating 139 + ## Updating 186 140 187 141 ```bash 188 142 docker-compose pull ··· 192 146 ## Implemented Endpoints 193 147 194 148 > [!NOTE] 195 - Just because something is implemented doesn't mean it is finished. Tons of these are returning bad errors, don't do validation properly, etc. I'll make a "second pass" checklist at some point to do all of that. 149 + > Just because something is implemented doesn't mean it is finished. Many endpoints still have rough edges around validation and error handling. 196 150 197 151 ### Identity 198 152 ··· 229 183 - [x] `com.atproto.server.describeServer` 230 184 - [ ] `com.atproto.server.getAccountInviteCodes` 231 185 - [x] `com.atproto.server.getServiceAuth` 232 - - ~~[ ] `com.atproto.server.listAppPasswords`~~ - not going to add app passwords 233 186 - [x] `com.atproto.server.refreshSession` 234 187 - [x] `com.atproto.server.requestAccountDelete` 235 188 - [x] `com.atproto.server.requestEmailConfirmation` ··· 237 190 - [x] `com.atproto.server.requestPasswordReset` 238 191 - [x] `com.atproto.server.reserveSigningKey` 239 192 - [x] `com.atproto.server.resetPassword` 240 - - ~~[] `com.atproto.server.revokeAppPassword`~~ - not going to add app passwords 241 193 - [x] `com.atproto.server.updateEmail` 242 194 243 195 ### Sync ··· 250 202 - [x] `com.atproto.sync.getRepo` 251 203 - [x] `com.atproto.sync.listBlobs` 252 204 - [x] `com.atproto.sync.listRepos` 253 - - ~~[ ] `com.atproto.sync.notifyOfUpdate`~~ - BGS doesn't even have this implemented lol 254 205 - [x] `com.atproto.sync.requestCrawl` 255 206 - [x] `com.atproto.sync.subscribeRepos` 256 207 257 208 ### Other 258 209 259 210 - [x] `com.atproto.label.queryLabels` 260 - - [x] `com.atproto.moderation.createReport` (Note: this should be handled by proxying, not actually implemented in the PDS) 211 + - [x] `com.atproto.moderation.createReport` 261 212 - [x] `app.bsky.actor.getPreferences` 262 213 - [x] `app.bsky.actor.putPreferences` 263 214 264 215 ## License 265 216 266 - This project is licensed under MIT license. `server/static/pico.css` is also licensed under MIT license, available at [https://github.com/picocss/pico/](https://github.com/picocss/pico/). 217 + MIT. `server/static/pico.css` is also MIT licensed, available at [https://github.com/picocss/pico/](https://github.com/picocss/pico/).
cmd/cocoon/flags.go cmd/vow/flags.go
+10 -10
cmd/cocoon/main.go cmd/vow/main.go
··· 17 17 "github.com/bluesky-social/indigo/atproto/atcrypto" 18 18 "github.com/bluesky-social/indigo/atproto/syntax" 19 19 "github.com/glebarez/sqlite" 20 - "github.com/haileyok/cocoon/internal/helpers" 21 - "github.com/haileyok/cocoon/server" 20 + "pkg.rbrt.fr/vow/internal/helpers" 21 + "pkg.rbrt.fr/vow/server" 22 22 _ "github.com/joho/godotenv/autoload" 23 23 "github.com/lestrrat-go/jwx/v2/jwk" 24 24 "github.com/prometheus/client_golang/prometheus/promhttp" ··· 37 37 } 38 38 39 39 var rootCmd = &cobra.Command{ 40 - Use: "cocoon", 40 + Use: "vow", 41 41 Short: "An atproto PDS", 42 42 Version: Version, 43 43 SilenceErrors: true, ··· 48 48 pf := rootCmd.PersistentFlags() 49 49 50 50 pf.String(flagAddr, ":8080", "Listen address") 51 - pf.String(flagDbName, "cocoon.db", "SQLite database file path") 51 + pf.String(flagDbName, "vow.db", "SQLite database file path") 52 52 pf.String(flagDid, "", "DID of this PDS") 53 53 pf.String(flagHostname, "", "Public hostname of this PDS") 54 54 pf.String(flagRotationKeyPath, "", "Path to the rotation key file") ··· 77 77 pf.String(flagMetricsListenAddress, "0.0.0.0:6009", "Listen address for the Prometheus metrics / pprof endpoint") 78 78 79 79 v := viper.New() 80 - v.SetEnvPrefix("COCOON") 80 + v.SetEnvPrefix("VOW") 81 81 v.SetEnvKeyReplacer(strings.NewReplacer("-", "_")) 82 82 v.AutomaticEnv() 83 83 _ = v.BindEnv(flagDebug, "DEBUG") 84 - _ = v.BindEnv(flagLogLevel, "COCOON_LOG_LEVEL", "LOG_LEVEL") 84 + _ = v.BindEnv(flagLogLevel, "VOW_LOG_LEVEL", "LOG_LEVEL") 85 85 _ = v.BindEnv(flagMetricsListenAddress, "METRICS_LISTEN_ADDRESS") 86 86 _ = v.BindPFlags(pf) 87 87 ··· 140 140 func newDb(v *viper.Viper) (*gorm.DB, error) { 141 141 dbName := v.GetString(flagDbName) 142 142 if dbName == "" { 143 - dbName = "cocoon.db" 143 + dbName = "vow.db" 144 144 } 145 145 return gorm.Open(sqlite.Open(dbName), &gorm.Config{}) 146 146 } ··· 148 148 func newServeCmd(v *viper.Viper) *cobra.Command { 149 149 return &cobra.Command{ 150 150 Use: "run", 151 - Short: "Start the cocoon PDS", 151 + Short: "Start the vow PDS", 152 152 RunE: func(cmd *cobra.Command, args []string) error { 153 153 logger := buildLogger(v) 154 154 startMetrics(v) ··· 185 185 FallbackProxy: v.GetString(flagFallbackProxy), 186 186 }) 187 187 if err != nil { 188 - return fmt.Errorf("error creating cocoon: %w", err) 188 + return fmt.Errorf("error creating vow: %w", err) 189 189 } 190 190 191 191 if err := s.Serve(context.Background()); err != nil { 192 - return fmt.Errorf("error starting cocoon: %w", err) 192 + return fmt.Errorf("error starting vow: %w", err) 193 193 } 194 194 195 195 return nil
-2
contrib/.gitignore
··· 1 - # `nix build` output 2 - /result
-27
contrib/flake.lock
··· 1 - { 2 - "nodes": { 3 - "nixpkgs": { 4 - "locked": { 5 - "lastModified": 1745742390, 6 - "narHash": "sha256-1rqa/XPSJqJg21BKWjzJZC7yU0l/YTVtjRi0RJmipus=", 7 - "owner": "NixOS", 8 - "repo": "nixpkgs", 9 - "rev": "26245db0cb552047418cfcef9a25da91b222d6c7", 10 - "type": "github" 11 - }, 12 - "original": { 13 - "owner": "NixOS", 14 - "ref": "nixos-24.11", 15 - "repo": "nixpkgs", 16 - "type": "github" 17 - } 18 - }, 19 - "root": { 20 - "inputs": { 21 - "nixpkgs": "nixpkgs" 22 - } 23 - } 24 - }, 25 - "root": "root", 26 - "version": 7 27 - }
-41
contrib/flake.nix
··· 1 - { 2 - inputs = { 3 - nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11"; 4 - }; 5 - outputs = { self, nixpkgs }: 6 - let 7 - systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ]; 8 - forAllSystems = f: nixpkgs.lib.genAttrs systems f; 9 - outputsBySystem = forAllSystems (system: 10 - let 11 - pkgs = nixpkgs.legacyPackages.${system}; 12 - in 13 - { 14 - packages = { 15 - default = pkgs.buildGo124Module { 16 - pname = "cocoon"; 17 - version = "0.1.0"; 18 - src = ../.; 19 - vendorHash = "sha256-kFwd2FnOueEOg/YRTQ8c7/iAO3PoO3yzWyVDFu43QOs="; 20 - meta.mainProgram = "cocoon"; 21 - }; 22 - }; 23 - devShells = { 24 - default = pkgs.mkShell { 25 - buildInputs = [ 26 - pkgs.go_1_24 27 - pkgs.gopls 28 - pkgs.gotools 29 - pkgs.go-tools 30 - ]; 31 - }; 32 - }; 33 - }); 34 - mergeOutputs = outputType: 35 - nixpkgs.lib.mapAttrs (system: systemOutputs: systemOutputs.${outputType} or {}) outputsBySystem; 36 - in 37 - { 38 - packages = mergeOutputs "packages"; 39 - devShells = mergeOutputs "devShells"; 40 - }; 41 - }
+1 -1
create-initial-invite.sh
··· 19 19 20 20 while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do 21 21 ATTEMPT=$((ATTEMPT + 1)) 22 - OUTPUT=$(/cocoon create-invite-code --uses 1 2>&1) 22 + OUTPUT=$(/vow create-invite-code --uses 1 2>&1) 23 23 INVITE_CODE=$(echo "$OUTPUT" | grep -oE '[a-zA-Z0-9]{8}-[a-zA-Z0-9]{8}' || echo "") 24 24 25 25 if [ -n "$INVITE_CODE" ]; then
+2 -2
cspell.json
··· 4 4 "words": [ 5 5 "atproto", 6 6 "bsky", 7 - "Cocoon", 7 + "Vow", 8 8 "PDS", 9 9 "Plc", 10 10 "plc", ··· 27 27 "OAuth", 28 28 "oauth", 29 29 "par", 30 - "Cocoon", 30 + "Vow", 31 31 "memcache", 32 32 "db", 33 33 "helpers",
-116
docker-compose.noproxy.yaml
··· 1 - # Simplified docker-compose for external reverse proxy 2 - # Exposes cocoon on 127.0.0.1:8080 by default 3 - # 4 - # Usage: 5 - # docker-compose -f docker-compose.noproxy.yaml up -d 6 - # 7 - 8 - version: "3.8" 9 - 10 - services: 11 - init-keys: 12 - build: 13 - context: . 14 - dockerfile: Dockerfile 15 - image: ghcr.io/haileyok/cocoon:latest 16 - container_name: cocoon-init-keys 17 - volumes: 18 - - ./keys:/keys 19 - - ./data:/data/cocoon 20 - - ./init-keys.sh:/init-keys.sh:ro 21 - environment: 22 - COCOON_DID: ${COCOON_DID} 23 - COCOON_HOSTNAME: ${COCOON_HOSTNAME} 24 - COCOON_ROTATION_KEY_PATH: /keys/rotation.key 25 - COCOON_JWK_PATH: /keys/jwk.key 26 - COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL} 27 - COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network} 28 - COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD} 29 - entrypoint: ["/bin/sh", "/init-keys.sh"] 30 - restart: "no" 31 - 32 - cocoon: 33 - build: 34 - context: . 35 - dockerfile: Dockerfile 36 - image: ghcr.io/haileyok/cocoon:latest 37 - container_name: cocoon-pds 38 - depends_on: 39 - init-keys: 40 - condition: service_completed_successfully 41 - ports: 42 - - "127.0.0.1:8080:8080" 43 - volumes: 44 - - ./data:/data/cocoon 45 - - ./keys/rotation.key:/keys/rotation.key:ro 46 - - ./keys/jwk.key:/keys/jwk.key:ro 47 - environment: 48 - # Required settings 49 - COCOON_DID: ${COCOON_DID} 50 - COCOON_HOSTNAME: ${COCOON_HOSTNAME} 51 - COCOON_ROTATION_KEY_PATH: /keys/rotation.key 52 - COCOON_JWK_PATH: /keys/jwk.key 53 - COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL} 54 - COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network} 55 - COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD} 56 - COCOON_SESSION_SECRET: ${COCOON_SESSION_SECRET} 57 - 58 - # Server configuration 59 - COCOON_ADDR: ":8080" 60 - COCOON_DB_NAME: ${COCOON_DB_NAME:-/data/cocoon/cocoon.db} 61 - COCOON_BLOCKSTORE_VARIANT: ${COCOON_BLOCKSTORE_VARIANT:-sqlite} 62 - 63 - # Optional: SMTP settings for email 64 - COCOON_SMTP_USER: ${COCOON_SMTP_USER:-} 65 - COCOON_SMTP_PASS: ${COCOON_SMTP_PASS:-} 66 - COCOON_SMTP_HOST: ${COCOON_SMTP_HOST:-} 67 - COCOON_SMTP_PORT: ${COCOON_SMTP_PORT:-} 68 - COCOON_SMTP_EMAIL: ${COCOON_SMTP_EMAIL:-} 69 - COCOON_SMTP_NAME: ${COCOON_SMTP_NAME:-} 70 - 71 - # Optional: IPFS pinning configuration 72 - COCOON_IPFS_BLOBSTORE_ENABLED: ${COCOON_IPFS_BLOBSTORE_ENABLED:-false} 73 - COCOON_IPFS_NODE_URL: ${COCOON_IPFS_NODE_URL:-http://127.0.0.1:5001} 74 - COCOON_IPFS_GATEWAY_URL: ${COCOON_IPFS_GATEWAY_URL:-} 75 - COCOON_IPFS_PINNING_SERVICE_URL: ${COCOON_IPFS_PINNING_SERVICE_URL:-} 76 - COCOON_IPFS_PINNING_SERVICE_TOKEN: ${COCOON_IPFS_PINNING_SERVICE_TOKEN:-} 77 - 78 - # Optional: Fallback proxy 79 - COCOON_FALLBACK_PROXY: ${COCOON_FALLBACK_PROXY:-} 80 - restart: unless-stopped 81 - healthcheck: 82 - test: ["CMD", "curl", "-f", "http://localhost:8080/xrpc/_health"] 83 - interval: 30s 84 - timeout: 10s 85 - retries: 3 86 - start_period: 40s 87 - 88 - create-invite: 89 - build: 90 - context: . 91 - dockerfile: Dockerfile 92 - image: ghcr.io/haileyok/cocoon:latest 93 - container_name: cocoon-create-invite 94 - network_mode: "service:cocoon" 95 - volumes: 96 - - ./keys:/keys 97 - - ./data:/data/cocoon 98 - - ./create-initial-invite.sh:/create-initial-invite.sh:ro 99 - environment: 100 - COCOON_DID: ${COCOON_DID} 101 - COCOON_HOSTNAME: ${COCOON_HOSTNAME} 102 - COCOON_ROTATION_KEY_PATH: /keys/rotation.key 103 - COCOON_JWK_PATH: /keys/jwk.key 104 - COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL} 105 - COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network} 106 - COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD} 107 - COCOON_DB_NAME: ${COCOON_DB_NAME:-/data/cocoon/cocoon.db} 108 - depends_on: 109 - cocoon: 110 - condition: service_healthy 111 - entrypoint: ["/bin/sh", "/create-initial-invite.sh"] 112 - restart: "no" 113 - 114 - volumes: 115 - data: 116 - driver: local
+53 -68
docker-compose.yaml
··· 5 5 build: 6 6 context: . 7 7 dockerfile: Dockerfile 8 - image: ghcr.io/haileyok/cocoon:latest 9 - container_name: cocoon-init-keys 8 + image: ghcr.io/julien/vow:latest 9 + container_name: vow-init-keys 10 10 volumes: 11 11 - ./keys:/keys 12 - - ./data:/data/cocoon 12 + - ./data:/data/vow 13 13 - ./init-keys.sh:/init-keys.sh:ro 14 14 environment: 15 - COCOON_DID: ${COCOON_DID} 16 - COCOON_HOSTNAME: ${COCOON_HOSTNAME} 17 - COCOON_ROTATION_KEY_PATH: /keys/rotation.key 18 - COCOON_JWK_PATH: /keys/jwk.key 19 - COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL} 20 - COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network} 21 - COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD} 15 + VOW_DID: ${VOW_DID} 16 + VOW_HOSTNAME: ${VOW_HOSTNAME} 17 + VOW_ROTATION_KEY_PATH: /keys/rotation.key 18 + VOW_JWK_PATH: /keys/jwk.key 19 + VOW_CONTACT_EMAIL: ${VOW_CONTACT_EMAIL} 20 + VOW_RELAYS: ${VOW_RELAYS:-https://bsky.network} 21 + VOW_ADMIN_PASSWORD: ${VOW_ADMIN_PASSWORD} 22 22 entrypoint: ["/bin/sh", "/init-keys.sh"] 23 23 restart: "no" 24 24 25 - cocoon: 25 + vow: 26 26 build: 27 27 context: . 28 28 dockerfile: Dockerfile 29 - image: ghcr.io/haileyok/cocoon:latest 30 - container_name: cocoon-pds 31 - network_mode: host 29 + image: ghcr.io/julien/vow:latest 30 + container_name: vow-pds 32 31 depends_on: 33 32 init-keys: 34 33 condition: service_completed_successfully 34 + ports: 35 + - "127.0.0.1:8080:8080" 35 36 volumes: 36 - - ./data:/data/cocoon 37 + - ./data:/data/vow 37 38 - ./keys/rotation.key:/keys/rotation.key:ro 38 39 - ./keys/jwk.key:/keys/jwk.key:ro 39 40 environment: 40 41 # Required settings 41 - COCOON_DID: ${COCOON_DID} 42 - COCOON_HOSTNAME: ${COCOON_HOSTNAME} 43 - COCOON_ROTATION_KEY_PATH: /keys/rotation.key 44 - COCOON_JWK_PATH: /keys/jwk.key 45 - COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL} 46 - COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network} 47 - COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD} 48 - COCOON_SESSION_SECRET: ${COCOON_SESSION_SECRET} 42 + VOW_DID: ${VOW_DID} 43 + VOW_HOSTNAME: ${VOW_HOSTNAME} 44 + VOW_ROTATION_KEY_PATH: /keys/rotation.key 45 + VOW_JWK_PATH: /keys/jwk.key 46 + VOW_CONTACT_EMAIL: ${VOW_CONTACT_EMAIL} 47 + VOW_RELAYS: ${VOW_RELAYS:-https://bsky.network} 48 + VOW_ADMIN_PASSWORD: ${VOW_ADMIN_PASSWORD} 49 + VOW_SESSION_SECRET: ${VOW_SESSION_SECRET} 49 50 50 51 # Server configuration 51 - COCOON_ADDR: ":8080" 52 - COCOON_DB_NAME: ${COCOON_DB_NAME:-/data/cocoon/cocoon.db} 53 - COCOON_BLOCKSTORE_VARIANT: ${COCOON_BLOCKSTORE_VARIANT:-sqlite} 52 + VOW_ADDR: ":8080" 53 + VOW_DB_NAME: ${VOW_DB_NAME:-/data/vow/vow.db} 54 + VOW_BLOCKSTORE_VARIANT: ${VOW_BLOCKSTORE_VARIANT:-sqlite} 54 55 55 56 # Optional: SMTP settings for email 56 - COCOON_SMTP_USER: ${COCOON_SMTP_USER:-} 57 - COCOON_SMTP_PASS: ${COCOON_SMTP_PASS:-} 58 - COCOON_SMTP_HOST: ${COCOON_SMTP_HOST:-} 59 - COCOON_SMTP_PORT: ${COCOON_SMTP_PORT:-} 60 - COCOON_SMTP_EMAIL: ${COCOON_SMTP_EMAIL:-} 61 - COCOON_SMTP_NAME: ${COCOON_SMTP_NAME:-} 57 + VOW_SMTP_USER: ${VOW_SMTP_USER:-} 58 + VOW_SMTP_PASS: ${VOW_SMTP_PASS:-} 59 + VOW_SMTP_HOST: ${VOW_SMTP_HOST:-} 60 + VOW_SMTP_PORT: ${VOW_SMTP_PORT:-} 61 + VOW_SMTP_EMAIL: ${VOW_SMTP_EMAIL:-} 62 + VOW_SMTP_NAME: ${VOW_SMTP_NAME:-} 62 63 63 64 # Optional: IPFS pinning configuration 64 - COCOON_IPFS_BLOBSTORE_ENABLED: ${COCOON_IPFS_BLOBSTORE_ENABLED:-false} 65 - COCOON_IPFS_NODE_URL: ${COCOON_IPFS_NODE_URL:-http://127.0.0.1:5001} 66 - COCOON_IPFS_GATEWAY_URL: ${COCOON_IPFS_GATEWAY_URL:-} 67 - COCOON_IPFS_PINNING_SERVICE_URL: ${COCOON_IPFS_PINNING_SERVICE_URL:-} 68 - COCOON_IPFS_PINNING_SERVICE_TOKEN: ${COCOON_IPFS_PINNING_SERVICE_TOKEN:-} 65 + VOW_IPFS_BLOBSTORE_ENABLED: ${VOW_IPFS_BLOBSTORE_ENABLED:-false} 66 + VOW_IPFS_NODE_URL: ${VOW_IPFS_NODE_URL:-http://127.0.0.1:5001} 67 + VOW_IPFS_GATEWAY_URL: ${VOW_IPFS_GATEWAY_URL:-} 68 + VOW_IPFS_PINNING_SERVICE_URL: ${VOW_IPFS_PINNING_SERVICE_URL:-} 69 + VOW_IPFS_PINNING_SERVICE_TOKEN: ${VOW_IPFS_PINNING_SERVICE_TOKEN:-} 69 70 70 71 # Optional: Fallback proxy 71 - COCOON_FALLBACK_PROXY: ${COCOON_FALLBACK_PROXY:-} 72 + VOW_FALLBACK_PROXY: ${VOW_FALLBACK_PROXY:-} 72 73 restart: unless-stopped 73 74 healthcheck: 74 75 test: ["CMD", "curl", "-f", "http://localhost:8080/xrpc/_health"] ··· 81 82 build: 82 83 context: . 83 84 dockerfile: Dockerfile 84 - image: ghcr.io/haileyok/cocoon:latest 85 - container_name: cocoon-create-invite 86 - network_mode: host 85 + image: ghcr.io/julien/vow:latest 86 + container_name: vow-create-invite 87 + network_mode: "service:vow" 87 88 volumes: 88 89 - ./keys:/keys 89 - - ./data:/data/cocoon 90 + - ./data:/data/vow 90 91 - ./create-initial-invite.sh:/create-initial-invite.sh:ro 91 92 environment: 92 - COCOON_DID: ${COCOON_DID} 93 - COCOON_HOSTNAME: ${COCOON_HOSTNAME} 94 - COCOON_ROTATION_KEY_PATH: /keys/rotation.key 95 - COCOON_JWK_PATH: /keys/jwk.key 96 - COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL} 97 - COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network} 98 - COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD} 99 - COCOON_DB_NAME: ${COCOON_DB_NAME:-/data/cocoon/cocoon.db} 93 + VOW_DID: ${VOW_DID} 94 + VOW_HOSTNAME: ${VOW_HOSTNAME} 95 + VOW_ROTATION_KEY_PATH: /keys/rotation.key 96 + VOW_JWK_PATH: /keys/jwk.key 97 + VOW_CONTACT_EMAIL: ${VOW_CONTACT_EMAIL} 98 + VOW_RELAYS: ${VOW_RELAYS:-https://bsky.network} 99 + VOW_ADMIN_PASSWORD: ${VOW_ADMIN_PASSWORD} 100 + VOW_DB_NAME: ${VOW_DB_NAME:-/data/vow/vow.db} 100 101 depends_on: 101 - - init-keys 102 + vow: 103 + condition: service_healthy 102 104 entrypoint: ["/bin/sh", "/create-initial-invite.sh"] 103 105 restart: "no" 104 106 105 - caddy: 106 - image: caddy:2-alpine 107 - container_name: cocoon-caddy 108 - network_mode: host 109 - volumes: 110 - - ./Caddyfile:/etc/caddy/Caddyfile:ro 111 - - caddy_data:/data 112 - - caddy_config:/config 113 - restart: unless-stopped 114 - environment: 115 - COCOON_HOSTNAME: ${COCOON_HOSTNAME} 116 - CADDY_ACME_EMAIL: ${COCOON_CONTACT_EMAIL:-} 117 - 118 107 volumes: 119 108 data: 120 109 driver: local 121 - caddy_data: 122 - driver: local 123 - caddy_config: 124 - driver: local
+1 -1
go.mod
··· 1 - module github.com/haileyok/cocoon 1 + module pkg.rbrt.fr/vow 2 2 3 3 go 1.25 4 4
+3 -3
init-keys.sh
··· 2 2 set -e 3 3 4 4 mkdir -p /keys 5 - mkdir -p /data/cocoon 5 + mkdir -p /data/vow 6 6 7 7 if [ ! -f /keys/rotation.key ]; then 8 8 echo "Generating rotation key..." 9 - /cocoon create-rotation-key --out /keys/rotation.key 2>/dev/null || true 9 + /vow create-rotation-key --out /keys/rotation.key 2>/dev/null || true 10 10 if [ -f /keys/rotation.key ]; then 11 11 echo "✓ Rotation key generated at /keys/rotation.key" 12 12 else ··· 19 19 20 20 if [ ! -f /keys/jwk.key ]; then 21 21 echo "Generating JWK..." 22 - /cocoon create-private-jwk --out /keys/jwk.key 2>/dev/null || true 22 + /vow create-private-jwk --out /keys/jwk.key 2>/dev/null || true 23 23 if [ -f /keys/jwk.key ]; then 24 24 echo "✓ JWK generated at /keys/jwk.key" 25 25 else
+1 -1
metrics/metrics.go
··· 6 6 ) 7 7 8 8 const ( 9 - NAMESPACE = "cocoon" 9 + NAMESPACE = "vow" 10 10 ) 11 11 12 12 var (
+1 -1
oauth/client/manager.go
··· 14 14 "time" 15 15 16 16 cache "github.com/go-pkgz/expirable-cache/v3" 17 - "github.com/haileyok/cocoon/internal/helpers" 17 + "pkg.rbrt.fr/vow/internal/helpers" 18 18 "github.com/lestrrat-go/jwx/v2/jwk" 19 19 ) 20 20
+1 -1
oauth/dpop/jti_cache.go
··· 5 5 "time" 6 6 7 7 cache "github.com/go-pkgz/expirable-cache/v3" 8 - "github.com/haileyok/cocoon/oauth/constants" 8 + "pkg.rbrt.fr/vow/oauth/constants" 9 9 ) 10 10 11 11 type jtiCache struct {
+2 -2
oauth/dpop/manager.go
··· 14 14 "time" 15 15 16 16 "github.com/golang-jwt/jwt/v4" 17 - "github.com/haileyok/cocoon/internal/helpers" 18 - "github.com/haileyok/cocoon/oauth/constants" 17 + "pkg.rbrt.fr/vow/internal/helpers" 18 + "pkg.rbrt.fr/vow/oauth/constants" 19 19 "github.com/lestrrat-go/jwx/v2/jwa" 20 20 "github.com/lestrrat-go/jwx/v2/jwk" 21 21 )
+2 -2
oauth/dpop/nonce.go
··· 8 8 "sync" 9 9 "time" 10 10 11 - "github.com/haileyok/cocoon/internal/helpers" 12 - "github.com/haileyok/cocoon/oauth/constants" 11 + "pkg.rbrt.fr/vow/internal/helpers" 12 + "pkg.rbrt.fr/vow/oauth/constants" 13 13 ) 14 14 15 15 type Nonce struct {
+3 -3
oauth/helpers.go
··· 6 6 "net/url" 7 7 "time" 8 8 9 - "github.com/haileyok/cocoon/internal/helpers" 10 - "github.com/haileyok/cocoon/oauth/constants" 11 - "github.com/haileyok/cocoon/oauth/provider" 9 + "pkg.rbrt.fr/vow/internal/helpers" 10 + "pkg.rbrt.fr/vow/oauth/constants" 11 + "pkg.rbrt.fr/vow/oauth/provider" 12 12 ) 13 13 14 14 func GenerateCode() string {
+3 -3
oauth/provider/client_auth.go
··· 9 9 "time" 10 10 11 11 "github.com/golang-jwt/jwt/v4" 12 - "github.com/haileyok/cocoon/oauth/client" 13 - "github.com/haileyok/cocoon/oauth/constants" 14 - "github.com/haileyok/cocoon/oauth/dpop" 12 + "pkg.rbrt.fr/vow/oauth/client" 13 + "pkg.rbrt.fr/vow/oauth/constants" 14 + "pkg.rbrt.fr/vow/oauth/dpop" 15 15 ) 16 16 17 17 type AuthenticateClientOptions struct {
+2 -2
oauth/provider/provider.go
··· 1 1 package provider 2 2 3 3 import ( 4 - "github.com/haileyok/cocoon/oauth/client" 5 - "github.com/haileyok/cocoon/oauth/dpop" 4 + "pkg.rbrt.fr/vow/oauth/client" 5 + "pkg.rbrt.fr/vow/oauth/dpop" 6 6 ) 7 7 8 8 type Provider struct {
+1 -1
plc/client.go
··· 15 15 16 16 "github.com/bluesky-social/indigo/atproto/atcrypto" 17 17 "github.com/bluesky-social/indigo/util" 18 - "github.com/haileyok/cocoon/identity" 18 + "pkg.rbrt.fr/vow/identity" 19 19 ) 20 20 21 21 type Client struct {
+1 -1
plc/types.go
··· 4 4 "encoding/json" 5 5 6 6 "github.com/bluesky-social/indigo/atproto/atdata" 7 - "github.com/haileyok/cocoon/identity" 7 + "pkg.rbrt.fr/vow/identity" 8 8 cbg "github.com/whyrusleeping/cbor-gen" 9 9 ) 10 10
+1 -1
server/blockstore_variant.go
··· 1 1 package server 2 2 3 3 import ( 4 - "github.com/haileyok/cocoon/sqlite_blockstore" 4 + "pkg.rbrt.fr/vow/sqlite_blockstore" 5 5 blockstore "github.com/ipfs/go-ipfs-blockstore" 6 6 ) 7 7
+1 -1
server/common.go
··· 3 3 import ( 4 4 "context" 5 5 6 - "github.com/haileyok/cocoon/models" 6 + "pkg.rbrt.fr/vow/models" 7 7 "gorm.io/gorm" 8 8 ) 9 9
+3 -3
server/handle_account.go
··· 4 4 "net/http" 5 5 "time" 6 6 7 - "github.com/haileyok/cocoon/oauth" 8 - "github.com/haileyok/cocoon/oauth/constants" 9 - "github.com/haileyok/cocoon/oauth/provider" 7 + "pkg.rbrt.fr/vow/oauth" 8 + "pkg.rbrt.fr/vow/oauth/constants" 9 + "pkg.rbrt.fr/vow/oauth/provider" 10 10 "github.com/hako/durafmt" 11 11 ) 12 12
+1 -1
server/handle_account_revoke.go
··· 3 3 import ( 4 4 "net/http" 5 5 6 - "github.com/haileyok/cocoon/internal/helpers" 6 + "pkg.rbrt.fr/vow/internal/helpers" 7 7 ) 8 8 9 9 type AccountRevokeInput struct {
+2 -2
server/handle_account_signin.go
··· 9 9 10 10 "github.com/bluesky-social/indigo/atproto/syntax" 11 11 "github.com/gorilla/sessions" 12 - "github.com/haileyok/cocoon/internal/helpers" 13 - "github.com/haileyok/cocoon/models" 12 + "pkg.rbrt.fr/vow/internal/helpers" 13 + "pkg.rbrt.fr/vow/models" 14 14 "golang.org/x/crypto/bcrypt" 15 15 "gorm.io/gorm" 16 16 )
+1 -1
server/handle_actor_get_preferences.go
··· 4 4 "encoding/json" 5 5 "net/http" 6 6 7 - "github.com/haileyok/cocoon/models" 7 + "pkg.rbrt.fr/vow/models" 8 8 ) 9 9 10 10 // This is kinda lame. Not great to implement app.bsky in the pds, but alas
+1 -1
server/handle_actor_put_preferences.go
··· 4 4 "encoding/json" 5 5 "net/http" 6 6 7 - "github.com/haileyok/cocoon/models" 7 + "pkg.rbrt.fr/vow/models" 8 8 ) 9 9 10 10 // This is kinda lame. Not great to implement app.bsky in the pds, but alas
+1 -1
server/handle_age_assurance.go
··· 5 5 "time" 6 6 7 7 "github.com/bluesky-social/indigo/util" 8 - "github.com/haileyok/cocoon/models" 8 + "pkg.rbrt.fr/vow/models" 9 9 ) 10 10 11 11 func (s *Server) handleAgeAssurance(w http.ResponseWriter, r *http.Request) {
+1 -1
server/handle_health.go
··· 4 4 5 5 func (s *Server) handleHealth(w http.ResponseWriter, r *http.Request) { 6 6 s.writeJSON(w, 200, map[string]string{ 7 - "version": "cocoon " + s.config.Version, 7 + "version": "vow " + s.config.Version, 8 8 }) 9 9 }
+2 -2
server/handle_identity_request_plc_operation.go
··· 5 5 "net/http" 6 6 "time" 7 7 8 - "github.com/haileyok/cocoon/internal/helpers" 9 - "github.com/haileyok/cocoon/models" 8 + "pkg.rbrt.fr/vow/internal/helpers" 9 + "pkg.rbrt.fr/vow/models" 10 10 ) 11 11 12 12 func (s *Server) handleIdentityRequestPlcOperationSignature(w http.ResponseWriter, r *http.Request) {
+4 -4
server/handle_identity_sign_plc_operation.go
··· 9 9 10 10 "github.com/Azure/go-autorest/autorest/to" 11 11 "github.com/bluesky-social/indigo/atproto/atcrypto" 12 - "github.com/haileyok/cocoon/identity" 13 - "github.com/haileyok/cocoon/internal/helpers" 14 - "github.com/haileyok/cocoon/models" 15 - "github.com/haileyok/cocoon/plc" 12 + "pkg.rbrt.fr/vow/identity" 13 + "pkg.rbrt.fr/vow/internal/helpers" 14 + "pkg.rbrt.fr/vow/models" 15 + "pkg.rbrt.fr/vow/plc" 16 16 ) 17 17 18 18 type ComAtprotoSignPlcOperationRequest struct {
+3 -3
server/handle_identity_submit_plc_operation.go
··· 12 12 "github.com/bluesky-social/indigo/atproto/atcrypto" 13 13 "github.com/bluesky-social/indigo/events" 14 14 "github.com/bluesky-social/indigo/util" 15 - "github.com/haileyok/cocoon/internal/helpers" 16 - "github.com/haileyok/cocoon/models" 17 - "github.com/haileyok/cocoon/plc" 15 + "pkg.rbrt.fr/vow/internal/helpers" 16 + "pkg.rbrt.fr/vow/models" 17 + "pkg.rbrt.fr/vow/plc" 18 18 ) 19 19 20 20 type ComAtprotoSubmitPlcOperationRequest struct {
+4 -4
server/handle_identity_update_handle.go
··· 12 12 "github.com/bluesky-social/indigo/atproto/atcrypto" 13 13 "github.com/bluesky-social/indigo/events" 14 14 "github.com/bluesky-social/indigo/util" 15 - "github.com/haileyok/cocoon/identity" 16 - "github.com/haileyok/cocoon/internal/helpers" 17 - "github.com/haileyok/cocoon/models" 18 - "github.com/haileyok/cocoon/plc" 15 + "pkg.rbrt.fr/vow/identity" 16 + "pkg.rbrt.fr/vow/internal/helpers" 17 + "pkg.rbrt.fr/vow/models" 18 + "pkg.rbrt.fr/vow/plc" 19 19 ) 20 20 21 21 type ComAtprotoIdentityUpdateHandleRequest struct {
+3 -2
server/handle_import_repo.go
··· 9 9 "strings" 10 10 11 11 "github.com/bluesky-social/indigo/atproto/syntax" 12 - "github.com/haileyok/cocoon/internal/helpers" 13 - "github.com/haileyok/cocoon/models" 12 + "github.com/bluesky-social/indigo/repo" 14 13 blocks "github.com/ipfs/go-block-format" 15 14 "github.com/ipfs/go-cid" 16 15 "github.com/ipld/go-car" 16 + "pkg.rbrt.fr/vow/internal/helpers" 17 + "pkg.rbrt.fr/vow/models" 17 18 ) 18 19 19 20 func (s *Server) handleRepoImportRepo(w http.ResponseWriter, r *http.Request) {
+5 -5
server/handle_oauth_authorize.go
··· 8 8 "time" 9 9 10 10 "github.com/Azure/go-autorest/autorest/to" 11 - "github.com/haileyok/cocoon/internal/helpers" 12 - "github.com/haileyok/cocoon/oauth" 13 - "github.com/haileyok/cocoon/oauth/constants" 14 - "github.com/haileyok/cocoon/oauth/provider" 11 + "pkg.rbrt.fr/vow/internal/helpers" 12 + "pkg.rbrt.fr/vow/oauth" 13 + "pkg.rbrt.fr/vow/oauth/constants" 14 + "pkg.rbrt.fr/vow/oauth/provider" 15 15 ) 16 16 17 17 type HandleOauthAuthorizeGetInput struct { ··· 64 64 s.renderTemplate(w, "authorize.html", map[string]any{ 65 65 "Scopes": []string{"atproto", "transition:generic"}, 66 66 "AppName": "DEV MODE AUTHORIZATION PAGE", 67 - "Handle": "paula.cocoon.social", 67 + "Handle": "paula.rbrt.fr", 68 68 "RequestUri": "", 69 69 }) 70 70 return
+5 -5
server/handle_oauth_par.go
··· 6 6 "time" 7 7 8 8 "github.com/Azure/go-autorest/autorest/to" 9 - "github.com/haileyok/cocoon/internal/helpers" 10 - "github.com/haileyok/cocoon/oauth" 11 - "github.com/haileyok/cocoon/oauth/constants" 12 - "github.com/haileyok/cocoon/oauth/dpop" 13 - "github.com/haileyok/cocoon/oauth/provider" 9 + "pkg.rbrt.fr/vow/internal/helpers" 10 + "pkg.rbrt.fr/vow/oauth" 11 + "pkg.rbrt.fr/vow/oauth/constants" 12 + "pkg.rbrt.fr/vow/oauth/dpop" 13 + "pkg.rbrt.fr/vow/oauth/provider" 14 14 ) 15 15 16 16 type OauthParResponse struct {
+5 -5
server/handle_oauth_token.go
··· 12 12 13 13 "github.com/Azure/go-autorest/autorest/to" 14 14 "github.com/golang-jwt/jwt/v4" 15 - "github.com/haileyok/cocoon/internal/helpers" 16 - "github.com/haileyok/cocoon/oauth" 17 - "github.com/haileyok/cocoon/oauth/constants" 18 - "github.com/haileyok/cocoon/oauth/dpop" 19 - "github.com/haileyok/cocoon/oauth/provider" 15 + "pkg.rbrt.fr/vow/internal/helpers" 16 + "pkg.rbrt.fr/vow/oauth" 17 + "pkg.rbrt.fr/vow/oauth/constants" 18 + "pkg.rbrt.fr/vow/oauth/dpop" 19 + "pkg.rbrt.fr/vow/oauth/provider" 20 20 ) 21 21 22 22 type OauthTokenRequest struct {
+2 -2
server/handle_proxy.go
··· 12 12 "time" 13 13 14 14 "github.com/google/uuid" 15 - "github.com/haileyok/cocoon/internal/helpers" 16 - "github.com/haileyok/cocoon/models" 15 + "pkg.rbrt.fr/vow/internal/helpers" 16 + "pkg.rbrt.fr/vow/models" 17 17 secp256k1secec "gitlab.com/yawning/secp256k1-voi/secec" 18 18 ) 19 19
+1 -1
server/handle_proxy_get_feed.go
··· 9 9 "github.com/bluesky-social/indigo/api/bsky" 10 10 "github.com/bluesky-social/indigo/atproto/syntax" 11 11 "github.com/bluesky-social/indigo/xrpc" 12 - "github.com/haileyok/cocoon/internal/helpers" 12 + "pkg.rbrt.fr/vow/internal/helpers" 13 13 ) 14 14 15 15 func (s *Server) handleProxyBskyFeedGetFeed(w http.ResponseWriter, r *http.Request) {
+2 -2
server/handle_repo_apply_writes.go
··· 4 4 "encoding/json" 5 5 "net/http" 6 6 7 - "github.com/haileyok/cocoon/internal/helpers" 8 - "github.com/haileyok/cocoon/models" 7 + "pkg.rbrt.fr/vow/internal/helpers" 8 + "pkg.rbrt.fr/vow/models" 9 9 ) 10 10 11 11 type ComAtprotoRepoApplyWritesInput struct {
+2 -2
server/handle_repo_create_record.go
··· 4 4 "encoding/json" 5 5 "net/http" 6 6 7 - "github.com/haileyok/cocoon/internal/helpers" 8 - "github.com/haileyok/cocoon/models" 7 + "pkg.rbrt.fr/vow/internal/helpers" 8 + "pkg.rbrt.fr/vow/models" 9 9 ) 10 10 11 11 type ComAtprotoRepoCreateRecordInput struct {
+2 -2
server/handle_repo_delete_record.go
··· 4 4 "encoding/json" 5 5 "net/http" 6 6 7 - "github.com/haileyok/cocoon/internal/helpers" 8 - "github.com/haileyok/cocoon/models" 7 + "pkg.rbrt.fr/vow/internal/helpers" 8 + "pkg.rbrt.fr/vow/models" 9 9 ) 10 10 11 11 type ComAtprotoRepoDeleteRecordInput struct {
+5 -5
server/handle_repo_describe_repo.go
··· 5 5 "strings" 6 6 7 7 "github.com/Azure/go-autorest/autorest/to" 8 - "github.com/haileyok/cocoon/identity" 9 - "github.com/haileyok/cocoon/internal/helpers" 10 - "github.com/haileyok/cocoon/models" 11 8 "gorm.io/gorm" 9 + "pkg.rbrt.fr/vow/identity" 10 + "pkg.rbrt.fr/vow/internal/helpers" 11 + "pkg.rbrt.fr/vow/models" 12 12 ) 13 13 14 14 type ComAtprotoRepoDescribeRepoResponse struct { ··· 47 47 48 48 dochandle := "" 49 49 for _, aka := range diddoc.AlsoKnownAs { 50 - if strings.HasPrefix(aka, "at://") { 51 - dochandle = strings.TrimPrefix(aka, "at://") 50 + if after, ok := strings.CutPrefix(aka, "at://"); ok { 51 + dochandle = after 52 52 break 53 53 } 54 54 }
+1 -1
server/handle_repo_get_record.go
··· 5 5 6 6 "github.com/bluesky-social/indigo/atproto/atdata" 7 7 "github.com/bluesky-social/indigo/atproto/syntax" 8 - "github.com/haileyok/cocoon/models" 8 + "pkg.rbrt.fr/vow/models" 9 9 ) 10 10 11 11 type ComAtprotoRepoGetRecordResponse struct {
+2 -2
server/handle_repo_list_missing_blobs.go
··· 6 6 "strconv" 7 7 8 8 "github.com/bluesky-social/indigo/atproto/atdata" 9 - "github.com/haileyok/cocoon/internal/helpers" 10 - "github.com/haileyok/cocoon/models" 9 + "pkg.rbrt.fr/vow/internal/helpers" 10 + "pkg.rbrt.fr/vow/models" 11 11 "github.com/ipfs/go-cid" 12 12 ) 13 13
+2 -2
server/handle_repo_list_records.go
··· 7 7 "github.com/Azure/go-autorest/autorest/to" 8 8 "github.com/bluesky-social/indigo/atproto/atdata" 9 9 "github.com/bluesky-social/indigo/atproto/syntax" 10 - "github.com/haileyok/cocoon/internal/helpers" 11 - "github.com/haileyok/cocoon/models" 10 + "pkg.rbrt.fr/vow/internal/helpers" 11 + "pkg.rbrt.fr/vow/models" 12 12 ) 13 13 14 14 type ComAtprotoRepoListRecordsRequest struct {
+1 -1
server/handle_repo_list_repos.go
··· 3 3 import ( 4 4 "net/http" 5 5 6 - "github.com/haileyok/cocoon/models" 6 + "pkg.rbrt.fr/vow/models" 7 7 "github.com/ipfs/go-cid" 8 8 ) 9 9
+2 -2
server/handle_repo_put_record.go
··· 4 4 "encoding/json" 5 5 "net/http" 6 6 7 - "github.com/haileyok/cocoon/internal/helpers" 8 - "github.com/haileyok/cocoon/models" 7 + "pkg.rbrt.fr/vow/internal/helpers" 8 + "pkg.rbrt.fr/vow/models" 9 9 ) 10 10 11 11 type ComAtprotoRepoPutRecordInput struct {
+2 -2
server/handle_repo_upload_blob.go
··· 7 7 "mime/multipart" 8 8 "net/http" 9 9 10 - "github.com/haileyok/cocoon/internal/helpers" 11 - "github.com/haileyok/cocoon/models" 10 + "pkg.rbrt.fr/vow/internal/helpers" 11 + "pkg.rbrt.fr/vow/models" 12 12 "github.com/ipfs/go-cid" 13 13 "github.com/multiformats/go-multihash" 14 14 )
+1 -1
server/handle_root.go
··· 39 39 40 40 This is an AT Protocol Personal Data Server (aka, an atproto PDS) 41 41 42 - Code: https://github.com/haileyok/cocoon 42 + Code: https://pkg.rbrt.fr/vow 43 43 Version: `+s.config.Version+"\n") 44 44 }
+2 -2
server/handle_server_activate_account.go
··· 8 8 "github.com/bluesky-social/indigo/api/atproto" 9 9 "github.com/bluesky-social/indigo/events" 10 10 "github.com/bluesky-social/indigo/util" 11 - "github.com/haileyok/cocoon/internal/helpers" 12 - "github.com/haileyok/cocoon/models" 11 + "pkg.rbrt.fr/vow/internal/helpers" 12 + "pkg.rbrt.fr/vow/models" 13 13 ) 14 14 15 15 type ComAtprotoServerActivateAccountRequest struct {
+2 -2
server/handle_server_check_account_status.go
··· 3 3 import ( 4 4 "net/http" 5 5 6 - "github.com/haileyok/cocoon/internal/helpers" 7 - "github.com/haileyok/cocoon/models" 6 + "pkg.rbrt.fr/vow/internal/helpers" 7 + "pkg.rbrt.fr/vow/models" 8 8 "github.com/ipfs/go-cid" 9 9 ) 10 10
+2 -2
server/handle_server_confirm_email.go
··· 6 6 "time" 7 7 8 8 "github.com/Azure/go-autorest/autorest/to" 9 - "github.com/haileyok/cocoon/internal/helpers" 10 - "github.com/haileyok/cocoon/models" 9 + "pkg.rbrt.fr/vow/internal/helpers" 10 + "pkg.rbrt.fr/vow/models" 11 11 ) 12 12 13 13 type ComAtprotoServerConfirmEmailRequest struct {
+2 -2
server/handle_server_create_account.go
··· 17 17 "github.com/bluesky-social/indigo/atproto/syntax" 18 18 "github.com/bluesky-social/indigo/events" 19 19 "github.com/bluesky-social/indigo/util" 20 - "github.com/haileyok/cocoon/internal/helpers" 21 - "github.com/haileyok/cocoon/models" 20 + "pkg.rbrt.fr/vow/internal/helpers" 21 + "pkg.rbrt.fr/vow/models" 22 22 "golang.org/x/crypto/bcrypt" 23 23 "gorm.io/gorm" 24 24 )
+2 -2
server/handle_server_create_invite_code.go
··· 5 5 "net/http" 6 6 7 7 "github.com/google/uuid" 8 - "github.com/haileyok/cocoon/internal/helpers" 9 - "github.com/haileyok/cocoon/models" 8 + "pkg.rbrt.fr/vow/internal/helpers" 9 + "pkg.rbrt.fr/vow/models" 10 10 ) 11 11 12 12 type ComAtprotoServerCreateInviteCodeRequest struct {
+2 -2
server/handle_server_create_invite_codes.go
··· 6 6 7 7 "github.com/Azure/go-autorest/autorest/to" 8 8 "github.com/google/uuid" 9 - "github.com/haileyok/cocoon/internal/helpers" 10 - "github.com/haileyok/cocoon/models" 9 + "pkg.rbrt.fr/vow/internal/helpers" 10 + "pkg.rbrt.fr/vow/models" 11 11 ) 12 12 13 13 type ComAtprotoServerCreateInviteCodesRequest struct {
+2 -2
server/handle_server_create_session.go
··· 11 11 12 12 "github.com/Azure/go-autorest/autorest/to" 13 13 "github.com/bluesky-social/indigo/atproto/syntax" 14 - "github.com/haileyok/cocoon/internal/helpers" 15 - "github.com/haileyok/cocoon/models" 14 + "pkg.rbrt.fr/vow/internal/helpers" 15 + "pkg.rbrt.fr/vow/models" 16 16 "golang.org/x/crypto/bcrypt" 17 17 "gorm.io/gorm" 18 18 )
+2 -2
server/handle_server_deactivate_account.go
··· 9 9 "github.com/bluesky-social/indigo/api/atproto" 10 10 "github.com/bluesky-social/indigo/events" 11 11 "github.com/bluesky-social/indigo/util" 12 - "github.com/haileyok/cocoon/internal/helpers" 13 - "github.com/haileyok/cocoon/models" 12 + "pkg.rbrt.fr/vow/internal/helpers" 13 + "pkg.rbrt.fr/vow/models" 14 14 ) 15 15 16 16 type ComAtprotoServerDeactivateAccountRequest struct {
+1 -1
server/handle_server_delete_account.go
··· 10 10 "github.com/bluesky-social/indigo/api/atproto" 11 11 "github.com/bluesky-social/indigo/events" 12 12 "github.com/bluesky-social/indigo/util" 13 - "github.com/haileyok/cocoon/internal/helpers" 13 + "pkg.rbrt.fr/vow/internal/helpers" 14 14 "golang.org/x/crypto/bcrypt" 15 15 ) 16 16
+2 -2
server/handle_server_delete_session.go
··· 3 3 import ( 4 4 "net/http" 5 5 6 - "github.com/haileyok/cocoon/internal/helpers" 7 - "github.com/haileyok/cocoon/models" 6 + "pkg.rbrt.fr/vow/internal/helpers" 7 + "pkg.rbrt.fr/vow/models" 8 8 ) 9 9 10 10 func (s *Server) handleDeleteSession(w http.ResponseWriter, r *http.Request) {
+2 -2
server/handle_server_get_service_auth.go
··· 12 12 13 13 "github.com/Azure/go-autorest/autorest/to" 14 14 "github.com/google/uuid" 15 - "github.com/haileyok/cocoon/internal/helpers" 16 - "github.com/haileyok/cocoon/models" 15 + "pkg.rbrt.fr/vow/internal/helpers" 16 + "pkg.rbrt.fr/vow/models" 17 17 secp256k1secec "gitlab.com/yawning/secp256k1-voi/secec" 18 18 ) 19 19
+1 -1
server/handle_server_get_session.go
··· 3 3 import ( 4 4 "net/http" 5 5 6 - "github.com/haileyok/cocoon/models" 6 + "pkg.rbrt.fr/vow/models" 7 7 ) 8 8 9 9 type ComAtprotoServerGetSessionResponse struct {
+2 -2
server/handle_server_refresh_session.go
··· 3 3 import ( 4 4 "net/http" 5 5 6 - "github.com/haileyok/cocoon/internal/helpers" 7 - "github.com/haileyok/cocoon/models" 6 + "pkg.rbrt.fr/vow/internal/helpers" 7 + "pkg.rbrt.fr/vow/models" 8 8 ) 9 9 10 10 type ComAtprotoServerRefreshSessionResponse struct {
+2 -2
server/handle_server_request_account_delete.go
··· 5 5 "net/http" 6 6 "time" 7 7 8 - "github.com/haileyok/cocoon/internal/helpers" 9 - "github.com/haileyok/cocoon/models" 8 + "pkg.rbrt.fr/vow/internal/helpers" 9 + "pkg.rbrt.fr/vow/models" 10 10 ) 11 11 12 12 func (s *Server) handleServerRequestAccountDelete(w http.ResponseWriter, r *http.Request) {
+2 -2
server/handle_server_request_email_confirmation.go
··· 6 6 "time" 7 7 8 8 "github.com/Azure/go-autorest/autorest/to" 9 - "github.com/haileyok/cocoon/internal/helpers" 10 - "github.com/haileyok/cocoon/models" 9 + "pkg.rbrt.fr/vow/internal/helpers" 10 + "pkg.rbrt.fr/vow/models" 11 11 ) 12 12 13 13 func (s *Server) handleServerRequestEmailConfirmation(w http.ResponseWriter, r *http.Request) {
+2 -2
server/handle_server_request_email_update.go
··· 5 5 "net/http" 6 6 "time" 7 7 8 - "github.com/haileyok/cocoon/internal/helpers" 9 - "github.com/haileyok/cocoon/models" 8 + "pkg.rbrt.fr/vow/internal/helpers" 9 + "pkg.rbrt.fr/vow/models" 10 10 ) 11 11 12 12 type ComAtprotoRequestEmailUpdateResponse struct {
+2 -2
server/handle_server_request_password_reset.go
··· 6 6 "net/http" 7 7 "time" 8 8 9 - "github.com/haileyok/cocoon/internal/helpers" 10 - "github.com/haileyok/cocoon/models" 9 + "pkg.rbrt.fr/vow/internal/helpers" 10 + "pkg.rbrt.fr/vow/models" 11 11 ) 12 12 13 13 type ComAtprotoServerRequestPasswordResetRequest struct {
+2 -2
server/handle_server_reserve_signing_key.go
··· 7 7 "time" 8 8 9 9 "github.com/bluesky-social/indigo/atproto/atcrypto" 10 - "github.com/haileyok/cocoon/internal/helpers" 11 - "github.com/haileyok/cocoon/models" 10 + "pkg.rbrt.fr/vow/internal/helpers" 11 + "pkg.rbrt.fr/vow/models" 12 12 ) 13 13 14 14 type ServerReserveSigningKeyRequest struct {
+2 -2
server/handle_server_reset_password.go
··· 6 6 "time" 7 7 8 8 "github.com/Azure/go-autorest/autorest/to" 9 - "github.com/haileyok/cocoon/internal/helpers" 10 - "github.com/haileyok/cocoon/models" 9 + "pkg.rbrt.fr/vow/internal/helpers" 10 + "pkg.rbrt.fr/vow/models" 11 11 "golang.org/x/crypto/bcrypt" 12 12 ) 13 13
+1 -1
server/handle_server_resolve_handle.go
··· 6 6 7 7 "github.com/Azure/go-autorest/autorest/to" 8 8 "github.com/bluesky-social/indigo/atproto/syntax" 9 - "github.com/haileyok/cocoon/internal/helpers" 9 + "pkg.rbrt.fr/vow/internal/helpers" 10 10 ) 11 11 12 12 func (s *Server) handleResolveHandle(w http.ResponseWriter, r *http.Request) {
+2 -2
server/handle_server_update_email.go
··· 5 5 "net/http" 6 6 "time" 7 7 8 - "github.com/haileyok/cocoon/internal/helpers" 9 - "github.com/haileyok/cocoon/models" 8 + "pkg.rbrt.fr/vow/internal/helpers" 9 + "pkg.rbrt.fr/vow/models" 10 10 ) 11 11 12 12 type ComAtprotoServerUpdateEmailRequest struct {
+2 -2
server/handle_sync_get_blob.go
··· 7 7 "net/http" 8 8 9 9 "github.com/Azure/go-autorest/autorest/to" 10 - "github.com/haileyok/cocoon/internal/helpers" 11 - "github.com/haileyok/cocoon/models" 10 + "pkg.rbrt.fr/vow/internal/helpers" 11 + "pkg.rbrt.fr/vow/models" 12 12 "github.com/ipfs/go-cid" 13 13 ) 14 14
+1 -1
server/handle_sync_get_blocks.go
··· 5 5 "net/http" 6 6 7 7 "github.com/bluesky-social/indigo/carstore" 8 - "github.com/haileyok/cocoon/internal/helpers" 8 + "pkg.rbrt.fr/vow/internal/helpers" 9 9 "github.com/ipfs/go-cid" 10 10 cbor "github.com/ipfs/go-ipld-cbor" 11 11 "github.com/ipld/go-car"
+1 -1
server/handle_sync_get_latest_commit.go
··· 3 3 import ( 4 4 "net/http" 5 5 6 - "github.com/haileyok/cocoon/internal/helpers" 6 + "pkg.rbrt.fr/vow/internal/helpers" 7 7 "github.com/ipfs/go-cid" 8 8 ) 9 9
+2 -2
server/handle_sync_get_record.go
··· 5 5 "net/http" 6 6 7 7 "github.com/bluesky-social/indigo/carstore" 8 - "github.com/haileyok/cocoon/internal/helpers" 9 - "github.com/haileyok/cocoon/models" 8 + "pkg.rbrt.fr/vow/internal/helpers" 9 + "pkg.rbrt.fr/vow/models" 10 10 "github.com/ipfs/go-cid" 11 11 cbor "github.com/ipfs/go-ipld-cbor" 12 12 "github.com/ipld/go-car"
+2 -2
server/handle_sync_get_repo.go
··· 5 5 "net/http" 6 6 7 7 "github.com/bluesky-social/indigo/carstore" 8 - "github.com/haileyok/cocoon/internal/helpers" 9 - "github.com/haileyok/cocoon/models" 8 + "pkg.rbrt.fr/vow/internal/helpers" 9 + "pkg.rbrt.fr/vow/models" 10 10 "github.com/ipfs/go-cid" 11 11 cbor "github.com/ipfs/go-ipld-cbor" 12 12 "github.com/ipld/go-car"
+1 -1
server/handle_sync_get_repo_status.go
··· 3 3 import ( 4 4 "net/http" 5 5 6 - "github.com/haileyok/cocoon/internal/helpers" 6 + "pkg.rbrt.fr/vow/internal/helpers" 7 7 ) 8 8 9 9 type ComAtprotoSyncGetRepoStatusResponse struct {
+2 -2
server/handle_sync_list_blobs.go
··· 5 5 "strconv" 6 6 7 7 "github.com/Azure/go-autorest/autorest/to" 8 - "github.com/haileyok/cocoon/internal/helpers" 9 - "github.com/haileyok/cocoon/models" 8 + "pkg.rbrt.fr/vow/internal/helpers" 9 + "pkg.rbrt.fr/vow/models" 10 10 "github.com/ipfs/go-cid" 11 11 ) 12 12
+1 -1
server/handle_sync_subscribe_repos.go
··· 9 9 "github.com/bluesky-social/indigo/events" 10 10 "github.com/bluesky-social/indigo/lex/util" 11 11 "github.com/btcsuite/websocket" 12 - "github.com/haileyok/cocoon/metrics" 12 + "pkg.rbrt.fr/vow/metrics" 13 13 ) 14 14 15 15 func (s *Server) handleSyncSubscribeRepos(w http.ResponseWriter, r *http.Request) {
+3 -3
server/handle_well_known.go
··· 6 6 "strings" 7 7 8 8 "github.com/Azure/go-autorest/autorest/to" 9 - "github.com/haileyok/cocoon/internal/helpers" 9 + "pkg.rbrt.fr/vow/internal/helpers" 10 10 "gorm.io/gorm" 11 11 ) 12 12 13 13 var ( 14 - CocoonSupportedScopes = []string{ 14 + VowSupportedScopes = []string{ 15 15 "atproto", 16 16 "transition:email", 17 17 "transition:generic", ··· 124 124 RequestParameterSupported: true, 125 125 RequestUriParameterSupported: true, 126 126 RequireRequestUriRegistration: to.BoolPtr(true), 127 - ScopesSupported: CocoonSupportedScopes, 127 + ScopesSupported: VowSupportedScopes, 128 128 SubjectTypesSupported: []string{"public"}, 129 129 ResponseTypesSupported: []string{"code"}, 130 130 ResponseModesSupported: []string{"query", "fragment", "form_post"},
+1 -1
server/ipfs.go
··· 36 36 "cid": cidStr, 37 37 "name": name, 38 38 "meta": map[string]string{ 39 - "pinned_by": "cocoon", 39 + "pinned_by": "vow", 40 40 "pinned_at": time.Now().UTC().Format(time.RFC3339), 41 41 }, 42 42 }
+4 -4
server/middleware.go
··· 12 12 13 13 "github.com/Azure/go-autorest/autorest/to" 14 14 "github.com/golang-jwt/jwt/v4" 15 - "github.com/haileyok/cocoon/internal/helpers" 16 - "github.com/haileyok/cocoon/models" 17 - "github.com/haileyok/cocoon/oauth/dpop" 18 - "github.com/haileyok/cocoon/oauth/provider" 15 + "pkg.rbrt.fr/vow/internal/helpers" 16 + "pkg.rbrt.fr/vow/models" 17 + "pkg.rbrt.fr/vow/oauth/dpop" 18 + "pkg.rbrt.fr/vow/oauth/provider" 19 19 "gitlab.com/yawning/secp256k1-voi" 20 20 secp256k1secec "gitlab.com/yawning/secp256k1-voi/secec" 21 21 "gorm.io/gorm"
+1 -1
server/persist.go
··· 13 13 cbg "github.com/whyrusleeping/cbor-gen" 14 14 "gorm.io/gorm" 15 15 16 - "github.com/haileyok/cocoon/models" 16 + "pkg.rbrt.fr/vow/models" 17 17 ) 18 18 19 19 type DbPersister struct {
+5 -4
server/repo.go
··· 19 19 "github.com/bluesky-social/indigo/carstore" 20 20 "github.com/bluesky-social/indigo/events" 21 21 lexutil "github.com/bluesky-social/indigo/lex/util" 22 - "github.com/haileyok/cocoon/internal/db" 23 - "github.com/haileyok/cocoon/metrics" 24 - "github.com/haileyok/cocoon/models" 25 - "github.com/haileyok/cocoon/recording_blockstore" 22 + "github.com/bluesky-social/indigo/repo" 26 23 blocks "github.com/ipfs/go-block-format" 27 24 "github.com/ipfs/go-cid" 28 25 blockstore "github.com/ipfs/go-ipfs-blockstore" ··· 30 27 "github.com/ipld/go-car" 31 28 "github.com/multiformats/go-multihash" 32 29 "gorm.io/gorm/clause" 30 + "pkg.rbrt.fr/vow/internal/db" 31 + "pkg.rbrt.fr/vow/metrics" 32 + "pkg.rbrt.fr/vow/models" 33 + "pkg.rbrt.fr/vow/recording_blockstore" 33 34 ) 34 35 35 36 type cachedRepo struct {
+14 -14
server/server.go
··· 28 28 chimiddleware "github.com/go-chi/chi/v5/middleware" 29 29 "github.com/go-playground/validator" 30 30 "github.com/gorilla/sessions" 31 - "github.com/haileyok/cocoon/identity" 32 - "github.com/haileyok/cocoon/internal/db" 33 - "github.com/haileyok/cocoon/internal/helpers" 34 - "github.com/haileyok/cocoon/models" 35 - "github.com/haileyok/cocoon/oauth/client" 36 - "github.com/haileyok/cocoon/oauth/constants" 37 - "github.com/haileyok/cocoon/oauth/dpop" 38 - "github.com/haileyok/cocoon/oauth/provider" 39 - "github.com/haileyok/cocoon/plc" 31 + "pkg.rbrt.fr/vow/identity" 32 + "pkg.rbrt.fr/vow/internal/db" 33 + "pkg.rbrt.fr/vow/internal/helpers" 34 + "pkg.rbrt.fr/vow/models" 35 + "pkg.rbrt.fr/vow/oauth/client" 36 + "pkg.rbrt.fr/vow/oauth/constants" 37 + "pkg.rbrt.fr/vow/oauth/dpop" 38 + "pkg.rbrt.fr/vow/oauth/provider" 39 + "pkg.rbrt.fr/vow/plc" 40 40 "github.com/ipfs/go-cid" 41 41 "github.com/prometheus/client_golang/prometheus/promhttp" 42 42 ··· 251 251 } 252 252 253 253 if args.Did == "" { 254 - return nil, fmt.Errorf("cocoon did must be set") 254 + return nil, fmt.Errorf("vow did must be set") 255 255 } 256 256 257 257 if args.ContactEmail == "" { 258 - return nil, fmt.Errorf("cocoon contact email is required") 258 + return nil, fmt.Errorf("vow contact email is required") 259 259 } 260 260 261 261 if _, err := syntax.ParseDID(args.Did); err != nil { 262 - return nil, fmt.Errorf("error parsing cocoon did: %w", err) 262 + return nil, fmt.Errorf("error parsing vow did: %w", err) 263 263 } 264 264 265 265 if args.Hostname == "" { 266 - return nil, fmt.Errorf("cocoon hostname must be set") 266 + return nil, fmt.Errorf("vow hostname must be set") 267 267 } 268 268 269 269 if args.AdminPassword == "" { ··· 602 602 &provider.OauthAuthorizationRequest{}, 603 603 ) 604 604 605 - logger.Info("starting cocoon") 605 + logger.Info("starting vow") 606 606 607 607 go func() { 608 608 if err := s.httpd.ListenAndServe(); err != nil {
+3 -3
server/service_auth.go
··· 20 20 return m.alg 21 21 } 22 22 23 - func (m *ES256KSigningMethod) Verify(signingString string, signature string, key interface{}) error { 23 + func (m *ES256KSigningMethod) Verify(signingString string, signature string, key any) error { 24 24 signatureBytes, err := jwt.DecodeSegment(signature) 25 25 if err != nil { 26 26 return err ··· 28 28 return key.(atcrypto.PublicKey).HashAndVerifyLenient([]byte(signingString), signatureBytes) 29 29 } 30 30 31 - func (m *ES256KSigningMethod) Sign(signingString string, key interface{}) (string, error) { 31 + func (m *ES256KSigningMethod) Sign(signingString string, key any) (string, error) { 32 32 return "", fmt.Errorf("unimplemented") 33 33 } 34 34 ··· 42 42 func (s *Server) validateServiceAuth(ctx context.Context, rawToken string, nsid string) (string, error) { 43 43 token := strings.TrimSpace(rawToken) 44 44 45 - parsedToken, err := jwt.ParseWithClaims(token, jwt.MapClaims{}, func(token *jwt.Token) (interface{}, error) { 45 + parsedToken, err := jwt.ParseWithClaims(token, jwt.MapClaims{}, func(token *jwt.Token) (any, error) { 46 46 did := syntax.DID(token.Claims.(jwt.MapClaims)["iss"].(string)) 47 47 didDoc, err := s.passport.FetchDoc(ctx, did.String()) 48 48 if err != nil {
+1 -1
server/session.go
··· 6 6 7 7 "github.com/golang-jwt/jwt/v4" 8 8 "github.com/google/uuid" 9 - "github.com/haileyok/cocoon/models" 9 + "pkg.rbrt.fr/vow/models" 10 10 ) 11 11 12 12 type Session struct {
+2 -2
sqlite_blockstore/sqlite_blockstore.go
··· 5 5 "fmt" 6 6 7 7 "github.com/bluesky-social/indigo/atproto/syntax" 8 - "github.com/haileyok/cocoon/internal/db" 9 - "github.com/haileyok/cocoon/models" 8 + "pkg.rbrt.fr/vow/internal/db" 9 + "pkg.rbrt.fr/vow/models" 10 10 blocks "github.com/ipfs/go-block-format" 11 11 "github.com/ipfs/go-cid" 12 12 "gorm.io/gorm/clause"
+2 -2
test.go
··· 25 25 26 26 func runFirehoseConsumer(relayHost string) error { 27 27 dialer := websocket.DefaultDialer 28 - u, err := url.Parse("wss://cocoon.hailey.at") 28 + u, err := url.Parse("wss://vow.rbrt.fr") 29 29 if err != nil { 30 30 return fmt.Errorf("invalid relayHost: %w", err) 31 31 } 32 32 33 33 u.Path = "xrpc/com.atproto.sync.subscribeRepos" 34 34 conn, _, err := dialer.Dial(u.String(), http.Header{ 35 - "User-Agent": []string{"cocoon-test/0.0.0"}, 35 + "User-Agent": []string{"vow-test/0.0.0"}, 36 36 }) 37 37 if err != nil { 38 38 return fmt.Errorf("subscribing to firehose failed (dialing): %w", err)