summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDessalines <tyhou13@gmx.com>2020-07-03 21:51:42 -0400
committerDessalines <tyhou13@gmx.com>2020-07-03 21:51:42 -0400
commitb1b755713ef791f777fb138ff9c9392e17c3529a (patch)
tree6606127efdf08fa12d7bc22d589a0119e03c6464
parent4822a53f063586dc7226011e6342b42961d42b3b (diff)
parentaab68f0bafacb88f6c542a98d2a0f3cdb0de20b3 (diff)
Merge branch 'master' into arrudaricardo-issue-#814
-rw-r--r--ansible/VERSION2
-rw-r--r--ansible/ansible.cfg4
-rw-r--r--ansible/inventory.example10
-rw-r--r--ansible/lemmy.yml78
-rw-r--r--ansible/lemmy_dev.yml86
-rw-r--r--ansible/templates/docker-compose.yml2
-rw-r--r--ansible/uninstall.yml26
-rw-r--r--docker/dev/docker-compose.yml4
-rwxr-xr-xdocker/federation-test/run-tests.sh14
-rwxr-xr-xdocker/federation-test/servers.sh19
-rwxr-xr-xdocker/federation-test/tests.sh10
-rw-r--r--docker/federation/Dockerfile2
-rw-r--r--docker/federation/docker-compose.yml58
-rw-r--r--docker/federation/nginx.conf12
-rw-r--r--docker/prod/docker-compose.yml4
-rw-r--r--docs/src/contributing_federation_development.md44
-rw-r--r--server/Cargo.lock567
-rw-r--r--server/Cargo.toml15
-rw-r--r--server/src/api/comment.rs310
-rw-r--r--server/src/api/community.rs387
-rw-r--r--server/src/api/mod.rs20
-rw-r--r--server/src/api/post.rs280
-rw-r--r--server/src/api/site.rs424
-rw-r--r--server/src/api/user.rs624
-rw-r--r--server/src/apub/activities.rs59
-rw-r--r--server/src/apub/comment.rs281
-rw-r--r--server/src/apub/community.rs204
-rw-r--r--server/src/apub/community_inbox.rs81
-rw-r--r--server/src/apub/extensions/group_extensions.rs8
-rw-r--r--server/src/apub/extensions/signatures.rs87
-rw-r--r--server/src/apub/fetcher.rs304
-rw-r--r--server/src/apub/mod.rs185
-rw-r--r--server/src/apub/post.rs233
-rw-r--r--server/src/apub/private_message.rs117
-rw-r--r--server/src/apub/shared_inbox.rs877
-rw-r--r--server/src/apub/user.rs87
-rw-r--r--server/src/apub/user_inbox.rs208
-rw-r--r--server/src/db/activity.rs24
-rw-r--r--server/src/db/code_migrations.rs15
-rw-r--r--server/src/db/comment.rs2
-rw-r--r--server/src/db/community.rs2
-rw-r--r--server/src/db/password_reset_request.rs8
-rw-r--r--server/src/db/user.rs2
-rw-r--r--server/src/lib.rs120
-rw-r--r--server/src/main.rs25
-rw-r--r--server/src/rate_limit/mod.rs19
-rw-r--r--server/src/rate_limit/rate_limiter.rs22
-rw-r--r--server/src/request.rs51
-rw-r--r--server/src/routes/api.rs14
-rw-r--r--server/src/routes/federation.rs12
-rw-r--r--server/src/routes/feeds.rs84
-rw-r--r--server/src/routes/nodeinfo.rs62
-rw-r--r--server/src/routes/webfinger.rs108
-rw-r--r--server/src/settings.rs6
-rw-r--r--server/src/version.rs2
-rw-r--r--server/src/websocket/mod.rs1
-rw-r--r--server/src/websocket/server.rs565
-rw-r--r--ui/src/api_tests/api.spec.ts18
-rw-r--r--ui/src/components/comment-form.tsx4
-rw-r--r--ui/src/components/login.tsx49
-rw-r--r--ui/src/components/sponsors.tsx16
-rw-r--r--ui/src/i18next.ts2
-rw-r--r--ui/src/utils.ts4
-rw-r--r--ui/src/version.ts2
-rw-r--r--ui/translations/de.json13
-rw-r--r--ui/translations/el.json10
-rw-r--r--ui/translations/en.json3
-rw-r--r--ui/translations/eo.json239
-rw-r--r--ui/translations/it.json6
-rw-r--r--ui/translations/sq.json108
70 files changed, 4419 insertions, 2932 deletions
diff --git a/ansible/VERSION b/ansible/VERSION
index aed5a7df..151a6866 100644
--- a/ansible/VERSION
+++ b/ansible/VERSION
@@ -1 +1 @@
-v0.7.5
+v0.7.8
diff --git a/ansible/ansible.cfg b/ansible/ansible.cfg
index 74b6ab2f..69646629 100644
--- a/ansible/ansible.cfg
+++ b/ansible/ansible.cfg
@@ -1,6 +1,6 @@
[defaults]
-inventory=inventory
-interpreter_python=/usr/bin/python3
+inventory = inventory
+interpreter_python = /usr/bin/python3
[ssh_connection]
pipelining = True
diff --git a/ansible/inventory.example b/ansible/inventory.example
index 52b45d3c..c5f98653 100644
--- a/ansible/inventory.example
+++ b/ansible/inventory.example
@@ -1,6 +1,12 @@
[lemmy]
-# define the username and hostname that you use for ssh connection, and specify the domain
-myuser@example.com domain=example.com letsencrypt_contact_email=your@email.com
+# to get started, copy this file to `inventory` and adjust the values below.
+# - `myuser@example.com`: replace with the destination you use to connect to your server via ssh
+# - `domain=example.com`: replace `example.com` with your lemmy domain
+# - `letsencrypt_contact_email=your@email.com` replace `your@email.com` with your email address,
+# to get notifications if your ssl cert expires
+# - `lemmy_base_dir=/srv/lemmy`: the location on the server where lemmy can be installed, can be any folder
+# if you are upgrading from a previous version, set this to `/lemmy`
+myuser@example.com domain=example.com letsencrypt_contact_email=your@email.com lemmy_base_dir=/srv/lemmy
[all:vars]
ansible_connection=ssh
diff --git a/ansible/lemmy.yml b/ansible/lemmy.yml
index 7b78ab8d..a73f7293 100644
--- a/ansible/lemmy.yml
+++ b/ansible/lemmy.yml
@@ -5,18 +5,41 @@
# https://www.josharcher.uk/code/ansible-python-connection-failure-ubuntu-server-1604/
gather_facts: False
pre_tasks:
+ - name: check lemmy_base_dir
+ fail:
+ msg: "`lemmy_base_dir` is unset. if you are upgrading from an older version, add `lemmy_base_dir=/lemmy` to your inventory file."
+ when: lemmy_base_dir is not defined
+
- name: install python for Ansible
+ # python2-minimal instead of python-minimal for ubuntu 20.04 and up
raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal python-setuptools)
args:
executable: /bin/bash
register: output
- changed_when: output.stdout != ""
+ changed_when: output.stdout != ''
+
- setup: # gather facts
tasks:
- name: install dependencies
apt:
- pkg: ['nginx', 'docker-compose', 'docker.io', 'certbot', 'python-certbot-nginx']
+ pkg:
+ - 'nginx'
+ - 'docker-compose'
+ - 'docker.io'
+ - 'certbot'
+
+ - name: install certbot-nginx on ubuntu < 20
+ apt:
+ pkg:
+ - 'python-certbot-nginx'
+ when: ansible_distribution == 'Ubuntu' and ansible_distribution_version|version_compare('20.04', '<')
+
+ - name: install certbot-nginx on ubuntu > 20
+ apt:
+ pkg:
+ - 'python3-certbot-nginx'
+ when: ansible_distribution == 'Ubuntu' and ansible_distribution_version|version_compare('20.04', '>=')
- name: request initial letsencrypt certificate
command: certbot certonly --nginx --agree-tos -d '{{ domain }}' -m '{{ letsencrypt_contact_email }}'
@@ -24,27 +47,48 @@
creates: '/etc/letsencrypt/live/{{domain}}/privkey.pem'
- name: create lemmy folder
- file: path={{item.path}} {{item.owner}} state=directory
+ file:
+ path: '{{item.path}}'
+ owner: '{{item.owner}}'
+ state: directory
with_items:
- - { path: '/lemmy/', owner: 'root' }
- - { path: '/lemmy/volumes/', owner: 'root' }
- - { path: '/lemmy/volumes/pictrs/', owner: '991' }
+ - path: '{{lemmy_base_dir}}'
+ owner: 'root'
+ - path: '{{lemmy_base_dir}}/volumes/'
+ owner: 'root'
+ - path: '{{lemmy_base_dir}}/volumes/pictrs/'
+ owner: '991'
- block:
- name: add template files
- template: src={{item.src}} dest={{item.dest}} mode={{item.mode}}
+ template:
+ src: '{{item.src}}'
+ dest: '{{item.dest}}'
+ mode: '{{item.mode}}'
with_items:
- - { src: 'templates/docker-compose.yml', dest: '/lemmy/docker-compose.yml', mode: '0600' }
- - { src: 'templates/nginx.conf', dest: '/etc/nginx/sites-enabled/lemmy.conf', mode: '0644' }
- - { src: '../docker/iframely.config.local.js', dest: '/lemmy/iframely.config.local.js', mode: '0600' }
- vars:
+ - src: 'templates/docker-compose.yml'
+ dest: '{{lemmy_base_dir}}/docker-compose.yml'
+ mode: '0600'
+ - src: 'templates/nginx.conf'
+ dest: '/etc/nginx/sites-enabled/lemmy.conf'
+ mode: '0644'
+ - src: '../docker/iframely.config.local.js'
+ dest: '{{lemmy_base_dir}}/iframely.config.local.js'
+ mode: '0600'
+ vars:
lemmy_docker_image: "dessalines/lemmy:{{ lookup('file', 'VERSION') }}"
lemmy_port: "8536"
pictshare_port: "8537"
iframely_port: "8538"
- name: add config file (only during initial setup)
- template: src='templates/config.hjson' dest='/lemmy/lemmy.hjson' mode='0600' force='no' owner='1000' group='1000'
+ template:
+ src: 'templates/config.hjson'
+ dest: '{{lemmy_base_dir}}/lemmy.hjson'
+ mode: '0600'
+ force: false
+ owner: '1000'
+ group: '1000'
vars:
postgres_password: "{{ lookup('password', 'passwords/{{ inventory_hostname }}/postgres chars=ascii_letters,digits') }}"
jwt_password: "{{ lookup('password', 'passwords/{{ inventory_hostname }}/jwt chars=ascii_letters,digits') }}"
@@ -57,7 +101,7 @@
- name: start docker-compose
docker_compose:
- project_src: /lemmy/
+ project_src: '{{lemmy_base_dir}}'
state: present
pull: yes
remove_orphans: yes
@@ -67,7 +111,7 @@
- name: certbot renewal cronjob
cron:
- special_time=daily
- name=certbot-renew-lemmy
- user=root
- job="certbot certonly --nginx -d '{{ domain }}' --deploy-hook 'nginx -s reload'"
+ special_time: daily
+ name: certbot-renew-lemmy
+ user: root
+ job: "certbot certonly --nginx -d '{{ domain }}' --deploy-hook 'nginx -s reload'"
diff --git a/ansible/lemmy_dev.yml b/ansible/lemmy_dev.yml
index 7a368361..e8556665 100644
--- a/ansible/lemmy_dev.yml
+++ b/ansible/lemmy_dev.yml
@@ -1,24 +1,34 @@
---
- hosts: all
vars:
- lemmy_docker_image: "lemmy:dev"
+ lemmy_docker_image: 'lemmy:dev'
# Install python if required
# https://www.josharcher.uk/code/ansible-python-connection-failure-ubuntu-server-1604/
gather_facts: False
pre_tasks:
+ - name: check lemmy_base_dir
+ fail:
+ msg: "`lemmy_base_dir` is unset. if you are upgrading from an older version, add `lemmy_base_dir=/lemmy` to your inventory file."
+ when: lemmy_base_dir is not defined
+
- name: install python for Ansible
raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal python-setuptools)
args:
executable: /bin/bash
register: output
- changed_when: output.stdout != ""
+ changed_when: output.stdout != ''
- setup: # gather facts
tasks:
- name: install dependencies
apt:
- pkg: ['nginx', 'docker-compose', 'docker.io', 'certbot', 'python-certbot-nginx']
+ pkg:
+ - 'nginx'
+ - 'docker-compose'
+ - 'docker.io'
+ - 'certbot'
+ - 'python-certbot-nginx'
- name: request initial letsencrypt certificate
command: certbot certonly --nginx --agree-tos -d '{{ domain }}' -m '{{ letsencrypt_contact_email }}'
@@ -26,25 +36,46 @@
creates: '/etc/letsencrypt/live/{{domain}}/privkey.pem'
- name: create lemmy folder
- file: path={{item.path}} owner={{item.owner}} state=directory
+ file:
+ path: '{{item.path}}'
+ owner: '{{item.owner}}'
+ state: directory
with_items:
- - { path: '/lemmy/', owner: 'root' }
- - { path: '/lemmy/volumes/', owner: 'root' }
- - { path: '/lemmy/volumes/pictrs/', owner: '991' }
+ - path: '{{lemmy_base_dir}}/lemmy/'
+ owner: 'root'
+ - path: '{{lemmy_base_dir}}/volumes/'
+ owner: 'root'
+ - path: '{{lemmy_base_dir}}/volumes/pictrs/'
+ owner: '991'
- block:
- name: add template files
- template: src={{item.src}} dest={{item.dest}} mode={{item.mode}}
+ template:
+ src: '{{item.src}}'
+ dest: '{{item.dest}}'
+ mode: '{{item.mode}}'
with_items:
- - { src: 'templates/docker-compose.yml', dest: '/lemmy/docker-compose.yml', mode: '0600' }
- - { src: 'templates/nginx.conf', dest: '/etc/nginx/sites-enabled/lemmy.conf', mode: '0644' }
- - { src: '../docker/iframely.config.local.js', dest: '/lemmy/iframely.config.local.js', mode: '0600' }
+ - src: 'templates/docker-compose.yml'
+ dest: '{{lemmy_base_dir}}/docker-compose.yml'
+ mode: '0600'
+ - src: 'templates/nginx.conf'
+ dest: '/etc/nginx/sites-enabled/lemmy.conf'
+ mode: '0644'
+ - src: '../docker/iframely.config.local.js'
+ dest: '{{lemmy_base_dir}}/iframely.config.local.js'
+ mode: '0600'
- name: add config file (only during initial setup)
- template: src='templates/config.hjson' dest='/lemmy/lemmy.hjson' mode='0600' force='no' owner='1000' group='1000'
- vars:
- postgres_password: "{{ lookup('password', 'passwords/{{ inventory_hostname }}/postgres chars=ascii_letters,digits') }}"
- jwt_password: "{{ lookup('password', 'passwords/{{ inventory_hostname }}/jwt chars=ascii_letters,digits') }}"
+ template:
+ src: 'templates/config.hjson'
+ dest: '{{lemmy_base_dir}}/lemmy.hjson'
+ mode: '0600'
+ force: false
+ owner: '1000'
+ group: '1000'
+ vars:
+ postgres_password: "{{ lookup('password', 'passwords/{{ inventory_hostname }}/postgres chars=ascii_letters,digits') }}"
+ jwt_password: "{{ lookup('password', 'passwords/{{ inventory_hostname }}/jwt chars=ascii_letters,digits') }}"
- name: build the dev docker image
local_action: shell cd .. && sudo docker build . -f docker/dev/Dockerfile -t lemmy:dev
@@ -59,22 +90,29 @@
local_action: shell sudo docker save lemmy:dev > lemmy-dev.tar
- name: copy dev docker image to server
- copy: src=lemmy-dev.tar dest=/lemmy/lemmy-dev.tar
+ copy:
+ src: lemmy-dev.tar
+ dest: '{{lemmy_base_dir}}/lemmy-dev.tar'
- name: import docker image
docker_image:
name: lemmy
tag: dev
- load_path: /lemmy/lemmy-dev.tar
+ load_path: '{{lemmy_base_dir}}/lemmy-dev.tar'
source: load
force_source: yes
register: image_import
- name: delete remote image file
- file: path=/lemmy/lemmy-dev.tar state=absent
+ file:
+ path: '{{lemmy_base_dir}}/lemmy-dev.tar'
+ state: absent
- name: delete local image file
- local_action: file path=lemmy-dev.tar state=absent
+ local_action:
+ module: file
+ path: lemmy-dev.tar
+ state: absent
- name: enable and start docker service
systemd:
@@ -86,7 +124,7 @@
# be a problem for testing
- name: start docker-compose
docker_compose:
- project_src: /lemmy/
+ project_src: '{{lemmy_base_dir}}'
state: present
recreate: always
remove_orphans: yes
@@ -97,7 +135,7 @@
- name: certbot renewal cronjob
cron:
- special_time=daily
- name=certbot-renew-lemmy
- user=root
- job="certbot certonly --nginx -d '{{ domain }}' --deploy-hook 'nginx -s reload'"
+ special_time: daily
+ name: certbot-renew-lemmy
+ user: root
+ job: "certbot certonly --nginx -d '{{ domain }}' --deploy-hook 'nginx -s reload'"
diff --git a/ansible/templates/docker-compose.yml b/ansible/templates/docker-compose.yml
index 76c53463..f4c94fd7 100644
--- a/ansible/templates/docker-compose.yml
+++ b/ansible/templates/docker-compose.yml
@@ -35,7 +35,7 @@ services:
restart: always
iframely:
- image: jolt/iframely:v1.4.3
+ image: dogbin/iframely:latest
ports:
- "127.0.0.1:8061:80"
volumes:
diff --git a/ansible/uninstall.yml b/ansible/uninstall.yml
index 252c5bd1..34c24d2e 100644
--- a/ansible/uninstall.yml
+++ b/ansible/uninstall.yml
@@ -22,27 +22,33 @@
- name: stop docker-compose
docker_compose:
- project_src: /lemmy/
+ project_src: '{{lemmy_base_dir}}'
state: absent
- name: delete data
- file: path={{item.path}} state=absent
+ file:
+ path: '{{item.path}}'
+ state: absent
with_items:
- - { path: '/lemmy/' }
- - { path: '/etc/nginx/sites-enabled/lemmy.conf' }
+ - path: '{{lemmy_base_dir}}'
+ - path: '/etc/nginx/sites-enabled/lemmy.conf'
- name: Remove a volume
- docker_volume: name={{item.name}} state=absent
+ docker_volume:
+ name: '{{item.name}}'
+ state: absent
with_items:
- - { name: 'lemmy_lemmy_db' }
- - { name: 'lemmy_lemmy_pictshare' }
+ - name: 'lemmy_lemmy_db'
+ - name: 'lemmy_lemmy_pictshare'
- name: delete entire ecloud folder
- file: path='/mnt/repo-base/' state=absent
+ file:
+ path: '/mnt/repo-base/'
+ state: absent
when: delete_certs|bool
- name: remove certbot cronjob
cron:
- name=certbot-renew-lemmy
- state=absent
+ name: certbot-renew-lemmy
+ state: absent
diff --git a/docker/dev/docker-compose.yml b/docker/dev/docker-compose.yml
index 65bec9a9..51a3ecda 100644
--- a/docker/dev/docker-compose.yml
+++ b/docker/dev/docker-compose.yml
@@ -20,6 +20,8 @@ services:
postgres:
image: postgres:12-alpine
+ ports:
+ - "127.0.0.1:5432:5432"
environment:
- POSTGRES_USER=lemmy
- POSTGRES_PASSWORD=password
@@ -38,7 +40,7 @@ services:
restart: always
iframely:
- image: jolt/iframely:v1.4.3
+ image: dogbin/iframely:latest
ports:
- "127.0.0.1:8061:80"
volumes:
diff --git a/docker/federation-test/run-tests.sh b/docker/federation-test/run-tests.sh
index fdb0e129..57c6cc8f 100755
--- a/docker/federation-test/run-tests.sh
+++ b/docker/federation-test/run-tests.sh
@@ -5,17 +5,21 @@ pushd ../../server/
cargo build
popd
+pushd ../../ui
+yarn
+popd
+
+mkdir -p volumes/pictrs_{alpha,beta,gamma}
+sudo chown -R 991:991 volumes/pictrs_{alpha,beta,gamma}
+
sudo docker build ../../ --file ../federation/Dockerfile --tag lemmy-federation:latest
-for Item in alpha beta gamma ; do
- sudo mkdir -p volumes/pictrs_$Item
- sudo chown -R 991:991 volumes/pictrs_$Item
-done
+sudo mkdir -p volumes/pictrs_alpha
+sudo chown -R 991:991 volumes/pictrs_alpha
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
diff --git a/docker/federation-test/servers.sh b/docker/federation-test/servers.sh
new file mode 100755
index 00000000..36f10cd8
--- /dev/null
+++ b/docker/federation-test/servers.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+set -e
+
+sudo rm -rf volumes
+
+pushd ../../server/
+cargo build
+popd
+
+pushd ../../ui
+yarn
+popd
+
+mkdir -p volumes/pictrs_{alpha,beta,gamma}
+sudo chown -R 991:991 volumes/pictrs_{alpha,beta,gamma}
+
+sudo docker build ../../ --file ../federation/Dockerfile --tag lemmy-federation:latest
+
+sudo docker-compose --file ../federation/docker-compose.yml --project-directory . up
diff --git a/docker/federation-test/tests.sh b/docker/federation-test/tests.sh
new file mode 100755
index 00000000..2e88ffb2
--- /dev/null
+++ b/docker/federation-test/tests.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+set -xe
+
+pushd ../../ui
+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
diff --git a/docker/federation/Dockerfile b/docker/federation/Dockerfile
index ec7bf2d2..caf08175 100644
--- a/docker/federation/Dockerfile
+++ b/docker/federation/Dockerfile
@@ -3,7 +3,7 @@ FROM ekidd/rust-musl-builder:1.42.0-openssl11
USER root
RUN mkdir /app/dist/documentation/ -p \
&& addgroup --gid 1001 lemmy \
- && adduser --disabled-password --shell /bin/sh -u 1001 --ingroup lemmy lemmy
+ && adduser --gecos "" --disabled-password --shell /bin/sh -u 1001 --ingroup lemmy lemmy
# Copy resources
COPY server/config/defaults.hjson /app/config/defaults.hjson
diff --git a/docker/federation/docker-compose.yml b/docker/federation/docker-compose.yml
index d854e9d6..cbc648e6 100644
--- a/docker/federation/docker-compose.yml
+++ b/docker/federation/docker-compose.yml
@@ -12,28 +12,33 @@ services:
- ../federation/nginx.conf:/etc/nginx/nginx.conf
restart: on-failure
depends_on:
- - lemmy_alpha
- - pictrs_alpha
- - lemmy_beta
- - pictrs_beta
- - lemmy_gamma
- - pictrs_gamma
+ - lemmy-alpha
+ - pictrs
+ - lemmy-beta
+ - lemmy-gamma
- iframely
- lemmy_alpha:
+ pictrs:
+ restart: always
+ image: asonix/pictrs:v0.1.13-r0
+ user: 991:991
+ volumes:
+ - ./volumes/pictrs_alpha:/mnt
+
+ lemmy-alpha:
image: l