summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.dockerignore7
-rw-r--r--.gitignore13
-rw-r--r--docker/federation/Dockerfile17
-rw-r--r--docker/federation/docker-compose.yml91
-rw-r--r--docker/federation/nginx.conf75
-rwxr-xr-xdocker/federation/run-federation-test.bash16
-rw-r--r--server/Cargo.lock207
-rw-r--r--server/Cargo.toml4
-rw-r--r--server/config/config.hjson4
-rw-r--r--server/config/defaults.hjson14
-rw-r--r--server/migrations/2020-03-26-192410_add_activitypub_tables/down.sql16
-rw-r--r--server/migrations/2020-03-26-192410_add_activitypub_tables/up.sql36
-rw-r--r--server/migrations/2020-04-03-194936_add_activitypub_for_posts_and_comments/down.sql7
-rw-r--r--server/migrations/2020-04-03-194936_add_activitypub_for_posts_and_comments/up.sql14
-rw-r--r--server/migrations/2020-04-07-135912_add_user_community_apub_constraints/down.sql36
-rw-r--r--server/migrations/2020-04-07-135912_add_user_community_apub_constraints/up.sql38
-rw-r--r--server/migrations/2020-04-14-163701_update_views_for_activitypub/down.sql440
-rw-r--r--server/migrations/2020-04-14-163701_update_views_for_activitypub/up.sql497
-rw-r--r--server/src/api/comment.rs11
-rw-r--r--server/src/api/community.rs95
-rw-r--r--server/src/api/post.rs34
-rw-r--r--server/src/api/site.rs18
-rw-r--r--server/src/api/user.rs124
-rw-r--r--server/src/apub/activities.rs143
-rw-r--r--server/src/apub/community.rs259
-rw-r--r--server/src/apub/fetcher.rs145
-rw-r--r--server/src/apub/inbox.rs101
-rw-r--r--server/src/apub/mod.rs187
-rw-r--r--server/src/apub/post.rs112
-rw-r--r--server/src/apub/signatures.rs30
-rw-r--r--server/src/apub/user.rs145
-rw-r--r--server/src/db/code_migrations.rs145
-rw-r--r--server/src/db/comment.rs59
-rw-r--r--server/src/db/comment_view.rs60
-rw-r--r--server/src/db/community.rs43
-rw-r--r--server/src/db/community_view.rs39
-rw-r--r--server/src/db/mod.rs1
-rw-r--r--server/src/db/moderator.rs25
-rw-r--r--server/src/db/password_reset_request.rs7
-rw-r--r--server/src/db/post.rs75
-rw-r--r--server/src/db/post_view.rs46
-rw-r--r--server/src/db/private_message.rs14
-rw-r--r--server/src/db/user.rs57
-rw-r--r--server/src/db/user_mention.rs25
-rw-r--r--server/src/db/user_mention_view.rs18
-rw-r--r--server/src/db/user_view.rs12
-rw-r--r--server/src/lib.rs13
-rw-r--r--server/src/main.rs77
-rw-r--r--server/src/routes/federation.rs52
-rw-r--r--server/src/routes/nodeinfo.rs85
-rw-r--r--server/src/routes/webfinger.rs43
-rw-r--r--server/src/schema.rs491
-rw-r--r--server/src/settings.rs9
-rw-r--r--server/src/websocket/server.rs6
-rw-r--r--ui/.gitignore3
-rw-r--r--ui/package.json2
-rw-r--r--ui/src/components/comment-form.tsx5
-rw-r--r--ui/src/components/comment-node.tsx26
-rw-r--r--ui/src/components/navbar.tsx2
-rw-r--r--ui/src/components/post-form.tsx10
-rw-r--r--ui/src/components/post-listing.tsx75
-rw-r--r--ui/src/components/post.tsx20
-rw-r--r--ui/src/components/private-message-form.tsx5
-rw-r--r--ui/src/components/private-message.tsx15
-rw-r--r--ui/src/components/sidebar.tsx11
-rw-r--r--ui/src/interfaces.ts26
-rw-r--r--ui/src/utils.ts14
-rw-r--r--ui/yarn.lock15
68 files changed, 3589 insertions, 978 deletions
diff --git a/.dockerignore b/.dockerignore
index a29cd2ec..4f186bcd 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,6 +1,11 @@
+# build folders and similar which are not needed for the docker build
ui/node_modules
-ui/dist
server/target
docker/dev/volumes
docker/federation/volumes
.git
+ansible
+
+# exceptions, needed for federation-test build
+
+!server/target/debug/lemmy_server
diff --git a/.gitignore b/.gitignore
index 9f7fa1e3..5e9fd40d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,17 @@
+# local ansible configuration
ansible/inventory
ansible/inventory_dev
ansible/passwords/
+
+# docker build files
docker/lemmy_mine.hjson
docker/dev/env_deploy.sh
+docker/federation/volumes
+docker/dev/volumes
+
+# local build files
build/
-.idea/
ui/src/translations
-docker/dev/volumes
-docker/federation-test/volumes
+
+# ide config
+.idea/
diff --git a/docker/federation/Dockerfile b/docker/federation/Dockerfile
new file mode 100644
index 00000000..d8302ea7
--- /dev/null
+++ b/docker/federation/Dockerfile
@@ -0,0 +1,17 @@
+FROM ekidd/rust-musl-builder:1.38.0-openssl11
+
+USER root
+RUN mkdir /app/dist/documentation/ -p \
+ && addgroup --gid 1001 lemmy \
+ && adduser --disabled-password --shell /bin/sh -u 1001 --ingroup lemmy lemmy
+
+# Copy resources
+COPY server/config/defaults.hjson /app/config/defaults.hjson
+COPY ui/dist /app/dist
+COPY server/target/debug/lemmy_server /app/lemmy
+
+RUN chown lemmy:lemmy /app/ -R
+USER lemmy
+EXPOSE 8536
+WORKDIR /app
+CMD ["/app/lemmy"]
diff --git a/docker/federation/docker-compose.yml b/docker/federation/docker-compose.yml
new file mode 100644
index 00000000..216ac9a1
--- /dev/null
+++ b/docker/federation/docker-compose.yml
@@ -0,0 +1,91 @@
+version: '3.3'
+
+services:
+ nginx:
+ image: nginx:1.17-alpine
+ ports:
+ - "8540:8540"
+ - "8550:8550"
+ volumes:
+ - ./nginx.conf:/etc/nginx/nginx.conf
+ depends_on:
+ - lemmy_alpha
+ - pictshare_alpha
+ - lemmy_beta
+ - pictshare_beta
+ - iframely
+ restart: "always"
+
+ lemmy_alpha:
+ image: lemmy-federation:latest
+ environment:
+ - LEMMY_HOSTNAME=lemmy_alpha:8540
+ - LEMMY_DATABASE_URL=postgres://lemmy:password@postgres_alpha:5432/lemmy
+ - LEMMY_JWT_SECRET=changeme
+ - LEMMY_FRONT_END_DIR=/app/dist
+ - LEMMY_FEDERATION__ENABLED=true
+ - LEMMY_FEDERATION__FOLLOWED_INSTANCES=lemmy_beta:8550
+ - LEMMY_FEDERATION__TLS_ENABLED=false
+ - LEMMY_PORT=8540
+ - LEMMY_SETUP__ADMIN_USERNAME=lemmy_alpha
+ - LEMMY_SETUP__ADMIN_PASSWORD=lemmy
+ - LEMMY_SETUP__SITE_NAME=lemmy_alpha
+ - RUST_BACKTRACE=1
+ - RUST_LOG=actix_web=debug
+ restart: always
+ depends_on:
+ - postgres_alpha
+ postgres_alpha:
+ image: postgres:12-alpine
+ environment:
+ - POSTGRES_USER=lemmy
+ - POSTGRES_PASSWORD=password
+ - POSTGRES_DB=lemmy
+ volumes:
+ - ./volumes/postgres_alpha:/var/lib/postgresql/data
+ restart: always
+ pictshare_alpha:
+ image: shtripok/pictshare:latest
+ volumes:
+ - ./volumes/pictshare_alpha:/usr/share/nginx/html/data
+ restart: always
+
+ lemmy_beta:
+ image: lemmy-federation:latest
+ environment:
+ - LEMMY_HOSTNAME=lemmy_beta:8550
+ - LEMMY_DATABASE_URL=postgres://lemmy:password@postgres_beta:5432/lemmy
+ - LEMMY_JWT_SECRET=changeme
+ - LEMMY_FRONT_END_DIR=/app/dist
+ - LEMMY_FEDERATION__ENABLED=true
+ - LEMMY_FEDERATION__FOLLOWED_INSTANCES=lemmy_alpha:8540
+ - LEMMY_FEDERATION__TLS_ENABLED=false
+ - LEMMY_PORT=8550
+ - LEMMY_SETUP__ADMIN_USERNAME=lemmy_beta
+ - LEMMY_SETUP__ADMIN_PASSWORD=lemmy
+ - LEMMY_SETUP__SITE_NAME=lemmy_beta
+ - RUST_BACKTRACE=1
+ - RUST_LOG=actix_web=debug
+ restart: always
+ depends_on:
+ - postgres_beta
+ postgres_beta:
+ image: postgres:12-alpine
+ environment:
+ - POSTGRES_USER=lemmy
+ - POSTGRES_PASSWORD=password
+ - POSTGRES_DB=lemmy
+ volumes:
+ - ./volumes/postgres_beta:/var/lib/postgresql/data
+ restart: always
+ pictshare_beta:
+ image: shtripok/pictshare:latest
+ volumes:
+ - ./volumes/pictshare_beta:/usr/share/nginx/html/data
+ restart: always
+
+ iframely:
+ image: dogbin/iframely:latest
+ volumes:
+ - ../iframely.config.local.js:/iframely/config.local.js:ro
+ restart: always
diff --git a/docker/federation/nginx.conf b/docker/federation/nginx.conf
new file mode 100644
index 00000000..c0633ea4
--- /dev/null
+++ b/docker/federation/nginx.conf
@@ -0,0 +1,75 @@
+events {
+ worker_connections 1024;
+}
+
+http {
+ server {
+ listen 8540;
+ server_name 127.0.0.1;
+ access_log off;
+
+ # Upload limit for pictshare
+ client_max_body_size 50M;
+
+ location / {
+ proxy_pass http://lemmy_alpha:8540;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+
+ # WebSocket support
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+ }
+
+ location /pictshare/ {
+ proxy_pass http://pictshare_alpha:80/;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+
+ location /iframely/ {
+ proxy_pass http://iframely:80/;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ }
+
+ server {
+ listen 8550;
+ server_name 127.0.0.1;
+ access_log off;
+
+ # Upload limit for pictshare
+ client_max_body_size 50M;
+
+ location / {
+ proxy_pass http://lemmy_beta:8550;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+
+ # WebSocket support
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+ }
+
+ location /pictshare/ {
+ proxy_pass http://pictshare_beta:80/;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+
+ location /iframely/ {
+ proxy_pass http://iframely:80/;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ }
+}
diff --git a/docker/federation/run-federation-test.bash b/docker/federation/run-federation-test.bash
new file mode 100755
index 00000000..62bc1e8b
--- /dev/null
+++ b/docker/federation/run-federation-test.bash
@@ -0,0 +1,16 @@
+#!/bin/bash
+set -e
+
+if [ "$1" = "-yarn" ]; then
+ pushd ../../ui/ || exit
+ yarn build
+ popd || exit
+fi
+
+pushd ../../server/ || exit
+cargo build
+popd || exit
+
+sudo docker build ../../ -f Dockerfile -t lemmy-federation:latest
+
+sudo docker-compose up \ No newline at end of file
diff --git a/server/Cargo.lock b/server/Cargo.lock
index 2a3bc033..b17f4d60 100644
--- a/server/Cargo.lock
+++ b/server/Cargo.lock
@@ -1,21 +1,22 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
-name = "activitypub"
-version = "0.2.0"
+name = "activitystreams"
+version = "0.5.0-alpha.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "activitystreams-derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "activitystreams-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "activitystreams-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "activitystreams-derive 0.5.0-alpha.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thiserror 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "activitystreams-derive"
-version = "0.2.0"
+version = "0.5.0-alpha.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -24,30 +25,6 @@ dependencies = [
]
[[package]]
-name = "activitystreams-traits"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)",
- "thiserror 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "activitystreams-types"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "activitystreams-derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "activitystreams-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
name = "actix"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -143,7 +120,7 @@ dependencies = [
"either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
"encoding_rs 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
"failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
- "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
"futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
"futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
"futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -372,7 +349,7 @@ dependencies = [
[[package]]
name = "aho-corasick"
-version = "0.7.9"
+version = "0.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -388,7 +365,7 @@ dependencies = [
[[package]]
name = "arc-swap"
-version = "0.4.4"
+version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
@@ -420,7 +397,7 @@ version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"hermit-abi 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -461,19 +438,19 @@ name = "backtrace"
version = "0.3.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "backtrace-sys 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)",
+ "backtrace-sys 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "backtrace-sys"
-version = "0.1.33"
+version = "0.1.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -563,7 +540,7 @@ version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -572,7 +549,7 @@ version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"brotli-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -609,14 +586,6 @@ dependencies = [
]
[[package]]
-name = "c2-chacha"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
name = "cc"
version = "1.0.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -701,7 +670,7 @@ version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -738,11 +707,11 @@ dependencies = [
[[package]]
name = "curl"
-version = "0.4.26"
+version = "0.4.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "curl-sys 0.4.28+curl-7.69.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)",
+ "curl-sys 0.4.30+curl-7.69.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
"openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
"openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)",
"schannel 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -752,11 +721,11 @@ dependencies = [
[[package]]
name = "curl-sys"
-version = "0.4.28+curl-7.69.0"
+version = "0.4.30+curl-7.69.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
"libnghttp2-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
"openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1043,12 +1012,12 @@ dependencies = [
[[package]]
name = "flate2"
-version = "1.0.13"
+version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
"crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
"miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -1137,7 +1106,7 @@ name = "futures-macro"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro-hack 0.5.12 (registry+https://github.com/rust-lang/crates.io-index)",
"proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
"syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1166,8 +1135,8 @@ dependencies = [
"futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
"memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
"pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro-hack 0.5.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"sla