diff --git a/.dockerignore b/.dockerignore index 255caf67..751289de 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,7 +2,6 @@ ui/node_modules server/target docker/dev/volumes -docker/federation/volumes docker/federation-test/volumes .git ansible diff --git a/.gitignore b/.gitignore index 236a729e..5e221b03 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ ansible/passwords/ # docker build files docker/lemmy_mine.hjson docker/dev/env_deploy.sh -docker/federation/volumes docker/federation-test/volumes docker/dev/volumes diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index e0270d4c..5a6c7d67 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -30,6 +30,6 @@ In the Lemmy community we strive to go the extra step to look out for each other And if someone takes issue with something you said or did, resist the urge to be defensive. Just stop doing what it was they complained about and apologize. Even if you feel you were misinterpreted or unfairly accused, chances are good there was something you could’ve communicated better — remember that it’s your responsibility to make others comfortable. Everyone wants to get along and we are all here first and foremost because we want to talk about cool technology. You will find that people will be eager to assume good intent and forgive as long as you earn their trust. -The enforcement policies listed above apply to all official Lemmy venues; including git repositories under [github.com/LemmyNet/lemmy](https://github.com/LemmyNet/lemmy) and [yerbamate.dev/dessalines/lemmy](https://yerbamate.dev/dessalines/lemmy), the [Matrix channel](https://matrix.to/#/!BZVTUuEiNmRcbFeLeI:matrix.org?via=matrix.org&via=privacytools.io&via=permaweb.io); and all instances under lemmy.ml. For other projects adopting the Rust Code of Conduct, please contact the maintainers of those projects for enforcement. If you wish to use this code of conduct for your own project, consider explicitly mentioning your moderation policy or making a copy with your own moderation policy so as to avoid confusion. +The enforcement policies listed above apply to all official Lemmy venues; including git repositories under [github.com/dessalines/lemmy](https://github.com/dessalines/lemmy) and [yerbamate.dev/dessalines/lemmy](https://yerbamate.dev/dessalines/lemmy), the [Matrix channel](https://matrix.to/#/!BZVTUuEiNmRcbFeLeI:matrix.org?via=matrix.org&via=privacytools.io&via=permaweb.io); and all instances under lemmy.ml. For other projects adopting the Rust Code of Conduct, please contact the maintainers of those projects for enforcement. If you wish to use this code of conduct for your own project, consider explicitly mentioning your moderation policy or making a copy with your own moderation policy so as to avoid confusion. Adapted from the [Rust Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct), which is based on the [Node.js Policy on Trolling](http://blog.izs.me/post/30036893703/policy-on-trolling) as well as the [Contributor Covenant v1.3.0](https://www.contributor-covenant.org/version/1/3/0/). diff --git a/README.md b/README.md index 41ba4809..2adad59c 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@
-![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/LemmyNet/lemmy.svg) -[![Build Status](https://travis-ci.org/LemmyNet/lemmy.svg?branch=master)](https://travis-ci.org/LemmyNet/lemmy) -[![GitHub issues](https://img.shields.io/github/issues-raw/LemmyNet/lemmy.svg)](https://github.com/LemmyNet/lemmy/issues) +![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/dessalines/lemmy.svg) +[![Build Status](https://travis-ci.org/dessalines/lemmy.svg?branch=master)](https://travis-ci.org/dessalines/lemmy) +[![GitHub issues](https://img.shields.io/github/issues-raw/dessalines/lemmy.svg)](https://github.com/dessalines/lemmy/issues) [![Docker Pulls](https://img.shields.io/docker/pulls/dessalines/lemmy.svg)](https://cloud.docker.com/repository/docker/dessalines/lemmy/) [![Translation status](http://weblate.yerbamate.dev/widgets/lemmy/-/lemmy/svg-badge.svg)](http://weblate.yerbamate.dev/engage/lemmy/) -[![License](https://img.shields.io/github/license/LemmyNet/lemmy.svg)](LICENSE) -![GitHub stars](https://img.shields.io/github/stars/LemmyNet/lemmy?style=social) +[![License](https://img.shields.io/github/license/dessalines/lemmy.svg)](LICENSE) +![GitHub stars](https://img.shields.io/github/stars/dessalines/lemmy?style=social)

@@ -22,11 +22,11 @@ · Documentation · - Report Bug + Report Bug · - Request Feature + Request Feature · - Releases + Releases

@@ -34,9 +34,9 @@ Front Page|Post ---|--- -![main screen](https://raw.githubusercontent.com/LemmyNet/lemmy/master/docs/img/main_screen.png)|![chat screen](https://raw.githubusercontent.com/LemmyNet/lemmy/master/docs/img/chat_screen.png) +![main screen](https://i.imgur.com/kZSRcRu.png)|![chat screen](https://i.imgur.com/4XghNh6.png) -[Lemmy](https://github.com/LemmyNet/lemmy) is similar to sites like [Reddit](https://reddit.com), [Lobste.rs](https://lobste.rs), [Raddle](https://raddle.me), or [Hacker News](https://news.ycombinator.com/): you subscribe to forums you're interested in, post links and discussions, then vote, and comment on them. Behind the scenes, it is very different; anyone can easily run a server, and all these servers are federated (think email), and connected to the same universe, called the [Fediverse](https://en.wikipedia.org/wiki/Fediverse). +[Lemmy](https://github.com/dessalines/lemmy) is similar to sites like [Reddit](https://reddit.com), [Lobste.rs](https://lobste.rs), [Raddle](https://raddle.me), or [Hacker News](https://news.ycombinator.com/): you subscribe to forums you're interested in, post links and discussions, then vote, and comment on them. Behind the scenes, it is very different; anyone can easily run a server, and all these servers are federated (think email), and connected to the same universe, called the [Fediverse](https://en.wikipedia.org/wiki/Fediverse). For a link aggregator, this means a user registered on one server can subscribe to forums on any other server, and can have discussions with users registered elsewhere. @@ -44,7 +44,7 @@ The overall goal is to create an easily self-hostable, decentralized alternative Each lemmy server can set its own moderation policy; appointing site-wide admins, and community moderators to keep out the trolls, and foster a healthy, non-toxic environment where all can feel comfortable contributing. -*Note: Federation is still in active development and the WebSocket, as well as, HTTP API are currently unstable* +*Note: Federation is still in active development* ### Why's it called Lemmy? @@ -73,7 +73,7 @@ Each lemmy server can set its own moderation policy; appointing site-wide admins - Full vote scores `(+/-)` like old reddit. - Themes, including light, dark, and solarized. - Emojis with autocomplete support. Start typing `:` - - User tagging using `@`, Community tagging using `!`. + - User tagging using `@`, Community tagging using `#`. - Integrated image uploading in both posts and comments. - A post can consist of a title and any combination of self text, a URL, or nothing else. - Notifications, on comment replies and when you're tagged. @@ -108,9 +108,8 @@ Each lemmy server can set its own moderation policy; appointing site-wide admins Lemmy is free, open-source software, meaning no advertising, monetizing, or venture capital, ever. Your donations directly support full-time development of the project. -- [Support on Liberapay](https://liberapay.com/Lemmy). +- [Support on Liberapay.](https://liberapay.com/Lemmy) - [Support on Patreon](https://www.patreon.com/dessalines). -- [Support on OpenCollective](https://opencollective.com/lemmy). - [List of Sponsors](https://dev.lemmy.ml/sponsors). ### Crypto @@ -125,19 +124,16 @@ Lemmy is free, open-source software, meaning no advertising, monetizing, or vent - [Docker Development](https://dev.lemmy.ml/docs/contributing_docker_development.html) - [Local Development](https://dev.lemmy.ml/docs/contributing_local_development.html) -### Translations +### Translations If you want to help with translating, take a look at [Weblate](https://weblate.yerbamate.dev/projects/lemmy/). ## Contact -- [Mastodon](https://mastodon.social/@LemmyDev) -- [Matrix](https://riot.im/app/#/room/#rust-reddit-fediverse:matrix.org) - -## Code Mirrors - -- [GitHub](https://github.com/LemmyNet/lemmy) -- [Gitea](https://yerbamate.dev/LemmyNet/lemmy) +- [Mastodon](https://mastodon.social/@LemmyDev) - [![Mastodon Follow](https://img.shields.io/mastodon/follow/810572?domain=https%3A%2F%2Fmastodon.social&style=social)](https://mastodon.social/@LemmyDev) +- [Matrix](https://riot.im/app/#/room/#rust-reddit-fediverse:matrix.org) - [![Matrix](https://img.shields.io/matrix/rust-reddit-fediverse:matrix.org.svg?label=matrix-chat)](https://riot.im/app/#/room/#rust-reddit-fediverse:matrix.org) +- [GitHub](https://github.com/dessalines/lemmy) +- [Gitea](https://yerbamate.dev/dessalines/lemmy) - [GitLab](https://gitlab.com/dessalines/lemmy) ## Credits diff --git a/RELEASES.md b/RELEASES.md index 5a4c7645..4d86f6da 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,6 +1,6 @@ # Lemmy v0.6.0 Release (2020-01-16) -`v0.6.0` is here, and we've closed [41 issues!](https://github.com/LemmyNet/lemmy/milestone/15?closed=1) +`v0.6.0` is here, and we've closed [41 issues!](https://github.com/dessalines/lemmy/milestone/15?closed=1) This is the biggest release by far: @@ -10,7 +10,7 @@ This is the biggest release by far: - Can set a custom language. - Lemmy-wide settings to disable downvotes, and close registration. - A better documentation system, hosted in lemmy itself. -- [Huge DB performance gains](https://github.com/LemmyNet/lemmy/issues/411) (everthing down to < `30ms`) by using materialized views. +- [Huge DB performance gains](https://github.com/dessalines/lemmy/issues/411) (everthing down to < `30ms`) by using materialized views. - Fixed major issue with similar post URL and title searching. - Upgraded to Actix `2.0` - Faster comment / post voting. diff --git a/ansible/VERSION b/ansible/VERSION index e31dcbc4..83ca525b 100644 --- a/ansible/VERSION +++ b/ansible/VERSION @@ -1 +1 @@ -v0.6.71 +v0.6.44 diff --git a/ansible/templates/docker-compose.yml b/ansible/templates/docker-compose.yml index 9ec1bfbc..a4d54f6d 100644 --- a/ansible/templates/docker-compose.yml +++ b/ansible/templates/docker-compose.yml @@ -26,7 +26,7 @@ services: restart: always pictshare: - image: hascheksolutions/pictshare:latest + image: shtripok/pictshare:latest ports: - "127.0.0.1:8537:80" volumes: diff --git a/ansible/templates/nginx.conf b/ansible/templates/nginx.conf index a978c189..04e5a643 100644 --- a/ansible/templates/nginx.conf +++ b/ansible/templates/nginx.conf @@ -36,7 +36,7 @@ server { # It might be nice to compress JSON, but leaving that out to protect against potential # compression+encryption information leak attacks like BREACH. gzip on; - gzip_types text/css application/javascript image/svg+xml; + gzip_types text/css application/javascript; gzip_vary on; # Only connect to this site via HTTPS for the two years diff --git a/docker/dev/deploy.sh b/docker/dev/deploy.sh index 09b21b0b..db2294fa 100755 --- a/docker/dev/deploy.sh +++ b/docker/dev/deploy.sh @@ -72,5 +72,5 @@ git push origin $new_tag git push # Pushing to any ansible deploys -cd ../../../lemmy-ansible || exit -ansible-playbook -i prod playbooks/site.yml --vault-password-file vault_pass +cd ../../ansible || exit +ansible-playbook lemmy.yml --become diff --git a/docker/dev/dev_deploy.sh b/docker/dev/dev_deploy.sh new file mode 100755 index 00000000..ef41434b --- /dev/null +++ b/docker/dev/dev_deploy.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +# Building from the dev branch for dev servers +git checkout dev + +# Rebuilding dev docker +docker-compose build +docker tag dev_lemmy:latest dessalines/lemmy:dev +docker push dessalines/lemmy:dev + +# SSH and pull it +ssh $LEMMY_USER@$LEMMY_HOST "cd ~/git/lemmy/docker/dev && docker pull dessalines/lemmy:dev && docker-compose up -d" diff --git a/docker/dev/docker-compose.yml b/docker/dev/docker-compose.yml index 3fc94099..a7d289b2 100644 --- a/docker/dev/docker-compose.yml +++ b/docker/dev/docker-compose.yml @@ -21,14 +21,14 @@ services: environment: - RUST_LOG=debug volumes: - - ../lemmy.hjson:/config/config.hjson - depends_on: + - ../lemmy.hjson:/config/config.hjson:ro + depends_on: - postgres - pictshare - iframely pictshare: - image: hascheksolutions/pictshare:latest + image: shtripok/pictshare:latest ports: - "127.0.0.1:8537:80" volumes: diff --git a/docker/dev/test_deploy.sh b/docker/dev/test_deploy.sh deleted file mode 100755 index fb09e4f1..00000000 --- a/docker/dev/test_deploy.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -set -e - -BRANCH=$1 - -git checkout $BRANCH -cd ../../ - -# Rebuilding dev docker -sudo docker build . -f "docker/dev/Dockerfile" -t "dessalines/lemmy:$BRANCH" -sudo docker push "dessalines/lemmy:$BRANCH" - -# Run the playbook -pushd ../lemmy-ansible -ansible-playbook -i test playbooks/site.yml -popd diff --git a/docker/federation/Dockerfile b/docker/federation-test/Dockerfile similarity index 89% rename from docker/federation/Dockerfile rename to docker/federation-test/Dockerfile index ec7bf2d2..d8302ea7 100644 --- a/docker/federation/Dockerfile +++ b/docker/federation-test/Dockerfile @@ -1,4 +1,4 @@ -FROM ekidd/rust-musl-builder:1.42.0-openssl11 +FROM ekidd/rust-musl-builder:1.38.0-openssl11 USER root RUN mkdir /app/dist/documentation/ -p \ diff --git a/docker/federation/docker-compose.yml b/docker/federation-test/docker-compose.yml similarity index 53% rename from docker/federation/docker-compose.yml rename to docker/federation-test/docker-compose.yml index 4379eb38..91f167c4 100644 --- a/docker/federation/docker-compose.yml +++ b/docker/federation-test/docker-compose.yml @@ -6,36 +6,28 @@ services: ports: - "8540:8540" - "8550:8550" - - "8560:8560" volumes: - # Hack to make this work from both docker/federation/ and docker/federation-test/ - - ../federation/nginx.conf:/etc/nginx/nginx.conf + - ./nginx.conf:/etc/nginx/nginx.conf depends_on: - lemmy_alpha - pictshare_alpha - lemmy_beta - pictshare_beta - - lemmy_gamma - - pictshare_gamma - iframely restart: "always" lemmy_alpha: - image: lemmy-federation:latest + image: lemmy-federation-test: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_FEDERATION__ALLOWED_INSTANCES=lemmy_beta,lemmy_gamma - 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=debug restart: always depends_on: - postgres_alpha @@ -55,21 +47,17 @@ services: restart: always lemmy_beta: - image: lemmy-federation:latest + image: lemmy-federation-test: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_FEDERATION__ALLOWED_INSTANCES=lemmy_alpha,lemmy_gamma - 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=debug restart: always depends_on: - postgres_beta @@ -88,40 +76,6 @@ services: - ./volumes/pictshare_beta:/usr/share/nginx/html/data restart: always - lemmy_gamma: - image: lemmy-federation:latest - environment: - - LEMMY_HOSTNAME=lemmy_gamma:8560 - - LEMMY_DATABASE_URL=postgres://lemmy:password@postgres_gamma:5432/lemmy - - LEMMY_JWT_SECRET=changeme - - LEMMY_FRONT_END_DIR=/app/dist - - LEMMY_FEDERATION__ENABLED=true - - LEMMY_FEDERATION__TLS_ENABLED=false - - LEMMY_FEDERATION__ALLOWED_INSTANCES=lemmy_alpha,lemmy_beta - - LEMMY_PORT=8560 - - LEMMY_SETUP__ADMIN_USERNAME=lemmy_gamma - - LEMMY_SETUP__ADMIN_PASSWORD=lemmy - - LEMMY_SETUP__SITE_NAME=lemmy_gamma - - RUST_BACKTRACE=1 - - RUST_LOG=debug - restart: always - depends_on: - - postgres_gamma - postgres_gamma: - image: postgres:12-alpine - environment: - - POSTGRES_USER=lemmy - - POSTGRES_PASSWORD=password - - POSTGRES_DB=lemmy - volumes: - - ./volumes/postgres_gamma:/var/lib/postgresql/data - restart: always - pictshare_gamma: - image: shtripok/pictshare:latest - volumes: - - ./volumes/pictshare_gamma:/usr/share/nginx/html/data - restart: always - iframely: image: dogbin/iframely:latest volumes: diff --git a/docker/federation-test/nginx.conf b/docker/federation-test/nginx.conf new file mode 100644 index 00000000..6dbe13b4 --- /dev/null +++ b/docker/federation-test/nginx.conf @@ -0,0 +1,73 @@ +events { + worker_connections 1024; +} + +http { + server { + listen 8540; + server_name 127.0.0.1; + + # 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; + + # 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-test/run-federation-test.bash b/docker/federation-test/run-federation-test.bash new file mode 100755 index 00000000..b9f150a0 --- /dev/null +++ b/docker/federation-test/run-federation-test.bash @@ -0,0 +1,14 @@ +#!/bin/bash +set -e + +pushd ../../ui/ || exit +yarn build +popd || exit + +pushd ../../server/ || exit +cargo build +popd || exit + +sudo docker build ../../ -f Dockerfile -t lemmy-federation-test:latest + +sudo docker-compose up \ No newline at end of file diff --git a/docker/federation-test/run-tests.sh b/docker/federation-test/run-tests.sh deleted file mode 100755 index b2d319dd..00000000 --- a/docker/federation-test/run-tests.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -set -e - -pushd ../../server/ -cargo build -popd - -sudo docker build ../../ --file ../federation/Dockerfile --tag lemmy-federation:latest - -sudo docker-compose --file ../federation/docker-compose.yml --project-directory . up -d - -pushd ../../ui -yarn -echo "Waiting for Lemmy to start..." -while [[ "$(curl -s -o /dev/null -w '%{http_code}' 'localhost:8540/api/v1/site')" != "200" ]]; do sleep 1; done -while [[ "$(curl -s -o /dev/null -w '%{http_code}' 'localhost:8550/api/v1/site')" != "200" ]]; do sleep 1; done -while [[ "$(curl -s -o /dev/null -w '%{http_code}' 'localhost:8560/api/v1/site')" != "200" ]]; do sleep 1; done -yarn api-test || true -popd - -sudo docker-compose --file ../federation/docker-compose.yml --project-directory . down - -sudo rm -r volumes/ diff --git a/docker/federation/nginx.conf b/docker/federation/nginx.conf deleted file mode 100644 index a73b0954..00000000 --- a/docker/federation/nginx.conf +++ /dev/null @@ -1,110 +0,0 @@ -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; - } - } - - server { - listen 8560; - server_name 127.0.0.1; - access_log off; - - # Upload limit for pictshare - client_max_body_size 50M; - - location / { - proxy_pass http://lemmy_gamma:8560; - 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_gamma: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 deleted file mode 100755 index 206a3240..00000000 --- a/docker/federation/run-federation-test.bash +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -set -e - -# already start rust build in the background -pushd ../../server/ || exit -cargo build & -popd || exit - -if [ "$1" = "-yarn" ]; then - pushd ../../ui/ || exit - yarn - yarn build - popd || exit -fi - -# wait for rust build to finish -pushd ../../server/ || exit -cargo build -popd || exit - -sudo docker build ../../ --file Dockerfile -t lemmy-federation:latest - -sudo docker-compose up diff --git a/docker/lemmy.hjson b/docker/lemmy.hjson index 271fc78d..b61ea826 100644 --- a/docker/lemmy.hjson +++ b/docker/lemmy.hjson @@ -23,6 +23,9 @@ jwt_secret: "changeme" # The dir for the front end front_end_dir: "/app/dist" + # whether to enable activitypub federation. this feature is in alpha, do not enable in production, as might + # cause problems like remote instances fetching and permanently storing bad data. + federation_enabled: false # rate limits for various user actions, by user ip rate_limit: { # maximum number of messages created in interval @@ -57,7 +60,6 @@ # smtp_password: "" # # address to send emails from, eg "info@your-instance.com" # smtp_from_address: "" -# use_tls: true # } } diff --git a/docker/prod/docker-compose.yml b/docker/prod/docker-compose.yml index db6e4004..76f5ae14 100644 --- a/docker/prod/docker-compose.yml +++ b/docker/prod/docker-compose.yml @@ -1,4 +1,4 @@ -version: '2.2' +version: '3.3' services: postgres: @@ -12,27 +12,26 @@ services: restart: always lemmy: - image: dessalines/lemmy:v0.6.71 + image: dessalines/lemmy:v0.6.44 ports: - "127.0.0.1:8536:8536" restart: always environment: - RUST_LOG=error volumes: - - ./lemmy.hjson:/config/config.hjson + - ./lemmy.hjson:/config/config.hjson:ro depends_on: - postgres - pictshare - iframely pictshare: - image: hascheksolutions/pictshare:latest + image: shtripok/pictshare:latest ports: - "127.0.0.1:8537:80" volumes: - ./volumes/pictshare:/usr/share/nginx/html/data restart: always - mem_limit: 100m iframely: image: dogbin/iframely:latest @@ -41,4 +40,3 @@ services: volumes: - ./iframely.config.local.js:/iframely/config.local.js:ro restart: always - mem_limit: 100m diff --git a/docs/img/chat_screen.png b/docs/img/chat_screen.png deleted file mode 100644 index 21a452dc..00000000 Binary files a/docs/img/chat_screen.png and /dev/null differ diff --git a/docs/img/main_screen.png b/docs/img/main_screen.png deleted file mode 100644 index 5d1f0c32..00000000 Binary files a/docs/img/main_screen.png and /dev/null differ diff --git a/docs/img/rank_algorithm.png b/docs/img/rank_algorithm.png deleted file mode 100644 index c8200f91..00000000 Binary files a/docs/img/rank_algorithm.png and /dev/null differ diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index bff5cbf6..70c423c7 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -10,7 +10,6 @@ - [Install with Ansible](administration_install_ansible.md) - [Install with Kubernetes](administration_install_kubernetes.md) - [Configuration](administration_configuration.md) - - [Backup and Restore](administration_backup_and_restore.md) - [Contributing](contributing.md) - [Docker Development](contributing_docker_development.md) - [Local Development](contributing_local_development.md) diff --git a/docs/src/about.md b/docs/src/about.md index 2c0e418b..33ecb211 100644 --- a/docs/src/about.md +++ b/docs/src/about.md @@ -2,9 +2,9 @@ Front Page|Post ---|--- -![main screen](https://raw.githubusercontent.com/LemmyNet/lemmy/master/docs/img/main_screen.png)|![chat screen](https://raw.githubusercontent.com/LemmyNet/lemmy/master/docs/img/chat_screen.png) +![main screen](https://i.imgur.com/kZSRcRu.png)|![chat screen](https://i.imgur.com/4XghNh6.png) -[Lemmy](https://github.com/LemmyNet/lemmy) is similar to sites like [Reddit](https://reddit.com), [Lobste.rs](https://lobste.rs), [Raddle](https://raddle.me), or [Hacker News](https://news.ycombinator.com/): you subscribe to forums you're interested in, post links and discussions, then vote, and comment on them. Behind the scenes, it is very different; anyone can easily run a server, and all these servers are federated (think email), and connected to the same universe, called the [Fediverse](https://en.wikipedia.org/wiki/Fediverse). +[Lemmy](https://github.com/dessalines/lemmy) is similar to sites like [Reddit](https://reddit.com), [Lobste.rs](https://lobste.rs), [Raddle](https://raddle.me), or [Hacker News](https://news.ycombinator.com/): you subscribe to forums you're interested in, post links and discussions, then vote, and comment on them. Behind the scenes, it is very different; anyone can easily run a server, and all these servers are federated (think email), and connected to the same universe, called the [Fediverse](https://en.wikipedia.org/wiki/Fediverse). For a link aggregator, this means a user registered on one server can subscribe to forums on any other server, and can have discussions with users registered elsewhere. diff --git a/docs/src/about_goals.md b/docs/src/about_goals.md index e0427481..caa6948a 100644 --- a/docs/src/about_goals.md +++ b/docs/src/about_goals.md @@ -51,4 +51,3 @@ - [Activitypub implementers guide](https://socialhub.activitypub.rocks/t/draft-guide-for-new-activitypub-implementers/479) - [Data storage questions](https://socialhub.activitypub.rocks/t/data-storage-questions/579/3) - [Activitypub as it has been understood](https://flak.tedunangst.com/post/ActivityPub-as-it-has-been-understood) -- [Asonix http signatures in rust](https://git.asonix.dog/Aardwolf/http-signature-normalization) diff --git a/docs/src/about_guide.md b/docs/src/about_guide.md index 6f709b58..16788ab9 100644 --- a/docs/src/about_guide.md +++ b/docs/src/about_guide.md @@ -3,7 +3,7 @@ Start typing... - `@a_user_name` to get a list of usernames. -- `!a_community` to get a list of communities. +- `#a_community` to get a list of communities. - `:emoji` to get a list of emojis. ## Sorting diff --git a/docs/src/about_ranking.md b/docs/src/about_ranking.md index fe9e82bb..d318ae82 100644 --- a/docs/src/about_ranking.md +++ b/docs/src/about_ranking.md @@ -26,4 +26,4 @@ Gravity = Decay gravity, 1.8 is default A plot of rank over 24 hours, of scores of 1, 5, 10, 100, 1000, with a scale factor of 10k. -![](https://raw.githubusercontent.com/LemmyNet/lemmy/master/docs/img/rank_algorithm.png) +![](https://i.imgur.com/w8oBLlL.png) diff --git a/docs/src/administration_backup_and_restore.md b/docs/src/administration_backup_and_restore.md deleted file mode 100644 index fe97cf88..00000000 --- a/docs/src/administration_backup_and_restore.md +++ /dev/null @@ -1,44 +0,0 @@ -# Backup and Restore Guide - -## Docker and Ansible - -When using docker or ansible, there should be a `volumes` folder, which contains both the database, and all the pictures. Copy this folder to the new instance to restore your data. - -### Incremental Database backup - -To incrementally backup the DB to an `.sql` file, you can run: - -```bash -docker exec -t FOLDERNAME_postgres_1 pg_dumpall -c -U lemmy > lemmy_dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql -``` -### A Sample backup script - -```bash -#!/bin/sh -# DB Backup -ssh MY_USER@MY_IP "docker exec -t FOLDERNAME_postgres_1 pg_dumpall -c -U lemmy" > ~/BACKUP_LOCATION/INSTANCE_NAME_dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql - -# Volumes folder Backup -rsync -avP -zz --rsync-path="sudo rsync" MY_USER@MY_IP:/LEMMY_LOCATION/volumes ~/BACKUP_LOCATION/FOLDERNAME -``` - -### Restoring the DB - -If you need to restore from a `pg_dumpall` file, you need to first clear out your existing database - -```bash -# Drop the existing DB -docker exec -i FOLDERNAME_postgres_1 psql -U lemmy -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;" - -# Restore from the .sql backup -cat db_dump.sql | docker exec -i FOLDERNAME_postgres_1 psql -U lemmy # restores the db - -# This also might be necessary when doing a db import with a different password. -docker exec -i FOLDERNAME_postgres_1 psql -U lemmy -c "alter user lemmy with password 'bleh'" -``` - -## More resources - -- https://stackoverflow.com/questions/24718706/backup-restore-a-dockerized-postgresql-database - - diff --git a/docs/src/administration_install_ansible.md b/docs/src/administration_install_ansible.md index 77d901b3..bf5e6749 100644 --- a/docs/src/administration_install_ansible.md +++ b/docs/src/administration_install_ansible.md @@ -7,7 +7,7 @@ First, you need to [install Ansible on your local computer](https://docs.ansible Then run the following commands on your local computer: ```bash -git clone https://github.com/LemmyNet/lemmy.git +git clone https://github.com/dessalines/lemmy.git cd lemmy/ansible/ cp inventory.example inventory nano inventory # enter your server, domain, contact email @@ -19,4 +19,4 @@ To update to a new version, just run the following in your local Lemmy repo: git pull origin master cd ansible ansible-playbook lemmy.yml --become -``` +``` \ No newline at end of file diff --git a/docs/src/administration_install_docker.md b/docs/src/administration_install_docker.md index 236faa6b..391299b3 100644 --- a/docs/src/administration_install_docker.md +++ b/docs/src/administration_install_docker.md @@ -10,13 +10,12 @@ cd /lemmy wget https://raw.githubusercontent.com/dessalines/lemmy/master/docker/prod/docker-compose.yml wget https://raw.githubusercontent.com/dessalines/lemmy/master/docker/lemmy.hjson wget https://raw.githubusercontent.com/dessalines/lemmy/master/docker/iframely.config.local.js +docker-compose up -d ``` -After this, have a look at the [config file](administration_configuration.md) named `lemmy.hjson`, and adjust it, in particular the hostname, and possibly the db password. Then run: +After this, have a look at the [config file](administration_configuration.md) named `lemmy.hjson`, and adjust it, in particular the hostname. -`docker-compose up -d` - -To make Lemmy available outside the server, you need to setup a reverse proxy, like Nginx. [A sample nginx config](https://raw.githubusercontent.com/dessalines/lemmy/master/ansible/templates/nginx.conf), could be setup with: +To make Lemmy available outside the server, you need to setup a reverse proxy, like Nginx. [A sample nginx config](/ansible/templates/nginx.conf), could be setup with: ```bash wget https://raw.githubusercontent.com/dessalines/lemmy/master/ansible/templates/nginx.conf diff --git a/docs/src/contributing.md b/docs/src/contributing.md index 4eabd6fc..9a01ad5d 100644 --- a/docs/src/contributing.md +++ b/docs/src/contributing.md @@ -4,14 +4,13 @@ Information about contributing to Lemmy, whether it is translating, testing, des ## Issue tracking / Repositories -- [GitHub (for issues)](https://github.com/LemmyNet/lemmy) +- [GitHub (for issues)](https://github.com/dessalines/lemmy) - [Gitea](https://yerbamate.dev/dessalines/lemmy) - [GitLab](https://gitlab.com/dessalines/lemmy) ## Translating -Check out [Lemmy's Weblate](https://weblate.yerbamate.dev/projects/lemmy/) for translations. - +Go [here](https://github.com/dessalines/lemmy#translations) for translation instructions. ## Architecture diff --git a/docs/src/contributing_docker_development.md b/docs/src/contributing_docker_development.md index 09239821..d5ab5829 100644 --- a/docs/src/contributing_docker_development.md +++ b/docs/src/contributing_docker_development.md @@ -3,7 +3,7 @@ ## Running ```bash -git clone https://github.com/LemmyNet/lemmy +git clone https://github.com/dessalines/lemmy cd lemmy/docker/dev ./docker_update.sh # This builds and runs it, updating for your changes ``` diff --git a/docs/src/contributing_federation_development.md b/docs/src/contributing_federation_development.md index 520a6127..13a047d0 100644 --- a/docs/src/contributing_federation_development.md +++ b/docs/src/contributing_federation_development.md @@ -5,17 +5,17 @@ If you don't have a local clone of the Lemmy repo yet, just run the following command: ```bash -git clone https://github.com/LemmyNet/lemmy -b federation +git clone https://yerbamate.dev/nutomic/lemmy.git -b federation ``` If you already have the Lemmy repo cloned, you need to add a new remote: ```bash -git remote add federation https://github.com/LemmyNet/lemmy +git remote add federation https://yerbamate.dev/nutomic/lemmy.git git checkout federation git pull federation federation ``` -## Running locally +## Running You need to have the following packages installed, the Docker service needs to be running. @@ -31,30 +31,7 @@ cd dev/federation-test ``` After the build is finished and the docker-compose setup is running, open [127.0.0.1:8540](http://127.0.0.1:8540) and -[127.0.0.1:8550](http://127.0.0.1:8550) in your browser to use the test instances. You can login as admin with -username `lemmy_alpha` and `lemmy_beta` respectively, with password `lemmy`. +[127.0.0.1:8541](http://127.0.0.1:8541) in your browser to use the test instances. You can login as admin with +username `lemmy` and password `lemmy`, or create new accounts. -## Running on a server - -Note that federation is currently in alpha. Only use it for testing, not on any production server, and be aware -that you might have to wipe the instance data at one point or another. - -Follow the normal installation instructions, either with [Ansible](administration_install_ansible.md) or -[manually](administration_install_docker.md). Then replace the line `image: dessalines/lemmy:v0.x.x` in -`/lemmy/docker-compose.yml` with `image: dessalines/lemmy:federation`. Also add the following in -`/lemmy/lemmy.hjson`: - -``` - federation: { - enabled: true - allowed_instances: example.com - } -``` - -Afterwards, and whenver you want to update to the latest version, run these commands on the server: - -``` -cd /lemmy/ -sudo docker-compose pull -sudo docker-compose up -d -``` +Please get in touch if you want to contribute to this, so we can coordinate things and avoid duplicate work. \ No newline at end of file diff --git a/docs/src/contributing_local_development.md b/docs/src/contributing_local_development.md index e823c9d1..175b000c 100644 --- a/docs/src/contributing_local_development.md +++ b/docs/src/contributing_local_development.md @@ -22,7 +22,7 @@ export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy #### Running ```bash -git clone https://github.com/LemmyNet/lemmy +git clone https://github.com/dessalines/lemmy cd lemmy ./install.sh # For live coding, where both the front and back end, automagically reload on any save, do: diff --git a/docs/src/contributing_websocket_http_api.md b/docs/src/contributing_websocket_http_api.md index 567f674c..a73a1c13 100644 --- a/docs/src/contributing_websocket_http_api.md +++ b/docs/src/contributing_websocket_http_api.md @@ -1,6 +1,6 @@ # Lemmy API -*Note: this may lag behind the actual API endpoints [here](../server/src/api). The API should be considered unstable and may change any time.* +*Note: this may lag behind the actual API endpoints [here](../server/src/api).* @@ -92,93 +92,85 @@ - [Request](#request-17) - [Response](#response-17) - [HTTP](#http-18) - + [Get Site Config](#get-site-config) + * [Community](#community) + + [Get Community](#get-community) - [Request](#request-18) - [Response](#response-18) - [HTTP](#http-19) - + [Save Site Config](#save-site-config) + + [Create Community](#create-community) - [Request](#request-19) - [Response](#response-19) - [HTTP](#http-20) - * [Community](#community) - + [Get Community](#get-community) + + [List Communities](#list-communities) - [Request](#request-20) - [Response](#response-20) - [HTTP](#http-21) - + [Create Community](#create-community) + + [Ban from Community](#ban-from-community) - [Request](#request-21) - [Response](#response-21) - [HTTP](#http-22) - + [List Communities](#list-communities) + + [Add Mod to Community](#add-mod-to-community) - [Request](#request-22) - [Response](#response-22) - [HTTP](#http-23) - + [Ban from Community](#ban-from-community) + + [Edit Community](#edit-community) - [Request](#request-23) - [Response](#response-23) - [HTTP](#http-24) - + [Add Mod to Community](#add-mod-to-community) + + [Follow Community](#follow-community) - [Request](#request-24) - [Response](#response-24) - [HTTP](#http-25) - + [Edit Community](#edit-community) + + [Get Followed Communities](#get-followed-communities) - [Request](#request-25) - [Response](#response-25) - [HTTP](#http-26) - + [Follow Community](#follow-community) + + [Transfer Community](#transfer-community) - [Request](#request-26) - [Response](#response-26) - [HTTP](#http-27) - + [Get Followed Communities](#get-followed-communities) + * [Post](#post) + + [Create Post](#create-post) - [Request](#request-27) - [Response](#response-27) - [HTTP](#http-28) - + [Transfer Community](#transfer-community) + + [Get Post](#get-post) - [Request](#request-28) - [Response](#response-28) - [HTTP](#http-29) - * [Post](#post) - + [Create Post](#create-post) + + [Get Posts](#get-posts) - [Request](#request-29) - [Response](#response-29) - [HTTP](#http-30) - + [Get Post](#get-post) + + [Create Post Like](#create-post-like) - [Request](#request-30) - [Response](#response-30) - [HTTP](#http-31) - + [Get Posts](#get-posts) + + [Edit Post](#edit-post) - [Request](#request-31) - [Response](#response-31) - [HTTP](#http-32) - + [Create Post Like](#create-post-like) + + [Save Post](#save-post) - [Request](#request-32) - [Response](#response-32) - [HTTP](#http-33) - + [Edit Post](#edit-post) + * [Comment](#comment) + + [Create Comment](#create-comment) - [Request](#request-33) - [Response](#response-33) - [HTTP](#http-34) - + [Save Post](#save-post) + + [Edit Comment](#edit-comment) - [Request](#request-34) - [Response](#response-34) - [HTTP](#http-35) - * [Comment](#comment) - + [Create Comment](#create-comment) + + [Save Comment](#save-comment) - [Request](#request-35) - [Response](#response-35) - [HTTP](#http-36) - + [Edit Comment](#edit-comment) + + [Create Comment Like](#create-comment-like) - [Request](#request-36) - [Response](#response-36) - [HTTP](#http-37) - + [Save Comment](#save-comment) - - [Request](#request-37) - - [Response](#response-37) - - [HTTP](#http-38) - + [Create Comment Like](#create-comment-like) - - [Request](#request-38) - - [Response](#response-38) - - [HTTP](#http-39) * [RSS / Atom feeds](#rss--atom-feeds) + [All](#all) + [Community](#community-1) @@ -787,53 +779,6 @@ Search types are `All, Comments, Posts, Communities, Users, Url` `POST /site/transfer` -#### Get Site Config -##### Request -```rust -{ - op: "GetSiteConfig", - data: { - auth: String - } -} -``` -##### Response -```rust -{ - op: "GetSiteConfig", - data: { - config_hjson: String, - } -} -``` -##### HTTP - -`GET /site/config` - -#### Save Site Config -##### Request -```rust -{ - op: "SaveSiteConfig", - data: { - config_hjson: String, - auth: String - } -} -``` -##### Response -```rust -{ - op: "SaveSiteConfig", - data: { - config_hjson: String, - } -} -``` -##### HTTP - -`PUT /site/config` - ### Community #### Get Community ##### Request diff --git a/install.sh b/install.sh index fb42b26d..ad3e4ab3 100755 --- a/install.sh +++ b/install.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash set -e # Set the database variable to the default first. @@ -10,55 +10,25 @@ export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy export JWT_SECRET=changeme export HOSTNAME=rrr -yes_no_prompt_invalid() { - echo "Invalid input. Please enter either \"y\" or \"n\"." 1>&2 -} - -ask_to_init_db() { - init_db_valid=0 - init_db_final=0 - while [ "$init_db_valid" == 0 ] - do - read -p "Initialize database (y/n)? " init_db - case "$init_db" in - [yY]* ) init_db_valid=1; init_db_final=1;; - [nN]* ) init_db_valid=1; init_db_final=0;; - * ) yes_no_prompt_invalid;; - esac - echo - done - if [ "$init_db_final" = 1 ] - then - source ./server/db-init.sh - read -n 1 -s -r -p "Press ANY KEY to continue execution of this script, press CTRL+C to quit..." - echo - fi -} - -ask_to_auto_reload() { - auto_reload_valid=0 - auto_reload_final=0 - while [ "$auto_reload_valid" == 0 ] - do - echo "Automagically reload the project when source files are changed?" - echo "ONLY ENABLE THIS FOR DEVELOPMENT!" - read -p "(y/n) " auto_reload - case "$auto_reload" in - [yY]* ) auto_reload_valid=1; auto_reload_final=1;; - [nN]* ) auto_reload_valid=1; auto_reload_final=0;; - * ) yes_no_prompt_invalid;; - esac - echo - done - if [ "$auto_reload_final" = 1 ] - then - cd ui && yarn start - cd server && cargo watch -x run - fi -} - # Optionally initialize the database -ask_to_init_db +init_db_valid=0 +init_db_final=0 +while [ "$init_db_valid" == 0 ] +do + read -p "Initialize database (y/n)? " init_db + case "${init_db,,}" in + y|yes ) init_db_valid=1; init_db_final=1;; + n|no ) init_db_valid=1; init_db_final=0;; + * ) echo "Invalid input" 1>&2;; + esac + echo +done +if [ "$init_db_final" = 1 ] +then + source ./server/db-init.sh + read -n 1 -s -r -p "Press ANY KEY to continue execution of this script, press CTRL+C to quit..." + echo +fi # Build the web client cd ui @@ -69,5 +39,6 @@ yarn build cd ../server RUST_LOG=debug cargo run -# For live coding, where both the front and back end, automagically reload on any save -ask_to_auto_reload +# For live coding, where both the front and back end, automagically reload on any save, do: +# cd ui && yarn start +# cd server && cargo watch -x run diff --git a/server/.rustfmt.toml b/server/.rustfmt.toml index f3efdc30..684a7f8a 100644 --- a/server/.rustfmt.toml +++ b/server/.rustfmt.toml @@ -1,5 +1,2 @@ tab_spaces = 2 -edition="2018" -imports_layout="HorizontalVertical" -merge_imports=true -reorder_imports=true +edition="2018" \ No newline at end of file diff --git a/server/Cargo.lock b/server/Cargo.lock index 55ec0509..9cef0b2c 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -2,3416 +2,3269 @@ # It is not intended for manual editing. [[package]] name = "activitystreams" -version = "0.6.2" +version = "0.5.0-alpha.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464cb473bfb402b857cc15b1153974c203a43f1485da4dda15cd17a738548958" dependencies = [ - "activitystreams-derive", - "chrono", - "mime", - "serde 1.0.111", - "serde_json 1.0.53", - "thiserror", - "url", + "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_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.6.1" +version = "0.5.0-alpha.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39ba5929399e9f921055bac76dd8f47419fa5b6b6da1ac4c1e82b94ed0ac7b4" dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "activitystreams-ext" -version = "0.1.0" -source = "git+https://git.asonix.dog/asonix/activitystreams-ext#e5c97f4ea9f60e49bc7ff27fb0fb515d3190fd25" -dependencies = [ - "activitystreams-new", - "serde 1.0.111", - "serde_json 1.0.53", -] - -[[package]] -name = "activitystreams-new" -version = "0.1.0" -source = "git+https://git.asonix.dog/asonix/activitystreams-sketch#05a2bdc98d5595b0a74fd79b7e1b19f382ad3139" -dependencies = [ - "activitystreams", - "serde 1.0.111", - "serde_json 1.0.53", - "typed-builder", + "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)", ] [[package]] name = "actix" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4af87564ff659dee8f9981540cac9418c45e910c8072fdedd643a262a38fcaf" dependencies = [ - "actix-http", - "actix-rt", - "actix_derive", - "bitflags", - "bytes", - "crossbeam-channel", - "derive_more", - "futures", - "lazy_static 1.4.0", - "log", - "parking_lot", - "pin-project", - "smallvec", - "tokio", - "tokio-util 0.2.0", - "trust-dns-proto", - "trust-dns-resolver", + "actix-http 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix_derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-proto 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-resolver 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-codec" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09e55f0a5c2ca15795035d90c46bd0e73a5123b72f68f12596d6ba5282051380" dependencies = [ - "bitflags", - "bytes", - "futures-core", - "futures-sink", - "log", - "tokio", - "tokio-util 0.2.0", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.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-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-connect" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c95cc9569221e9802bf4c377f6c18b90ef10227d787611decf79fd47d2a8e76c" dependencies = [ - "actix-codec", - "actix-rt", - "actix-service", - "actix-utils", - "derive_more", - "either", - "futures", - "http", - "log", - "trust-dns-proto", - "trust-dns-resolver", + "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-utils 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-proto 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-resolver 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-files" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "193b22cb1f7b4ff12a4eb2415d6d19e47e44ea93e05930b30d05375ea29d3529" dependencies = [ - "actix-http", - "actix-service", - "actix-web", - "bitflags", - "bytes", - "derive_more", - "futures-core", - "futures-util", - "log", - "mime", - "mime_guess", - "percent-encoding", - "v_htmlescape", + "actix-http 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-web 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "v_htmlescape 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-http" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c16664cc4fdea8030837ad5a845eb231fb93fc3c5c171edfefb52fad92ce9019" dependencies = [ - "actix-codec", - "actix-connect", - "actix-rt", - "actix-service", - "actix-threadpool", - "actix-utils", - "base64 0.11.0", - "bitflags", - "brotli2", - "bytes", - "chrono", - "copyless", - "derive_more", - "either", - "encoding_rs", - "failure", - "flate2", - "futures-channel", - "futures-core", - "futures-util", - "fxhash", - "h2", - "http", - "httparse", - "indexmap", - "language-tags", - "lazy_static 1.4.0", - "log", - "mime", - "percent-encoding", - "pin-project", - "rand 0.7.3", - "regex 1.3.9", - "serde 1.0.111", - "serde_json 1.0.53", - "serde_urlencoded", - "sha1", - "slab", - "time", + "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-connect 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-threadpool 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-utils 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "brotli2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "copyless 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "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.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)", + "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", + "serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-macros" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a60f9ba7c4e6df97f3aacb14bb5c0cd7d98a49dcbaed0d7f292912ad9a6a3ed2" dependencies = [ - "quote", - "syn", + "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)", ] [[package]] name = "actix-router" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d7a10ca4d94e8c8e7a87c5173aba1b97ba9a6563ca02b0e1cd23531093d3ec8" dependencies = [ - "bytestring", - "http", - "log", - "regex 1.3.9", - "serde 1.0.111", + "bytestring 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-rt" -version = "1.1.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143fcc2912e0d1de2bcf4e2f720d2a60c28652ab4179685a1ee159e0fb3db227" dependencies = [ - "actix-macros", - "actix-threadpool", - "copyless", - "futures-channel", - "futures-util", - "smallvec", - "tokio", + "actix-macros 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-threadpool 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "copyless 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-server" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d74b464215a473c973a2d7d03a69cc10f4ce1f4b38a7659c5193dc5c675630" dependencies = [ - "actix-codec", - "actix-rt", - "actix-service", - "actix-utils", - "futures-channel", - "futures-util", - "log", - "mio", - "mio-uds", - "num_cpus", - "slab", - "socket2", + "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-utils 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-service" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e4fc95dfa7e24171b2d0bb46b85f8ab0e8499e4e3caec691fc4ea65c287564" dependencies = [ - "futures-util", - "pin-project", + "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-testing" -version = "1.0.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47239ca38799ab74ee6a8a94d1ce857014b2ac36f242f70f3f75a66f691e791c" dependencies = [ - "actix-macros", - "actix-rt", - "actix-server", - "actix-service", - "log", - "socket2", + "actix-macros 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-server 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-threadpool" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91164716d956745c79dcea5e66d2aa04506549958accefcede5368c70f2fd4ff" dependencies = [ - "derive_more", - "futures-channel", - "lazy_static 1.4.0", - "log", - "num_cpus", - "parking_lot", - "threadpool", + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-tls" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e5b4faaf105e9a6d389c606c298dcdb033061b00d532af9df56ff3a54995a8" dependencies = [ - "actix-codec", - "actix-rt", - "actix-service", - "actix-utils", - "derive_more", - "either", - "futures", - "log", + "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-utils 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-utils" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf8f5631bf01adec2267808f00e228b761c60c0584cc9fa0b5364f41d147f4e" dependencies = [ - "actix-codec", - "actix-rt", - "actix-service", - "bitflags", - "bytes", - "either", - "futures", - "log", - "pin-project", - "slab", + "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-web" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3158e822461040822f0dbf1735b9c2ce1f95f93b651d7a7aded00b1efbb1f635" dependencies = [ - "actix-codec", - "actix-http", - "actix-macros", - "actix-router", - "actix-rt", - "actix-server", - "actix-service", - "actix-testing", - "actix-threadpool", - "actix-tls", - "actix-utils", - "actix-web-codegen", - "awc", - "bytes", - "derive_more", - "encoding_rs", - "futures", - "fxhash", - "log", - "mime", - "net2", - "pin-project", - "regex 1.3.9", - "serde 1.0.111", - "serde_json 1.0.53", - "serde_urlencoded", - "time", - "url", + "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-http 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-macros 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-router 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-server 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-testing 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-threadpool 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-utils 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-web-codegen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "awc 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding_rs 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", + "serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-web-actors" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1bd41bd66c4e9b5274cec87aac30168e63d64e96fd19db38edef6b46ba2982" dependencies = [ - "actix", - "actix-codec", - "actix-http", - "actix-web", - "bytes", - "futures", - "pin-project", + "actix 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-http 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-web 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-web-codegen" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a71bf475cbe07281d0b3696abb48212db118e7e23219f13596ce865235ff5766" dependencies = [ - "proc-macro2", - "quote", - "syn", + "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)", ] [[package]] name = "actix_derive" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b95aceadaf327f18f0df5962fedc1bde2f870566a0b9f65c89508a3b1f79334c" dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "addr2line" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a49806b9dadc843c61e7c97e72490ad7f7220ae249012fbda9ad0609457c0543" -dependencies = [ - "gimli", + "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)", ] [[package]] name = "adler32" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" [[package]] name = "aho-corasick" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66" dependencies = [ - "memchr 0.1.11", + "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "aho-corasick" version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" dependencies = [ - "memchr 2.3.3", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ansi_term" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" dependencies = [ - "winapi 0.3.8", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "arc-swap" -version = "0.4.6" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b585a98a234c46fc563103e9278c9391fde1f4e6850334da895d27edb9580f62" [[package]] name = "arrayvec" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" dependencies = [ - "nodrop", + "nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ascii_utils" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71938f30533e4d95a6d17aa530939da3842c2ab6f4f84b9dae68447e4129f74a" [[package]] name = "async-trait" -version = "0.1.32" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eb7f9ad01405feb3c1dac82463038945cf88eea4569acaf3ad662233496dd96" dependencies = [ - "proc-macro2", - "quote", - "syn", + "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)", ] [[package]] name = "atty" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", - "libc", - "winapi 0.3.8", + "hermit-abi 0.1.8 (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)", ] [[package]] name = "autocfg" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" [[package]] name = "autocfg" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" [[package]] name = "awc" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7601d4d1d7ef2335d6597a41b5fe069f6ab799b85f53565ab390e7b7065aac5" dependencies = [ - "actix-codec", - "actix-http", - "actix-rt", - "actix-service", - "base64 0.11.0", - "bytes", - "derive_more", - "futures-core", - "log", - "mime", - "percent-encoding", - "rand 0.7.3", - "serde 1.0.111", - "serde_json 1.0.53", - "serde_urlencoded", + "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-http 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", + "serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "backtrace" -version = "0.3.48" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0df2f85c8a2abbe3b7d7e748052fdd9b76a0458fdeb16ad4223f5eca78c7c130" dependencies = [ - "addr2line", - "cfg-if", - "libc", - "object", - "rustc-demangle", + "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.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.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.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "base64" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" dependencies = [ - "byteorder", - "safemem", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "base64" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" dependencies = [ - "byteorder", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "base64" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" [[package]] name = "base64" -version = "0.12.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d1ccbaf7d9ec9537465a97bf19edc1a4e158ecb49fc16178202238c569cc42" [[package]] name = "bcrypt" -version = "0.8.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b70db86f3c560199b0dada79a22b9a924622384abb2a756a9707ffcce077f2" dependencies = [ - "base64 0.12.1", - "blowfish", - "byteorder", - "getrandom", + "base64 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "blowfish 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "bitflags" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "block-buffer" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" dependencies = [ - "block-padding", - "byte-tools", - "byteorder", - "generic-array", + "block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "block-cipher-trait" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" dependencies = [ - "generic-array", + "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "block-padding" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" dependencies = [ - "byte-tools", + "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "blowfish" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aeb80d00f2688459b8542068abd974cfb101e7a82182414a99b5026c0d85cc3" dependencies = [ - "block-cipher-trait", - "byteorder", - "opaque-debug", + "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "brotli-sys" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4445dea95f4c2b41cde57cc9fee236ae4dbae88d8fcbdb4750fc1bb5d86aaecd" dependencies = [ - "cc", - "libc", + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "brotli2" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cb036c3eade309815c15ddbacec5b22c4d1f3983a774ab2eac2e3e9ea85568e" dependencies = [ - "brotli-sys", - "libc", + "brotli-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "bufstream" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40e38929add23cdf8a366df9b0e088953150724bcbe5fc330b0d8eb3b328eec8" [[package]] name = "bumpalo" -version = "3.4.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" [[package]] name = "byte-tools" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "byteorder" version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" [[package]] name = "bytes" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" [[package]] name = "bytestring" -version = "0.1.5" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7c05fa5172da78a62d9949d662d2ac89d4cc7355d7b49adee5163f1fb3f363" dependencies = [ - "bytes", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "cc" -version = "1.0.54" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bbb73db36c1246e9034e307d0fba23f9a2e251faa47ade70c1bd252220c8311" [[package]] name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] name = "chrono" version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" dependencies = [ - "num-integer", - "num-traits 0.2.11", - "serde 1.0.111", - "time", + "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "clap" -version = "2.33.1" +version = "2.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" dependencies = [ - "ansi_term", - "atty", - "bitflags", - "strsim 0.8.0", - "textwrap", - "unicode-width", - "vec_map", + "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "cloudabi" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" dependencies = [ - "bitflags", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "comrak" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17058cc536cf290563e88787d7b9e6030ce4742943017cc2ffb71f88034021c" dependencies = [ - "clap", - "entities", - "lazy_static 1.4.0", - "pest", - "pest_derive", - "regex 1.3.9", - "twoway", - "typed-arena", - "unicode_categories", + "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", + "entities 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "pest_derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "twoway 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "typed-arena 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode_categories 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "config" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b076e143e1d9538dde65da30f8481c2a6c44040edb8e02b9bf1351edb92ce3" dependencies = [ - "lazy_static 1.4.0", - "nom 5.1.1", - "rust-ini", - "serde 1.0.111", - "serde-hjson 0.9.1", - "serde_json 1.0.53", - "toml", - "yaml-rust", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "nom 5.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rust-ini 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", + "serde-hjson 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "copyless" -version = "0.1.5" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536" [[package]] name = "core-foundation" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" dependencies = [ - "core-foundation-sys", - "libc", + "core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "core-foundation-sys" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" [[package]] name = "crc32fast" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" dependencies = [ - "cfg-if", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "crossbeam-channel" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061" dependencies = [ - "crossbeam-utils", - "maybe-uninit", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "crossbeam-utils" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" dependencies = [ - "autocfg 1.0.0", - "cfg-if", - "lazy_static 1.4.0", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "curl" -version = "0.4.29" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "762e34611d2d5233a506a79072be944fddd057db2f18e04c0d6fa79e3fd466fd" dependencies = [ - "curl-sys", - "libc", - "openssl-probe", - "openssl-sys", - "schannel", - "socket2", - "winapi 0.3.8", + "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)", + "socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "curl-sys" -version = "0.4.31+curl-7.70.0" +version = "0.4.30+curl-7.69.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcd62757cc4f5ab9404bc6ca9f0ae447e729a1403948ce5106bd588ceac6a3b0" dependencies = [ - "cc", - "libc", - "libnghttp2-sys", - "libz-sys", - "openssl-sys", - "pkg-config", - "vcpkg", - "winapi 0.3.8", + "cc 1.0.50 (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)", + "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", + "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "darling" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", + "darling_macro 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "darling_core" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.9.3", - "syn", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ident_case 1.0.1 (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)", + "strsim 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "darling_macro" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" dependencies = [ - "darling_core", - "quote", - "syn", + "darling_core 0.10.2 (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)", ] [[package]] name = "derive_builder" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0" dependencies = [ - "darling", - "derive_builder_core", - "proc-macro2", - "quote", - "syn", + "darling 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_builder_core 0.9.0 (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)", ] [[package]] name = "derive_builder_core" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef" dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn", + "darling 0.10.2 (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)", ] [[package]] name = "derive_more" -version = "0.99.7" +version = "0.99.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2127768764f1556535c01b5326ef94bd60ff08dcfbdc544d53e69ed155610f5d" dependencies = [ - "proc-macro2", - "quote", - "syn", + "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)", ] [[package]] name = "diesel" -version = "1.4.4" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d7ca63eb2efea87a7f56a283acc49e2ce4b2bd54adf7465dc1d81fef13d8fc" dependencies = [ - "bitflags", - "byteorder", - "chrono", - "diesel_derives", - "pq-sys", - "r2d2", - "serde_json 1.0.53", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "diesel_derives 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pq-sys 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "r2d2 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "diesel_derives" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45f5098f628d02a7a0f68ddba586fb61e80edec3bdc1be3b921f4ceec60858d3" dependencies = [ - "proc-macro2", - "quote", - "syn", + "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)", ] [[package]] name = "diesel_migrations" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf3cde8413353dc7f5d72fa8ce0b99a560a359d2c5ef1e5817ca731cd9008f4c" dependencies = [ - "migrations_internals", - "migrations_macros", + "migrations_internals 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "migrations_macros 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "digest" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" dependencies = [ - "generic-array", + "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "docopt" version = "0.6.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a7ef30445607f6fc8720f0a0a2c7442284b629cf0d049286860fae23e71c4d9" dependencies = [ - "lazy_static 0.2.11", - "regex 0.1.80", - "rustc-serialize", - "strsim 0.5.2", + "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "strsim 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "dotenv" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" [[package]] name = "dtoa" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd841b58510c9618291ffa448da2e4e0f699d984d436122372f446dae62263d" [[package]] name = "dtoa" version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4358a9e11b9a09cf52383b451b49a169e8d797b68aa02301ff586d70d9661ea3" [[package]] name = "either" version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" [[package]] name = "email" version = "0.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91549a51bb0241165f13d57fc4c72cef063b4088fb078b019ecbf464a45f22e4" dependencies = [ - "base64 0.9.3", - "chrono", - "encoding", - "lazy_static 1.4.0", - "rand 0.4.6", - "time", - "version_check 0.1.5", + "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "encoding" version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" dependencies = [ - "encoding-index-japanese", - "encoding-index-korean", - "encoding-index-simpchinese", - "encoding-index-singlebyte", - "encoding-index-tradchinese", + "encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "encoding-index-japanese" version = "1.20141219.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" dependencies = [ - "encoding_index_tests", + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "encoding-index-korean" version = "1.20141219.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" dependencies = [ - "encoding_index_tests", + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "encoding-index-simpchinese" version = "1.20141219.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" dependencies = [ - "encoding_index_tests", + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "encoding-index-singlebyte" version = "1.20141219.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" dependencies = [ - "encoding_index_tests", + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "encoding-index-tradchinese" version = "1.20141219.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" dependencies = [ - "encoding_index_tests", + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "encoding_index_tests" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" [[package]] name = "encoding_rs" -version = "0.8.23" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8ac63f94732332f44fe654443c46f6375d1939684c17b0afb6cb56b0456e171" dependencies = [ - "cfg-if", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "entities" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5320ae4c3782150d900b79807611a59a99fc9a1d61d686faafc24b93fc8d7ca" [[package]] name = "enum-as-inner" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc4bfcfacb61d231109d1d55202c1f33263319668b168843e02ad4652725ec9c" dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", + "heck 0.3.1 (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)", ] [[package]] name = "env_logger" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" dependencies = [ - "atty", - "humantime", - "log", - "regex 1.3.9", - "termcolor", + "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", + "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "failure" -version = "0.1.8" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" dependencies = [ - "backtrace", - "failure_derive", + "backtrace 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "failure_derive" -version = "0.1.8" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", + "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)", + "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "fake-simd" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" [[package]] name = "fast_chemail" version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "495a39d30d624c2caabe6312bfead73e7717692b44e0b32df168c275a2e8e9e4" dependencies = [ - "ascii_utils", + "ascii_utils 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "flate2" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cfff41391129e0a856d6d822600b8d71179d46879e310417eb9c762eb178b42" dependencies = [ - "cfg-if", - "crc32fast", - "libc", - "miniz_oxide", + "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.68 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "fnv" -version = "1.0.7" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foreign-types" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "foreign-types-shared" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "fuchsia-cprng" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" [[package]] name = "fuchsia-zircon" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" dependencies = [ - "bitflags", - "fuchsia-zircon-sys", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "fuchsia-zircon-sys" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" [[package]] name = "futures" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613" dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", + "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-executor 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-task 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)", ] [[package]] name = "futures-channel" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5" dependencies = [ - "futures-core", - "futures-sink", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "futures-core" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399" [[package]] name = "futures-executor" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314" dependencies = [ - "futures-core", - "futures-task", - "futures-util", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-task 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)", ] [[package]] name = "futures-io" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789" [[package]] name = "futures-macro" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39" dependencies = [ - "proc-macro-hack", - "proc-macro2", - "quote", - "syn", + "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)", ] [[package]] name = "futures-sink" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc" [[package]] name = "futures-task" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626" -dependencies = [ - "once_cell", -] [[package]] name = "futures-util" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6" dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr 2.3.3", - "pin-project", - "pin-utils", - "proc-macro-hack", - "proc-macro-nested", - "slab", + "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-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-macro 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "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.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)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "fxhash" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" dependencies = [ - "byteorder", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "generic-array" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" dependencies = [ - "typenum", + "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "getrandom" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" dependencies = [ - "cfg-if", - "libc", - "wasi", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "gimli" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc8e0c9bce37868955864dbecd2b1ab2bdf967e6f28066d65aaac620444b65c" - [[package]] name = "h2" -version = "0.2.5" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79b7246d7e4b979c03fa093da39cfb3617a96bbeee6310af63991668d7e843ff" dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "log", - "slab", - "tokio", - "tokio-util 0.3.1", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 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)", + "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "heck" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" dependencies = [ - "unicode-segmentation", + "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hermit-abi" -version = "0.1.13" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91780f809e750b0a89f5544be56617ff6b1227ee485bcb06ebe10cdf89bd3b71" dependencies = [ - "libc", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hjson" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0849d73a64ec77d1c8354aff489cf31943c4b4d3716de1eabfba572c70fde530" dependencies = [ - "docopt", - "serde 0.8.23", - "serde-hjson 0.8.2", - "serde_json 0.8.6", + "docopt 0.6.86 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", + "serde-hjson 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hostname" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21ceb46a83a85e824ef93669c8b390009623863b5c195d1ba747292c0c72f94e" dependencies = [ - "libc", - "winutil", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "winutil 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hostname" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" dependencies = [ - "libc", - "match_cfg", - "winapi 0.3.8", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "match_cfg 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "htmlescape" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9025058dae765dee5070ec375f591e2ba14638c63feff74f13805a72e523163" [[package]] name = "http" -version = "0.2.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9" dependencies = [ - "bytes", - "fnv", - "itoa 0.4.5", -] - -[[package]] -name = "http-signature-normalization" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "648233553603e7bb55bc1ea08a514661e212c09c10f6434507894273d8b5e773" -dependencies = [ - "chrono", - "thiserror", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "httparse" version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" [[package]] name = "humantime" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" dependencies = [ - "quick-error", + "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ident_case" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "indexmap" -version = "1.4.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c398b2b113b55809ceb9ee3e753fcbac793f1956663f3c36549c1346015c2afe" dependencies = [ - "autocfg 1.0.0", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "iovec" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" dependencies = [ - "libc", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ipconfig" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" dependencies = [ - "socket2", - "widestring", - "winapi 0.3.8", - "winreg", + "socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "widestring 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "isahc" -version = "0.9.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "098c47b6176a9b667292810105999d6029d8338819f299584677e8a125e549c2" dependencies = [ - "bytes", - "crossbeam-channel", - "crossbeam-utils", - "curl", - "curl-sys", - "encoding_rs", - "futures-channel", - "futures-io", - "futures-util", - "http", - "lazy_static 1.4.0", - "log", - "mime", - "slab", - "sluice", - "tracing", - "tracing-futures", -] - -[[package]] -name = "itertools" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" -dependencies = [ - "either", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "curl 0.4.28 (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)", + "encoding_rs 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-io 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)", + "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "sluice 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "itoa" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae3088ea4baeceb0284ee9eea42f591226e6beaecf65373e41b38d95a1b8e7a1" [[package]] name = "itoa" version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" [[package]] name = "js-sys" -version = "0.3.40" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce10c23ad2ea25ceca0093bd3192229da4c5b3c0f2de499c1ecac0d98d452177" dependencies = [ - "wasm-bindgen", + "wasm-bindgen 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonwebtoken" version = "7.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d11f9e80a85927748a334df8e4f6782a04033517bb28f3863a563daad882da7f" dependencies = [ - "base64 0.11.0", - "pem", - "ring", - "serde 1.0.111", - "serde_json 1.0.53", - "simple_asn1", + "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pem 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.16.11 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", + "simple_asn1 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "kernel32-sys" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" dependencies = [ - "winapi 0.2.8", - "winapi-build", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "language-tags" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" [[package]] name = "lazy_static" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lemmy_server" version = "0.0.1" dependencies = [ - "activitystreams", - "activitystreams-ext", - "activitystreams-new", - "actix", - "actix-files", - "actix-rt", - "actix-web", - "actix-web-actors", - "base64 0.12.1", - "bcrypt", - "chrono", - "comrak", - "config", - "diesel", - "diesel_migrations", - "dotenv", - "env_logger", - "failure", - "futures", - "hjson", - "htmlescape", - "http", - "http-signature-normalization", - "isahc", - "itertools", - "jsonwebtoken", - "lazy_static 1.4.0", - "lettre", - "lettre_email", - "log", - "openssl", - "percent-encoding", - "rand 0.7.3", - "regex 1.3.9", - "rss", - "serde 1.0.111", - "serde_json 1.0.53", - "sha2", - "strum", - "strum_macros", - "tokio", - "url", - "uuid 0.8.1", + "activitystreams 0.5.0-alpha.16 (registry+https://github.com/rust-lang/crates.io-index)", + "actix 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-files 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-web 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-web-actors 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bcrypt 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "comrak 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "config 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "diesel 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "diesel_migrations 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "dotenv 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "hjson 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "htmlescape 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "isahc 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonwebtoken 7.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lettre 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lettre_email 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.28 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rss 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", + "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "strum 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "strum_macros 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "lettre" -version = "0.9.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf43f3202a879fbdab4ecafec3349b0139f81d31c626246d53bcbb546253ffaa" dependencies = [ - "base64 0.10.1", - "bufstream", - "fast_chemail", - "hostname 0.1.5", - "log", - "native-tls", - "nom 4.2.3", - "serde 1.0.111", - "serde_derive", - "serde_json 1.0.53", + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bufstream 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "fast_chemail 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", + "hostname 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "nom 4.2.3 (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 = "lettre_email" -version = "0.9.4" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd02480f8dcf48798e62113974d6ccca2129a51d241fa20f1ea349c8a42559d5" dependencies = [ - "base64 0.10.1", - "email", - "lettre", - "mime", - "time", - "uuid 0.7.4", + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "email 0.0.20 (registry+https://github.com/rust-lang/crates.io-index)", + "lettre 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "lexical-core" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7043aa5c05dd34fb73b47acb8c3708eac428de4545ea3682ed2f11293ebd890" dependencies = [ - "arrayvec", - "cfg-if", - "rustc_version", - "ryu", - "static_assertions", + "arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "static_assertions 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libc" -version = "0.2.71" +version = "0.2.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" [[package]] name = "libnghttp2-sys" -version = "0.1.4+1.41.0" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03624ec6df166e79e139a2310ca213283d6b3c30810c54844f307086d4488df1" dependencies = [ - "cc", - "libc", + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libz-sys" version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", + "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "linked-hash-map" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d262045c5b87c0861b3f004610afd0e2c851e2908d08b6c870cbb9d5f494ecd" dependencies = [ - "serde 0.8.23", - "serde_test", + "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_test 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "linked-hash-map" -version = "0.5.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a" [[package]] name = "lock_api" -version = "0.3.4" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" dependencies = [ - "scopeguard", + "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "log" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" dependencies = [ - "cfg-if", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "lru-cache" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" dependencies = [ - "linked-hash-map 0.5.3", + "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "maplit" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" [[package]] name = "match_cfg" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "matches" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" [[package]] name = "maybe-uninit" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20" dependencies = [ - "libc", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "memchr" version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" [[package]] name = "migrations_internals" -version = "1.4.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b4fc84e4af020b837029e017966f86a1c2d5e83e64b589963d5047525995860" dependencies = [ - "diesel", + "diesel 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "migrations_macros" -version = "1.4.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9753f12909fd8d923f75ae5c3258cae1ed3c8ec052e1b38c93c21a6d157f789c" dependencies = [ - "migrations_internals", - "proc-macro2", - "quote", - "syn", + "migrations_internals 1.4.0 (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)", ] [[package]] name = "mime" version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" [[package]] name = "mime_guess" version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" dependencies = [ - "mime", - "unicase", + "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "miniz_oxide" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5" dependencies = [ - "adler32", + "adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "mio" -version = "0.6.22" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430" dependencies = [ - "cfg-if", - "fuchsia-zircon", - "fuchsia-zircon-sys", - "iovec", - "kernel32-sys", - "libc", - "log", - "miow", - "net2", - "slab", - "winapi 0.2.8", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "mio-uds" -version = "0.6.8" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" dependencies = [ - "iovec", - "libc", - "mio", + "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "miow" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" dependencies = [ - "kernel32-sys", - "net2", - "winapi 0.2.8", - "ws2_32-sys", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "native-tls" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b0d88c06fe90d5ee94048ba40409ef1d9315d86f6f38c2efdaad4fb50c58b2d" dependencies = [ - "lazy_static 1.4.0", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.28 (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)", + "security-framework 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "net2" -version = "0.2.34" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ba7c918ac76704fb42afcbbb43891e72731f3dcca3bef2a19786297baf14af7" dependencies = [ - "cfg-if", - "libc", - "winapi 0.3.8", + "cfg-if 0.1.10 (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)", ] [[package]] name = "nodrop" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" [[package]] name = "nom" version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" dependencies = [ - "memchr 2.3.3", - "version_check 0.1.5", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "nom" version = "5.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b471253da97532da4b61552249c521e01e736071f71c1a4f7ebbfbf0a06aad6" dependencies = [ - "lexical-core", - "memchr 2.3.3", - "version_check 0.9.2", + "lexical-core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-bigint" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" dependencies = [ - "autocfg 1.0.0", - "num-integer", - "num-traits 0.2.11", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-integer" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" dependencies = [ - "autocfg 1.0.0", - "num-traits 0.2.11", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" dependencies = [ - "num-traits 0.2.11", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" dependencies = [ - "autocfg 1.0.0", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" dependencies = [ - "hermit-abi", - "libc", + "hermit-abi 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "object" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cbca9424c482ee628fa549d9c812e2cd22f1180b9222c9200fdfa6eb31aecb2" - -[[package]] -name = "once_cell" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" - [[package]] name = "opaque-debug" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" [[package]] name = "openssl" -version = "0.10.29" +version = "0.10.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee6d85f4cb4c4f59a6a85d5b68a233d280c82e29e822913b9c8b129fbf20bdd" dependencies = [ - "bitflags", - "cfg-if", - "foreign-types", - "lazy_static 1.4.0", - "libc", - "openssl-sys", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "openssl-probe" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" [[package]] name = "openssl-sys" -version = "0.9.57" +version = "0.9.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7410fef80af8ac071d4f63755c0ab89ac3df0fd1ea91f1d1f37cf5cec4395990" dependencies = [ - "autocfg 1.0.0", - "cc", - "libc", - "pkg-config", - "vcpkg", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", + "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot" -version = "0.10.2" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" dependencies = [ - "lock_api", - "parking_lot_core", + "lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot_core" -version = "0.7.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" dependencies = [ - "cfg-if", - "cloudabi", - "libc", - "redox_syscall", - "smallvec", - "winapi 0.3.8", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "pem" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1581760c757a756a41f0ee3ff01256227bdf64cb752839779b95ffb01c59793" dependencies = [ - "base64 0.11.0", - "lazy_static 1.4.0", - "regex 1.3.9", + "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "percent-encoding" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "pest" version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" dependencies = [ - "ucd-trie", + "ucd-trie 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "pest_derive" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" dependencies = [ - "pest", - "pest_generator", + "pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "pest_generator 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "pest_generator" version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn", + "pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "pest_meta 2.1.3 (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)", ] [[package]] name = "pest_meta" version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" dependencies = [ - "maplit", - "pest", - "sha-1", + "maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "pin-project" -version = "0.4.17" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc93aeee735e60ecb40cf740eb319ff23eab1c5748abfdb5c180e4ce49f7791" dependencies = [ - "pin-project-internal", + "pin-project-internal 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "pin-project-internal" -version = "0.4.17" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e58db2081ba5b4c93bd6be09c40fd36cb9193a8336c384f3b40012e531aa7e40" dependencies = [ - "proc-macro2", - "quote", - "syn", + "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)", ] [[package]] name = "pin-project-lite" -version = "0.1.6" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9df32da11d84f3a7d70205549562966279adb900e080fad3dccd8e64afccf0ad" [[package]] name = "pin-utils" -version = "0.1.0" +version = "0.1.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" [[package]] name = "ppv-lite86" -version = "0.2.8" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" [[package]] name = "pq-sys" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac25eee5a0582f45a67e837e350d784e7003bd29a5f460796772061ca49ffda" dependencies = [ - "vcpkg", + "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-hack" -version = "0.5.16" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e0456befd48169b9f13ef0f0ad46d492cf9d2dbb918bcf38e01eed4ce3ec5e4" +dependencies = [ + "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)", +] [[package]] name = "proc-macro-nested" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694" [[package]] name = "proc-macro2" -version = "1.0.18" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa" dependencies = [ - "unicode-xid", + "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "quick-error" version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quick-xml" version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe1e430bdcf30c9fdc25053b9c459bb1a4672af4617b6c783d7d91dc17c6bbb0" dependencies = [ - "encoding_rs", - "memchr 2.3.3", + "encoding_rs 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "quote" -version = "1.0.6" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" dependencies = [ - "proc-macro2", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "r2d2" version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1497e40855348e4a8a40767d8e55174bce1e445a3ac9254ad44ad468ee0485af" dependencies = [ - "log", - "parking_lot", - "scheduled-thread-pool", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "scheduled-thread-pool 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" dependencies = [ - "fuchsia-cprng", - "libc", - "rand_core 0.3.1", - "rdrand", - "winapi 0.3.8", + "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" dependencies = [ - "autocfg 0.1.7", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.2", - "rand_hc 0.1.0", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg", - "rand_xorshift", - "winapi 0.3.8", + "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc 0.2.0", + "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" dependencies = [ - "autocfg 0.1.7", - "rand_core 0.3.1", + "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_chacha" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" dependencies = [ - "rand_core 0.4.2", + "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_core" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" [[package]] name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_hc" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" dependencies = [ - "rand_core 0.3.1", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_hc" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1", + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_isaac" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" dependencies = [ - "rand_core 0.3.1", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_jitter" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" dependencies = [ - "libc", - "rand_core 0.4.2", - "winapi 0.3.8", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_os" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" dependencies = [ - "cloudabi", - "fuchsia-cprng", - "libc", - "rand_core 0.4.2", - "rdrand", - "winapi 0.3.8", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" dependencies = [ - "autocfg 0.1.7", - "rand_core 0.4.2", + "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_xorshift" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" dependencies = [ - "rand_core 0.3.1", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rdrand" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" dependencies = [ - "rand_core 0.3.1", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "redox_syscall" version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" [[package]] name = "regex" version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f" dependencies = [ - "aho-corasick 0.5.3", - "memchr 0.1.11", - "regex-syntax 0.3.9", - "thread_local 0.2.7", - "utf8-ranges", + "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex" -version = "1.3.9" +version = "1.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" dependencies = [ - "aho-corasick 0.7.10", - "memchr 2.3.3", - "regex-syntax 0.6.18", - "thread_local 1.0.1", + "aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957" [[package]] name = "regex-syntax" -version = "0.6.18" +version = "0.6.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" [[package]] name = "remove_dir_all" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" dependencies = [ - "winapi 0.3.8", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "resolv-conf" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11834e137f3b14e309437a8276714eed3a80d1ef894869e510f2c0c0b98b9f4a" dependencies = [ - "hostname 0.3.1", - "quick-error", + "hostname 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ring" -version = "0.16.14" +version = "0.16.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06b3fefa4f12272808f809a0af618501fdaba41a58963c5fb72238ab0be09603" dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi 0.3.8", + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rss" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99979205510c60f80a119dedbabd0b8426517384edf205322f8bcd51796bcef9" dependencies = [ - "derive_builder", - "quick-xml", + "derive_builder 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "quick-xml 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rust-ini" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e52c148ef37f8c375d49d5a73aa70713125b7f19095948a923f80afdeb22ec2" [[package]] name = "rustc-demangle" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" [[package]] name = "rustc-serialize" version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" [[package]] name = "rustc_version" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" dependencies = [ - "semver", + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ryu" -version = "1.0.5" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "safemem" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" [[package]] name = "schannel" -version = "0.1.19" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" dependencies = [ - "lazy_static 1.4.0", - "winapi 0.3.8", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "scheduled-thread-pool" -version = "0.2.4" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0988d7fdf88d5e5fcf5923a0f1e8ab345f3e98ab4bc6bc45a2d5ff7f7458fbf6" dependencies = [ - "parking_lot", + "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "scopeguard" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "security-framework" -version = "0.4.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64808902d7d99f78eaddd2b4e2509713babc3dc3c85ad6f4c447680f3c01e535" dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "security-framework-sys" -version = "0.4.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17bf11d99252f512695eb468de5516e5cf75455521e69dfe343f3b74e4748405" dependencies = [ - "core-foundation-sys", - "libc", + "core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "semver" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "semver-parser", + "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "semver-parser" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" [[package]] name = "serde" -version = "1.0.111" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9124df5b40cbd380080b2cc6ab894c040a3070d995f5c9dc77e18c34a8ae37d" dependencies = [ - "serde_derive", + "serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde-hjson" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b833c5ad67d52ced5f5938b2980f32a9c1c5ef047f0b4fb3127e7a423c76153" dependencies = [ - "lazy_static 0.2.11", - "linked-hash-map 0.3.0", - "num-traits 0.1.43", - "regex 1.3.9", - "serde 0.8.23", + "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "linked-hash-map 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde-hjson" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a3a4e0ea8a88553209f6cc6cfe8724ecad22e1acf372793c27d995290fe74f8" dependencies = [ - "lazy_static 1.4.0", - "linked-hash-map 0.3.0", - "num-traits 0.1.43", - "regex 1.3.9", - "serde 0.8.23", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "linked-hash-map 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.111" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f2c3ac8e6ca1e9c80b8be1023940162bf81ae3cffbb1809474152f2ce1eb250" dependencies = [ - "proc-macro2", - "quote", - "syn", + "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)", ] [[package]] name = "serde_json" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67f7d2e9edc3523a9c8ec8cd6ec481b3a27810aafee3e625d311febd3e656b4c" dependencies = [ - "dtoa 0.2.2", - "itoa 0.1.1", - "num-traits 0.1.43", - "serde 0.8.23", + "dtoa 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_json" -version = "1.0.53" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2" dependencies = [ - "indexmap", - "itoa 0.4.5", - "ryu", - "serde 1.0.111", + "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_test" version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "110b3dbdf8607ec493c22d5d947753282f3bae73c0f56d322af1e8c78e4c23d5" dependencies = [ - "serde 0.8.23", + "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_urlencoded" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" dependencies = [ - "dtoa 0.4.5", - "itoa 0.4.5", - "serde 1.0.111", - "url", + "dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", + "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sha-1" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" dependencies = [ - "block-buffer", - "digest", - "fake-simd", - "opaque-debug", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sha1" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" [[package]] name = "sha2" -version = "0.8.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" dependencies = [ - "block-buffer", - "digest", - "fake-simd", - "opaque-debug", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "signal-hook-registry" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" dependencies = [ - "arc-swap", - "libc", + "arc-swap 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "simple_asn1" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b25ecba7165254f0c97d6c22a64b1122a03634b18d20a34daf21e18f892e618" dependencies = [ - "chrono", - "num-bigint", - "num-traits 0.2.11", + "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "slab" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" [[package]] name = "sluice" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed13b7cb46f13a15db2c4740f087a848acc8b31af89f95844d40137451f89b1" dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-util", + "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-io 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)", ] [[package]] name = "smallvec" -version = "1.4.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4" [[package]] name = "socket2" -version = "0.3.12" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03088793f677dce356f3ccc2edb1b314ad191ab702a5de3faf49304f7e104918" dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "winapi 0.3.8", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "spin" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "static_assertions" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f3eb36b47e512f8f1c9e3d10c2c1965bc992bd9cdb024fa581e2194501c83d3" [[package]] name = "strsim" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67f84c44fbb2f91db7fef94554e6b2ac05909c9c0b0bc23bb98d3a1aebfe7f7c" [[package]] name = "strsim" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "strsim" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" [[package]] name = "strum" version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bd81eb48f4c437cadc685403cad539345bf703d78e63707418431cecd4522b" [[package]] name = "strum_macros" version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87c85aa3f8ea653bfd3ddf25f7ee357ee4d204731f6aa9ad04002306f6e2774c" dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", + "heck 0.3.1 (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)", ] [[package]] name = "syn" -version = "1.0.30" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93a56fabc59dce20fe48b6c832cc249c713e7ed88fa28b0ee0a3bfcaae5fe4e2" dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", + "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)", + "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "synstructure" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" dependencies = [ - "proc-macro2", - "quote", - "syn", - "unicode-xid", + "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)", + "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tempfile" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ - "cfg-if", - "libc", - "rand 0.7.3", - "redox_syscall", - "remove_dir_all", - "winapi 0.3.8", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", + "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "termcolor" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" dependencies = [ - "winapi-util", + "winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "textwrap" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" dependencies = [ - "unicode-width", + "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "thiserror" -version = "1.0.19" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b13f926965ad00595dd129fa12823b04bbf866e9085ab0a5f2b05b850fbfc344" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "thiserror-impl" -version = "1.0.19" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "893582086c2f98cde18f906265a65b5030a074b1046c674ae898be6519a7f479" dependencies = [ - "proc-macro2", - "quote", - "syn", + "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)", ] [[package]] name = "thread-id" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03" dependencies = [ - "kernel32-sys", - "libc", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "thread_local" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5" dependencies = [ - "thread-id", + "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "thread_local" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" dependencies = [ - "lazy_static 1.4.0", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "threadpool" -version = "1.8.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" dependencies = [ - "num_cpus", + "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "time" -version = "0.1.43" +version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" dependencies = [ - "libc", - "winapi 0.3.8", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio" -version = "0.2.21" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d099fa27b9702bed751524694adbe393e18b36b204da91eb1cbbbbb4a5ee2d58" dependencies = [ - "bytes", - "fnv", - "futures-core", - "iovec", - "lazy_static 1.4.0", - "libc", - "memchr 2.3.3", - "mio", - "mio-uds", - "pin-project-lite", - "signal-hook-registry", - "slab", - "winapi 0.3.8", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-util" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930" dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "log", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "log", - "pin-project-lite", - "tokio", + "bytes 0.5.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-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "toml" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" dependencies = [ - "serde 1.0.111", -] - -[[package]] -name = "tracing" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41f40ed0e162c911ac6fcb53ecdc8134c46905fdbbae8c50add462a538b495f" -dependencies = [ - "cfg-if", - "log", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99bbad0de3fd923c9c3232ead88510b783e5a4d16a6154adffa3d53308de984c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tracing-core" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa83a9a47081cd522c09c81b31aec2c9273424976f922ad61c053b58350b715" -dependencies = [ - "lazy_static 1.4.0", -] - -[[package]] -name = "tracing-futures" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c" -dependencies = [ - "pin-project", - "tracing", + "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trust-dns-proto" version = "0.18.0-alpha.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a7f3a2ab8a919f5eca52a468866a67ed7d3efa265d48a652a9a3452272b413f" dependencies = [ - "async-trait", - "enum-as-inner", - "failure", - "futures", - "idna", - "lazy_static 1.4.0", - "log", - "rand 0.7.3", - "smallvec", - "socket2", - "tokio", - "url", + "async-trait 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)", + "enum-as-inner 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trust-dns-resolver" version = "0.18.0-alpha.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f90b1502b226f8b2514c6d5b37bafa8c200d7ca4102d57dc36ee0f3b7a04a2f" dependencies = [ - "cfg-if", - "failure", - "futures", - "ipconfig", - "lazy_static 1.4.0", - "log", - "lru-cache", - "resolv-conf", - "smallvec", - "tokio", - "trust-dns-proto", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ipconfig 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "resolv-conf 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-proto 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "twoway" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b40075910de3a912adbd80b5d8bad6ad10a23eeb1f5bf9d4006839e899ba5bc" dependencies = [ - "memchr 2.3.3", - "unchecked-index", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unchecked-index 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "typed-arena" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b2228007eba4120145f785df0f6c92ea538f5a3635a612ecf4e334c8c1446d" - -[[package]] -name = "typed-builder" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fc4459191c621a53ef6c6ca5642e6e0e5ccc61f3e5b8ad6b6ab5317f0200fb" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] [[package]] name = "typenum" -version = "1.12.0" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" [[package]] name = "ucd-trie" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" [[package]] name = "unchecked-index" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeba86d422ce181a719445e51872fa30f1f7413b62becb52e95ec91aa262d85c" [[package]] name = "unicase" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" dependencies = [ - "version_check 0.9.2", + "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "unicode-bidi" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" dependencies = [ - "matches", + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "unicode-normalization" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4" dependencies = [ - "smallvec", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "unicode-segmentation" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" [[package]] name = "unicode-width" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" [[package]] name = "unicode-xid" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" [[package]] name = "unicode_categories" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "untrusted" -version = "0.7.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" dependencies = [ - "idna", - "matches", - "percent-encoding", - "serde 1.0.111", + "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "utf8-ranges" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f" [[package]] name = "uuid" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a" dependencies = [ - "rand 0.6.5", -] - -[[package]] -name = "uuid" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11" -dependencies = [ - "rand 0.7.3", - "serde 1.0.111", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "v_escape" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "660b101c07b5d0863deb9e7fb3138777e858d6d2a79f9e6049a27d1cc77c6da6" dependencies = [ - "v_escape_derive", + "v_escape_derive 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "v_escape_derive" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ca2a14bc3fc5b64d188b087a7d3a927df87b152e941ccfbc66672e20c467ae" dependencies = [ - "nom 4.2.3", - "proc-macro2", - "quote", - "syn", + "nom 4.2.3 (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)", ] [[package]] name = "v_htmlescape" version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33e939c0d8cf047514fb6ba7d5aac78bc56677a6938b2ee67000b91f2e97e41" dependencies = [ - "cfg-if", - "v_escape", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "v_escape 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "vcpkg" -version = "0.2.9" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55d1e41d56121e07f1e223db0a4def204e45c85425f6a16d462fd07c8d10d74c" [[package]] name = "vec_map" -version = "0.8.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" [[package]] name = "version_check" -version = "0.9.2" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasm-bindgen" -version = "0.2.63" +version = "0.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2dc4aa152834bc334f506c1a06b866416a8b6697d5c9f75b9a689c8486def0" dependencies = [ - "cfg-if", - "wasm-bindgen-macro", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.63" +version = "0.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded84f06e0ed21499f6184df0e0cb3494727b0c5da89534e0fcc55c51d812101" dependencies = [ - "bumpalo", - "lazy_static 1.4.0", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", + "bumpalo 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (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)", + "wasm-bindgen-shared 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.63" +version = "0.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "838e423688dac18d73e31edce74ddfac468e37b1506ad163ffaf0a46f703ffe3" dependencies = [ - "quote", - "wasm-bindgen-macro-support", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.63" +version = "0.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3156052d8ec77142051a533cdd686cba889537b213f948cd1d20869926e68e92" dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", + "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)", + "wasm-bindgen-backend 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.63" +version = "0.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9ba19973a58daf4db6f352eda73dc0e289493cd29fb2632eb172085b6521acd" [[package]] name = "web-sys" -version = "0.3.40" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b72fe77fd39e4bd3eaa4412fd299a0be6b3dfe9d2597e2f1c20beb968f41d17" dependencies = [ - "js-sys", - "wasm-bindgen", + "js-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "widestring" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effc0e4ff8085673ea7b9b2e3c73f6bd4d118810c9009ed8f1e16bd96c331db6" [[package]] name = "winapi" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" [[package]] name = "winapi" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "winapi-build" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ - "winapi 0.3.8", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winreg" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" dependencies = [ - "winapi 0.3.8", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "winutil" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daf138b6b14196e3830a588acf1e86966c694d3e8fb026fb105b8b5dca07e6e" dependencies = [ - "winapi 0.3.8", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ws2_32-sys" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" dependencies = [ - "winapi 0.2.8", - "winapi-build", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "yaml-rust" -version = "0.4.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39f0c922f1a334134dc2f7a8b67dc5d25f0735263feec974345ff706bcf20b0d" dependencies = [ - "linked-hash-map 0.5.3", + "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] + +[metadata] +"checksum activitystreams 0.5.0-alpha.16 (registry+https://github.com/rust-lang/crates.io-index)" = "e7173513c9d586a1157f375835777e3b50498b6b7aab4411a7098b455ba995f0" +"checksum activitystreams-derive 0.5.0-alpha.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c7ff4a2be3b67d763e78794f622ef2d53da077521229774837f61963c4067b36" +"checksum actix 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a4af87564ff659dee8f9981540cac9418c45e910c8072fdedd643a262a38fcaf" +"checksum actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09e55f0a5c2ca15795035d90c46bd0e73a5123b72f68f12596d6ba5282051380" +"checksum actix-connect 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c95cc9569221e9802bf4c377f6c18b90ef10227d787611decf79fd47d2a8e76c" +"checksum actix-files 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "301482841d3d74483a446ead63cb7d362e187d2c8b603f13d91995621ea53c46" +"checksum actix-http 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c16664cc4fdea8030837ad5a845eb231fb93fc3c5c171edfefb52fad92ce9019" +"checksum actix-macros 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "21705adc76bbe4bc98434890e73a89cd00c6015e5704a60bb6eea6c3b72316b6" +"checksum actix-router 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9d7a10ca4d94e8c8e7a87c5173aba1b97ba9a6563ca02b0e1cd23531093d3ec8" +"checksum actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6a0a55507046441a496b2f0d26a84a65e67c8cafffe279072412f624b5fb6d" +"checksum actix-server 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "582a7173c281a4f46b5aa168a11e7f37183dcb71177a39312cc2264da7a632c9" +"checksum actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d3e4fc95dfa7e24171b2d0bb46b85f8ab0e8499e4e3caec691fc4ea65c287564" +"checksum actix-testing 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "48494745b72d0ea8ff0cf874aaf9b622a3ee03d7081ee0c04edea4f26d32c911" +"checksum actix-threadpool 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf4082192601de5f303013709ff84d81ca6a1bc4af7fb24f367a500a23c6e84e" +"checksum actix-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a4e5b4faaf105e9a6d389c606c298dcdb033061b00d532af9df56ff3a54995a8" +"checksum actix-utils 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fcf8f5631bf01adec2267808f00e228b761c60c0584cc9fa0b5364f41d147f4e" +"checksum actix-web 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3158e822461040822f0dbf1735b9c2ce1f95f93b651d7a7aded00b1efbb1f635" +"checksum actix-web-actors 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc1bd41bd66c4e9b5274cec87aac30168e63d64e96fd19db38edef6b46ba2982" +"checksum actix-web-codegen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f00371942083469785f7e28c540164af1913ee7c96a4534acb9cea92c39f057" +"checksum actix_derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b95aceadaf327f18f0df5962fedc1bde2f870566a0b9f65c89508a3b1f79334c" +"checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" +"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66" +"checksum aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" +"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +"checksum arc-swap 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d663a8e9a99154b5fb793032533f6328da35e23aac63d5c152279aa8ba356825" +"checksum arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" +"checksum ascii_utils 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "71938f30533e4d95a6d17aa530939da3842c2ab6f4f84b9dae68447e4129f74a" +"checksum async-trait 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "750b1c38a1dfadd108da0f01c08f4cdc7ff1bb39b325f9c82cc972361780a6e1" +"checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" +"checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" +"checksum awc 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d7601d4d1d7ef2335d6597a41b5fe069f6ab799b85f53565ab390e7b7065aac5" +"checksum backtrace 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)" = "ad235dabf00f36301792cfe82499880ba54c6486be094d1047b02bacb67c14e8" +"checksum backtrace-sys 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "ca797db0057bae1a7aa2eef3283a874695455cecf08a43bfb8507ee0ebc1ed69" +"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" +"checksum base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" +"checksum base64 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d5ca2cd0adc3f48f9e9ea5a6bbdf9ccc0bfade884847e484d452414c7ccffb3" +"checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" +"checksum bcrypt 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c158d9cf14495dbd2ac5ce1f31d75b3253f75c54cc865dd7e5fc864eb5fb8633" +"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +"checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" +"checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +"checksum blowfish 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6aeb80d00f2688459b8542068abd974cfb101e7a82182414a99b5026c0d85cc3" +"checksum brotli-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4445dea95f4c2b41cde57cc9fee236ae4dbae88d8fcbdb4750fc1bb5d86aaecd" +"checksum brotli2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0cb036c3eade309815c15ddbacec5b22c4d1f3983a774ab2eac2e3e9ea85568e" +"checksum bufstream 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "40e38929add23cdf8a366df9b0e088953150724bcbe5fc330b0d8eb3b328eec8" +"checksum bumpalo 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f359dc14ff8911330a51ef78022d376f25ed00248912803b58f00cb1c27f742" +"checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" +"checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" +"checksum bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" +"checksum bytestring 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "fc267467f58ef6cc8874064c62a0423eb0d099362c8a23edd1c6d044f46eead4" +"checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" +"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +"checksum chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" +"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" +"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +"checksum comrak 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e17058cc536cf290563e88787d7b9e6030ce4742943017cc2ffb71f88034021c" +"checksum config 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "19b076e143e1d9538dde65da30f8481c2a6c44040edb8e02b9bf1351edb92ce3" +"checksum copyless 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6ff9c56c9fb2a49c05ef0e431485a22400af20d33226dc0764d891d09e724127" +"checksum core-foundation 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" +"checksum core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" +"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" +"checksum crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061" +"checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +"checksum curl 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)" = "eda1c0c03cacf3365d84818a40293f0e3f3953db8759c9c565a3b434edf0b52e" +"checksum curl-sys 0.4.30+curl-7.69.1 (registry+https://github.com/rust-lang/crates.io-index)" = "923b38e423a8f47a4058e96f2a1fa2865a6231097ee860debd678d244277d50c" +"checksum darling 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +"checksum darling_core 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +"checksum darling_macro 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +"checksum derive_builder 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0" +"checksum derive_builder_core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef" +"checksum derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a806e96c59a76a5ba6e18735b6cf833344671e61e7863f2edb5c518ea2cac95c" +"checksum diesel 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9d7cc03b910de9935007861dce440881f69102aaaedfd4bc5a6f40340ca5840c" +"checksum diesel_derives 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "45f5098f628d02a7a0f68ddba586fb61e80edec3bdc1be3b921f4ceec60858d3" +"checksum diesel_migrations 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3cde8413353dc7f5d72fa8ce0b99a560a359d2c5ef1e5817ca731cd9008f4c" +"checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +"checksum docopt 0.6.86 (registry+https://github.com/rust-lang/crates.io-index)" = "4a7ef30445607f6fc8720f0a0a2c7442284b629cf0d049286860fae23e71c4d9" +"checksum dotenv 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +"checksum dtoa 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0dd841b58510c9618291ffa448da2e4e0f699d984d436122372f446dae62263d" +"checksum dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4358a9e11b9a09cf52383b451b49a169e8d797b68aa02301ff586d70d9661ea3" +"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" +"checksum email 0.0.20 (registry+https://github.com/rust-lang/crates.io-index)" = "91549a51bb0241165f13d57fc4c72cef063b4088fb078b019ecbf464a45f22e4" +"checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" +"checksum encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" +"checksum encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" +"checksum encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" +"checksum encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" +"checksum encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" +"checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" +"checksum encoding_rs 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)" = "cd8d03faa7fe0c1431609dfad7bbe827af30f82e1e2ae6f7ee4fca6bd764bc28" +"checksum entities 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5320ae4c3782150d900b79807611a59a99fc9a1d61d686faafc24b93fc8d7ca" +"checksum enum-as-inner 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bc4bfcfacb61d231109d1d55202c1f33263319668b168843e02ad4652725ec9c" +"checksum env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +"checksum failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b8529c2421efa3066a5cbd8063d2244603824daccb6936b079010bb2aa89464b" +"checksum failure_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "030a733c8287d6213886dd487564ff5c8f6aae10278b3588ed177f9d18f8d231" +"checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" +"checksum fast_chemail 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)" = "495a39d30d624c2caabe6312bfead73e7717692b44e0b32df168c275a2e8e9e4" +"checksum flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2cfff41391129e0a856d6d822600b8d71179d46879e310417eb9c762eb178b42" +"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" +"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" +"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" +"checksum futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5c329ae8753502fb44ae4fc2b622fa2a94652c41e795143765ba0927f92ab780" +"checksum futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c77d04ce8edd9cb903932b608268b3fffec4163dc053b3b402bf47eac1f1a8" +"checksum futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a" +"checksum futures-executor 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f674f3e1bcb15b37284a90cedf55afdba482ab061c407a9c0ebbd0f3109741ba" +"checksum futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a638959aa96152c7a4cddf50fcb1e3fede0583b27157c26e67d6f99904090dc6" +"checksum futures-macro 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9a5081aa3de1f7542a794a397cde100ed903b0630152d0973479018fd85423a7" +"checksum futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3466821b4bc114d95b087b850a724c6f83115e929bc88f1fa98a3304a944c8a6" +"checksum futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27" +"checksum futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "22766cf25d64306bedf0384da004d05c9974ab104fcc4528f1236181c18004c5" +"checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" +"checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" +"checksum h2 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9d5c295d1c0c68e4e42003d75f908f5e16a1edd1cbe0b0d02e4dc2006a384f47" +"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" +"checksum hermit-abi 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1010591b26bbfe835e9faeabeb11866061cc7dcebffd56ad7d0942d0e61aefd8" +"checksum hjson 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0849d73a64ec77d1c8354aff489cf31943c4b4d3716de1eabfba572c70fde530" +"checksum hostname 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "21ceb46a83a85e824ef93669c8b390009623863b5c195d1ba747292c0c72f94e" +"checksum hostname 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +"checksum htmlescape 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e9025058dae765dee5070ec375f591e2ba14638c63feff74f13805a72e523163" +"checksum http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b708cc7f06493459026f53b9a61a7a121a5d1ec6238dee58ea4941132b30156b" +"checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" +"checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +"checksum ident_case 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +"checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" +"checksum indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292" +"checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +"checksum ipconfig 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa79fa216fbe60834a9c0737d7fcd30425b32d1c58854663e24d4c4b328ed83f" +"checksum isahc 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "50bdb3bdcbf6d534daaad1a686eda0d0dc1946818fa71e3edd3124d001adfdc2" +"checksum itoa 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ae3088ea4baeceb0284ee9eea42f591226e6beaecf65373e41b38d95a1b8e7a1" +"checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" +"checksum js-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1cb931d43e71f560c81badb0191596562bafad2be06a3f9025b845c847c60df5" +"checksum jsonwebtoken 7.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d11f9e80a85927748a334df8e4f6782a04033517bb28f3863a563daad882da7f" +"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +"checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" +"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" +"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +"checksum lettre 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c66afaa5dfadbb81d4e00fd1d1ab057c7cd4c799c5a44e0009386d553587e728" +"checksum lettre_email 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bbb68ca999042d965476e47bbdbacd52db0927348b6f8062c44dd04a3b1fd43b" +"checksum lexical-core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d7043aa5c05dd34fb73b47acb8c3708eac428de4545ea3682ed2f11293ebd890" +"checksum libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)" = "dea0c0405123bba743ee3f91f49b1c7cfb684eef0da0a50110f758ccf24cdff0" +"checksum libnghttp2-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b359f5ec8106bc297694c9a562ace312be2cfd17a5fc68dc12249845aa144b11" +"checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" +"checksum linked-hash-map 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d262045c5b87c0861b3f004610afd0e2c851e2908d08b6c870cbb9d5f494ecd" +"checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" +"checksum lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "79b2de95ecb4691949fea4716ca53cdbcfccb2c612e19644a8bad05edcf9f47b" +"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +"checksum lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +"checksum maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" +"checksum match_cfg 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" +"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +"checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" +"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20" +"checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" +"checksum migrations_internals 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8089920229070f914b9ce9b07ef60e175b2b9bc2d35c3edd8bf4433604e863b9" +"checksum migrations_macros 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "719ef0bc7f531428764c9b70661c14abd50a7f3d21f355752d9985aa21251c9e" +"checksum mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +"checksum mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" +"checksum miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5" +"checksum mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" +"checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" +"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" +"checksum native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "2b0d88c06fe90d5ee94048ba40409ef1d9315d86f6f38c2efdaad4fb50c58b2d" +"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" +"checksum nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" +"checksum nom 5.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b471253da97532da4b61552249c521e01e736071f71c1a4f7ebbfbf0a06aad6" +"checksum num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +"checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" +"checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" +"checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" +"checksum num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6" +"checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" +"checksum openssl 0.10.28 (registry+https://github.com/rust-lang/crates.io-index)" = "973293749822d7dd6370d6da1e523b0d1db19f06c459134c658b2a4261378b52" +"checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" +"checksum openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)" = "1024c0a59774200a555087a6da3f253a9095a5f344e353b212ac4c8b8e450986" +"checksum parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "92e98c49ab0b7ce5b222f2cc9193fc4efe11c6d0bd4f648e374684a6857b1cfc" +"checksum parking_lot_core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7582838484df45743c8434fbff785e8edf260c28748353d44bc0da32e0ceabf1" +"checksum pem 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a1581760c757a756a41f0ee3ff01256227bdf64cb752839779b95ffb01c59793" +"checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +"checksum pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +"checksum pest_derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" +"checksum pest_generator 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" +"checksum pest_meta 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" +"checksum pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7804a463a8d9572f13453c516a5faea534a2403d7ced2f0c7e100eeff072772c" +"checksum pin-project-internal 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "385322a45f2ecf3410c68d2a549a4a2685e8051d0f278e39743ff4e451cb9b3f" +"checksum pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "237844750cfbb86f67afe27eee600dfbbcb6188d734139b534cbfbf4f96792ae" +"checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" +"checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" +"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" +"checksum pq-sys 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "6ac25eee5a0582f45a67e837e350d784e7003bd29a5f460796772061ca49ffda" +"checksum proc-macro-hack 0.5.12 (registry+https://github.com/rust-lang/crates.io-index)" = "f918f2b601f93baa836c1c2945faef682ba5b6d4828ecb45eeb7cc3c71b811b4" +"checksum proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694" +"checksum proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6c09721c6781493a2a492a96b5a5bf19b65917fe6728884e7c44dd0c60ca3435" +"checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +"checksum quick-xml 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fe1e430bdcf30c9fdc25053b9c459bb1a4672af4617b6c783d7d91dc17c6bbb0" +"checksum quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" +"checksum r2d2 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1497e40855348e4a8a40767d8e55174bce1e445a3ac9254ad44ad468ee0485af" +"checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" +"checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" +"checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" +"checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +"checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" +"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +"checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" +"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +"checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" +"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" +"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" +"checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" +"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" +"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" +"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f" +"checksum regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8900ebc1363efa7ea1c399ccc32daed870b4002651e0bed86e72d501ebbe0048" +"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957" +"checksum regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)" = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae" +"checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" +"checksum resolv-conf 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "11834e137f3b14e309437a8276714eed3a80d1ef894869e510f2c0c0b98b9f4a" +"checksum ring 0.16.11 (registry+https://github.com/rust-lang/crates.io-index)" = "741ba1704ae21999c00942f9f5944f801e977f54302af346b596287599ad1862" +"checksum rss 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "99979205510c60f80a119dedbabd0b8426517384edf205322f8bcd51796bcef9" +"checksum rust-ini 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e52c148ef37f8c375d49d5a73aa70713125b7f19095948a923f80afdeb22ec2" +"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" +"checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" +"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +"checksum ryu 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535622e6be132bccd223f4bb2b8ac8d53cda3c7a6394944d3b2b33fb974f9d76" +"checksum safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" +"checksum schannel 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "507a9e6e8ffe0a4e0ebb9a10293e62fdf7657c06f1b8bb07a8fcf697d2abf295" +"checksum scheduled-thread-pool 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f5de7bc31f28f8e6c28df5e1bf3d10610f5fdc14cc95f272853512c70a2bd779" +"checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +"checksum security-framework 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "97bbedbe81904398b6ebb054b3e912f99d55807125790f3198ac990d98def5b0" +"checksum security-framework-sys 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "06fd2f23e31ef68dd2328cc383bd493142e46107a3a0e24f7d734e3f3b80fe4c" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +"checksum serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" +"checksum serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)" = "e707fbbf255b8fc8c3b99abb91e7257a622caeb20a9818cbadbeeede4e0932ff" +"checksum serde-hjson 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0b833c5ad67d52ced5f5938b2980f32a9c1c5ef047f0b4fb3127e7a423c76153" +"checksum serde-hjson 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6a3a4e0ea8a88553209f6cc6cfe8724ecad22e1acf372793c27d995290fe74f8" +"checksum serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)" = "ac5d00fc561ba2724df6758a17de23df5914f20e41cb00f94d5b7ae42fffaff8" +"checksum serde_json 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)" = "67f7d2e9edc3523a9c8ec8cd6ec481b3a27810aafee3e625d311febd3e656b4c" +"checksum serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)" = "9371ade75d4c2d6cb154141b9752cf3781ec9c05e0e5cf35060e1e70ee7b9c25" +"checksum serde_test 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "110b3dbdf8607ec493c22d5d947753282f3bae73c0f56d322af1e8c78e4c23d5" +"checksum serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" +"checksum sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" +"checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" +"checksum sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0" +"checksum signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" +"checksum simple_asn1 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2b25ecba7165254f0c97d6c22a64b1122a03634b18d20a34daf21e18f892e618" +"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +"checksum sluice 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fed13b7cb46f13a15db2c4740f087a848acc8b31af89f95844d40137451f89b1" +"checksum smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5c2fb2ec9bcd216a5b0d0ccf31ab17b5ed1d627960edff65bbe95d3ce221cefc" +"checksum socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "e8b74de517221a2cb01a53349cf54182acdc31a074727d3079068448c0676d85" +"checksum spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +"checksum static_assertions 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7f3eb36b47e512f8f1c9e3d10c2c1965bc992bd9cdb024fa581e2194501c83d3" +"checksum strsim 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "67f84c44fbb2f91db7fef94554e6b2ac05909c9c0b0bc23bb98d3a1aebfe7f7c" +"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +"checksum strsim 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" +"checksum strum 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "57bd81eb48f4c437cadc685403cad539345bf703d78e63707418431cecd4522b" +"checksum strum_macros 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "87c85aa3f8ea653bfd3ddf25f7ee357ee4d204731f6aa9ad04002306f6e2774c" +"checksum syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)" = "123bd9499cfb380418d509322d7a6d52e5315f064fe4b3ad18a53d6b92c07859" +"checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" +"checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" +"checksum termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" +"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +"checksum thiserror 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ee14bf8e6767ab4c687c9e8bc003879e042a96fd67a3ba5934eadb6536bef4db" +"checksum thiserror-impl 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "a7b51e1fbc44b5a0840be594fbc0f960be09050f2617e61e6aa43bef97cd3ef4" +"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03" +"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5" +"checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +"checksum threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865" +"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" +"checksum tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "0fa5e81d6bc4e67fe889d5783bd2a128ab2e0cfa487e0be16b6a8d177b101616" +"checksum tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930" +"checksum toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" +"checksum trust-dns-proto 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2a7f3a2ab8a919f5eca52a468866a67ed7d3efa265d48a652a9a3452272b413f" +"checksum trust-dns-resolver 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6f90b1502b226f8b2514c6d5b37bafa8c200d7ca4102d57dc36ee0f3b7a04a2f" +"checksum twoway 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6b40075910de3a912adbd80b5d8bad6ad10a23eeb1f5bf9d4006839e899ba5bc" +"checksum typed-arena 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9b2228007eba4120145f785df0f6c92ea538f5a3635a612ecf4e334c8c1446d" +"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" +"checksum ucd-trie 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" +"checksum unchecked-index 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eeba86d422ce181a719445e51872fa30f1f7413b62becb52e95ec91aa262d85c" +"checksum unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +"checksum unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4" +"checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" +"checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" +"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" +"checksum unicode_categories 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" +"checksum untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60369ef7a31de49bcb3f6ca728d4ba7300d9a1658f94c727d4cab8c8d9f4aece" +"checksum url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" +"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f" +"checksum uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a" +"checksum v_escape 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "660b101c07b5d0863deb9e7fb3138777e858d6d2a79f9e6049a27d1cc77c6da6" +"checksum v_escape_derive 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c2ca2a14bc3fc5b64d188b087a7d3a927df87b152e941ccfbc66672e20c467ae" +"checksum v_htmlescape 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e33e939c0d8cf047514fb6ba7d5aac78bc56677a6938b2ee67000b91f2e97e41" +"checksum vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" +"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" +"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" +"checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" +"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +"checksum wasm-bindgen 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "3557c397ab5a8e347d434782bcd31fc1483d927a6826804cec05cc792ee2519d" +"checksum wasm-bindgen-backend 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "e0da9c9a19850d3af6df1cb9574970b566d617ecfaf36eb0b706b6f3ef9bd2f8" +"checksum wasm-bindgen-macro 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "0f6fde1d36e75a714b5fe0cffbb78978f222ea6baebb726af13c78869fdb4205" +"checksum wasm-bindgen-macro-support 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "25bda4168030a6412ea8a047e27238cadf56f0e53516e1e83fec0a8b7c786f6d" +"checksum wasm-bindgen-shared 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "fc9f36ad51f25b0219a3d4d13b90eb44cd075dff8b6280cca015775d7acaddd8" +"checksum web-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)" = "721c6263e2c66fd44501cc5efbfa2b7dfa775d13e4ea38c46299646ed1f9c70a" +"checksum widestring 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "effc0e4ff8085673ea7b9b2e3c73f6bd4d118810c9009ed8f1e16bd96c331db6" +"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" +"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" +"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4ccfbf554c6ad11084fb7517daca16cfdcaccbdadba4fc336f032a8b12c2ad80" +"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +"checksum winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" +"checksum winutil 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7daf138b6b14196e3830a588acf1e86966c694d3e8fb026fb105b8b5dca07e6e" +"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +"checksum yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "65923dd1784f44da1d2c3dbbc5e822045628c590ba72123e1c73d3c230c4434d" diff --git a/server/Cargo.toml b/server/Cargo.toml index 47be3239..d94d5640 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -1,26 +1,24 @@ [package] name = "lemmy_server" version = "0.0.1" -authors = ["Dessalines "] +authors = ["Dessalines "] edition = "2018" [dependencies] -diesel = { version = "1.4.4", features = ["postgres","chrono","r2d2","64-column-tables","serde_json"] } +diesel = { version = "1.4.2", features = ["postgres","chrono", "r2d2", "64-column-tables"] } diesel_migrations = "1.4.0" dotenv = "0.15.0" -activitystreams = "0.6.2" -activitystreams-new = { git = "https://git.asonix.dog/asonix/activitystreams-sketch" } -activitystreams-ext = { git = "https://git.asonix.dog/asonix/activitystreams-ext" } -bcrypt = "0.8.0" +activitystreams = "0.5.0-alpha.16" +bcrypt = "0.6.2" chrono = { version = "0.4.7", features = ["serde"] } +failure = "0.1.5" serde_json = { version = "1.0.48", features = ["preserve_order"]} -failure = "0.1.8" serde = { version = "1.0.105", features = ["derive"] } actix = "0.9.0" actix-web = "2.0.0" actix-files = "0.2.1" actix-web-actors = "2.0.0" -actix-rt = "1.1.1" +actix-rt = "1.0.0" log = "0.4.0" env_logger = "0.7.1" rand = "0.7.3" @@ -29,22 +27,15 @@ strum_macros = "0.18.0" jsonwebtoken = "7.0.1" regex = "1.3.5" lazy_static = "1.3.0" -lettre = "0.9.3" -lettre_email = "0.9.4" +lettre = "0.9.2" +lettre_email = "0.9.2" sha2 = "0.8.1" rss = "1.9.0" htmlescape = "0.3.1" config = "0.10.1" hjson = "0.8.2" -url = { version = "2.1.1", features = ["serde"] } +url = "2.1.1" percent-encoding = "2.1.0" -isahc = "0.9.2" +isahc = "0.9" comrak = "0.7" openssl = "0.10" -http = "0.2.1" -http-signature-normalization = "0.5.1" -base64 = "0.12.1" -tokio = "0.2.21" -futures = "0.3.5" -itertools = "0.9.0" -uuid = { version = "0.8", features = ["serde", "v4"] } diff --git a/server/config/defaults.hjson b/server/config/defaults.hjson index 61951321..8603e49a 100644 --- a/server/config/defaults.hjson +++ b/server/config/defaults.hjson @@ -54,10 +54,10 @@ federation: { # whether to enable activitypub federation. this feature is in alpha, do not enable in production. enabled: false + # comma seperated list of instances to follow + followed_instances: "" # whether tls is required for activitypub. only disable this for debugging, never for producion. tls_enabled: true - # comma seperated list of instances with which federation is allowed - allowed_instances: "" } # # email sending configuration # email: { diff --git a/server/db-init.sh b/server/db-init.sh index a2ad77b5..c9150e9d 100755 --- a/server/db-init.sh +++ b/server/db-init.sh @@ -1,106 +1,43 @@ -#!/bin/sh +#!/bin/bash -# Default configurations username=lemmy dbname=lemmy port=5432 -yes_no_prompt_invalid() { - echo "Invalid input. Please enter either \"y\" or \"n\"." 1>&2 -} +password="" +password_confirm="" +password_valid=0 -print_config() { - echo " database name: $dbname" - echo " username: $username" - echo " port: $port" -} - -ask_for_db_config() { - echo "The default database configuration is:" - print_config +while [ "$password_valid" == 0 ] +do + read -p "Enter database password: " -s password echo - default_config_final=0 - default_config_valid=0 - while [ "$default_config_valid" == 0 ] - do - read -p "Use this configuration (y/n)? " default_config - case "$default_config" in - [yY]* ) default_config_valid=1; default_config_final=1;; - [nN]* ) default_config_valid=1; default_config_final=0;; - * ) yes_no_prompt_invalid;; - esac - echo - done + read -p "Verify database password: " -s password_confirm + echo + echo - if [ "$default_config_final" == 0 ] + # Start the loop from the top if either check fails + if [ -z "$password" ] then - config_ok_final=0 - while [ "$config_ok_final" == 0 ] - do - read -p "Database name: " dbname - read -p "Username: " username - read -p "Port: " port - #echo - - #echo "The database configuration is:" - #print_config - #echo - - config_ok_valid=0 - while [ "$config_ok_valid" == 0 ] - do - read -p "Use this configuration (y/n)? " config_ok - case "$config_ok" in - [yY]* ) config_ok_valid=1; config_ok_final=1;; - [nN]* ) config_ok_valid=1; config_ok_final=0;; - * ) yes_no_prompt_invalid;; - esac - echo - done - done + echo "Error: Password cannot be empty." 1>&2 + echo + continue fi -} - -ask_for_password() { - password="" - password_confirm="" - password_valid=0 - while [ "$password_valid" == 0 ] - do - read -p "Enter database password: " -s password + if [ "$password" != "$password_confirm" ] + then + echo "Error: Passwords don't match." 1>&2 echo + continue + fi - read -p "Verify database password: " -s password_confirm - echo - echo + # Set the password_valid variable to break out of the loop + password_valid=1 +done - # Start the loop from the top if either check fails - if [ -z "$password" ] - then - echo "Error: Password cannot be empty." 1>&2 - echo - continue - fi - if [ "$password" != "$password_confirm" ] - then - echo "Error: Passwords don't match." 1>&2 - echo - continue - fi - - # Set the password_valid variable to break out of the loop - password_valid=1 - done -} - -ask_for_db_config - -ask_for_password psql -c "CREATE USER $username WITH PASSWORD '$password' SUPERUSER;" -U postgres -psql -c "CREATE DATABASE $dbname WITH OWNER $username;" -U postgres +psql -c 'CREATE DATABASE $dbname WITH OWNER $username;' -U postgres export LEMMY_DATABASE_URL=postgres://$username:$password@localhost:$port/$dbname -echo "The database URL is $LEMMY_DATABASE_URL" - +echo $LEMMY_DATABASE_URL diff --git a/server/migrations/2020-04-14-163701_update_views_for_activitypub/down.sql b/server/migrations/2020-04-14-163701_update_views_for_activitypub/down.sql deleted file mode 100644 index ce2dde39..00000000 --- a/server/migrations/2020-04-14-163701_update_views_for_activitypub/down.sql +++ /dev/null @@ -1,440 +0,0 @@ --- user_view -drop view user_view cascade; - -create view user_view as -select -u.id, -u.name, -u.avatar, -u.email, -u.matrix_user_id, -u.admin, -u.banned, -u.show_avatars, -u.send_notifications_to_email, -u.published, -(select count(*) from post p where p.creator_id = u.id) as number_of_posts, -(select coalesce(sum(score), 0) from post p, post_like pl where u.id = p.creator_id and p.id = pl.post_id) as post_score, -(select count(*) from comment c where c.creator_id = u.id) as number_of_comments, -(select coalesce(sum(score), 0) from comment c, comment_like cl where u.id = c.creator_id and c.id = cl.comment_id) as comment_score -from user_ u; - -create materialized view user_mview as select * from user_view; - -create unique index idx_user_mview_id on user_mview (id); - --- community_view -drop view community_aggregates_view cascade; -create view community_aggregates_view as -select c.*, -(select name from user_ u where c.creator_id = u.id) as creator_name, -(select avatar from user_ u where c.creator_id = u.id) as creator_avatar, -(select name from category ct where c.category_id = ct.id) as category_name, -(select count(*) from community_follower cf where cf.community_id = c.id) as number_of_subscribers, -(select count(*) from post p where p.community_id = c.id) as number_of_posts, -(select count(*) from comment co, post p where c.id = p.community_id and p.id = co.post_id) as number_of_comments, -hot_rank((select count(*) from community_follower cf where cf.community_id = c.id), c.published) as hot_rank -from community c; - -create materialized view community_aggregates_mview as select * from community_aggregates_view; - -create unique index idx_community_aggregates_mview_id on community_aggregates_mview (id); - -create view community_view as -with all_community as -( - select - ca.* - from community_aggregates_view ca -) - -select -ac.*, -u.id as user_id, -(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed -from user_ u -cross join all_community ac - -union all - -select -ac.*, -null as user_id, -null as subscribed -from all_community ac -; - -create view community_mview as -with all_community as -( - select - ca.* - from community_aggregates_mview ca -) - -select -ac.*, -u.id as user_id, -(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed -from user_ u -cross join all_community ac - -union all - -select -ac.*, -null as user_id, -null as subscribed -from all_community ac -; - --- community views -drop view community_moderator_view; -drop view community_follower_view; -drop view community_user_ban_view; - -create view community_moderator_view as -select *, -(select name from user_ u where cm.user_id = u.id) as user_name, -(select avatar from user_ u where cm.user_id = u.id), -(select name from community c where cm.community_id = c.id) as community_name -from community_moderator cm; - -create view community_follower_view as -select *, -(select name from user_ u where cf.user_id = u.id) as user_name, -(select avatar from user_ u where cf.user_id = u.id), -(select name from community c where cf.community_id = c.id) as community_name -from community_follower cf; - -create view community_user_ban_view as -select *, -(select name from user_ u where cm.user_id = u.id) as user_name, -(select avatar from user_ u where cm.user_id = u.id), -(select name from community c where cm.community_id = c.id) as community_name -from community_user_ban cm; - --- post_view -drop view post_view; -drop view post_mview; -drop materialized view post_aggregates_mview; -drop view post_aggregates_view; - --- regen post view -create view post_aggregates_view as -select -p.*, -(select u.banned from user_ u where p.creator_id = u.id) as banned, -(select cb.id::bool from community_user_ban cb where p.creator_id = cb.user_id and p.community_id = cb.community_id) as banned_from_community, -(select name from user_ where p.creator_id = user_.id) as creator_name, -(select avatar from user_ where p.creator_id = user_.id) as creator_avatar, -(select name from community where p.community_id = community.id) as community_name, -(select removed from community c where p.community_id = c.id) as community_removed, -(select deleted from community c where p.community_id = c.id) as community_deleted, -(select nsfw from community c where p.community_id = c.id) as community_nsfw, -(select count(*) from comment where comment.post_id = p.id) as number_of_comments, -coalesce(sum(pl.score), 0) as score, -count (case when pl.score = 1 then 1 else null end) as upvotes, -count (case when pl.score = -1 then 1 else null end) as downvotes, -hot_rank(coalesce(sum(pl.score) , 0), - ( - case when (p.published < ('now'::timestamp - '1 month'::interval)) then p.published -- Prevents necro-bumps - else greatest(c.recent_comment_time, p.published) - end - ) -) as hot_rank, -( - case when (p.published < ('now'::timestamp - '1 month'::interval)) then p.published -- Prevents necro-bumps - else greatest(c.recent_comment_time, p.published) - end -) as newest_activity_time -from post p -left join post_like pl on p.id = pl.post_id -left join ( - select post_id, - max(published) as recent_comment_time - from comment - group by 1 -) c on p.id = c.post_id -group by p.id, c.recent_comment_time; - -create materialized view post_aggregates_mview as select * from post_aggregates_view; - -create unique index idx_post_aggregates_mview_id on post_aggregates_mview (id); - -create view post_view as -with all_post as ( - select - pa.* - from post_aggregates_view pa -) -select -ap.*, -u.id as user_id, -coalesce(pl.score, 0) as my_vote, -(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, -(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, -(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved -from user_ u -cross join all_post ap -left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id - -union all - -select -ap.*, -null as user_id, -null as my_vote, -null as subscribed, -null as read, -null as saved -from all_post ap -; - -create view post_mview as -with all_post as ( - select - pa.* - from post_aggregates_mview pa -) -select -ap.*, -u.id as user_id, -coalesce(pl.score, 0) as my_vote, -(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, -(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, -(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved -from user_ u -cross join all_post ap -left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id - -union all - -select -ap.*, -null as user_id, -null as my_vote, -null as subscribed, -null as read, -null as saved -from all_post ap -; - - --- reply_view, comment_view, user_mention -drop view reply_view; -drop view user_mention_view; -drop view user_mention_mview; -drop view comment_view; -drop view comment_mview; -drop materialized view comment_aggregates_mview; -drop view comment_aggregates_view; - --- reply and comment view -create view comment_aggregates_view as -select -c.*, -(select community_id from post p where p.id = c.post_id), -(select co.name from post p, community co where p.id = c.post_id and p.community_id = co.id) as community_name, -(select u.banned from user_ u where c.creator_id = u.id) as banned, -(select cb.id::bool from community_user_ban cb, post p where c.creator_id = cb.user_id and p.id = c.post_id and p.community_id = cb.community_id) as banned_from_community, -(select name from user_ where c.creator_id = user_.id) as creator_name, -(select avatar from user_ where c.creator_id = user_.id) as creator_avatar, -coalesce(sum(cl.score), 0) as score, -count (case when cl.score = 1 then 1 else null end) as upvotes, -count (case when cl.score = -1 then 1 else null end) as downvotes, -hot_rank(coalesce(sum(cl.score) , 0), c.published) as hot_rank -from comment c -left join comment_like cl on c.id = cl.comment_id -group by c.id; - -create materialized view comment_aggregates_mview as select * from comment_aggregates_view; - -create unique index idx_comment_aggregates_mview_id on comment_aggregates_mview (id); - -create view comment_view as -with all_comment as -( - select - ca.* - from comment_aggregates_view ca -) - -select -ac.*, -u.id as user_id, -coalesce(cl.score, 0) as my_vote, -(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.community_id = cf.community_id) as subscribed, -(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved -from user_ u -cross join all_comment ac -left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id - -union all - -select - ac.*, - null as user_id, - null as my_vote, - null as subscribed, - null as saved -from all_comment ac -; - -create view comment_mview as -with all_comment as -( - select - ca.* - from comment_aggregates_mview ca -) - -select -ac.*, -u.id as user_id, -coalesce(cl.score, 0) as my_vote, -(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.community_id = cf.community_id) as subscribed, -(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved -from user_ u -cross join all_comment ac -left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id - -union all - -select - ac.*, - null as user_id, - null as my_vote, - null as subscribed, - null as saved -from all_comment ac -; - --- Do the reply_view referencing the comment_mview -create view reply_view as -with closereply as ( - select - c2.id, - c2.creator_id as sender_id, - c.creator_id as recipient_id - from comment c - inner join comment c2 on c.id = c2.parent_id - where c2.creator_id != c.creator_id - -- Do union where post is null - union - select - c.id, - c.creator_id as sender_id, - p.creator_id as recipient_id - from comment c, post p - where c.post_id = p.id and c.parent_id is null and c.creator_id != p.creator_id -) -select cv.*, -closereply.recipient_id -from comment_mview cv, closereply -where closereply.id = cv.id -; - --- user mention -create view user_mention_view as -select - c.id, - um.id as user_mention_id, - c.creator_id, - c.post_id, - c.parent_id, - c.content, - c.removed, - um.read, - c.published, - c.updated, - c.deleted, - c.community_id, - c.community_name, - c.banned, - c.banned_from_community, - c.creator_name, - c.creator_avatar, - c.score, - c.upvotes, - c.downvotes, - c.hot_rank, - c.user_id, - c.my_vote, - c.saved, - um.recipient_id -from user_mention um, comment_view c -where um.comment_id = c.id; - - -create view user_mention_mview as -with all_comment as -( - select - ca.* - from comment_aggregates_mview ca -) - -select - ac.id, - um.id as user_mention_id, - ac.creator_id, - ac.post_id, - ac.parent_id, - ac.content, - ac.removed, - um.read, - ac.published, - ac.updated, - ac.deleted, - ac.community_id, - ac.community_name, - ac.banned, - ac.banned_from_community, - ac.creator_name, - ac.creator_avatar, - ac.score, - ac.upvotes, - ac.downvotes, - ac.hot_rank, - u.id as user_id, - coalesce(cl.score, 0) as my_vote, - (select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved, - um.recipient_id -from user_ u -cross join all_comment ac -left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id -left join user_mention um on um.comment_id = ac.id - -union all - -select - ac.id, - um.id as user_mention_id, - ac.creator_id, - ac.post_id, - ac.parent_id, - ac.content, - ac.removed, - um.read, - ac.published, - ac.updated, - ac.deleted, - ac.community_id, - ac.community_name, - ac.banned, - ac.banned_from_community, - ac.creator_name, - ac.creator_avatar, - ac.score, - ac.upvotes, - ac.downvotes, - ac.hot_rank, - null as user_id, - null as my_vote, - null as saved, - um.recipient_id -from all_comment ac -left join user_mention um on um.comment_id = ac.id -; - diff --git a/server/migrations/2020-04-14-163701_update_views_for_activitypub/up.sql b/server/migrations/2020-04-14-163701_update_views_for_activitypub/up.sql deleted file mode 100644 index 02499fc2..00000000 --- a/server/migrations/2020-04-14-163701_update_views_for_activitypub/up.sql +++ /dev/null @@ -1,497 +0,0 @@ --- user_view -drop view user_view cascade; - -create view user_view as -select -u.id, -u.actor_id, -u.name, -u.avatar, -u.email, -u.matrix_user_id, -u.bio, -u.local, -u.admin, -u.banned, -u.show_avatars, -u.send_notifications_to_email, -u.published, -(select count(*) from post p where p.creator_id = u.id) as number_of_posts, -(select coalesce(sum(score), 0) from post p, post_like pl where u.id = p.creator_id and p.id = pl.post_id) as post_score, -(select count(*) from comment c where c.creator_id = u.id) as number_of_comments, -(select coalesce(sum(score), 0) from comment c, comment_like cl where u.id = c.creator_id and c.id = cl.comment_id) as comment_score -from user_ u; - -create materialized view user_mview as select * from user_view; - -create unique index idx_user_mview_id on user_mview (id); - --- community_view -drop view community_aggregates_view cascade; -create view community_aggregates_view as --- Now that there's public and private keys, you have to be explicit here -select c.id, -c.name, -c.title, -c.description, -c.category_id, -c.creator_id, -c.removed, -c.published, -c.updated, -c.deleted, -c.nsfw, -c.actor_id, -c.local, -c.last_refreshed_at, -(select actor_id from user_ u where c.creator_id = u.id) as creator_actor_id, -(select local from user_ u where c.creator_id = u.id) as creator_local, -(select name from user_ u where c.creator_id = u.id) as creator_name, -(select avatar from user_ u where c.creator_id = u.id) as creator_avatar, -(select name from category ct where c.category_id = ct.id) as category_name, -(select count(*) from community_follower cf where cf.community_id = c.id) as number_of_subscribers, -(select count(*) from post p where p.community_id = c.id) as number_of_posts, -(select count(*) from comment co, post p where c.id = p.community_id and p.id = co.post_id) as number_of_comments, -hot_rank((select count(*) from community_follower cf where cf.community_id = c.id), c.published) as hot_rank -from community c; - -create materialized view community_aggregates_mview as select * from community_aggregates_view; - -create unique index idx_community_aggregates_mview_id on community_aggregates_mview (id); - -create view community_view as -with all_community as -( - select - ca.* - from community_aggregates_view ca -) - -select -ac.*, -u.id as user_id, -(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed -from user_ u -cross join all_community ac - -union all - -select -ac.*, -null as user_id, -null as subscribed -from all_community ac -; - -create view community_mview as -with all_community as -( - select - ca.* - from community_aggregates_mview ca -) - -select -ac.*, -u.id as user_id, -(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed -from user_ u -cross join all_community ac - -union all - -select -ac.*, -null as user_id, -null as subscribed -from all_community ac -; - --- community views -drop view community_moderator_view; -drop view community_follower_view; -drop view community_user_ban_view; - -create view community_moderator_view as -select *, -(select actor_id from user_ u where cm.user_id = u.id) as user_actor_id, -(select local from user_ u where cm.user_id = u.id) as user_local, -(select name from user_ u where cm.user_id = u.id) as user_name, -(select avatar from user_ u where cm.user_id = u.id), -(select actor_id from community c where cm.community_id = c.id) as community_actor_id, -(select local from community c where cm.community_id = c.id) as community_local, -(select name from community c where cm.community_id = c.id) as community_name -from community_moderator cm; - -create view community_follower_view as -select *, -(select actor_id from user_ u where cf.user_id = u.id) as user_actor_id, -(select local from user_ u where cf.user_id = u.id) as user_local, -(select name from user_ u where cf.user_id = u.id) as user_name, -(select avatar from user_ u where cf.user_id = u.id), -(select actor_id from community c where cf.community_id = c.id) as community_actor_id, -(select local from community c where cf.community_id = c.id) as community_local, -(select name from community c where cf.community_id = c.id) as community_name -from community_follower cf; - -create view community_user_ban_view as -select *, -(select actor_id from user_ u where cm.user_id = u.id) as user_actor_id, -(select local from user_ u where cm.user_id = u.id) as user_local, -(select name from user_ u where cm.user_id = u.id) as user_name, -(select avatar from user_ u where cm.user_id = u.id), -(select actor_id from community c where cm.community_id = c.id) as community_actor_id, -(select local from community c where cm.community_id = c.id) as community_local, -(select name from community c where cm.community_id = c.id) as community_name -from community_user_ban cm; - --- post_view -drop view post_view; -drop view post_mview; -drop materialized view post_aggregates_mview; -drop view post_aggregates_view; - --- regen post view -create view post_aggregates_view as -select -p.*, -(select u.banned from user_ u where p.creator_id = u.id) as banned, -(select cb.id::bool from community_user_ban cb where p.creator_id = cb.user_id and p.community_id = cb.community_id) as banned_from_community, -(select actor_id from user_ where p.creator_id = user_.id) as creator_actor_id, -(select local from user_ where p.creator_id = user_.id) as creator_local, -(select name from user_ where p.creator_id = user_.id) as creator_name, -(select avatar from user_ where p.creator_id = user_.id) as creator_avatar, -(select actor_id from community where p.community_id = community.id) as community_actor_id, -(select local from community where p.community_id = community.id) as community_local, -(select name from community where p.community_id = community.id) as community_name, -(select removed from community c where p.community_id = c.id) as community_removed, -(select deleted from community c where p.community_id = c.id) as community_deleted, -(select nsfw from community c where p.community_id = c.id) as community_nsfw, -(select count(*) from comment where comment.post_id = p.id) as number_of_comments, -coalesce(sum(pl.score), 0) as score, -count (case when pl.score = 1 then 1 else null end) as upvotes, -count (case when pl.score = -1 then 1 else null end) as downvotes, -hot_rank(coalesce(sum(pl.score) , 0), - ( - case when (p.published < ('now'::timestamp - '1 month'::interval)) then p.published -- Prevents necro-bumps - else greatest(c.recent_comment_time, p.published) - end - ) -) as hot_rank, -( - case when (p.published < ('now'::timestamp - '1 month'::interval)) then p.published -- Prevents necro-bumps - else greatest(c.recent_comment_time, p.published) - end -) as newest_activity_time -from post p -left join post_like pl on p.id = pl.post_id -left join ( - select post_id, - max(published) as recent_comment_time - from comment - group by 1 -) c on p.id = c.post_id -group by p.id, c.recent_comment_time; - -create materialized view post_aggregates_mview as select * from post_aggregates_view; - -create unique index idx_post_aggregates_mview_id on post_aggregates_mview (id); - -create view post_view as -with all_post as ( - select - pa.* - from post_aggregates_view pa -) -select -ap.*, -u.id as user_id, -coalesce(pl.score, 0) as my_vote, -(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, -(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, -(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved -from user_ u -cross join all_post ap -left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id - -union all - -select -ap.*, -null as user_id, -null as my_vote, -null as subscribed, -null as read, -null as saved -from all_post ap -; - -create view post_mview as -with all_post as ( - select - pa.* - from post_aggregates_mview pa -) -select -ap.*, -u.id as user_id, -coalesce(pl.score, 0) as my_vote, -(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, -(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, -(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved -from user_ u -cross join all_post ap -left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id - -union all - -select -ap.*, -null as user_id, -null as my_vote, -null as subscribed, -null as read, -null as saved -from all_post ap -; - - --- reply_view, comment_view, user_mention -drop view reply_view; -drop view user_mention_view; -drop view user_mention_mview; -drop view comment_view; -drop view comment_mview; -drop materialized view comment_aggregates_mview; -drop view comment_aggregates_view; - --- reply and comment view -create view comment_aggregates_view as -select -c.*, -(select community_id from post p where p.id = c.post_id), -(select co.actor_id from post p, community co where p.id = c.post_id and p.community_id = co.id) as community_actor_id, -(select co.local from post p, community co where p.id = c.post_id and p.community_id = co.id) as community_local, -(select co.name from post p, community co where p.id = c.post_id and p.community_id = co.id) as community_name, -(select u.banned from user_ u where c.creator_id = u.id) as banned, -(select cb.id::bool from community_user_ban cb, post p where c.creator_id = cb.user_id and p.id = c.post_id and p.community_id = cb.community_id) as banned_from_community, -(select actor_id from user_ where c.creator_id = user_.id) as creator_actor_id, -(select local from user_ where c.creator_id = user_.id) as creator_local, -(select name from user_ where c.creator_id = user_.id) as creator_name, -(select avatar from user_ where c.creator_id = user_.id) as creator_avatar, -coalesce(sum(cl.score), 0) as score, -count (case when cl.score = 1 then 1 else null end) as upvotes, -count (case when cl.score = -1 then 1 else null end) as downvotes, -hot_rank(coalesce(sum(cl.score) , 0), c.published) as hot_rank -from comment c -left join comment_like cl on c.id = cl.comment_id -group by c.id; - -create materialized view comment_aggregates_mview as select * from comment_aggregates_view; - -create unique index idx_comment_aggregates_mview_id on comment_aggregates_mview (id); - -create view comment_view as -with all_comment as -( - select - ca.* - from comment_aggregates_view ca -) - -select -ac.*, -u.id as user_id, -coalesce(cl.score, 0) as my_vote, -(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.community_id = cf.community_id) as subscribed, -(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved -from user_ u -cross join all_comment ac -left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id - -union all - -select - ac.*, - null as user_id, - null as my_vote, - null as subscribed, - null as saved -from all_comment ac -; - -create view comment_mview as -with all_comment as -( - select - ca.* - from comment_aggregates_mview ca -) - -select -ac.*, -u.id as user_id, -coalesce(cl.score, 0) as my_vote, -(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.community_id = cf.community_id) as subscribed, -(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved -from user_ u -cross join all_comment ac -left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id - -union all - -select - ac.*, - null as user_id, - null as my_vote, - null as subscribed, - null as saved -from all_comment ac -; - --- Do the reply_view referencing the comment_mview -create view reply_view as -with closereply as ( - select - c2.id, - c2.creator_id as sender_id, - c.creator_id as recipient_id - from comment c - inner join comment c2 on c.id = c2.parent_id - where c2.creator_id != c.creator_id - -- Do union where post is null - union - select - c.id, - c.creator_id as sender_id, - p.creator_id as recipient_id - from comment c, post p - where c.post_id = p.id and c.parent_id is null and c.creator_id != p.creator_id -) -select cv.*, -closereply.recipient_id -from comment_mview cv, closereply -where closereply.id = cv.id -; - --- user mention -create view user_mention_view as -select - c.id, - um.id as user_mention_id, - c.creator_id, - c.creator_actor_id, - c.creator_local, - c.post_id, - c.parent_id, - c.content, - c.removed, - um.read, - c.published, - c.updated, - c.deleted, - c.community_id, - c.community_actor_id, - c.community_local, - c.community_name, - c.banned, - c.banned_from_community, - c.creator_name, - c.creator_avatar, - c.score, - c.upvotes, - c.downvotes, - c.hot_rank, - c.user_id, - c.my_vote, - c.saved, - um.recipient_id, - (select actor_id from user_ u where u.id = um.recipient_id) as recipient_actor_id, - (select local from user_ u where u.id = um.recipient_id) as recipient_local -from user_mention um, comment_view c -where um.comment_id = c.id; - - -create view user_mention_mview as -with all_comment as -( - select - ca.* - from comment_aggregates_mview ca -) - -select - ac.id, - um.id as user_mention_id, - ac.creator_id, - ac.creator_actor_id, - ac.creator_local, - ac.post_id, - ac.parent_id, - ac.content, - ac.removed, - um.read, - ac.published, - ac.updated, - ac.deleted, - ac.community_id, - ac.community_actor_id, - ac.community_local, - ac.community_name, - ac.banned, - ac.banned_from_community, - ac.creator_name, - ac.creator_avatar, - ac.score, - ac.upvotes, - ac.downvotes, - ac.hot_rank, - u.id as user_id, - coalesce(cl.score, 0) as my_vote, - (select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved, - um.recipient_id, - (select actor_id from user_ u where u.id = um.recipient_id) as recipient_actor_id, - (select local from user_ u where u.id = um.recipient_id) as recipient_local -from user_ u -cross join all_comment ac -left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id -left join user_mention um on um.comment_id = ac.id - -union all - -select - ac.id, - um.id as user_mention_id, - ac.creator_id, - ac.creator_actor_id, - ac.creator_local, - ac.post_id, - ac.parent_id, - ac.content, - ac.removed, - um.read, - ac.published, - ac.updated, - ac.deleted, - ac.community_id, - ac.community_actor_id, - ac.community_local, - ac.community_name, - ac.banned, - ac.banned_from_community, - ac.creator_name, - ac.creator_avatar, - ac.score, - ac.upvotes, - ac.downvotes, - ac.hot_rank, - null as user_id, - null as my_vote, - null as saved, - um.recipient_id, - (select actor_id from user_ u where u.id = um.recipient_id) as recipient_actor_id, - (select local from user_ u where u.id = um.recipient_id) as recipient_local -from all_comment ac -left join user_mention um on um.comment_id = ac.id -; - diff --git a/server/migrations/2020-04-21-123957_remove_unique_user_constraints/down.sql b/server/migrations/2020-04-21-123957_remove_unique_user_constraints/down.sql deleted file mode 100644 index a172581a..00000000 --- a/server/migrations/2020-04-21-123957_remove_unique_user_constraints/down.sql +++ /dev/null @@ -1,4 +0,0 @@ --- The username index -drop index idx_user_name_lower_actor_id; -create unique index idx_user_name_lower on user_ (lower(name)); - diff --git a/server/migrations/2020-04-21-123957_remove_unique_user_constraints/up.sql b/server/migrations/2020-04-21-123957_remove_unique_user_constraints/up.sql deleted file mode 100644 index 969eab0b..00000000 --- a/server/migrations/2020-04-21-123957_remove_unique_user_constraints/up.sql +++ /dev/null @@ -1,2 +0,0 @@ -drop index idx_user_name_lower; -create unique index idx_user_name_lower_actor_id on user_ (lower(name), lower(actor_id)); diff --git a/server/migrations/2020-05-05-210233_add_activitypub_for_private_messages/down.sql b/server/migrations/2020-05-05-210233_add_activitypub_for_private_messages/down.sql deleted file mode 100644 index 15c92859..00000000 --- a/server/migrations/2020-05-05-210233_add_activitypub_for_private_messages/down.sql +++ /dev/null @@ -1,21 +0,0 @@ -drop materialized view private_message_mview; -drop view private_message_view; - -alter table private_message -drop column ap_id, -drop column local; - -create view private_message_view as -select -pm.*, -u.name as creator_name, -u.avatar as creator_avatar, -u2.name as recipient_name, -u2.avatar as recipient_avatar -from private_message pm -inner join user_ u on u.id = pm.creator_id -inner join user_ u2 on u2.id = pm.recipient_id; - -create materialized view private_message_mview as select * from private_message_view; - -create unique index idx_private_message_mview_id on private_message_mview (id); diff --git a/server/migrations/2020-05-05-210233_add_activitypub_for_private_messages/up.sql b/server/migrations/2020-05-05-210233_add_activitypub_for_private_messages/up.sql deleted file mode 100644 index 627be1f3..00000000 --- a/server/migrations/2020-05-05-210233_add_activitypub_for_private_messages/up.sql +++ /dev/null @@ -1,25 +0,0 @@ -alter table private_message -add column ap_id character varying(255) not null default 'changeme', -- This needs to be checked and updated in code, building from the site url if local -add column local boolean not null default true -; - -drop materialized view private_message_mview; -drop view private_message_view; -create view private_message_view as -select -pm.*, -u.name as creator_name, -u.avatar as creator_avatar, -u.actor_id as creator_actor_id, -u.local as creator_local, -u2.name as recipient_name, -u2.avatar as recipient_avatar, -u2.actor_id as recipient_actor_id, -u2.local as recipient_local -from private_message pm -inner join user_ u on u.id = pm.creator_id -inner join user_ u2 on u2.id = pm.recipient_id; - -create materialized view private_message_mview as select * from private_message_view; - -create unique index idx_private_message_mview_id on private_message_mview (id); diff --git a/server/query_testing/apache_bench_report.sh b/server/query_testing/apache_bench_report.sh index 06ceb484..62b3e863 100755 --- a/server/query_testing/apache_bench_report.sh +++ b/server/query_testing/apache_bench_report.sh @@ -11,12 +11,6 @@ declare -a arr=( "https://torrents-csv.ml/service/search?q=wheel&page=1&type_=torrent" ) -## check if ab installed -if ! [ -x "$(command -v ab)" ]; then - echo 'Error: ab (Apache Bench) is not installed. https://httpd.apache.org/docs/2.4/programs/ab.html' >&2 - exit 1 -fi - ## now loop through the above array for i in "${arr[@]}" do diff --git a/server/query_testing/api_benchmark.sh b/server/query_testing/api_benchmark.sh index 9f06580a..8f8c65f1 100755 --- a/server/query_testing/api_benchmark.sh +++ b/server/query_testing/api_benchmark.sh @@ -15,12 +15,6 @@ declare -a arr=( "/api/v1/post/list?sort=Hot&type_=All" ) -## check if ab installed -if ! [ -x "$(command -v ab)" ]; then - echo 'Error: ab (Apache Bench) is not installed. https://httpd.apache.org/docs/2.4/programs/ab.html' >&2 - exit 1 -fi - ## now loop through the above array for path in "${arr[@]}" do diff --git a/server/src/api/comment.rs b/server/src/api/comment.rs index 369cba5c..1528f509 100644 --- a/server/src/api/comment.rs +++ b/server/src/api/comment.rs @@ -1,41 +1,8 @@ -use crate::{ - api::{APIError, Oper, Perform}, - apub::{ApubLikeableType, ApubObjectType}, - db::{ - comment::*, - comment_view::*, - community_view::*, - moderator::*, - post::*, - site_view::*, - user::*, - user_mention::*, - user_view::*, - Crud, - Likeable, - ListingType, - Saveable, - SortType, - }, - naive_now, - remove_slurs, - scrape_text_for_mentions, - send_email, - settings::Settings, - websocket::{ - server::{JoinCommunityRoom, SendComment}, - UserOperation, - WebsocketInfo, - }, - MentionData, -}; -use diesel::{ - r2d2::{ConnectionManager, Pool}, - PgConnection, -}; -use failure::Error; +use super::*; +use crate::send_email; +use crate::settings::Settings; +use diesel::PgConnection; use log::error; -use serde::{Deserialize, Serialize}; use std::str::FromStr; #[derive(Serialize, Deserialize)] @@ -97,14 +64,8 @@ pub struct GetCommentsResponse { comments: Vec, } -impl Perform for Oper { - type Response = CommentResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &CreateComment = &self.data; let claims = match Claims::decode(&data.auth) { @@ -114,7 +75,7 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; + let hostname = &format!("https://{}", Settings::get().hostname); // Check for a community ban let post = Post::read(&conn, data.post_id)?; @@ -123,8 +84,7 @@ impl Perform for Oper { } // Check for a site ban - let user = User_::read(&conn, user_id)?; - if user.banned { + if UserView::read(&conn, user_id)?.banned { return Err(APIError::err("site_ban").into()); } @@ -138,7 +98,6 @@ impl Perform for Oper { removed: None, deleted: None, read: None, - published: None, updated: None, ap_id: "changeme".into(), local: true, @@ -149,16 +108,112 @@ impl Perform for Oper { Err(_e) => return Err(APIError::err("couldnt_create_comment").into()), }; - let updated_comment = match Comment::update_ap_id(&conn, inserted_comment.id) { + match Comment::update_ap_id(&conn, inserted_comment.id) { Ok(comment) => comment, Err(_e) => return Err(APIError::err("couldnt_create_comment").into()), }; - updated_comment.send_create(&user, &conn)?; + let mut recipient_ids = Vec::new(); // Scan the comment for user mentions, add those rows - let mentions = scrape_text_for_mentions(&comment_form.content); - let recipient_ids = send_local_notifs(&conn, &mentions, &updated_comment, &user, &post); + let extracted_usernames = extract_usernames(&comment_form.content); + + for username_mention in &extracted_usernames { + if let Ok(mention_user) = User_::read_from_name(&conn, (*username_mention).to_string()) { + // You can't mention yourself + // At some point, make it so you can't tag the parent creator either + // This can cause two notifications, one for reply and the other for mention + if mention_user.id != user_id { + recipient_ids.push(mention_user.id); + + let user_mention_form = UserMentionForm { + recipient_id: mention_user.id, + comment_id: inserted_comment.id, + read: None, + }; + + // Allow this to fail softly, since comment edits might re-update or replace it + // Let the uniqueness handle this fail + match UserMention::create(&conn, &user_mention_form) { + Ok(_mention) => (), + Err(_e) => error!("{}", &_e), + }; + + // Send an email to those users that have notifications on + if mention_user.send_notifications_to_email { + if let Some(mention_email) = mention_user.email { + let subject = &format!( + "{} - Mentioned by {}", + Settings::get().hostname, + claims.username + ); + let html = &format!( + "

User Mention


{} - {}

inbox", + claims.username, comment_form.content, hostname + ); + match send_email(subject, &mention_email, &mention_user.name, html) { + Ok(_o) => _o, + Err(e) => error!("{}", e), + }; + } + } + } + } + } + + // Send notifs to the parent commenter / poster + match data.parent_id { + Some(parent_id) => { + let parent_comment = Comment::read(&conn, parent_id)?; + if parent_comment.creator_id != user_id { + let parent_user = User_::read(&conn, parent_comment.creator_id)?; + recipient_ids.push(parent_user.id); + + if parent_user.send_notifications_to_email { + if let Some(comment_reply_email) = parent_user.email { + let subject = &format!( + "{} - Reply from {}", + Settings::get().hostname, + claims.username + ); + let html = &format!( + "

Comment Reply


{} - {}

inbox", + claims.username, comment_form.content, hostname + ); + match send_email(subject, &comment_reply_email, &parent_user.name, html) { + Ok(_o) => _o, + Err(e) => error!("{}", e), + }; + } + } + } + } + // Its a post + None => { + if post.creator_id != user_id { + let parent_user = User_::read(&conn, post.creator_id)?; + recipient_ids.push(parent_user.id); + + if parent_user.send_notifications_to_email { + if let Some(post_reply_email) = parent_user.email { + let subject = &format!( + "{} - Reply from {}", + Settings::get().hostname, + claims.username + ); + let html = &format!( + "

Post Reply


{} - {}

inbox", + claims.username, comment_form.content, hostname + ); + match send_email(subject, &post_reply_email, &parent_user.name, html) { + Ok(_o) => _o, + Err(e) => error!("{}", e), + }; + } + } + } + } + }; // You like your own comment by default let like_form = CommentLikeForm { @@ -173,39 +228,17 @@ impl Perform for Oper { Err(_e) => return Err(APIError::err("couldnt_like_comment").into()), }; - updated_comment.send_like(&user, &conn)?; - let comment_view = CommentView::read(&conn, inserted_comment.id, Some(user_id))?; - let mut res = CommentResponse { + Ok(CommentResponse { comment: comment_view, recipient_ids, - }; - - if let Some(ws) = websocket_info { - ws.chatserver.do_send(SendComment { - op: UserOperation::CreateComment, - comment: res.clone(), - my_id: ws.id, - }); - - // strip out the recipient_ids, so that - // users don't get double notifs - res.recipient_ids = Vec::new(); - } - - Ok(res) + }) } } -impl Perform for Oper { - type Response = CommentResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &EditComment = &self.data; let claims = match Claims::decode(&data.auth) { @@ -215,10 +248,6 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - - let user = User_::read(&conn, user_id)?; - let orig_comment = CommentView::read(&conn, data.edit_id, None)?; // You are allowed to mark the comment as read even if you're banned. @@ -243,7 +272,7 @@ impl Perform for Oper { } // Check for a site ban - if user.banned { + if UserView::read(&conn, user_id)?.banned { return Err(APIError::err("site_ban").into()); } } @@ -260,7 +289,6 @@ impl Perform for Oper { removed: data.removed.to_owned(), deleted: data.deleted.to_owned(), read: data.read.to_owned(), - published: None, updated: if data.read.is_some() { orig_comment.updated } else { @@ -270,31 +298,58 @@ impl Perform for Oper { local: read_comment.local, }; - let updated_comment = match Comment::update(&conn, data.edit_id, &comment_form) { + let _updated_comment = match Comment::update(&conn, data.edit_id, &comment_form) { Ok(comment) => comment, Err(_e) => return Err(APIError::err("couldnt_update_comment").into()), }; - if let Some(deleted) = data.deleted.to_owned() { - if deleted { - updated_comment.send_delete(&user, &conn)?; - } else { - updated_comment.send_undo_delete(&user, &conn)?; + let mut recipient_ids = Vec::new(); + + // Scan the comment for user mentions, add those rows + let extracted_usernames = extract_usernames(&comment_form.content); + + for username_mention in &extracted_usernames { + let mention_user = User_::read_from_name(&conn, (*username_mention).to_string()); + + if mention_user.is_ok() { + let mention_user_id = mention_user?.id; + + // You can't mention yourself + // At some point, make it so you can't tag the parent creator either + // This can cause two notifications, one for reply and the other for mention + if mention_user_id != user_id { + recipient_ids.push(mention_user_id); + + let user_mention_form = UserMentionForm { + recipient_id: mention_user_id, + comment_id: data.edit_id, + read: None, + }; + + // Allow this to fail softly, since comment edits might re-update or replace it + // Let the uniqueness handle this fail + match UserMention::create(&conn, &user_mention_form) { + Ok(_mention) => (), + Err(_e) => error!("{}", &_e), + } + } } - } else if let Some(removed) = data.removed.to_owned() { - if removed { - updated_comment.send_remove(&user, &conn)?; - } else { - updated_comment.send_undo_remove(&user, &conn)?; - } - } else { - updated_comment.send_update(&user, &conn)?; } - let post = Post::read(&conn, data.post_id)?; - - let mentions = scrape_text_for_mentions(&comment_form.content); - let recipient_ids = send_local_notifs(&conn, &mentions, &updated_comment, &user, &post); + // Add to recipient ids + match data.parent_id { + Some(parent_id) => { + let parent_comment = Comment::read(&conn, parent_id)?; + if parent_comment.creator_id != user_id { + let parent_user = User_::read(&conn, parent_comment.creator_id)?; + recipient_ids.push(parent_user.id); + } + } + None => { + let post = Post::read(&conn, data.post_id)?; + recipient_ids.push(post.creator_id); + } + } // Mod tables if let Some(removed) = data.removed.to_owned() { @@ -309,35 +364,15 @@ impl Perform for Oper { let comment_view = CommentView::read(&conn, data.edit_id, Some(user_id))?; - let mut res = CommentResponse { + Ok(CommentResponse { comment: comment_view, recipient_ids, - }; - - if let Some(ws) = websocket_info { - ws.chatserver.do_send(SendComment { - op: UserOperation::EditComment, - comment: res.clone(), - my_id: ws.id, - }); - - // strip out the recipient_ids, so that - // users don't get double notifs - res.recipient_ids = Vec::new(); - } - - Ok(res) + }) } } -impl Perform for Oper { - type Response = CommentResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &SaveComment = &self.data; let claims = match Claims::decode(&data.auth) { @@ -352,8 +387,6 @@ impl Perform for Oper { user_id, }; - let conn = pool.get()?; - if data.save { match CommentSaved::save(&conn, &comment_saved_form) { Ok(comment) => comment, @@ -375,14 +408,8 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = CommentResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &CreateCommentLike = &self.data; let claims = match Claims::decode(&data.auth) { @@ -394,8 +421,6 @@ impl Perform for Oper { let mut recipient_ids = Vec::new(); - let conn = pool.get()?; - // Don't do a downvote if site has downvotes disabled if data.score == -1 { let site = SiteView::read(&conn)?; @@ -411,8 +436,7 @@ impl Perform for Oper { } // Check for a site ban - let user = User_::read(&conn, user_id)?; - if user.banned { + if UserView::read(&conn, user_id)?.banned { return Err(APIError::err("site_ban").into()); } @@ -449,48 +473,20 @@ impl Perform for Oper { Ok(like) => like, Err(_e) => return Err(APIError::err("couldnt_like_comment").into()), }; - - if like_form.score == 1 { - comment.send_like(&user, &conn)?; - } else if like_form.score == -1 { - comment.send_dislike(&user, &conn)?; - } - } else { - comment.send_undo_like(&user, &conn)?; } // Have to refetch the comment to get the current state let liked_comment = CommentView::read(&conn, data.comment_id, Some(user_id))?; - let mut res = CommentResponse { + Ok(CommentResponse { comment: liked_comment, recipient_ids, - }; - - if let Some(ws) = websocket_info { - ws.chatserver.do_send(SendComment { - op: UserOperation::CreateCommentLike, - comment: res.clone(), - my_id: ws.id, - }); - - // strip out the recipient_ids, so that - // users don't get double notifs - res.recipient_ids = Vec::new(); - } - - Ok(res) + }) } } -impl Perform for Oper { - type Response = GetCommentsResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &GetComments = &self.data; let user_claims: Option = match &data.auth { @@ -509,8 +505,6 @@ impl Perform for Oper { let type_ = ListingType::from_str(&data.type_)?; let sort = SortType::from_str(&data.sort)?; - let conn = pool.get()?; - let comments = match CommentQueryBuilder::create(&conn) .listing_type(type_) .sort(&sort) @@ -524,123 +518,6 @@ impl Perform for Oper { Err(_e) => return Err(APIError::err("couldnt_get_comments").into()), }; - if let Some(ws) = websocket_info { - // You don't need to join the specific community room, bc this is already handled by - // GetCommunity - if data.community_id.is_none() { - if let Some(id) = ws.id { - // 0 is the "all" community - ws.chatserver.do_send(JoinCommunityRoom { - community_id: 0, - id, - }); - } - } - } - Ok(GetCommentsResponse { comments }) } } - -pub fn send_local_notifs( - conn: &PgConnection, - mentions: &[MentionData], - comment: &Comment, - user: &User_, - post: &Post, -) -> Vec { - let mut recipient_ids = Vec::new(); - let hostname = &format!("https://{}", Settings::get().hostname); - - // Send the local mentions - for mention in mentions - .iter() - .filter(|m| m.is_local() && m.name.ne(&user.name)) - .collect::>() - { - if let Ok(mention_user) = User_::read_from_name(&conn, &mention.name) { - // TODO - // At some point, make it so you can't tag the parent creator either - // This can cause two notifications, one for reply and the other for mention - recipient_ids.push(mention_user.id); - - let user_mention_form = UserMentionForm { - recipient_id: mention_user.id, - comment_id: comment.id, - read: None, - }; - - // Allow this to fail softly, since comment edits might re-update or replace it - // Let the uniqueness handle this fail - match UserMention::create(&conn, &user_mention_form) { - Ok(_mention) => (), - Err(_e) => error!("{}", &_e), - }; - - // Send an email to those users that have notifications on - if mention_user.send_notifications_to_email { - if let Some(mention_email) = mention_user.email { - let subject = &format!("{} - Mentioned by {}", Settings::get().hostname, user.name,); - let html = &format!( - "

User Mention


{} - {}

inbox", - user.name, comment.content, hostname - ); - match send_email(subject, &mention_email, &mention_user.name, html) { - Ok(_o) => _o, - Err(e) => error!("{}", e), - }; - } - } - } - } - - // Send notifs to the parent commenter / poster - match comment.parent_id { - Some(parent_id) => { - if let Ok(parent_comment) = Comment::read(&conn, parent_id) { - if parent_comment.creator_id != user.id { - if let Ok(parent_user) = User_::read(&conn, parent_comment.creator_id) { - recipient_ids.push(parent_user.id); - - if parent_user.send_notifications_to_email { - if let Some(comment_reply_email) = parent_user.email { - let subject = &format!("{} - Reply from {}", Settings::get().hostname, user.name,); - let html = &format!( - "

Comment Reply


{} - {}

inbox", - user.name, comment.content, hostname - ); - match send_email(subject, &comment_reply_email, &parent_user.name, html) { - Ok(_o) => _o, - Err(e) => error!("{}", e), - }; - } - } - } - } - } - } - // Its a post - None => { - if post.creator_id != user.id { - if let Ok(parent_user) = User_::read(&conn, post.creator_id) { - recipient_ids.push(parent_user.id); - - if parent_user.send_notifications_to_email { - if let Some(post_reply_email) = parent_user.email { - let subject = &format!("{} - Reply from {}", Settings::get().hostname, user.name,); - let html = &format!( - "

Post Reply


{} - {}

inbox", - user.name, comment.content, hostname - ); - match send_email(subject, &post_reply_email, &parent_user.name, html) { - Ok(_o) => _o, - Err(e) => error!("{}", e), - }; - } - } - } - } - } - }; - recipient_ids -} diff --git a/server/src/api/community.rs b/server/src/api/community.rs index cb412fcc..0ba7effc 100644 --- a/server/src/api/community.rs +++ b/server/src/api/community.rs @@ -1,40 +1,8 @@ -use crate::{ - api::{APIError, Oper, Perform}, - apub::{ - extensions::signatures::generate_actor_keypair, - make_apub_endpoint, - ActorType, - EndpointType, - }, - db::{ - community::*, - community_view::*, - moderator::*, - site::*, - user::*, - user_view::*, - Bannable, - Crud, - Followable, - Joinable, - SortType, - }, - naive_from_unix, - naive_now, - slur_check, - slurs_vec_to_str, - websocket::{ - server::{JoinCommunityRoom, SendCommunityRoomMessage}, - UserOperation, - WebsocketInfo, - }, -}; -use diesel::{ - r2d2::{ConnectionManager, Pool}, - PgConnection, -}; -use failure::Error; -use serde::{Deserialize, Serialize}; +use super::*; +use crate::apub::puller::{fetch_all_communities, fetch_remote_community}; +use crate::apub::{gen_keypair_str, make_apub_endpoint, EndpointType}; +use crate::settings::Settings; +use diesel::PgConnection; use std::str::FromStr; #[derive(Serialize, Deserialize)] @@ -73,6 +41,7 @@ pub struct ListCommunities { pub page: Option, pub limit: Option, pub auth: Option, + pub local_only: Option, } #[derive(Serialize, Deserialize, Debug)] @@ -90,7 +59,7 @@ pub struct BanFromCommunity { auth: String, } -#[derive(Serialize, Deserialize, Clone)] +#[derive(Serialize, Deserialize)] pub struct BanFromCommunityResponse { user: UserView, banned: bool, @@ -104,7 +73,7 @@ pub struct AddModToCommunity { auth: String, } -#[derive(Serialize, Deserialize, Clone)] +#[derive(Serialize, Deserialize)] pub struct AddModToCommunityResponse { moderators: Vec, } @@ -148,16 +117,17 @@ pub struct TransferCommunity { auth: String, } -impl Perform for Oper { - type Response = GetCommunityResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &GetCommunity = &self.data; + if data.name.is_some() + && Settings::get().federation.enabled + && data.name.as_ref().unwrap().contains('@') + { + return fetch_remote_community(data.name.as_ref().unwrap()); + } + let user_id: Option = match &data.auth { Some(auth) => match Claims::decode(&auth) { Ok(claims) => { @@ -169,27 +139,25 @@ impl Perform for Oper { None => None, }; - let conn = pool.get()?; - - let community = match data.id { - Some(id) => Community::read(&conn, id)?, + let community_id = match data.id { + Some(id) => id, None => { match Community::read_from_name( &conn, - &data.name.to_owned().unwrap_or_else(|| "main".to_string()), + data.name.to_owned().unwrap_or_else(|| "main".to_string()), ) { - Ok(community) => community, + Ok(community) => community.id, Err(_e) => return Err(APIError::err("couldnt_find_community").into()), } } }; - let community_view = match CommunityView::read(&conn, community.id, user_id) { + let community_view = match CommunityView::read(&conn, community_id, user_id) { Ok(community) => community, Err(_e) => return Err(APIError::err("couldnt_find_community").into()), }; - let moderators = match CommunityModeratorView::for_community(&conn, community.id) { + let moderators = match CommunityModeratorView::for_community(&conn, community_id) { Ok(moderators) => moderators, Err(_e) => return Err(APIError::err("couldnt_find_community").into()), }; @@ -200,44 +168,18 @@ impl Perform for Oper { let creator_user = admins.remove(creator_index); admins.insert(0, creator_user); - let online = if let Some(ws) = websocket_info { - if let Some(id) = ws.id { - ws.chatserver.do_send(JoinCommunityRoom { - community_id: community.id, - id, - }); - } - - // TODO - 1 - // let fut = async { - // ws.chatserver.send(GetCommunityUsersOnline {community_id}).await.unwrap() - // }; - // Runtime::new().unwrap().block_on(fut) - } else { - 0 - }; - - let res = GetCommunityResponse { + // Return the jwt + Ok(GetCommunityResponse { community: community_view, moderators, admins, - online, - }; - - // Return the jwt - Ok(res) + online: 0, + }) } } -impl Perform for Oper { - type Response = CommunityResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &CreateCommunity = &self.data; let claims = match Claims::decode(&data.auth) { @@ -261,15 +203,13 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - // Check for a site ban if UserView::read(&conn, user_id)?.banned { return Err(APIError::err("site_ban").into()); } // When you create a community, make sure the user becomes a moderator and a follower - let keypair = generate_actor_keypair()?; + let (community_public_key, community_private_key) = gen_keypair_str(); let community_form = CommunityForm { name: data.name.to_owned(), @@ -283,10 +223,9 @@ impl Perform for Oper { updated: None, actor_id: make_apub_endpoint(EndpointType::Community, &data.name).to_string(), local: true, - private_key: Some(keypair.private_key), - public_key: Some(keypair.public_key), + private_key: Some(community_private_key), + public_key: Some(community_public_key), last_refreshed_at: None, - published: None, }; let inserted_community = match Community::create(&conn, &community_form) { @@ -324,14 +263,8 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = CommunityResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &EditCommunity = &self.data; if let Err(slurs) = slur_check(&data.name) { @@ -355,11 +288,8 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - // Check for a site ban - let user = User_::read(&conn, user_id)?; - if user.banned { + if UserView::read(&conn, user_id)?.banned { return Err(APIError::err("site_ban").into()); } @@ -393,10 +323,9 @@ impl Perform for Oper { private_key: read_community.private_key, public_key: read_community.public_key, last_refreshed_at: None, - published: None, }; - let updated_community = match Community::update(&conn, data.edit_id, &community_form) { + let _updated_community = match Community::update(&conn, data.edit_id, &community_form) { Ok(community) => community, Err(_e) => return Err(APIError::err("couldnt_update_community").into()), }; @@ -417,54 +346,25 @@ impl Perform for Oper { ModRemoveCommunity::create(&conn, &form)?; } - if let Some(deleted) = data.deleted.to_owned() { - if deleted { - updated_community.send_delete(&user, &conn)?; - } else { - updated_community.send_undo_delete(&user, &conn)?; - } - } else if let Some(removed) = data.removed.to_owned() { - if removed { - updated_community.send_remove(&user, &conn)?; - } else { - updated_community.send_undo_remove(&user, &conn)?; - } - } - let community_view = CommunityView::read(&conn, data.edit_id, Some(user_id))?; - let res = CommunityResponse { + Ok(CommunityResponse { community: community_view, - }; - - if let Some(ws) = websocket_info { - // Strip out the user id and subscribed when sending to others - let mut res_sent = res.clone(); - res_sent.community.user_id = None; - res_sent.community.subscribed = None; - - ws.chatserver.do_send(SendCommunityRoomMessage { - op: UserOperation::EditCommunity, - response: res_sent, - community_id: data.edit_id, - my_id: ws.id, - }); - } - - Ok(res) + }) } } -impl Perform for Oper { - type Response = ListCommunitiesResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &ListCommunities = &self.data; + let local_only = data.local_only.unwrap_or(false); + if Settings::get().federation.enabled && !local_only { + return Ok(ListCommunitiesResponse { + communities: fetch_all_communities()?, + }); + } + let user_claims: Option = match &data.auth { Some(auth) => match Claims::decode(&auth) { Ok(claims) => Some(claims.claims), @@ -485,8 +385,6 @@ impl Perform for Oper { let sort = SortType::from_str(&data.sort)?; - let conn = pool.get()?; - let communities = CommunityQueryBuilder::create(&conn) .sort(&sort) .for_user(user_id) @@ -500,14 +398,8 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = CommunityResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &FollowCommunity = &self.data; let claims = match Claims::decode(&data.auth) { @@ -517,41 +409,21 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - - let community = Community::read(&conn, data.community_id)?; let community_follower_form = CommunityFollowerForm { community_id: data.community_id, user_id, }; - if community.local { - if data.follow { - match CommunityFollower::follow(&conn, &community_follower_form) { - Ok(user) => user, - Err(_e) => return Err(APIError::err("community_follower_already_exists").into()), - }; - } else { - match CommunityFollower::unfollow(&conn, &community_follower_form) { - Ok(user) => user, - Err(_e) => return Err(APIError::err("community_follower_already_exists").into()), - }; - } + if data.follow { + match CommunityFollower::follow(&conn, &community_follower_form) { + Ok(user) => user, + Err(_e) => return Err(APIError::err("community_follower_already_exists").into()), + }; } else { - let user = User_::read(&conn, user_id)?; - - if data.follow { - // Dont actually add to the community followers here, because you need - // to wait for the accept - user.send_follow(&community.actor_id, &conn)?; - } else { - user.send_unfollow(&community.actor_id, &conn)?; - match CommunityFollower::unfollow(&conn, &community_follower_form) { - Ok(user) => user, - Err(_e) => return Err(APIError::err("community_follower_already_exists").into()), - }; - } - // TODO: this needs to return a "pending" state, until Accept is received from the remote server + match CommunityFollower::ignore(&conn, &community_follower_form) { + Ok(user) => user, + Err(_e) => return Err(APIError::err("community_follower_already_exists").into()), + }; } let community_view = CommunityView::read(&conn, data.community_id, Some(user_id))?; @@ -562,14 +434,8 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = GetFollowedCommunitiesResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &GetFollowedCommunities = &self.data; let claims = match Claims::decode(&data.auth) { @@ -579,8 +445,6 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - let communities: Vec = match CommunityFollowerView::for_user(&conn, user_id) { Ok(communities) => communities, @@ -592,14 +456,8 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = BanFromCommunityResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &BanFromCommunity = &self.data; let claims = match Claims::decode(&data.auth) { @@ -614,8 +472,6 @@ impl Perform for Oper { user_id: data.user_id, }; - let conn = pool.get()?; - if data.ban { match CommunityUserBan::ban(&conn, &community_user_ban_form) { Ok(user) => user, @@ -646,32 +502,15 @@ impl Perform for Oper { let user_view = UserView::read(&conn, data.user_id)?; - let res = BanFromCommunityResponse { + Ok(BanFromCommunityResponse { user: user_view, banned: data.ban, - }; - - if let Some(ws) = websocket_info { - ws.chatserver.do_send(SendCommunityRoomMessage { - op: UserOperation::BanFromCommunity, - response: res.clone(), - community_id: data.community_id, - my_id: ws.id, - }); - } - - Ok(res) + }) } } -impl Perform for Oper { - type Response = AddModToCommunityResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &AddModToCommunity = &self.data; let claims = match Claims::decode(&data.auth) { @@ -686,8 +525,6 @@ impl Perform for Oper { user_id: data.user_id, }; - let conn = pool.get()?; - if data.added { match CommunityModerator::join(&conn, &community_moderator_form) { Ok(user) => user, @@ -711,29 +548,12 @@ impl Perform for Oper { let moderators = CommunityModeratorView::for_community(&conn, data.community_id)?; - let res = AddModToCommunityResponse { moderators }; - - if let Some(ws) = websocket_info { - ws.chatserver.do_send(SendCommunityRoomMessage { - op: UserOperation::AddModToCommunity, - response: res.clone(), - community_id: data.community_id, - my_id: ws.id, - }); - } - - Ok(res) + Ok(AddModToCommunityResponse { moderators }) } } -impl Perform for Oper { - type Response = GetCommunityResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &TransferCommunity = &self.data; let claims = match Claims::decode(&data.auth) { @@ -743,8 +563,6 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - let read_community = Community::read(&conn, data.community_id)?; let site_creator_id = Site::read(&conn, 1)?.creator_id; @@ -763,7 +581,7 @@ impl Perform for Oper { title: read_community.title, description: read_community.description, category_id: read_community.category_id, - creator_id: data.user_id, // This makes the new user the community creator + creator_id: data.user_id, removed: None, deleted: None, nsfw: read_community.nsfw, @@ -773,7 +591,6 @@ impl Perform for Oper { private_key: read_community.private_key, public_key: read_community.public_key, last_refreshed_at: None, - published: None, }; let _updated_community = match Community::update(&conn, data.community_id, &community_form) { diff --git a/server/src/api/mod.rs b/server/src/api/mod.rs index 5120e9bc..e4fdfee6 100644 --- a/server/src/api/mod.rs +++ b/server/src/api/mod.rs @@ -1,9 +1,29 @@ -use crate::websocket::WebsocketInfo; -use diesel::{ - r2d2::{ConnectionManager, Pool}, - PgConnection, +use crate::db::category::*; +use crate::db::comment::*; +use crate::db::comment_view::*; +use crate::db::community::*; +use crate::db::community_view::*; +use crate::db::moderator::*; +use crate::db::moderator_views::*; +use crate::db::password_reset_request::*; +use crate::db::post::*; +use crate::db::post_view::*; +use crate::db::private_message::*; +use crate::db::private_message_view::*; +use crate::db::site::*; +use crate::db::site_view::*; +use crate::db::user::*; +use crate::db::user_mention::*; +use crate::db::user_mention_view::*; +use crate::db::user_view::*; +use crate::db::*; +use crate::{ + extract_usernames, fetch_iframely_and_pictshare_data, naive_from_unix, naive_now, remove_slurs, + slur_check, slurs_vec_to_str, }; +use diesel::PgConnection; use failure::Error; +use serde::{Deserialize, Serialize}; pub mod comment; pub mod community; @@ -29,18 +49,14 @@ pub struct Oper { data: T, } -impl Oper { - pub fn new(data: Data) -> Oper { +impl Oper { + pub fn new(data: T) -> Oper { Oper { data } } } -pub trait Perform { - type Response: serde::ser::Serialize + Send; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result; +pub trait Perform { + fn perform(&self, conn: &PgConnection) -> Result + where + T: Sized; } diff --git a/server/src/api/post.rs b/server/src/api/post.rs index 9bbde791..cfb71941 100644 --- a/server/src/api/post.rs +++ b/server/src/api/post.rs @@ -1,41 +1,9 @@ -use crate::{ - api::{APIError, Oper, Perform}, - apub::{ApubLikeableType, ApubObjectType}, - db::{ - comment_view::*, - community_view::*, - moderator::*, - post::*, - post_view::*, - site::*, - site_view::*, - user::*, - user_view::*, - Crud, - Likeable, - ListingType, - Saveable, - SortType, - }, - fetch_iframely_and_pictshare_data, - naive_now, - slur_check, - slurs_vec_to_str, - websocket::{ - server::{JoinCommunityRoom, JoinPostRoom, SendPost}, - UserOperation, - WebsocketInfo, - }, -}; -use diesel::{ - r2d2::{ConnectionManager, Pool}, - PgConnection, -}; -use failure::Error; -use serde::{Deserialize, Serialize}; +use super::*; +use crate::settings::Settings; +use diesel::PgConnection; use std::str::FromStr; -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize)] pub struct CreatePost { name: String, url: Option, @@ -112,14 +80,8 @@ pub struct SavePost { auth: String, } -impl Perform for Oper { - type Response = PostResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &CreatePost = &self.data; let claims = match Claims::decode(&data.auth) { @@ -139,16 +101,13 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - // Check for a community ban if CommunityUserBanView::get(&conn, user_id, data.community_id).is_ok() { return Err(APIError::err("community_ban").into()); } // Check for a site ban - let user = User_::read(&conn, user_id)?; - if user.banned { + if UserView::read(&conn, user_id)?.banned { return Err(APIError::err("site_ban").into()); } @@ -174,7 +133,6 @@ impl Perform for Oper { thumbnail_url: pictshare_thumbnail, ap_id: "changeme".into(), local: true, - published: None, }; let inserted_post = match Post::create(&conn, &post_form) { @@ -190,13 +148,11 @@ impl Perform for Oper { } }; - let updated_post = match Post::update_ap_id(&conn, inserted_post.id) { + match Post::update_ap_id(&conn, inserted_post.id) { Ok(post) => post, Err(_e) => return Err(APIError::err("couldnt_create_post").into()), }; - updated_post.send_create(&user, &conn)?; - // They like their own post by default let like_form = PostLikeForm { post_id: inserted_post.id, @@ -204,41 +160,24 @@ impl Perform for Oper { score: 1, }; + // Only add the like if the score isnt 0 let _inserted_like = match PostLike::like(&conn, &like_form) { Ok(like) => like, Err(_e) => return Err(APIError::err("couldnt_like_post").into()), }; - updated_post.send_like(&user, &conn)?; - // Refetch the view let post_view = match PostView::read(&conn, inserted_post.id, Some(user_id)) { Ok(post) => post, Err(_e) => return Err(APIError::err("couldnt_find_post").into()), }; - let res = PostResponse { post: post_view }; - - if let Some(ws) = websocket_info { - ws.chatserver.do_send(SendPost { - op: UserOperation::CreatePost, - post: res.clone(), - my_id: ws.id, - }); - } - - Ok(res) + Ok(PostResponse { post: post_view }) } } -impl Perform for Oper { - type Response = GetPostResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &GetPost = &self.data; let user_id: Option = match &data.auth { @@ -252,8 +191,6 @@ impl Perform for Oper { None => None, }; - let conn = pool.get()?; - let post_view = match PostView::read(&conn, data.id, user_id) { Ok(post) => post, Err(_e) => return Err(APIError::err("couldnt_find_post").into()), @@ -275,24 +212,6 @@ impl Perform for Oper { let creator_user = admins.remove(creator_index); admins.insert(0, creator_user); - let online = if let Some(ws) = websocket_info { - if let Some(id) = ws.id { - ws.chatserver.do_send(JoinPostRoom { - post_id: data.id, - id, - }); - } - - // TODO - 1 - // let fut = async { - // ws.chatserver.send(GetPostUsersOnline {post_id: data.id}).await.unwrap() - // }; - // Runtime::new().unwrap().block_on(fut) - } else { - 0 - }; - // Return the jwt Ok(GetPostResponse { post: post_view, @@ -300,21 +219,20 @@ impl Perform for Oper { community, moderators, admins, - online, + online: 0, }) } } -impl Perform for Oper { - type Response = GetPostsResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &GetPosts = &self.data; + if Settings::get().federation.enabled { + // TODO: intercept here (but the type is wrong) + //get_remote_community_posts(get_posts.community_id.unwrap()) + } + let user_claims: Option = match &data.auth { Some(auth) => match Claims::decode(&auth) { Ok(claims) => Some(claims.claims), @@ -336,8 +254,6 @@ impl Perform for Oper { let type_ = ListingType::from_str(&data.type_)?; let sort = SortType::from_str(&data.sort)?; - let conn = pool.get()?; - let posts = match PostQueryBuilder::create(&conn) .listing_type(type_) .sort(&sort) @@ -352,32 +268,12 @@ impl Perform for Oper { Err(_e) => return Err(APIError::err("couldnt_get_posts").into()), }; - if let Some(ws) = websocket_info { - // You don't need to join the specific community room, bc this is already handled by - // GetCommunity - if data.community_id.is_none() { - if let Some(id) = ws.id { - // 0 is the "all" community - ws.chatserver.do_send(JoinCommunityRoom { - community_id: 0, - id, - }); - } - } - } - Ok(GetPostsResponse { posts }) } } -impl Perform for Oper { - type Response = PostResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &CreatePostLike = &self.data; let claims = match Claims::decode(&data.auth) { @@ -387,8 +283,6 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - // Don't do a downvote if site has downvotes disabled if data.score == -1 { let site = SiteView::read(&conn)?; @@ -404,8 +298,7 @@ impl Perform for Oper { } // Check for a site ban - let user = User_::read(&conn, user_id)?; - if user.banned { + if UserView::read(&conn, user_id)?.banned { return Err(APIError::err("site_ban").into()); } @@ -425,14 +318,6 @@ impl Perform for Oper { Ok(like) => like, Err(_e) => return Err(APIError::err("couldnt_like_post").into()), }; - - if like_form.score == 1 { - post.send_like(&user, &conn)?; - } else if like_form.score == -1 { - post.send_dislike(&user, &conn)?; - } - } else { - post.send_undo_like(&user, &conn)?; } let post_view = match PostView::read(&conn, data.post_id, Some(user_id)) { @@ -440,28 +325,13 @@ impl Perform for Oper { Err(_e) => return Err(APIError::err("couldnt_find_post").into()), }; - let res = PostResponse { post: post_view }; - - if let Some(ws) = websocket_info { - ws.chatserver.do_send(SendPost { - op: UserOperation::CreatePostLike, - post: res.clone(), - my_id: ws.id, - }); - } - - Ok(res) + // just output the score + Ok(PostResponse { post: post_view }) } } -impl Perform for Oper { - type Response = PostResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &EditPost = &self.data; if let Err(slurs) = slur_check(&data.name) { @@ -481,8 +351,6 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - // Verify its the creator or a mod or admin let mut editors: Vec = vec![data.creator_id]; editors.append( @@ -502,8 +370,7 @@ impl Perform for Oper { } // Check for a site ban - let user = User_::read(&conn, user_id)?; - if user.banned { + if UserView::read(&conn, user_id)?.banned { return Err(APIError::err("site_ban").into()); } @@ -531,10 +398,9 @@ impl Perform for Oper { thumbnail_url: pictshare_thumbnail, ap_id: read_post.ap_id, local: read_post.local, - published: None, }; - let updated_post = match Post::update(&conn, data.edit_id, &post_form) { + let _updated_post = match Post::update(&conn, data.edit_id, &post_form) { Ok(post) => post, Err(e) => { let err_type = if e.to_string() == "value too long for type character varying(200)" { @@ -576,46 +442,14 @@ impl Perform for Oper { ModStickyPost::create(&conn, &form)?; } - if let Some(deleted) = data.deleted.to_owned() { - if deleted { - updated_post.send_delete(&user, &conn)?; - } else { - updated_post.send_undo_delete(&user, &conn)?; - } - } else if let Some(removed) = data.removed.to_owned() { - if removed { - updated_post.send_remove(&user, &conn)?; - } else { - updated_post.send_undo_remove(&user, &conn)?; - } - } else { - updated_post.send_update(&user, &conn)?; - } - let post_view = PostView::read(&conn, data.edit_id, Some(user_id))?; - let res = PostResponse { post: post_view }; - - if let Some(ws) = websocket_info { - ws.chatserver.do_send(SendPost { - op: UserOperation::EditPost, - post: res.clone(), - my_id: ws.id, - }); - } - - Ok(res) + Ok(PostResponse { post: post_view }) } } -impl Perform for Oper { - type Response = PostResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &SavePost = &self.data; let claims = match Claims::decode(&data.auth) { @@ -630,8 +464,6 @@ impl Perform for Oper { user_id, }; - let conn = pool.get()?; - if data.save { match PostSaved::save(&conn, &post_saved_form) { Ok(post) => post, diff --git a/server/src/api/site.rs b/server/src/api/site.rs index faee30cb..6bd90149 100644 --- a/server/src/api/site.rs +++ b/server/src/api/site.rs @@ -1,35 +1,9 @@ -use super::user::Register; -use crate::{ - api::{APIError, Oper, Perform}, - apub::fetcher::search_by_apub_id, - db::{ - category::*, - comment_view::*, - community_view::*, - moderator::*, - moderator_views::*, - post_view::*, - site::*, - site_view::*, - user::*, - user_view::*, - Crud, - SearchType, - SortType, - }, - naive_now, - settings::Settings, - slur_check, - slurs_vec_to_str, - websocket::{server::SendAllMessage, UserOperation, WebsocketInfo}, -}; -use diesel::{ - r2d2::{ConnectionManager, Pool}, - PgConnection, -}; -use failure::Error; -use log::{debug, info}; -use serde::{Deserialize, Serialize}; +use super::*; +use crate::api::user::Register; +use crate::api::{Oper, Perform}; +use crate::settings::Settings; +use diesel::PgConnection; +use log::info; use std::str::FromStr; #[derive(Serialize, Deserialize)] @@ -40,7 +14,7 @@ pub struct ListCategoriesResponse { categories: Vec, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize)] pub struct Search { q: String, type_: String, @@ -51,13 +25,13 @@ pub struct Search { auth: Option, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize)] pub struct SearchResponse { - pub type_: String, - pub comments: Vec, - pub posts: Vec, - pub communities: Vec, - pub users: Vec, + type_: String, + comments: Vec, + posts: Vec, + communities: Vec, + users: Vec, } #[derive(Serialize, Deserialize)] @@ -104,7 +78,7 @@ pub struct EditSite { #[derive(Serialize, Deserialize)] pub struct GetSite {} -#[derive(Serialize, Deserialize, Clone)] +#[derive(Serialize, Deserialize)] pub struct SiteResponse { site: SiteView, } @@ -123,34 +97,10 @@ pub struct TransferSite { auth: String, } -#[derive(Serialize, Deserialize)] -pub struct GetSiteConfig { - auth: String, -} - -#[derive(Serialize, Deserialize)] -pub struct GetSiteConfigResponse { - config_hjson: String, -} - -#[derive(Serialize, Deserialize)] -pub struct SaveSiteConfig { - config_hjson: String, - auth: String, -} - -impl Perform for Oper { - type Response = ListCategoriesResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let _data: &ListCategories = &self.data; - let conn = pool.get()?; - let categories: Vec = Category::list_all(&conn)?; // Return the jwt @@ -158,18 +108,10 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = GetModlogResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &GetModlog = &self.data; - let conn = pool.get()?; - let removed_posts = ModRemovePostView::list( &conn, data.community_id, @@ -239,14 +181,8 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = SiteResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &CreateSite = &self.data; let claims = match Claims::decode(&data.auth) { @@ -266,8 +202,6 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - // Make sure user is an admin if !UserView::read(&conn, user_id)?.admin { return Err(APIError::err("not_an_admin").into()); @@ -294,13 +228,8 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = SiteResponse; - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &EditSite = &self.data; let claims = match Claims::decode(&data.auth) { @@ -320,8 +249,6 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - // Make sure user is an admin if !UserView::read(&conn, user_id)?.admin { return Err(APIError::err("not_an_admin").into()); @@ -346,34 +273,16 @@ impl Perform for Oper { let site_view = SiteView::read(&conn)?; - let res = SiteResponse { site: site_view }; - - if let Some(ws) = websocket_info { - ws.chatserver.do_send(SendAllMessage { - op: UserOperation::EditSite, - response: res.clone(), - my_id: ws.id, - }); - } - - Ok(res) + Ok(SiteResponse { site: site_view }) } } -impl Perform for Oper { - type Response = GetSiteResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let _data: &GetSite = &self.data; - let conn = pool.get()?; - - // TODO refactor this a little - let site_view = if let Ok(_site) = Site::read(&conn, 1) { + let site = Site::read(&conn, 1); + let site_view = if site.is_ok() { Some(SiteView::read(&conn)?) } else if let Some(setup) = Settings::get().setup.as_ref() { let register = Register { @@ -384,18 +293,18 @@ impl Perform for Oper { admin: true, show_nsfw: true, }; - let login_response = Oper::new(register).perform(pool.clone(), websocket_info.clone())?; + let login_response = Oper::new(register).perform(&conn)?; info!("Admin {} created", setup.admin_username); let create_site = CreateSite { name: setup.site_name.to_owned(), description: None, - enable_downvotes: true, - open_registration: true, - enable_nsfw: true, + enable_downvotes: false, + open_registration: false, + enable_nsfw: false, auth: login_response.jwt, }; - Oper::new(create_site).perform(pool, websocket_info.clone())?; + Oper::new(create_site).perform(&conn)?; info!("Site {} created", setup.site_name); Some(SiteView::read(&conn)?) } else { @@ -403,59 +312,28 @@ impl Perform for Oper { }; let mut admins = UserView::admins(&conn)?; - - // Make sure the site creator is the top admin - if let Some(site_view) = site_view.to_owned() { - let site_creator_id = site_view.creator_id; - // TODO investigate why this is sometimes coming back null - // Maybe user_.admin isn't being set to true? - if let Some(creator_index) = admins.iter().position(|r| r.id == site_creator_id) { - let creator_user = admins.remove(creator_index); - admins.insert(0, creator_user); - } + if site_view.is_some() { + let site_creator_id = site_view.to_owned().unwrap().creator_id; + let creator_index = admins.iter().position(|r| r.id == site_creator_id).unwrap(); + let creator_user = admins.remove(creator_index); + admins.insert(0, creator_user); } let banned = UserView::banned(&conn)?; - let online = if let Some(_ws) = websocket_info { - // TODO - 1 - // let fut = async { - // ws.chatserver.send(GetUsersOnline).await.unwrap() - // }; - // Runtime::new().unwrap().block_on(fut) - } else { - 0 - }; - Ok(GetSiteResponse { site: site_view, admins, banned, - online, + online: 0, }) } } -impl Perform for Oper { - type Response = SearchResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &Search = &self.data; - dbg!(&data); - - let conn = pool.get()?; - - match search_by_apub_id(&data.q, &conn) { - Ok(r) => return Ok(r), - Err(e) => debug!("Failed to resolve search query as activitypub ID: {}", e), - } - let user_id: Option = match &data.auth { Some(auth) => match Claims::decode(&auth) { Ok(claims) => { @@ -570,14 +448,8 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = GetSiteResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &TransferSite = &self.data; let claims = match Claims::decode(&data.auth) { @@ -587,8 +459,6 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - let read_site = Site::read(&conn, 1)?; // Make sure user is the creator @@ -640,73 +510,3 @@ impl Perform for Oper { }) } } - -impl Perform for Oper { - type Response = GetSiteConfigResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { - let data: &GetSiteConfig = &self.data; - - let claims = match Claims::decode(&data.auth) { - Ok(claims) => claims.claims, - Err(_e) => return Err(APIError::err("not_logged_in").into()), - }; - - let user_id = claims.id; - - let conn = pool.get()?; - - // Only let admins read this - let admins = UserView::admins(&conn)?; - let admin_ids: Vec = admins.into_iter().map(|m| m.id).collect(); - - if !admin_ids.contains(&user_id) { - return Err(APIError::err("not_an_admin").into()); - } - - let config_hjson = Settings::read_config_file()?; - - Ok(GetSiteConfigResponse { config_hjson }) - } -} - -impl Perform for Oper { - type Response = GetSiteConfigResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { - let data: &SaveSiteConfig = &self.data; - - let claims = match Claims::decode(&data.auth) { - Ok(claims) => claims.claims, - Err(_e) => return Err(APIError::err("not_logged_in").into()), - }; - - let user_id = claims.id; - - let conn = pool.get()?; - - // Only let admins read this - let admins = UserView::admins(&conn)?; - let admin_ids: Vec = admins.into_iter().map(|m| m.id).collect(); - - if !admin_ids.contains(&user_id) { - return Err(APIError::err("not_an_admin").into()); - } - - // Make sure docker doesn't have :ro at the end of the volume, so its not a read-only filesystem - let config_hjson = match Settings::save_config_file(&data.config_hjson) { - Ok(config_hjson) => config_hjson, - Err(_e) => return Err(APIError::err("couldnt_update_site").into()), - }; - - Ok(GetSiteConfigResponse { config_hjson }) - } -} diff --git a/server/src/api/user.rs b/server/src/api/user.rs index f68a1a82..dda1d9ad 100644 --- a/server/src/api/user.rs +++ b/server/src/api/user.rs @@ -1,57 +1,10 @@ -use crate::{ - api::{APIError, Oper, Perform}, - apub::{ - extensions::signatures::generate_actor_keypair, - make_apub_endpoint, - ApubObjectType, - EndpointType, - }, - db::{ - comment::*, - comment_view::*, - community::*, - community_view::*, - moderator::*, - password_reset_request::*, - post::*, - post_view::*, - private_message::*, - private_message_view::*, - site::*, - site_view::*, - user::*, - user_mention::*, - user_mention_view::*, - user_view::*, - Crud, - Followable, - Joinable, - ListingType, - SortType, - }, - generate_random_string, - is_valid_username, - naive_from_unix, - naive_now, - remove_slurs, - send_email, - settings::Settings, - slur_check, - slurs_vec_to_str, - websocket::{ - server::{JoinUserRoom, SendAllMessage, SendUserRoomMessage}, - UserOperation, - WebsocketInfo, - }, -}; +use super::*; +use crate::apub::{gen_keypair_str, make_apub_endpoint, EndpointType}; +use crate::settings::Settings; +use crate::{generate_random_string, send_email}; use bcrypt::verify; -use diesel::{ - r2d2::{ConnectionManager, Pool}, - PgConnection, -}; -use failure::Error; +use diesel::PgConnection; use log::error; -use serde::{Deserialize, Serialize}; use std::str::FromStr; #[derive(Serialize, Deserialize, Debug)] @@ -137,7 +90,7 @@ pub struct AddAdmin { auth: String, } -#[derive(Serialize, Deserialize, Clone)] +#[derive(Serialize, Deserialize)] pub struct AddAdminResponse { admins: Vec, } @@ -151,7 +104,7 @@ pub struct BanUser { auth: String, } -#[derive(Serialize, Deserialize, Clone)] +#[derive(Serialize, Deserialize)] pub struct BanUserResponse { user: UserView, banned: bool, @@ -239,7 +192,7 @@ pub struct PrivateMessagesResponse { #[derive(Serialize, Deserialize, Clone)] pub struct PrivateMessageResponse { - pub message: PrivateMessageView, + message: PrivateMessageView, } #[derive(Serialize, Deserialize, Debug)] @@ -252,18 +205,10 @@ pub struct UserJoinResponse { pub user_id: i32, } -impl Perform for Oper { - type Response = LoginResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &Login = &self.data; - let conn = pool.get()?; - // Fetch that username / email let user: User_ = match User_::find_by_email_or_username(&conn, &data.username_or_email) { Ok(user) => user, @@ -281,18 +226,10 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = LoginResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &Register = &self.data; - let conn = pool.get()?; - // Make sure site has open registration if let Ok(site) = SiteView::read(&conn) { if !site.open_registration { @@ -314,10 +251,7 @@ impl Perform for Oper { return Err(APIError::err("admin_already_created").into()); } - let user_keypair = generate_actor_keypair()?; - if !is_valid_username(&data.username) { - return Err(APIError::err("invalid_username").into()); - } + let (user_public_key, user_private_key) = gen_keypair_str(); // Register the new user let user_form = UserForm { @@ -340,8 +274,8 @@ impl Perform for Oper { actor_id: make_apub_endpoint(EndpointType::User, &data.username).to_string(), bio: None, local: true, - private_key: Some(user_keypair.private_key), - public_key: Some(user_keypair.public_key), + private_key: Some(user_private_key), + public_key: Some(user_public_key), last_refreshed_at: None, }; @@ -361,7 +295,7 @@ impl Perform for Oper { } }; - let main_community_keypair = generate_actor_keypair()?; + let (community_public_key, community_private_key) = gen_keypair_str(); // Create the main community if it doesn't exist let main_community: Community = match Community::read(&conn, 2) { @@ -380,10 +314,9 @@ impl Perform for Oper { updated: None, actor_id: make_apub_endpoint(EndpointType::Community, default_community_name).to_string(), local: true, - private_key: Some(main_community_keypair.private_key), - public_key: Some(main_community_keypair.public_key), + private_key: Some(community_private_key), + public_key: Some(community_public_key), last_refreshed_at: None, - published: None, }; Community::create(&conn, &community_form).unwrap() } @@ -422,14 +355,8 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = LoginResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &SaveUserSettings = &self.data; let claims = match Claims::decode(&data.auth) { @@ -439,8 +366,6 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - let read_user = User_::read(&conn, user_id)?; let email = match &data.email { @@ -523,18 +448,10 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = GetUserDetailsResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &GetUserDetails = &self.data; - let conn = pool.get()?; - let user_claims: Option = match &data.auth { Some(auth) => match Claims::decode(&auth) { Ok(claims) => Some(claims.claims), @@ -560,7 +477,7 @@ impl Perform for Oper { None => { match User_::read_from_name( &conn, - &data + data .username .to_owned() .unwrap_or_else(|| "admin".to_string()), @@ -628,14 +545,8 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = AddAdminResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &AddAdmin = &self.data; let claims = match Claims::decode(&data.auth) { @@ -645,8 +556,6 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - // Make sure user is an admin if !UserView::read(&conn, user_id)?.admin { return Err(APIError::err("not_an_admin").into()); @@ -672,28 +581,12 @@ impl Perform for Oper { let creator_user = admins.remove(creator_index); admins.insert(0, creator_user); - let res = AddAdminResponse { admins }; - - if let Some(ws) = websocket_info { - ws.chatserver.do_send(SendAllMessage { - op: UserOperation::AddAdmin, - response: res.clone(), - my_id: ws.id, - }); - } - - Ok(res) + Ok(AddAdminResponse { admins }) } } -impl Perform for Oper { - type Response = BanUserResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &BanUser = &self.data; let claims = match Claims::decode(&data.auth) { @@ -703,8 +596,6 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - // Make sure user is an admin if !UserView::read(&conn, user_id)?.admin { return Err(APIError::err("not_an_admin").into()); @@ -733,31 +624,15 @@ impl Perform for Oper { let user_view = UserView::read(&conn, data.user_id)?; - let res = BanUserResponse { + Ok(BanUserResponse { user: user_view, banned: data.ban, - }; - - if let Some(ws) = websocket_info { - ws.chatserver.do_send(SendAllMessage { - op: UserOperation::BanUser, - response: res.clone(), - my_id: ws.id, - }); - } - - Ok(res) + }) } } -impl Perform for Oper { - type Response = GetRepliesResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &GetReplies = &self.data; let claims = match Claims::decode(&data.auth) { @@ -769,8 +644,6 @@ impl Perform for Oper { let sort = SortType::from_str(&data.sort)?; - let conn = pool.get()?; - let replies = ReplyQueryBuilder::create(&conn, user_id) .sort(&sort) .unread_only(data.unread_only) @@ -782,14 +655,8 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = GetUserMentionsResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &GetUserMentions = &self.data; let claims = match Claims::decode(&data.auth) { @@ -801,8 +668,6 @@ impl Perform for Oper { let sort = SortType::from_str(&data.sort)?; - let conn = pool.get()?; - let mentions = UserMentionQueryBuilder::create(&conn, user_id) .sort(&sort) .unread_only(data.unread_only) @@ -814,14 +679,8 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = UserMentionResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &EditUserMention = &self.data; let claims = match Claims::decode(&data.auth) { @@ -831,8 +690,6 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - let user_mention = UserMention::read(&conn, data.user_mention_id)?; let user_mention_form = UserMentionForm { @@ -855,14 +712,8 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = GetRepliesResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &MarkAllAsRead = &self.data; let claims = match Claims::decode(&data.auth) { @@ -872,8 +723,6 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - let replies = ReplyQueryBuilder::create(&conn, user_id) .unread_only(true) .page(1) @@ -917,15 +766,12 @@ impl Perform for Oper { for message in &messages { let private_message_form = PrivateMessageForm { - content: message.to_owned().content, + content: None, creator_id: message.to_owned().creator_id, recipient_id: message.to_owned().recipient_id, deleted: None, read: Some(true), updated: None, - ap_id: message.to_owned().ap_id, - local: message.local, - published: None, }; let _updated_message = match PrivateMessage::update(&conn, message.id, &private_message_form) @@ -939,14 +785,8 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = LoginResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &DeleteAccount = &self.data; let claims = match Claims::decode(&data.auth) { @@ -956,8 +796,6 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - let user: User_ = User_::read(&conn, user_id)?; // Verify the password @@ -999,18 +837,10 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = PasswordResetResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &PasswordReset = &self.data; - let conn = pool.get()?; - // Fetch that email let user: User_ = match User_::find_by_email(&conn, &data.email) { Ok(user) => user, @@ -1038,18 +868,10 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = LoginResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &PasswordChange = &self.data; - let conn = pool.get()?; - // Fetch the user_id from the token let user_id = PasswordResetRequest::read_from_token(&conn, &data.token)?.user_id; @@ -1071,14 +893,8 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = PrivateMessageResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &CreatePrivateMessage = &self.data; let claims = match Claims::decode(&data.auth) { @@ -1090,26 +906,20 @@ impl Perform for Oper { let hostname = &format!("https://{}", Settings::get().hostname); - let conn = pool.get()?; - // Check for a site ban - let user = User_::read(&conn, user_id)?; - if user.banned { + if UserView::read(&conn, user_id)?.banned { return Err(APIError::err("site_ban").into()); } let content_slurs_removed = remove_slurs(&data.content.to_owned()); let private_message_form = PrivateMessageForm { - content: content_slurs_removed.to_owned(), + content: Some(content_slurs_removed.to_owned()), creator_id: user_id, recipient_id: data.recipient_id, deleted: None, read: None, updated: None, - ap_id: "changeme".into(), - local: true, - published: None, }; let inserted_private_message = match PrivateMessage::create(&conn, &private_message_form) { @@ -1119,14 +929,6 @@ impl Perform for Oper { } }; - let updated_private_message = - match PrivateMessage::update_ap_id(&conn, inserted_private_message.id) { - Ok(private_message) => private_message, - Err(_e) => return Err(APIError::err("couldnt_create_private_message").into()), - }; - - updated_private_message.send_create(&user, &conn)?; - // Send notifications to the recipient let recipient_user = User_::read(&conn, data.recipient_id)?; if recipient_user.send_notifications_to_email { @@ -1149,29 +951,12 @@ impl Perform for Oper { let message = PrivateMessageView::read(&conn, inserted_private_message.id)?; - let res = PrivateMessageResponse { message }; - - if let Some(ws) = websocket_info { - ws.chatserver.do_send(SendUserRoomMessage { - op: UserOperation::CreatePrivateMessage, - response: res.clone(), - recipient_id: recipient_user.id, - my_id: ws.id, - }); - } - - Ok(res) + Ok(PrivateMessageResponse { message }) } } -impl Perform for Oper { - type Response = PrivateMessageResponse; - - fn perform( - &self, - pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &EditPrivateMessage = &self.data; let claims = match Claims::decode(&data.auth) { @@ -1181,13 +966,10 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - let orig_private_message = PrivateMessage::read(&conn, data.edit_id)?; // Check for a site ban - let user = User_::read(&conn, user_id)?; - if user.banned { + if UserView::read(&conn, user_id)?.banned { return Err(APIError::err("site_ban").into()); } @@ -1199,8 +981,8 @@ impl Perform for Oper { } let content_slurs_removed = match &data.content { - Some(content) => remove_slurs(content), - None => orig_private_message.content, + Some(content) => Some(remove_slurs(content)), + None => None, }; let private_message_form = PrivateMessageForm { @@ -1214,52 +996,22 @@ impl Perform for Oper { } else { Some(naive_now()) }, - ap_id: orig_private_message.ap_id, - local: orig_private_message.local, - published: None, }; - let updated_private_message = + let _updated_private_message = match PrivateMessage::update(&conn, data.edit_id, &private_message_form) { Ok(private_message) => private_message, Err(_e) => return Err(APIError::err("couldnt_update_private_message").into()), }; - if let Some(deleted) = data.deleted.to_owned() { - if deleted { - updated_private_message.send_delete(&user, &conn)?; - } else { - updated_private_message.send_undo_delete(&user, &conn)?; - } - } else { - updated_private_message.send_update(&user, &conn)?; - } - let message = PrivateMessageView::read(&conn, data.edit_id)?; - let res = PrivateMessageResponse { message }; - - if let Some(ws) = websocket_info { - ws.chatserver.do_send(SendUserRoomMessage { - op: UserOperation::EditPrivateMessage, - response: res.clone(), - recipient_id: orig_private_message.recipient_id, - my_id: ws.id, - }); - } - - Ok(res) + Ok(PrivateMessageResponse { message }) } } -impl Perform for Oper { - type Response = PrivateMessagesResponse; - - fn perform( - &self, - pool: Pool>, - _websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, conn: &PgConnection) -> Result { let data: &GetPrivateMessages = &self.data; let claims = match Claims::decode(&data.auth) { @@ -1269,8 +1021,6 @@ impl Perform for Oper { let user_id = claims.id; - let conn = pool.get()?; - let messages = PrivateMessageQueryBuilder::create(&conn, user_id) .page(data.page) .limit(data.limit) @@ -1281,14 +1031,8 @@ impl Perform for Oper { } } -impl Perform for Oper { - type Response = UserJoinResponse; - - fn perform( - &self, - _pool: Pool>, - websocket_info: Option, - ) -> Result { +impl Perform for Oper { + fn perform(&self, _conn: &PgConnection) -> Result { let data: &UserJoin = &self.data; let claims = match Claims::decode(&data.auth) { @@ -1297,13 +1041,6 @@ impl Perform for Oper { }; let user_id = claims.id; - - if let Some(ws) = websocket_info { - if let Some(id) = ws.id { - ws.chatserver.do_send(JoinUserRoom { user_id, id }); - } - } - Ok(UserJoinResponse { user_id }) } } diff --git a/server/src/apub/activities.rs b/server/src/apub/activities.rs deleted file mode 100644 index b5bb9d76..00000000 --- a/server/src/apub/activities.rs +++ /dev/null @@ -1,73 +0,0 @@ -use crate::{ - apub::{extensions::signatures::sign, is_apub_id_valid, ActorType}, - db::{activity::insert_activity, community::Community, user::User_}, -}; -use activitystreams::{context, object::properties::ObjectProperties, public, Activity, Base}; -use diesel::PgConnection; -use failure::{Error, _core::fmt::Debug}; -use isahc::prelude::*; -use log::debug; -use serde::Serialize; -use url::Url; - -pub fn populate_object_props( - props: &mut ObjectProperties, - addressed_ccs: Vec, - object_id: &str, -) -> Result<(), Error> { - props - .set_context_xsd_any_uri(context())? - // TODO: the activity needs a seperate id from the object - .set_id(object_id)? - // TODO: should to/cc go on the Create, or on the Post? or on both? - // TODO: handle privacy on the receiving side (at least ignore anything thats not public) - .set_to_xsd_any_uri(public())? - .set_many_cc_xsd_any_uris(addressed_ccs)?; - Ok(()) -} - -pub fn send_activity_to_community( - creator: &User_, - conn: &PgConnection, - community: &Community, - to: Vec, - activity: A, -) -> Result<(), Error> -where - A: Activity + Base + Serialize + Debug, -{ - insert_activity(&conn, creator.id, &activity, true)?; - - // if this is a local community, we need to do an announce from the community instead - if community.local { - Community::do_announce(activity, &community, creator, conn)?; - } else { - send_activity(&activity, creator, to)?; - } - Ok(()) -} - -/// Send an activity to a list of recipients, using the correct headers etc. -pub fn send_activity(activity: &A, actor: &dyn ActorType, to: Vec) -> Result<(), Error> -where - A: Serialize + Debug, -{ - let json = serde_json::to_string(&activity)?; - debug!("Sending activitypub activity {} to {:?}", json, to); - for t in to { - let to_url = Url::parse(&t)?; - if !is_apub_id_valid(&to_url) { - debug!("Not sending activity to {} (invalid or blocklisted)", t); - continue; - } - let request = Request::post(t).header("Host", to_url.domain().unwrap()); - let signature = sign(&request, actor)?; - let res = request - .header("Signature", signature) - .header("Content-Type", "application/json") - .body(json.to_owned())? - .send()?; - debug!("Result for activity send: {:?}", res); - } - Ok(()) -} diff --git a/server/src/apub/comment.rs b/server/src/apub/comment.rs deleted file mode 100644 index 0a513f33..00000000 --- a/server/src/apub/comment.rs +++ /dev/null @@ -1,510 +0,0 @@ -use crate::{ - apub::{ - activities::{populate_object_props, send_activity_to_community}, - create_apub_response, - create_apub_tombstone_response, - create_tombstone, - fetch_webfinger_url, - fetcher::{ - get_or_fetch_and_insert_remote_comment, - get_or_fetch_and_insert_remote_post, - get_or_fetch_and_upsert_remote_user, - }, - ActorType, - ApubLikeableType, - ApubObjectType, - FromApub, - ToApub, - }, - convert_datetime, - db::{ - comment::{Comment, CommentForm}, - community::Community, - post::Post, - user::User_, - Crud, - }, - routes::DbPoolParam, - scrape_text_for_mentions, - MentionData, -}; -use activitystreams::{ - activity::{Create, Delete, Dislike, Like, Remove, Undo, Update}, - context, - link::Mention, - object::{kind::NoteType, properties::ObjectProperties, Note}, -}; -use activitystreams_new::object::Tombstone; -use actix_web::{body::Body, web::Path, HttpResponse, Result}; -use diesel::PgConnection; -use failure::Error; -use itertools::Itertools; -use log::debug; -use serde::Deserialize; - -#[derive(Deserialize)] -pub struct CommentQuery { - comment_id: String, -} - -/// Return the post json over HTTP. -pub async fn get_apub_comment( - info: Path, - db: DbPoolParam, -) -> Result, Error> { - let id = info.comment_id.parse::()?; - let comment = Comment::read(&&db.get()?, id)?; - if !comment.deleted { - Ok(create_apub_response(&comment.to_apub(&db.get().unwrap())?)) - } else { - Ok(create_apub_tombstone_response(&comment.to_tombstone()?)) - } -} - -impl ToApub for Comment { - type Response = Note; - - fn to_apub(&self, conn: &PgConnection) -> Result { - let mut comment = Note::default(); - let oprops: &mut ObjectProperties = comment.as_mut(); - let creator = User_::read(&conn, self.creator_id)?; - let post = Post::read(&conn, self.post_id)?; - let community = Community::read(&conn, post.community_id)?; - - // Add a vector containing some important info to the "in_reply_to" field - // [post_ap_id, Option(parent_comment_ap_id)] - let mut in_reply_to_vec = vec![post.ap_id]; - - if let Some(parent_id) = self.parent_id { - let parent_comment = Comment::read(&conn, parent_id)?; - in_reply_to_vec.push(parent_comment.ap_id); - } - - oprops - // Not needed when the Post is embedded in a collection (like for community outbox) - .set_context_xsd_any_uri(context())? - .set_id(self.ap_id.to_owned())? - .set_published(convert_datetime(self.published))? - .set_to_xsd_any_uri(community.actor_id)? - .set_many_in_reply_to_xsd_any_uris(in_reply_to_vec)? - .set_content_xsd_string(self.content.to_owned())? - .set_attributed_to_xsd_any_uri(creator.actor_id)?; - - if let Some(u) = self.updated { - oprops.set_updated(convert_datetime(u))?; - } - - Ok(comment) - } - - fn to_tombstone(&self) -> Result { - create_tombstone( - self.deleted, - &self.ap_id, - self.updated, - NoteType.to_string(), - ) - } -} - -impl FromApub for CommentForm { - type ApubType = Note; - - /// Parse an ActivityPub note received from another instance into a Lemmy comment - fn from_apub(note: &Note, conn: &PgConnection) -> Result { - let oprops = ¬e.object_props; - let creator_actor_id = &oprops.get_attributed_to_xsd_any_uri().unwrap().to_string(); - let creator = get_or_fetch_and_upsert_remote_user(&creator_actor_id, &conn)?; - - let mut in_reply_tos = oprops.get_many_in_reply_to_xsd_any_uris().unwrap(); - let post_ap_id = in_reply_tos.next().unwrap().to_string(); - - // This post, or the parent comment might not yet exist on this server yet, fetch them. - let post = get_or_fetch_and_insert_remote_post(&post_ap_id, &conn)?; - - // The 2nd item, if it exists, is the parent comment apub_id - // For deeply nested comments, FromApub automatically gets called recursively - let parent_id: Option = match in_reply_tos.next() { - Some(parent_comment_uri) => { - let parent_comment_ap_id = &parent_comment_uri.to_string(); - let parent_comment = get_or_fetch_and_insert_remote_comment(&parent_comment_ap_id, &conn)?; - - Some(parent_comment.id) - } - None => None, - }; - - Ok(CommentForm { - creator_id: creator.id, - post_id: post.id, - parent_id, - content: oprops - .get_content_xsd_string() - .map(|c| c.to_string()) - .unwrap(), - removed: None, - read: None, - published: oprops - .get_published() - .map(|u| u.as_ref().to_owned().naive_local()), - updated: oprops - .get_updated() - .map(|u| u.as_ref().to_owned().naive_local()), - deleted: None, - ap_id: oprops.get_id().unwrap().to_string(), - local: false, - }) - } -} - -impl ApubObjectType for Comment { - /// Send out information about a newly created comment, to the followers of the community. - fn send_create(&self, creator: &User_, conn: &PgConnection) -> Result<(), Error> { - let note = self.to_apub(conn)?; - let post = Post::read(&conn, self.post_id)?; - let community = Community::read(conn, post.community_id)?; - let id = format!("{}/create/{}", self.ap_id, uuid::Uuid::new_v4()); - - let maa: MentionsAndAddresses = - collect_non_local_mentions_and_addresses(&conn, &self.content, &community)?; - - let mut create = Create::new(); - populate_object_props(&mut create.object_props, maa.addressed_ccs, &id)?; - - // Set the mention tags - create.object_props.set_many_tag_base_boxes(maa.tags)?; - - create - .create_props - .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(note)?; - - send_activity_to_community(&creator, &conn, &community, maa.inboxes, create)?; - Ok(()) - } - - /// Send out information about an edited post, to the followers of the community. - fn send_update(&self, creator: &User_, conn: &PgConnection) -> Result<(), Error> { - let note = self.to_apub(&conn)?; - let post = Post::read(&conn, self.post_id)?; - let community = Community::read(&conn, post.community_id)?; - let id = format!("{}/update/{}", self.ap_id, uuid::Uuid::new_v4()); - - let maa: MentionsAndAddresses = - collect_non_local_mentions_and_addresses(&conn, &self.content, &community)?; - - let mut update = Update::new(); - populate_object_props(&mut update.object_props, maa.addressed_ccs, &id)?; - - // Set the mention tags - update.object_props.set_many_tag_base_boxes(maa.tags)?; - - update - .update_props - .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(note)?; - - send_activity_to_community(&creator, &conn, &community, maa.inboxes, update)?; - Ok(()) - } - - fn send_delete(&self, creator: &User_, conn: &PgConnection) -> Result<(), Error> { - let note = self.to_apub(&conn)?; - let post = Post::read(&conn, self.post_id)?; - let community = Community::read(&conn, post.community_id)?; - let id = format!("{}/delete/{}", self.ap_id, uuid::Uuid::new_v4()); - let mut delete = Delete::default(); - - populate_object_props( - &mut delete.object_props, - vec![community.get_followers_url()], - &id, - )?; - - delete - .delete_props - .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(note)?; - - send_activity_to_community( - &creator, - &conn, - &community, - vec![community.get_shared_inbox_url()], - delete, - )?; - Ok(()) - } - - fn send_undo_delete(&self, creator: &User_, conn: &PgConnection) -> Result<(), Error> { - let note = self.to_apub(&conn)?; - let post = Post::read(&conn, self.post_id)?; - let community = Community::read(&conn, post.community_id)?; - - // Generate a fake delete activity, with the correct object - let id = format!("{}/delete/{}", self.ap_id, uuid::Uuid::new_v4()); - let mut delete = Delete::default(); - - populate_object_props( - &mut delete.object_props, - vec![community.get_followers_url()], - &id, - )?; - - delete - .delete_props - .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(note)?; - - // TODO - // Undo that fake activity - let undo_id = format!("{}/undo/delete/{}", self.ap_id, uuid::Uuid::new_v4()); - let mut undo = Undo::default(); - - populate_object_props( - &mut undo.object_props, - vec![community.get_followers_url()], - &undo_id, - )?; - - undo - .undo_props - .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(delete)?; - - send_activity_to_community( - &creator, - &conn, - &community, - vec![community.get_shared_inbox_url()], - undo, - )?; - Ok(()) - } - - fn send_remove(&self, mod_: &User_, conn: &PgConnection) -> Result<(), Error> { - let note = self.to_apub(&conn)?; - let post = Post::read(&conn, self.post_id)?; - let community = Community::read(&conn, post.community_id)?; - let id = format!("{}/remove/{}", self.ap_id, uuid::Uuid::new_v4()); - let mut remove = Remove::default(); - - populate_object_props( - &mut remove.object_props, - vec![community.get_followers_url()], - &id, - )?; - - remove - .remove_props - .set_actor_xsd_any_uri(mod_.actor_id.to_owned())? - .set_object_base_box(note)?; - - send_activity_to_community( - &mod_, - &conn, - &community, - vec![community.get_shared_inbox_url()], - remove, - )?; - Ok(()) - } - - fn send_undo_remove(&self, mod_: &User_, conn: &PgConnection) -> Result<(), Error> { - let note = self.to_apub(&conn)?; - let post = Post::read(&conn, self.post_id)?; - let community = Community::read(&conn, post.community_id)?; - - // Generate a fake delete activity, with the correct object - let id = format!("{}/remove/{}", self.ap_id, uuid::Uuid::new_v4()); - let mut remove = Remove::default(); - - populate_object_props( - &mut remove.object_props, - vec![community.get_followers_url()], - &id, - )?; - - remove - .remove_props - .set_actor_xsd_any_uri(mod_.actor_id.to_owned())? - .set_object_base_box(note)?; - - // Undo that fake activity - let undo_id = format!("{}/undo/remove/{}", self.ap_id, uuid::Uuid::new_v4()); - let mut undo = Undo::default(); - - populate_object_props( - &mut undo.object_props, - vec![community.get_followers_url()], - &undo_id, - )?; - - undo - .undo_props - .set_actor_xsd_any_uri(mod_.actor_id.to_owned())? - .set_object_base_box(remove)?; - - send_activity_to_community( - &mod_, - &conn, - &community, - vec![community.get_shared_inbox_url()], - undo, - )?; - Ok(()) - } -} - -impl ApubLikeableType for Comment { - fn send_like(&self, creator: &User_, conn: &PgConnection) -> Result<(), Error> { - let note = self.to_apub(&conn)?; - let post = Post::read(&conn, self.post_id)?; - let community = Community::read(&conn, post.community_id)?; - let id = format!("{}/like/{}", self.ap_id, uuid::Uuid::new_v4()); - - let mut like = Like::new(); - populate_object_props( - &mut like.object_props, - vec![community.get_followers_url()], - &id, - )?; - like - .like_props - .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(note)?; - - send_activity_to_community( - &creator, - &conn, - &community, - vec![community.get_shared_inbox_url()], - like, - )?; - Ok(()) - } - - fn send_dislike(&self, creator: &User_, conn: &PgConnection) -> Result<(), Error> { - let note = self.to_apub(&conn)?; - let post = Post::read(&conn, self.post_id)?; - let community = Community::read(&conn, post.community_id)?; - let id = format!("{}/dislike/{}", self.ap_id, uuid::Uuid::new_v4()); - - let mut dislike = Dislike::new(); - populate_object_props( - &mut dislike.object_props, - vec![community.get_followers_url()], - &id, - )?; - dislike - .dislike_props - .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(note)?; - - send_activity_to_community( - &creator, - &conn, - &community, - vec![community.get_shared_inbox_url()], - dislike, - )?; - Ok(()) - } - - fn send_undo_like(&self, creator: &User_, conn: &PgConnection) -> Result<(), Error> { - let note = self.to_apub(&conn)?; - let post = Post::read(&conn, self.post_id)?; - let community = Community::read(&conn, post.community_id)?; - let id = format!("{}/dislike/{}", self.ap_id, uuid::Uuid::new_v4()); - - let mut like = Like::new(); - populate_object_props( - &mut like.object_props, - vec![community.get_followers_url()], - &id, - )?; - like - .like_props - .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(note)?; - - // TODO - // Undo that fake activity - let undo_id = format!("{}/undo/like/{}", self.ap_id, uuid::Uuid::new_v4()); - let mut undo = Undo::default(); - - populate_object_props( - &mut undo.object_props, - vec![community.get_followers_url()], - &undo_id, - )?; - - undo - .undo_props - .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(like)?; - - send_activity_to_community( - &creator, - &conn, - &community, - vec![community.get_shared_inbox_url()], - undo, - )?; - Ok(()) - } -} - -struct MentionsAndAddresses { - addressed_ccs: Vec, - inboxes: Vec, - tags: Vec, -} - -/// This takes a comment, and builds a list of to_addresses, inboxes, -/// and mention tags, so they know where to be sent to. -/// Addresses are the users / addresses that go in the cc field. -fn collect_non_local_mentions_and_addresses( - conn: &PgConnection, - content: &str, - community: &Community, -) -> Result { - let mut addressed_ccs = vec![community.get_followers_url()]; - - // Add the mention tag - let mut tags = Vec::new(); - - // Get the inboxes for any mentions - let mentions = scrape_text_for_mentions(&content) - .into_iter() - // Filter only the non-local ones - .filter(|m| !m.is_local()) - .collect::>(); - let mut mention_inboxes = Vec::new(); - for mention in &mentions { - // TODO should it be fetching it every time? - if let Ok(actor_id) = fetch_webfinger_url(mention) { - debug!("mention actor_id: {}", actor_id); - addressed_ccs.push(actor_id.to_owned()); - let mention_user = get_or_fetch_and_upsert_remote_user(&actor_id, &conn)?; - let shared_inbox = mention_user.get_shared_inbox_url(); - mention_inboxes.push(shared_inbox); - let mut mention_tag = Mention::new(); - mention_tag - .link_props - .set_href(actor_id)? - .set_name_xsd_string(mention.full_name())?; - tags.push(mention_tag); - } - } - - let mut inboxes = vec![community.get_shared_inbox_url()]; - inboxes.extend(mention_inboxes); - inboxes = inboxes.into_iter().unique().collect(); - - Ok(MentionsAndAddresses { - addressed_ccs, - inboxes, - tags, - }) -} diff --git a/server/src/apub/community.rs b/server/src/apub/community.rs index 8c8c3b28..aa6d832f 100644 --- a/server/src/apub/community.rs +++ b/server/src/apub/community.rs @@ -1,414 +1,192 @@ -use crate::{ - apub::{ - activities::{populate_object_props, send_activity}, - create_apub_response, - create_apub_tombstone_response, - create_tombstone, - extensions::{group_extensions::GroupExtension, signatures::PublicKey}, - fetcher::get_or_fetch_and_upsert_remote_user, - get_shared_inbox, - ActorType, - FromApub, - GroupExt, - ToApub, - }, - convert_datetime, - db::{ - activity::insert_activity, - community::{Community, CommunityForm}, - community_view::{CommunityFollowerView, CommunityModeratorView}, - user::User_, - }, - naive_now, - routes::DbPoolParam, -}; +use crate::apub::puller::fetch_remote_object; +use crate::apub::*; +use crate::convert_datetime; +use crate::db::community::Community; +use crate::db::community_view::{CommunityFollowerView, CommunityView}; +use crate::db::establish_unpooled_connection; +use crate::db::post::Post; +use crate::settings::Settings; +use activitystreams::actor::properties::ApActorProperties; +use activitystreams::collection::OrderedCollection; use activitystreams::{ - activity::{Accept, Announce, Delete, Remove, Undo}, - actor::{kind::GroupType, properties::ApActorProperties, Group}, - collection::UnorderedCollection, - context, - endpoint::EndpointProperties, + actor::Group, collection::UnorderedCollection, context, ext::Extensible, object::properties::ObjectProperties, - Activity, - Base, - BaseBox, }; -use activitystreams_ext::Ext3; -use activitystreams_new::{activity::Follow, object::Tombstone}; -use actix_web::{body::Body, web::Path, HttpResponse, Result}; +use actix_web::body::Body; +use actix_web::web::Path; +use actix_web::HttpResponse; +use actix_web::{web, Result}; +use diesel::r2d2::{ConnectionManager, Pool}; use diesel::PgConnection; -use failure::{Error, _core::fmt::Debug}; -use itertools::Itertools; -use serde::{Deserialize, Serialize}; +use failure::Error; +use serde::Deserialize; #[derive(Deserialize)] pub struct CommunityQuery { community_name: String, } -impl ToApub for Community { - type Response = GroupExt; +pub async fn get_apub_community_list( + db: web::Data>>, +) -> Result, Error> { + // TODO: implement pagination + let communities = Community::list(&db.get().unwrap())? + .iter() + .map(|c| c.as_group()) + .collect::, Error>>()?; + let mut collection = UnorderedCollection::default(); + let oprops: &mut ObjectProperties = collection.as_mut(); + oprops.set_context_xsd_any_uri(context())?.set_id(format!( + "{}://{}/federation/communities", + get_apub_protocol_string(), + Settings::get().hostname + ))?; + + collection + .collection_props + .set_total_items(communities.len() as u64)? + .set_many_items_base_boxes(communities)?; + Ok(create_apub_response(&collection)) +} + +impl Community { + fn as_group(&self) -> Result { + let base_url = make_apub_endpoint(EndpointType::Community, &self.name); - // Turn a Lemmy Community into an ActivityPub group that can be sent out over the network. - fn to_apub(&self, conn: &PgConnection) -> Result { let mut group = Group::default(); let oprops: &mut ObjectProperties = group.as_mut(); - // The attributed to, is an ordered vector with the creator actor_ids first, - // then the rest of the moderators - // TODO Technically the instance admins can mod the community, but lets - // ignore that for now - let moderators = CommunityModeratorView::for_community(&conn, self.id)? - .into_iter() - .map(|m| m.user_actor_id) - .collect(); - oprops .set_context_xsd_any_uri(context())? - .set_id(self.actor_id.to_owned())? + .set_id(base_url.to_owned())? .set_name_xsd_string(self.name.to_owned())? .set_published(convert_datetime(self.published))? - .set_many_attributed_to_xsd_any_uris(moderators)?; + .set_attributed_to_xsd_any_uri(make_apub_endpoint( + EndpointType::User, + &self.creator_id.to_string(), + ))?; if let Some(u) = self.updated.to_owned() { oprops.set_updated(convert_datetime(u))?; } if let Some(d) = self.description.to_owned() { - // TODO: this should be html, also add source field with raw markdown - // -> same for post.content and others - oprops.set_content_xsd_string(d)?; + oprops.set_summary_xsd_string(d)?; } - let mut endpoint_props = EndpointProperties::default(); - - endpoint_props.set_shared_inbox(self.get_shared_inbox_url())?; - let mut actor_props = ApActorProperties::default(); actor_props .set_preferred_username(self.title.to_owned())? - .set_inbox(self.get_inbox_url())? - .set_outbox(self.get_outbox_url())? - .set_endpoints(endpoint_props)? - .set_followers(self.get_followers_url())?; + .set_inbox(format!("{}/inbox", &base_url))? + .set_outbox(format!("{}/outbox", &base_url))? + .set_followers(format!("{}/followers", &base_url))?; - let group_extension = GroupExtension::new(conn, self.category_id, self.nsfw)?; - - Ok(Ext3::new( - group, - group_extension, - actor_props, - self.get_public_key_ext(), - )) - } - - fn to_tombstone(&self) -> Result { - create_tombstone( - self.deleted, - &self.actor_id, - self.updated, - GroupType.to_string(), - ) + Ok(group.extend(actor_props)) } } -impl ActorType for Community { - fn actor_id(&self) -> String { - self.actor_id.to_owned() - } - - fn public_key(&self) -> String { - self.public_key.to_owned().unwrap() - } - fn private_key(&self) -> String { - self.private_key.to_owned().unwrap() - } - - /// As a local community, accept the follow request from a remote user. - fn send_accept_follow(&self, follow: &Follow, conn: &PgConnection) -> Result<(), Error> { - let actor_uri = follow.actor.as_single_xsd_any_uri().unwrap().to_string(); - let id = format!("{}/accept/{}", self.actor_id, uuid::Uuid::new_v4()); - - let mut accept = Accept::new(); - accept - .object_props - .set_context_xsd_any_uri(context())? - .set_id(id)?; - accept - .accept_props - .set_actor_xsd_any_uri(self.actor_id.to_owned())? - .set_object_base_box(BaseBox::from_concrete(follow.clone())?)?; - let to = format!("{}/inbox", actor_uri); - - insert_activity(&conn, self.creator_id, &accept, true)?; - - send_activity(&accept, self, vec![to])?; - Ok(()) - } - - fn send_delete(&self, creator: &User_, conn: &PgConnection) -> Result<(), Error> { - let group = self.to_apub(conn)?; - let id = format!("{}/delete/{}", self.actor_id, uuid::Uuid::new_v4()); - - let mut delete = Delete::default(); - populate_object_props( - &mut delete.object_props, - vec![self.get_followers_url()], - &id, - )?; - - delete - .delete_props - .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(BaseBox::from_concrete(group)?)?; - - insert_activity(&conn, self.creator_id, &delete, true)?; - - // Note: For an accept, since it was automatic, no one pushed a button, - // the community was the actor. - // But for delete, the creator is the actor, and does the signing - send_activity(&delete, creator, self.get_follower_inboxes(&conn)?)?; - Ok(()) - } - - fn send_undo_delete(&self, creator: &User_, conn: &PgConnection) -> Result<(), Error> { - let group = self.to_apub(conn)?; - let id = format!("{}/delete/{}", self.actor_id, uuid::Uuid::new_v4()); - - let mut delete = Delete::default(); - populate_object_props( - &mut delete.object_props, - vec![self.get_followers_url()], - &id, - )?; - - delete - .delete_props - .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(BaseBox::from_concrete(group)?)?; - - // TODO - // Undo that fake activity - let undo_id = format!("{}/undo/delete/{}", self.actor_id, uuid::Uuid::new_v4()); - let mut undo = Undo::default(); - - populate_object_props( - &mut undo.object_props, - vec![self.get_followers_url()], - &undo_id, - )?; - - undo - .undo_props - .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(delete)?; - - insert_activity(&conn, self.creator_id, &undo, true)?; - - // Note: For an accept, since it was automatic, no one pushed a button, - // the community was the actor. - // But for delete, the creator is the actor, and does the signing - send_activity(&undo, creator, self.get_follower_inboxes(&conn)?)?; - Ok(()) - } - - fn send_remove(&self, mod_: &User_, conn: &PgConnection) -> Result<(), Error> { - let group = self.to_apub(conn)?; - let id = format!("{}/remove/{}", self.actor_id, uuid::Uuid::new_v4()); - - let mut remove = Remove::default(); - populate_object_props( - &mut remove.object_props, - vec![self.get_followers_url()], - &id, - )?; - - remove - .remove_props - .set_actor_xsd_any_uri(mod_.actor_id.to_owned())? - .set_object_base_box(BaseBox::from_concrete(group)?)?; - - insert_activity(&conn, mod_.id, &remove, true)?; - - // Note: For an accept, since it was automatic, no one pushed a button, - // the community was the actor. - // But for delete, the creator is the actor, and does the signing - send_activity(&remove, mod_, self.get_follower_inboxes(&conn)?)?; - Ok(()) - } - - fn send_undo_remove(&self, mod_: &User_, conn: &PgConnection) -> Result<(), Error> { - let group = self.to_apub(conn)?; - let id = format!("{}/remove/{}", self.actor_id, uuid::Uuid::new_v4()); - - let mut remove = Remove::default(); - populate_object_props( - &mut remove.object_props, - vec![self.get_followers_url()], - &id, - )?; - - remove - .remove_props - .set_actor_xsd_any_uri(mod_.actor_id.to_owned())? - .set_object_base_box(BaseBox::from_concrete(group)?)?; - - // Undo that fake activity - let undo_id = format!("{}/undo/remove/{}", self.actor_id, uuid::Uuid::new_v4()); - let mut undo = Undo::default(); - - populate_object_props( - &mut undo.object_props, - vec![self.get_followers_url()], - &undo_id, - )?; - - undo - .undo_props - .set_actor_xsd_any_uri(mod_.actor_id.to_owned())? - .set_object_base_box(remove)?; - - insert_activity(&conn, mod_.id, &undo, true)?; - - // Note: For an accept, since it was automatic, no one pushed a button, - // the community was the actor. - // But for remove , the creator is the actor, and does the signing - send_activity(&undo, mod_, self.get_follower_inboxes(&conn)?)?; - Ok(()) - } - - /// For a given community, returns the inboxes of all followers. - fn get_follower_inboxes(&self, conn: &PgConnection) -> Result, Error> { - Ok( - CommunityFollowerView::for_community(conn, self.id)? - .into_iter() - .map(|c| get_shared_inbox(&c.user_actor_id)) - .filter(|s| !s.is_empty()) - .unique() - .collect(), - ) - } - - fn send_follow(&self, _follow_actor_id: &str, _conn: &PgConnection) -> Result<(), Error> { - unimplemented!() - } - - fn send_unfollow(&self, _follow_actor_id: &str, _conn: &PgConnection) -> Result<(), Error> { - unimplemented!() - } -} - -impl FromApub for CommunityForm { - type ApubType = GroupExt; - - /// Parse an ActivityPub group received from another instance into a Lemmy community. - fn from_apub(group: &GroupExt, conn: &PgConnection) -> Result { - let group_extensions: &GroupExtension = &group.ext_one; - let oprops = &group.inner.object_props; - let aprops = &group.ext_two; - let public_key: &PublicKey = &group.ext_three.public_key; - - let mut creator_and_moderator_uris = oprops.get_many_attributed_to_xsd_any_uris().unwrap(); - let creator = creator_and_moderator_uris - .next() - .map(|c| get_or_fetch_and_upsert_remote_user(&c.to_string(), &conn).unwrap()) - .unwrap(); - - Ok(CommunityForm { - name: oprops.get_name_xsd_string().unwrap().to_string(), +impl CommunityView { + pub fn from_group(group: &GroupExt, domain: &str) -> Result { + let followers_uri = &group.extension.get_followers().unwrap().to_string(); + let outbox_uri = &group.extension.get_outbox().to_string(); + let outbox = fetch_remote_object::(outbox_uri)?; + let followers = fetch_remote_object::(followers_uri)?; + let oprops = &group.base.object_props; + let aprops = &group.extension; + Ok(CommunityView { + // TODO: we need to merge id and name into a single thing (stuff like @user@instance.com) + id: 1337, //community.object_props.get_id() + name: format_community_name(&oprops.get_name_xsd_string().unwrap().to_string(), domain), title: aprops.get_preferred_username().unwrap().to_string(), - // TODO: should be parsed as html and tags like