From 8b048976326ef6e0fd83a82f8c41523a955b04fc Mon Sep 17 00:00:00 2001 From: Richie Zhang <12566991+StaticallyTypedRice@users.noreply.github.com> Date: Wed, 5 Feb 2020 17:23:07 -0800 Subject: [PATCH 01/22] Add liberapay to FUNDING.yml --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index e2aa05474..be4c3f629 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,4 @@ # These are supported funding model platforms patreon: dessalines +liberapay: Lemmy From 53a662e3b293e86af3340c77093bf3e4a41d64f7 Mon Sep 17 00:00:00 2001 From: Richie Zhang <12566991+StaticallyTypedRice@users.noreply.github.com> Date: Wed, 5 Feb 2020 17:35:09 -0800 Subject: [PATCH 02/22] Translate support_on_liberapay to German --- ui/src/translations/de.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/src/translations/de.ts b/ui/src/translations/de.ts index 7a1b0f5d1..d8a4a8500 100644 --- a/ui/src/translations/de.ts +++ b/ui/src/translations/de.ts @@ -150,6 +150,7 @@ export const de = { sponsor_message: 'Lemmy ist freie <1>Open-Source Software, also ohne Werbung, Monetarisierung oder Venturekapital, Punkt. Deine Spenden gehen direkt an die Vollzeit Entwicklung des Projekts. Vielen Dank an die folgenden Personen:', support_on_patreon: 'Auf Patreon unterstützen', + support_on_liberapay: 'Auf Liberapay unterstützen', general_sponsors: 'Allgemeine Sponsoren sind die, die zwischen $10 und $39 zu Lemmy beitragen.', crypto: 'Kryptowährung', From fe1db54a93763e64e8ab08cb17a122635356f26e Mon Sep 17 00:00:00 2001 From: Richie Zhang <12566991+StaticallyTypedRice@users.noreply.github.com> Date: Wed, 5 Feb 2020 17:36:22 -0800 Subject: [PATCH 03/22] Translate support_on_liberapay to Chinese --- ui/src/translations/zh.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/src/translations/zh.ts b/ui/src/translations/zh.ts index 52fdfabfd..e4111996d 100644 --- a/ui/src/translations/zh.ts +++ b/ui/src/translations/zh.ts @@ -116,6 +116,7 @@ export const zh = { sponsor_message: 'Lemmy is free, <1>open-source software, meaning no advertising, monetizing, or venture capital, ever. Your donations directly support full-time development of the project. Thank you to the following people:', support_on_patreon: '在 Patreon 赞助', + support_on_liberapay: '在 on 赞助', general_sponsors: 'General Sponsors are those that pledged $10 to $39 to Lemmy.', crypto: '加密', From 43c187cf08f589fd242eb1825e05bbbf7bf5f946 Mon Sep 17 00:00:00 2001 From: Richie Zhang <12566991+StaticallyTypedRice@users.noreply.github.com> Date: Wed, 5 Feb 2020 17:38:04 -0800 Subject: [PATCH 04/22] Translate support_on_liberapay to Spanish. --- ui/src/translations/es.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/src/translations/es.ts b/ui/src/translations/es.ts index 53d7636d8..1b1b5d67c 100644 --- a/ui/src/translations/es.ts +++ b/ui/src/translations/es.ts @@ -169,6 +169,7 @@ export const es = { sponsor_message: 'Lemmy es software libre y de <1>código abierto, lo que significa que no tendrá publicidades, monetización, ni capitales emprendedores, nunca. Tus donaciones apoyan directamente el desarrollo a tiempo completo del proyecto. Muchas gracias a las siguientes personas:', support_on_patreon: 'Apoyo en Patreon', + support_on_liberapay: 'Apoyo en Liberapay', donate_to_lemmy: 'Donar a Lemmy', donate: 'Donar', general_sponsors: From 45241cc5dfef814816da5bafbd67ef8fd9d9d759 Mon Sep 17 00:00:00 2001 From: Richie Zhang <12566991+StaticallyTypedRice@users.noreply.github.com> Date: Wed, 5 Feb 2020 17:40:43 -0800 Subject: [PATCH 05/22] Translate support_on_liberapay to French --- ui/src/translations/fr.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/src/translations/fr.ts b/ui/src/translations/fr.ts index 771f44e8d..663b7dcb9 100644 --- a/ui/src/translations/fr.ts +++ b/ui/src/translations/fr.ts @@ -139,6 +139,7 @@ export const fr = { sponsor_message: "Lemmy est gratuit et <1>open-source, c'est à dire sans publicité et sans monétisation. Pour toujours. Vos dons soutiennent directement le développement du projet. Merci à nos soutiens.", support_on_patreon: 'Soutenir sur Patreon', + support_on_liberapay: 'Soutenir sur Liberapay', general_sponsors: 'General Sponsors are those that pledged $10 to $39 to Lemmy.', crypto: 'Cryptomonnaies', From 1f96b73e517f34b1b5c5450d0ecceb2e54aff364 Mon Sep 17 00:00:00 2001 From: Richie Zhang <12566991+StaticallyTypedRice@users.noreply.github.com> Date: Wed, 5 Feb 2020 17:41:43 -0800 Subject: [PATCH 06/22] Translate support_on_liberapay to Italian --- ui/src/translations/it.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/src/translations/it.ts b/ui/src/translations/it.ts index db22eeb45..53d1894df 100644 --- a/ui/src/translations/it.ts +++ b/ui/src/translations/it.ts @@ -138,6 +138,7 @@ export const it = { sponsors_of_lemmy: 'Sponsors di Lemmy', sponsor_message: 'Lemmy è un software gratuito e <1>open-source, il che significa nessuna pubblicità, monetizzazione o investitori esterni, per sempre. Le tue donazioni supportano direttamente lo sviluppo full-time del progetto. Si ringraziano le seguenti persone:', support_on_patreon: 'Supporta su Patreon', + support_on_liberapay: 'Supporta su Liberapay', general_sponsors: 'I "General Sponsors" sono quelli che hanno investito dai 10$ ai 39$ su Lemmy.', crypto: 'Crypto', bitcoin: 'Bitcoin', From 07fdb17557c2b5efe6d12916e84052d8615a0474 Mon Sep 17 00:00:00 2001 From: Richie Zhang <12566991+StaticallyTypedRice@users.noreply.github.com> Date: Wed, 5 Feb 2020 17:42:38 -0800 Subject: [PATCH 07/22] Translate support_on_liberapay to Dutch. --- ui/src/translations/nl.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/src/translations/nl.ts b/ui/src/translations/nl.ts index 41aa24385..4bf1fae5f 100644 --- a/ui/src/translations/nl.ts +++ b/ui/src/translations/nl.ts @@ -125,6 +125,7 @@ export const nl = { sponsor_message: 'Lemmy is vrije, <1>open-source software, dus zonder reclame, winstoogmerk en durfkapitaal, punt. Jouw donaties gaan direct naar de full-time-ontwikkeling van het project. Met veel dank aan de volgende mensen:', support_on_patreon: 'Ondersteun op Patreon', + support_on_liberapay: 'Ondersteun op Liberapay', general_sponsors: 'Algemene sponsors zijn sponsors die tussen de $10 en $39 hebben gegeven aan Lemmy.', crypto: 'Cryptovaluta', From 8a3f5032c300583d0671e9e0f266532e7f0f4f83 Mon Sep 17 00:00:00 2001 From: Richie Zhang <12566991+StaticallyTypedRice@users.noreply.github.com> Date: Wed, 5 Feb 2020 17:44:52 -0800 Subject: [PATCH 08/22] Translate support_on_liberapay to Brazilian Portuguese. --- ui/src/translations/pt_br.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/src/translations/pt_br.ts b/ui/src/translations/pt_br.ts index 3f1c21fdd..aed781e87 100644 --- a/ui/src/translations/pt_br.ts +++ b/ui/src/translations/pt_br.ts @@ -171,6 +171,7 @@ export const pt_BR = { sponsor_message: 'Lemmy é um programa livre e de código aberto, o que significa que não haverá publicidade, monetização ou capital de risco, jamais. Suas doações apoiam de forma direta o desenvolvimento em tempo integral do projeto. Muitos agradecimentos às sequintes pessoas:', support_on_patreon: 'Colabore no Patreon', + support_on_liberapay: 'Colabore no Liberapay', donate_to_lemmy: 'Faça uma doação ao Lemmy', donate: 'Doar', general_sponsors: From a8ef9f87262110ab7119d799aa2d370544e63a7a Mon Sep 17 00:00:00 2001 From: Richie Zhang <12566991+StaticallyTypedRice@users.noreply.github.com> Date: Wed, 5 Feb 2020 18:15:28 -0800 Subject: [PATCH 09/22] Create db-init.sh --- server/db-init.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 server/db-init.sh diff --git a/server/db-init.sh b/server/db-init.sh new file mode 100644 index 000000000..77b9a6d71 --- /dev/null +++ b/server/db-init.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +username=lemmy +dbname=lemmy +port=5432 + +read -p "Enter database password: " -s password +echo + +psql -c "CREATE USER $username WITH PASSWORD '$password' SUPERUSER;" -U postgres +psql -c 'CREATE DATABASE $dbname WITH OWNER $username;' -U postgres +export LEMMY_DATABASE_URL=postgres://$username:$password@localhost:$port/$dbname From 5614ed7a9321b20d7ca11093fa4c0b2e036a508c Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 6 Feb 2020 11:26:11 -0500 Subject: [PATCH 10/22] Reworking README.md. Fixes #513. --- README.md | 133 +++++++----------- docs/src/about.md | 16 ++- docs/src/about_features.md | 7 + docs/src/administration.md | 4 +- docs/src/administration_configuration.md | 2 + docs/src/administration_install_ansible.md | 2 + docs/src/administration_install_docker.md | 8 +- docs/src/administration_install_kubernetes.md | 2 + docs/src/contributing_docker_development.md | 6 +- docs/src/contributing_websocket_http_api.md | 1 + 10 files changed, 91 insertions(+), 90 deletions(-) diff --git a/README.md b/README.md index 84b3dba98..1c5709745 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,35 @@ -

- - -

- -

Lemmy

-
-![GitHub stars](https://img.shields.io/github/stars/dessalines/lemmy?style=social) -[![Mastodon Follow](https://img.shields.io/mastodon/follow/810572?domain=https%3A%2F%2Fmastodon.social&style=social)](https://mastodon.social/@LemmyDev) -[![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 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/) -![GitHub commit activity](https://img.shields.io/github/commit-activity/m/dessalines/lemmy.svg) -![GitHub repo size](https://img.shields.io/github/repo-size/dessalines/lemmy.svg) [![License](https://img.shields.io/github/license/dessalines/lemmy.svg)](LICENSE) -[![Patreon](https://img.shields.io/badge/-Support%20on%20Patreon-blueviolet.svg)](https://www.patreon.com/dessalines) +![GitHub stars](https://img.shields.io/github/stars/dessalines/lemmy?style=social)
---- +

+ + -

A link aggregator / reddit clone for the fediverse. -
+

Lemmy

+

+ A link aggregator / reddit clone for the fediverse. +
+
+ View Site + · + Documentation + · + Report Bug + · + Request Feature + · + Releases +

-[Lemmy Dev instance](https://dev.lemmy.ml) *This data is being backed up, and once federation is working, it will be the basis for a main instance.* - -This is a **very early beta version**, and a lot of features are currently broken or in active development, such as federation. +## About The Project Front Page|Post ---|--- @@ -42,17 +43,22 @@ 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. -Made with [Rust](https://www.rust-lang.org), [Actix](https://actix.rs/), [Inferno](https://infernojs.org), [Typescript](https://www.typescriptlang.org/) and [Diesel](http://diesel.rs/). +*Note: Federation is still in active development* -- [Documentation](https://dev.lemmy.ml/docs/index.html) -- [Releases / Changelog](/RELEASES.md) -- [Contributing](https://dev.lemmy.ml/docs/contributing.html) +### Why's it called Lemmy? -## Repository Mirrors +- Lead singer from [Motörhead](https://invidio.us/watch?v=pWB5JZRGl0U). +- The old school [video game](). +- The [Koopa from Super Mario](https://www.mariowiki.com/Lemmy_Koopa). +- The [furry rodents](http://sunchild.fpwc.org/lemming-the-little-giant-of-the-north/). -- [GitHub](https://github.com/dessalines/lemmy) -- [Gitea](https://yerbamate.dev/dessalines/lemmy) -- [GitLab](https://gitlab.com/dessalines/lemmy) +### Built With + +- [Rust](https://www.rust-lang.org) +- [Actix](https://actix.rs/) +- [Diesel](http://diesel.rs/) +- [Inferno](https://infernojs.org) +- [Typescript](https://www.typescriptlang.org/) ## Features @@ -89,60 +95,11 @@ Made with [Rust](https://www.rust-lang.org), [Actix](https://actix.rs/), [Infern - Front end is `~80kB` gzipped. - Supports arm64 / Raspberry Pi. -## Why's it called Lemmy? - -- Lead singer from [Motörhead](https://invidio.us/watch?v=pWB5JZRGl0U). -- The old school [video game](). -- The [Koopa from Super Mario](https://www.mariowiki.com/Lemmy_Koopa). -- The [furry rodents](http://sunchild.fpwc.org/lemming-the-little-giant-of-the-north/). - -## Install - -### Docker - -Make sure you have both docker and docker-compose(>=`1.24.0`) installed: - -```bash -mkdir lemmy/ -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 -# Edit lemmy.hjson to do more configuration -docker-compose up -d -``` - -and go to http://localhost:8536. - -[A sample nginx config](/ansible/templates/nginx.conf) (Image uploading won't work without this), could be setup with: - -```bash -wget https://raw.githubusercontent.com/dessalines/lemmy/master/ansible/templates/nginx.conf -# Replace the {{ vars }} -sudo mv nginx.conf /etc/nginx/sites-enabled/lemmy.conf -``` -#### Updating - -To update to the newest version, run: - -```bash -wget https://raw.githubusercontent.com/dessalines/lemmy/master/docker/prod/docker-compose.yml -docker-compose up -d -``` - -### Ansible - -First, you need to [install Ansible on your local computer](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html) (e.g. using `sudo apt install ansible`) or the equivalent for you platform. - -Then run the following commands on your local computer: - -```bash -git clone https://github.com/dessalines/lemmy.git -cd lemmy/ansible/ -cp inventory.example inventory -nano inventory # enter your server, domain, contact email -ansible-playbook lemmy.yml --become -``` +## Installation +- [Docker](https://dev.lemmy.ml/docs/administration_install_docker.html) +- [Ansible](https://dev.lemmy.ml/docs/administration_install_ansible.html) +- [Kubernetes](https://dev.lemmy.ml/docs/administration_install_kubernetes.html) ## Support / Donate Lemmy is free, open-source software, meaning no advertising, monetizing, or venture capital, ever. Your donations directly support full-time development of the project. @@ -157,7 +114,13 @@ Lemmy is free, open-source software, meaning no advertising, monetizing, or vent - ethereum: `0x400c96c96acbC6E7B3B43B1dc1BB446540a88A01` - monero: `41taVyY6e1xApqKyMVDRVxJ76sPkfZhALLTjRvVKpaAh2pBd4wv9RgYj1tSPrx8wc6iE1uWUfjtQdTmTy2FGMeChGVKPQuV` -## Translations +## Contributing + +- [Contributing instructions](https://dev.lemmy.ml/docs/contributing.html) +- [Docker Development](https://dev.lemmy.ml/docs/contributing_docker_development.html) +- [Local Development](https://dev.lemmy.ml/docs/contributing_local_development.html) + +### Translations If you'd like to add translations, take a look at the [English translation file](ui/src/translations/en.ts). @@ -189,6 +152,14 @@ cd ui ts-node translation_report.ts ``` +## Contact + +- [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 Logo made by Andy Cuccaro (@andycuccaro) under the CC-BY-SA 4.0 license. diff --git a/docs/src/about.md b/docs/src/about.md index 7aa1be27a..33ecb211a 100644 --- a/docs/src/about.md +++ b/docs/src/about.md @@ -1,6 +1,8 @@ -# Lemmy - A link aggregator / reddit clone for the fediverse. +## About The Project -[Lemmy Dev instance](https://dev.lemmy.ml) *for testing purposes only* +Front Page|Post +---|--- +![main screen](https://i.imgur.com/kZSRcRu.png)|![chat screen](https://i.imgur.com/4XghNh6.png) [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). @@ -10,6 +12,8 @@ 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* + ### Why's it called Lemmy? - Lead singer from [Motörhead](https://invidio.us/watch?v=pWB5JZRGl0U). @@ -17,4 +21,10 @@ Each lemmy server can set its own moderation policy; appointing site-wide admins - The [Koopa from Super Mario](https://www.mariowiki.com/Lemmy_Koopa). - The [furry rodents](http://sunchild.fpwc.org/lemming-the-little-giant-of-the-north/). -Made with [Rust](https://www.rust-lang.org), [Actix](https://actix.rs/), [Inferno](https://infernojs.org), [Typescript](https://www.typescriptlang.org/) and [Diesel](http://diesel.rs/). +### Built With + +- [Rust](https://www.rust-lang.org) +- [Actix](https://actix.rs/) +- [Diesel](http://diesel.rs/) +- [Inferno](https://infernojs.org) +- [Typescript](https://www.typescriptlang.org/) diff --git a/docs/src/about_features.md b/docs/src/about_features.md index 5c70c978e..a8371fc4d 100644 --- a/docs/src/about_features.md +++ b/docs/src/about_features.md @@ -1,20 +1,27 @@ # Features + - Open source, [AGPL License](/LICENSE). - Self hostable, easy to deploy. - Comes with [Docker](#docker), [Ansible](#ansible), [Kubernetes](#kubernetes). - Clean, mobile-friendly interface. + - Only a minimum of a username and password is required to sign up! + - User avatar support. - Live-updating Comment threads. - Full vote scores `(+/-)` like old reddit. - Themes, including light, dark, and solarized. - Emojis with autocomplete support. Start typing `:` - 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. + - Notifications can be sent via email. - i18n / internationalization support. - RSS / Atom feeds for `All`, `Subscribed`, `Inbox`, `User`, and `Community`. - Cross-posting support. - A *similar post search* when creating new posts. Great for question / answer communities. - Moderation abilities. - Public Moderation Logs. + - Can sticky posts to the top of communities. - Both site admins, and community moderators, who can appoint other moderators. - Can lock, remove, and restore posts and comments. - Can ban and unban users from communities and the site. diff --git a/docs/src/administration.md b/docs/src/administration.md index c4c2b01f1..9851232d9 100644 --- a/docs/src/administration.md +++ b/docs/src/administration.md @@ -1 +1,3 @@ -Information for Lemmy instance admins, and those who want to start an instance. \ No newline at end of file +# Admin info + +Information for Lemmy instance admins, and those who want to start an instance. diff --git a/docs/src/administration_configuration.md b/docs/src/administration_configuration.md index 73ea35042..600fc3d20 100644 --- a/docs/src/administration_configuration.md +++ b/docs/src/administration_configuration.md @@ -1,3 +1,5 @@ +# Configuration + The configuration is based on the file [defaults.hjson](server/config/defaults.hjson). This file also contains documentation for all the available options. To override the defaults, you can copy the options you want to change into your local `config.hjson` file. Additionally, you can override any config files with environment variables. These have the same name as the config options, and are prefixed with `LEMMY_`. For example, you can override the `database.password` with diff --git a/docs/src/administration_install_ansible.md b/docs/src/administration_install_ansible.md index 03642b897..875dae6a1 100644 --- a/docs/src/administration_install_ansible.md +++ b/docs/src/administration_install_ansible.md @@ -1,3 +1,5 @@ +# Ansible Installation + First, you need to [install Ansible on your local computer](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html) (e.g. using `sudo apt install ansible`) or the equivalent for you platform. Then run the following commands on your local computer: diff --git a/docs/src/administration_install_docker.md b/docs/src/administration_install_docker.md index 64abe737e..f92cbd5be 100644 --- a/docs/src/administration_install_docker.md +++ b/docs/src/administration_install_docker.md @@ -1,3 +1,5 @@ +# Docker Installation + Make sure you have both docker and docker-compose(>=`1.24.0`) installed: ```bash @@ -5,20 +7,20 @@ mkdir lemmy/ 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 -# Edit lemmy.hjson to do more configuration +# Edit lemmy.hjson, and docker-compose.yml to do more configuration (like adding a custom password) docker-compose up -d ``` and go to http://localhost:8536. -[A sample nginx config](/ansible/templates/nginx.conf), could be setup with: +[A sample nginx config](/ansible/templates/nginx.conf) (Note: Avatar / Image uploading won't work without this), could be setup with: ```bash wget https://raw.githubusercontent.com/dessalines/lemmy/master/ansible/templates/nginx.conf # Replace the {{ vars }} sudo mv nginx.conf /etc/nginx/sites-enabled/lemmy.conf ``` -#### Updating +## Updating To update to the newest version, run: diff --git a/docs/src/administration_install_kubernetes.md b/docs/src/administration_install_kubernetes.md index 886558dce..729cb1558 100644 --- a/docs/src/administration_install_kubernetes.md +++ b/docs/src/administration_install_kubernetes.md @@ -1,3 +1,5 @@ +# Kubernetes Installation + You'll need to have an existing Kubernetes cluster and [storage class](https://kubernetes.io/docs/concepts/storage/storage-classes/). Setting this up will vary depending on your provider. To try it locally, you can use [MicroK8s](https://microk8s.io/) or [Minikube](https://kubernetes.io/docs/tasks/tools/install-minikube/). diff --git a/docs/src/contributing_docker_development.md b/docs/src/contributing_docker_development.md index 0ed5bde5e..d5ab58293 100644 --- a/docs/src/contributing_docker_development.md +++ b/docs/src/contributing_docker_development.md @@ -1,4 +1,6 @@ -Run: +# Docker Development + +## Running ```bash git clone https://github.com/dessalines/lemmy @@ -8,4 +10,4 @@ cd lemmy/docker/dev and go to http://localhost:8536. -Note that compile times are relatively long with Docker, because builds can't be properly cached. If this is a problem for you, you should use [Local Development](contributing_local_development.md). \ No newline at end of file +Note that compile times when changing `Cargo.toml` are relatively long with Docker, because builds can't be incrementally cached. If this is a problem for you, you should use [Local Development](contributing_local_development.md). diff --git a/docs/src/contributing_websocket_http_api.md b/docs/src/contributing_websocket_http_api.md index 9e87d4faa..a73a1c133 100644 --- a/docs/src/contributing_websocket_http_api.md +++ b/docs/src/contributing_websocket_http_api.md @@ -1,4 +1,5 @@ # Lemmy API + *Note: this may lag behind the actual API endpoints [here](../server/src/api).* From 6fce9911f963263fa92dbb65325256f034f0a149 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 6 Feb 2020 13:10:43 -0500 Subject: [PATCH 11/22] Increasing post title length limit to 200. Fixes #515 --- README.md | 26 ++-- .../down.sql | 132 +++++++++++++++++ .../up.sql | 133 ++++++++++++++++++ server/src/api/post.rs | 20 ++- ui/src/components/post-form.tsx | 9 +- ui/src/translations/en.ts | 1 + 6 files changed, 304 insertions(+), 17 deletions(-) create mode 100644 server/migrations/2020-02-06-165953_change_post_title_length/down.sql create mode 100644 server/migrations/2020-02-06-165953_change_post_title_length/up.sql diff --git a/README.md b/README.md index 1c5709745..fcb07e72d 100644 --- a/README.md +++ b/README.md @@ -130,19 +130,19 @@ If you'd like to add translations, take a look at the [English translation file] lang | done | missing ---- | ---- | ------- -ca | 98% | cross_posted_to,old,support_on_liberapay,time,action -de | 86% | cross_posted_to,create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,old,docs,message_sent,messages,old_password,matrix_user_id,private_message_disclaimer,send_notifications_to_email,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,support_on_liberapay,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action -fa | 72% | cross_post,cross_posted_to,subscribed_to_communities,trending_communities,create_private_message,send_secure_message,send_message,message,mod,mods,moderates,remove_as_mod,appoint_as_mod,modlog,stickied,ban,ban_from_site,unban,unban_from_site,banned,number_of_subscribers,subscribers,both,saved,unsubscribe,subscribe,subscribed,old,api,docs,inbox,inbox_for,message_sent,notifications_error,messages,no_email_setup,matrix_user_id,private_message_disclaimer,url,body,copy_suggested_title,community,expand_here,subscribe_to_communities,theme,sponsor_message,support_on_liberapay,general_sponsors,joined,by,to,from,landing_0,logged_in,community_moderator_already_exists,community_follower_already_exists,community_user_already_banned,no_slurs,admin_already_created,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action -eo | 74% | cross_posted_to,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,theme,support_on_liberapay,donate_to_lemmy,donate,from,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action -es | 99% | cross_posted_to,support_on_liberapay -fi | 98% | cross_posted_to,old,support_on_liberapay,time,action -fr | 81% | cross_posted_to,create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,support_on_liberapay,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action -it | 82% | cross_posted_to,create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,support_on_liberapay,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action -nl | 98% | cross_posted_to,support_on_liberapay,time,action -pt-br | 100% | support_on_liberapay -ru | 70% | cross_posts,cross_post,cross_posted_to,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,theme,support_on_liberapay,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action -sv | 81% | cross_posted_to,create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,support_on_liberapay,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action -zh | 69% | cross_posts,cross_post,cross_posted_to,users,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,settings,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,nsfw,show_nsfw,theme,support_on_liberapay,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action +ca | 97% | cross_posted_to,old,support_on_liberapay,post_title_too_long,time,action +de | 86% | cross_posted_to,create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,old,docs,message_sent,messages,old_password,matrix_user_id,private_message_disclaimer,send_notifications_to_email,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,post_title_too_long,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action +fa | 71% | cross_post,cross_posted_to,subscribed_to_communities,trending_communities,create_private_message,send_secure_message,send_message,message,mod,mods,moderates,remove_as_mod,appoint_as_mod,modlog,stickied,ban,ban_from_site,unban,unban_from_site,banned,number_of_subscribers,subscribers,both,saved,unsubscribe,subscribe,subscribed,old,api,docs,inbox,inbox_for,message_sent,notifications_error,messages,no_email_setup,matrix_user_id,private_message_disclaimer,url,body,copy_suggested_title,community,expand_here,subscribe_to_communities,theme,sponsor_message,support_on_liberapay,general_sponsors,joined,by,to,from,landing_0,logged_in,community_moderator_already_exists,community_follower_already_exists,community_user_already_banned,post_title_too_long,no_slurs,admin_already_created,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action +eo | 74% | cross_posted_to,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,theme,support_on_liberapay,donate_to_lemmy,donate,from,are_you_sure,yes,no,logged_in,post_title_too_long,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action +es | 99% | cross_posted_to,post_title_too_long +fi | 97% | cross_posted_to,old,support_on_liberapay,post_title_too_long,time,action +fr | 82% | cross_posted_to,create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,post_title_too_long,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action +it | 82% | cross_posted_to,create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,post_title_too_long,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action +nl | 98% | cross_posted_to,post_title_too_long,time,action +pt-br | 100% | post_title_too_long +ru | 70% | cross_posts,cross_post,cross_posted_to,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,theme,support_on_liberapay,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,post_title_too_long,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action +sv | 81% | cross_posted_to,create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,support_on_liberapay,donate_to_lemmy,donate,from,logged_in,post_title_too_long,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action +zh | 69% | cross_posts,cross_post,cross_posted_to,users,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,settings,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,nsfw,show_nsfw,theme,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,post_title_too_long,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action If you'd like to update this report, run: diff --git a/server/migrations/2020-02-06-165953_change_post_title_length/down.sql b/server/migrations/2020-02-06-165953_change_post_title_length/down.sql new file mode 100644 index 000000000..2bc765f85 --- /dev/null +++ b/server/migrations/2020-02-06-165953_change_post_title_length/down.sql @@ -0,0 +1,132 @@ +-- Drop the dependent views +drop view post_view; +drop view post_mview; +drop materialized view post_aggregates_mview; +drop view post_aggregates_view; +drop view mod_remove_post_view; +drop view mod_sticky_post_view; +drop view mod_lock_post_view; +drop view mod_remove_comment_view; + +alter table post alter column name type varchar(100); + +-- 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), p.published) as hot_rank +from post p +left join post_like pl on p.id = pl.post_id +group by p.id; + +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 +; + +-- The mod views + +create view mod_remove_post_view as +select mrp.*, +(select name from user_ u where mrp.mod_user_id = u.id) as mod_user_name, +(select name from post p where mrp.post_id = p.id) as post_name, +(select c.id from post p, community c where mrp.post_id = p.id and p.community_id = c.id) as community_id, +(select c.name from post p, community c where mrp.post_id = p.id and p.community_id = c.id) as community_name +from mod_remove_post mrp; + +create view mod_lock_post_view as +select mlp.*, +(select name from user_ u where mlp.mod_user_id = u.id) as mod_user_name, +(select name from post p where mlp.post_id = p.id) as post_name, +(select c.id from post p, community c where mlp.post_id = p.id and p.community_id = c.id) as community_id, +(select c.name from post p, community c where mlp.post_id = p.id and p.community_id = c.id) as community_name +from mod_lock_post mlp; + +create view mod_remove_comment_view as +select mrc.*, +(select name from user_ u where mrc.mod_user_id = u.id) as mod_user_name, +(select c.id from comment c where mrc.comment_id = c.id) as comment_user_id, +(select name from user_ u, comment c where mrc.comment_id = c.id and u.id = c.creator_id) as comment_user_name, +(select content from comment c where mrc.comment_id = c.id) as comment_content, +(select p.id from post p, comment c where mrc.comment_id = c.id and c.post_id = p.id) as post_id, +(select p.name from post p, comment c where mrc.comment_id = c.id and c.post_id = p.id) as post_name, +(select co.id from comment c, post p, community co where mrc.comment_id = c.id and c.post_id = p.id and p.community_id = co.id) as community_id, +(select co.name from comment c, post p, community co where mrc.comment_id = c.id and c.post_id = p.id and p.community_id = co.id) as community_name +from mod_remove_comment mrc; + +create view mod_sticky_post_view as +select msp.*, +(select name from user_ u where msp.mod_user_id = u.id) as mod_user_name, +(select name from post p where msp.post_id = p.id) as post_name, +(select c.id from post p, community c where msp.post_id = p.id and p.community_id = c.id) as community_id, +(select c.name from post p, community c where msp.post_id = p.id and p.community_id = c.id) as community_name +from mod_sticky_post msp; diff --git a/server/migrations/2020-02-06-165953_change_post_title_length/up.sql b/server/migrations/2020-02-06-165953_change_post_title_length/up.sql new file mode 100644 index 000000000..006a7d049 --- /dev/null +++ b/server/migrations/2020-02-06-165953_change_post_title_length/up.sql @@ -0,0 +1,133 @@ +-- Drop the dependent views +drop view post_view; +drop view post_mview; +drop materialized view post_aggregates_mview; +drop view post_aggregates_view; +drop view mod_remove_post_view; +drop view mod_sticky_post_view; +drop view mod_lock_post_view; +drop view mod_remove_comment_view; + +-- Add the extra post limit +alter table post alter column name type varchar(200); + +-- 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), p.published) as hot_rank +from post p +left join post_like pl on p.id = pl.post_id +group by p.id; + +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 +; + +-- The mod views + +create view mod_remove_post_view as +select mrp.*, +(select name from user_ u where mrp.mod_user_id = u.id) as mod_user_name, +(select name from post p where mrp.post_id = p.id) as post_name, +(select c.id from post p, community c where mrp.post_id = p.id and p.community_id = c.id) as community_id, +(select c.name from post p, community c where mrp.post_id = p.id and p.community_id = c.id) as community_name +from mod_remove_post mrp; + +create view mod_lock_post_view as +select mlp.*, +(select name from user_ u where mlp.mod_user_id = u.id) as mod_user_name, +(select name from post p where mlp.post_id = p.id) as post_name, +(select c.id from post p, community c where mlp.post_id = p.id and p.community_id = c.id) as community_id, +(select c.name from post p, community c where mlp.post_id = p.id and p.community_id = c.id) as community_name +from mod_lock_post mlp; + +create view mod_remove_comment_view as +select mrc.*, +(select name from user_ u where mrc.mod_user_id = u.id) as mod_user_name, +(select c.id from comment c where mrc.comment_id = c.id) as comment_user_id, +(select name from user_ u, comment c where mrc.comment_id = c.id and u.id = c.creator_id) as comment_user_name, +(select content from comment c where mrc.comment_id = c.id) as comment_content, +(select p.id from post p, comment c where mrc.comment_id = c.id and c.post_id = p.id) as post_id, +(select p.name from post p, comment c where mrc.comment_id = c.id and c.post_id = p.id) as post_name, +(select co.id from comment c, post p, community co where mrc.comment_id = c.id and c.post_id = p.id and p.community_id = co.id) as community_id, +(select co.name from comment c, post p, community co where mrc.comment_id = c.id and c.post_id = p.id and p.community_id = co.id) as community_name +from mod_remove_comment mrc; + +create view mod_sticky_post_view as +select msp.*, +(select name from user_ u where msp.mod_user_id = u.id) as mod_user_name, +(select name from post p where msp.post_id = p.id) as post_name, +(select c.id from post p, community c where msp.post_id = p.id and p.community_id = c.id) as community_id, +(select c.name from post p, community c where msp.post_id = p.id and p.community_id = c.id) as community_name +from mod_sticky_post msp; diff --git a/server/src/api/post.rs b/server/src/api/post.rs index bd276be5a..00bf8e114 100644 --- a/server/src/api/post.rs +++ b/server/src/api/post.rs @@ -126,7 +126,15 @@ impl Perform for Oper { let inserted_post = match Post::create(&conn, &post_form) { Ok(post) => post, - Err(_e) => return Err(APIError::err("couldnt_create_post").into()), + Err(e) => { + let err_type = if e.to_string() == "value too long for type character varying(200)" { + "post_title_too_long" + } else { + "couldnt_create_post" + }; + + return Err(APIError::err(err_type).into()); + } }; // They like their own post by default @@ -361,7 +369,15 @@ impl Perform for Oper { let _updated_post = match Post::update(&conn, data.edit_id, &post_form) { Ok(post) => post, - Err(_e) => return Err(APIError::err("couldnt_update_post").into()), + Err(e) => { + let err_type = if e.to_string() == "value too long for type character varying(200)" { + "post_title_too_long" + } else { + "couldnt_update_post" + }; + + return Err(APIError::err(err_type).into()); + } }; // Mod tables diff --git a/ui/src/components/post-form.tsx b/ui/src/components/post-form.tsx index 5d9c0f3cb..35d4e5956 100644 --- a/ui/src/components/post-form.tsx +++ b/ui/src/components/post-form.tsx @@ -37,6 +37,8 @@ import autosize from 'autosize'; import Tribute from 'tributejs/src/Tribute.js'; import { i18n } from '../i18next'; +const MAX_POST_TITLE_LENGTH = 200; + interface PostFormProps { post?: Post; // If a post is given, that means this is an edit params?: PostFormParams; @@ -232,7 +234,7 @@ export class PostForm extends Component { required rows={2} minLength={3} - maxLength={100} + maxLength={MAX_POST_TITLE_LENGTH} /> {this.state.suggestedPosts.length > 0 && ( <> @@ -360,7 +362,10 @@ export class PostForm extends Component { } copySuggestedTitle(i: PostForm) { - i.state.postForm.name = i.state.suggestedTitle; + i.state.postForm.name = i.state.suggestedTitle.substring( + 0, + MAX_POST_TITLE_LENGTH + ); i.state.suggestedTitle = undefined; i.setState(i.state); } diff --git a/ui/src/translations/en.ts b/ui/src/translations/en.ts index e58e94e50..f71c203bc 100644 --- a/ui/src/translations/en.ts +++ b/ui/src/translations/en.ts @@ -211,6 +211,7 @@ export const en = { community_follower_already_exists: 'Community follower already exists.', community_user_already_banned: 'Community user already banned.', couldnt_create_post: "Couldn't create post.", + post_title_too_long: 'Post title too long.', couldnt_like_post: "Couldn't like post.", couldnt_find_post: "Couldn't find post.", couldnt_get_posts: "Couldn't get posts", From 7612a548940fe1a1a69ba6e7cf2197cc407020b4 Mon Sep 17 00:00:00 2001 From: Richie Zhang <12566991+StaticallyTypedRice@users.noreply.github.com> Date: Thu, 6 Feb 2020 12:25:13 -0800 Subject: [PATCH 12/22] Add instructions for unning db-init.sh to contributing_local_development.md --- docs/src/contributing_local_development.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/src/contributing_local_development.md b/docs/src/contributing_local_development.md index c19bcba84..7d782925a 100644 --- a/docs/src/contributing_local_development.md +++ b/docs/src/contributing_local_development.md @@ -7,9 +7,18 @@ #### Set up Postgres DB ```bash - psql -c "create user lemmy with password 'password' superuser;" -U postgres - psql -c 'create database lemmy with owner lemmy;' -U postgres - export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy +# Start at the root of the Lemmy repository + +cd server +./db-init.sh +``` + +Or run the commands manually: + +```bash +psql -c "create user lemmy with password 'password' superuser;" -U postgres +psql -c 'create database lemmy with owner lemmy;' -U postgres +export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy ``` #### Running From 510387874112f4bf91df7357b731cf0e055f1761 Mon Sep 17 00:00:00 2001 From: Richie Zhang <12566991+StaticallyTypedRice@users.noreply.github.com> Date: Thu, 6 Feb 2020 12:26:01 -0800 Subject: [PATCH 13/22] Add instructions for unning db-init.sh to administration_configuration.md --- docs/src/administration_configuration.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/src/administration_configuration.md b/docs/src/administration_configuration.md index 73ea35042..c47d32362 100644 --- a/docs/src/administration_configuration.md +++ b/docs/src/administration_configuration.md @@ -4,3 +4,12 @@ Additionally, you can override any config files with environment variables. Thes `LEMMY__DATABASE__POOL_SIZE=10`. An additional option `LEMMY_DATABASE_URL` is available, which can be used with a PostgreSQL connection string like `postgres://lemmy:password@lemmy_db:5432/lemmy`, passing all connection details at once. + +If the Docker container is not used, manually create the database specified above by running the following commands: + +```bash +# Start at the root of the Lemmy repository + +cd server +./db-init.sh +``` From 1d4dc19d6f2af133d8a4b6bd77a33cdb8d73aebc Mon Sep 17 00:00:00 2001 From: Richie Zhang <12566991+StaticallyTypedRice@users.noreply.github.com> Date: Thu, 6 Feb 2020 13:07:34 -0800 Subject: [PATCH 14/22] Implement password verification in db-init.sh. --- server/db-init.sh | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/server/db-init.sh b/server/db-init.sh index 77b9a6d71..c9150e9de 100644 --- a/server/db-init.sh +++ b/server/db-init.sh @@ -4,9 +4,40 @@ username=lemmy dbname=lemmy port=5432 -read -p "Enter database password: " -s password -echo +password="" +password_confirm="" +password_valid=0 + +while [ "$password_valid" == 0 ] +do + read -p "Enter database password: " -s password + echo + + read -p "Verify database password: " -s password_confirm + echo + echo + + # 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 + psql -c "CREATE USER $username WITH PASSWORD '$password' SUPERUSER;" -U postgres psql -c 'CREATE DATABASE $dbname WITH OWNER $username;' -U postgres export LEMMY_DATABASE_URL=postgres://$username:$password@localhost:$port/$dbname + +echo $LEMMY_DATABASE_URL From d5b483d4d1eaa1d22f4bf8564614e250f5029d9c Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 6 Feb 2020 16:07:59 -0500 Subject: [PATCH 15/22] Fixing rate limit checking to only ping after a success. Fixes #516 --- README.md | 14 ++-- docker/lemmy.hjson | 2 +- server/config/defaults.hjson | 2 +- server/src/websocket/server.rs | 141 ++++++++++++++++++++++----------- 4 files changed, 103 insertions(+), 56 deletions(-) diff --git a/README.md b/README.md index 1c5709745..27637b8aa 100644 --- a/README.md +++ b/README.md @@ -131,18 +131,18 @@ If you'd like to add translations, take a look at the [English translation file] lang | done | missing ---- | ---- | ------- ca | 98% | cross_posted_to,old,support_on_liberapay,time,action -de | 86% | cross_posted_to,create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,old,docs,message_sent,messages,old_password,matrix_user_id,private_message_disclaimer,send_notifications_to_email,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,support_on_liberapay,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action +de | 86% | cross_posted_to,create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,old,docs,message_sent,messages,old_password,matrix_user_id,private_message_disclaimer,send_notifications_to_email,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action fa | 72% | cross_post,cross_posted_to,subscribed_to_communities,trending_communities,create_private_message,send_secure_message,send_message,message,mod,mods,moderates,remove_as_mod,appoint_as_mod,modlog,stickied,ban,ban_from_site,unban,unban_from_site,banned,number_of_subscribers,subscribers,both,saved,unsubscribe,subscribe,subscribed,old,api,docs,inbox,inbox_for,message_sent,notifications_error,messages,no_email_setup,matrix_user_id,private_message_disclaimer,url,body,copy_suggested_title,community,expand_here,subscribe_to_communities,theme,sponsor_message,support_on_liberapay,general_sponsors,joined,by,to,from,landing_0,logged_in,community_moderator_already_exists,community_follower_already_exists,community_user_already_banned,no_slurs,admin_already_created,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action eo | 74% | cross_posted_to,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,theme,support_on_liberapay,donate_to_lemmy,donate,from,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action -es | 99% | cross_posted_to,support_on_liberapay +es | 100% | cross_posted_to fi | 98% | cross_posted_to,old,support_on_liberapay,time,action -fr | 81% | cross_posted_to,create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,support_on_liberapay,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action -it | 82% | cross_posted_to,create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,support_on_liberapay,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action -nl | 98% | cross_posted_to,support_on_liberapay,time,action -pt-br | 100% | support_on_liberapay +fr | 82% | cross_posted_to,create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action +it | 83% | cross_posted_to,create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action +nl | 99% | cross_posted_to,time,action +pt-br | 100% | ru | 70% | cross_posts,cross_post,cross_posted_to,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,theme,support_on_liberapay,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action sv | 81% | cross_posted_to,create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,support_on_liberapay,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action -zh | 69% | cross_posts,cross_post,cross_posted_to,users,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,settings,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,nsfw,show_nsfw,theme,support_on_liberapay,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action +zh | 69% | cross_posts,cross_post,cross_posted_to,users,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,settings,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,nsfw,show_nsfw,theme,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message,time,action If you'd like to update this report, run: diff --git a/docker/lemmy.hjson b/docker/lemmy.hjson index fce4470ca..55c2f2b76 100644 --- a/docker/lemmy.hjson +++ b/docker/lemmy.hjson @@ -29,7 +29,7 @@ # rate limits for various user actions, by user ip rate_limit: { # maximum number of messages created in interval - message: 30 + message: 180 # interval length for message limit message_per_second: 60 # maximum number of posts created in interval diff --git a/server/config/defaults.hjson b/server/config/defaults.hjson index 9a7ad49db..2b37f3bb3 100644 --- a/server/config/defaults.hjson +++ b/server/config/defaults.hjson @@ -30,7 +30,7 @@ # rate limits for various user actions, by user ip rate_limit: { # maximum number of messages created in interval - message: 30 + message: 180 # interval length for message limit message_per_second: 60 # maximum number of posts created in interval diff --git a/server/src/websocket/server.rs b/server/src/websocket/server.rs index a26c8144e..fc838c1fc 100644 --- a/server/src/websocket/server.rs +++ b/server/src/websocket/server.rs @@ -12,6 +12,7 @@ use serde_json::Value; use std::collections::{HashMap, HashSet}; use std::str::FromStr; use std::time::SystemTime; +use strum::IntoEnumIterator; use crate::api::comment::*; use crate::api::community::*; @@ -71,6 +72,13 @@ pub struct SessionInfo { pub ip: IPAddr, } +#[derive(Eq, PartialEq, Hash, Debug, EnumIter, Copy, Clone)] +pub enum RateLimitType { + Message, + Register, + Post, +} + /// `ChatServer` manages chat rooms and responsible for coordinating chat /// session. pub struct ChatServer { @@ -87,8 +95,8 @@ pub struct ChatServer { /// sessions (IE clients) user_rooms: HashMap>, - /// Rate limiting based on IP addr - rate_limits: HashMap, + /// Rate limiting based on rate type and IP addr + rate_limit_buckets: HashMap>, rng: ThreadRng, db: Pool>, @@ -98,7 +106,7 @@ impl ChatServer { pub fn startup(db: Pool>) -> ChatServer { ChatServer { sessions: HashMap::new(), - rate_limits: HashMap::new(), + rate_limit_buckets: HashMap::new(), post_rooms: HashMap::new(), community_rooms: HashMap::new(), user_rooms: HashMap::new(), @@ -259,60 +267,82 @@ impl ChatServer { to_json_string(&user_operation, post) } - fn check_rate_limit_register(&mut self, id: usize) -> Result<(), Error> { + fn check_rate_limit_register(&mut self, id: usize, check_only: bool) -> Result<(), Error> { self.check_rate_limit_full( + RateLimitType::Register, id, Settings::get().rate_limit.register, Settings::get().rate_limit.register_per_second, + check_only, ) } - fn check_rate_limit_post(&mut self, id: usize) -> Result<(), Error> { + fn check_rate_limit_post(&mut self, id: usize, check_only: bool) -> Result<(), Error> { self.check_rate_limit_full( + RateLimitType::Post, id, Settings::get().rate_limit.post, Settings::get().rate_limit.post_per_second, + check_only, ) } - fn check_rate_limit_message(&mut self, id: usize) -> Result<(), Error> { + fn check_rate_limit_message(&mut self, id: usize, check_only: bool) -> Result<(), Error> { self.check_rate_limit_full( + RateLimitType::Message, id, Settings::get().rate_limit.message, Settings::get().rate_limit.message_per_second, + check_only, ) } #[allow(clippy::float_cmp)] - fn check_rate_limit_full(&mut self, id: usize, rate: i32, per: i32) -> Result<(), Error> { + fn check_rate_limit_full( + &mut self, + type_: RateLimitType, + id: usize, + rate: i32, + per: i32, + check_only: bool, + ) -> Result<(), Error> { if let Some(info) = self.sessions.get(&id) { - if let Some(rate_limit) = self.rate_limits.get_mut(&info.ip) { - // The initial value - if rate_limit.allowance == -2f64 { - rate_limit.allowance = rate as f64; - }; + if let Some(bucket) = self.rate_limit_buckets.get_mut(&type_) { + if let Some(rate_limit) = bucket.get_mut(&info.ip) { + let current = SystemTime::now(); + let time_passed = current.duration_since(rate_limit.last_checked)?.as_secs() as f64; - let current = SystemTime::now(); - let time_passed = current.duration_since(rate_limit.last_checked)?.as_secs() as f64; - rate_limit.last_checked = current; - rate_limit.allowance += time_passed * (rate as f64 / per as f64); - if rate_limit.allowance > rate as f64 { - rate_limit.allowance = rate as f64; - } + // The initial value + if rate_limit.allowance == -2f64 { + rate_limit.allowance = rate as f64; + }; - if rate_limit.allowance < 1.0 { - println!( - "Rate limited IP: {}, time_passed: {}, allowance: {}", - &info.ip, time_passed, rate_limit.allowance - ); - Err( - APIError { - message: format!("Too many requests. {} per {} seconds", rate, per), + rate_limit.last_checked = current; + if !check_only { + rate_limit.allowance += time_passed * (rate as f64 / per as f64); + if rate_limit.allowance > rate as f64 { + rate_limit.allowance = rate as f64; } - .into(), - ) + } + + if rate_limit.allowance < 1.0 { + println!( + "Rate limited IP: {}, time_passed: {}, allowance: {}", + &info.ip, time_passed, rate_limit.allowance + ); + Err( + APIError { + message: format!("Too many requests. {} per {} seconds", rate, per), + } + .into(), + ) + } else { + if !check_only { + rate_limit.allowance -= 1.0; + } + Ok(()) + } } else { - rate_limit.allowance -= 1.0; Ok(()) } } else { @@ -350,14 +380,24 @@ impl Handler for ChatServer { }, ); - if self.rate_limits.get(&msg.ip).is_none() { - self.rate_limits.insert( - msg.ip, - RateLimitBucket { - last_checked: SystemTime::now(), - allowance: -2f64, - }, - ); + for rate_limit_type in RateLimitType::iter() { + if self.rate_limit_buckets.get(&rate_limit_type).is_none() { + self + .rate_limit_buckets + .insert(rate_limit_type, HashMap::new()); + } + + if let Some(bucket) = self.rate_limit_buckets.get_mut(&rate_limit_type) { + if bucket.get(&msg.ip).is_none() { + bucket.insert( + msg.ip.to_owned(), + RateLimitBucket { + last_checked: SystemTime::now(), + allowance: -2f64, + }, + ); + } + } } id @@ -446,11 +486,18 @@ fn parse_json_message(chat: &mut ChatServer, msg: StandardMessage) -> Result do_user_operation::(user_operation, data, &conn), UserOperation::Register => { - chat.check_rate_limit_register(msg.id)?; - do_user_operation::(user_operation, data, &conn) + chat.check_rate_limit_register(msg.id, true)?; + let register: Register = serde_json::from_str(data)?; + let res = Oper::new(register).perform(&conn)?; + chat.check_rate_limit_register(msg.id, false)?; + to_json_string(&user_operation, &res) } UserOperation::GetUserDetails => { do_user_operation::(user_operation, data, &conn) @@ -503,8 +550,11 @@ fn parse_json_message(chat: &mut ChatServer, msg: StandardMessage) -> Result(user_operation, data, &conn) } UserOperation::CreateCommunity => { - chat.check_rate_limit_register(msg.id)?; - do_user_operation::(user_operation, data, &conn) + chat.check_rate_limit_register(msg.id, true)?; + let create_community: CreateCommunity = serde_json::from_str(data)?; + let res = Oper::new(create_community).perform(&conn)?; + chat.check_rate_limit_register(msg.id, false)?; + to_json_string(&user_operation, &res) } UserOperation::EditCommunity => { let edit_community: EditCommunity = serde_json::from_str(data)?; @@ -566,14 +616,14 @@ fn parse_json_message(chat: &mut ChatServer, msg: StandardMessage) -> Result { - chat.check_rate_limit_post(msg.id)?; + chat.check_rate_limit_post(msg.id, true)?; let create_post: CreatePost = serde_json::from_str(data)?; let res = Oper::new(create_post).perform(&conn)?; + chat.check_rate_limit_post(msg.id, false)?; chat.post_sends(UserOperation::CreatePost, res, msg.id) } UserOperation::CreatePostLike => { - chat.check_rate_limit_message(msg.id)?; let create_post_like: CreatePostLike = serde_json::from_str(data)?; let res = Oper::new(create_post_like).perform(&conn)?; @@ -589,7 +639,6 @@ fn parse_json_message(chat: &mut ChatServer, msg: StandardMessage) -> Result(user_operation, data, &conn) } UserOperation::CreateComment => { - chat.check_rate_limit_message(msg.id)?; let create_comment: CreateComment = serde_json::from_str(data)?; let res = Oper::new(create_comment).perform(&conn)?; @@ -605,7 +654,6 @@ fn parse_json_message(chat: &mut ChatServer, msg: StandardMessage) -> Result(user_operation, data, &conn) } UserOperation::CreateCommentLike => { - chat.check_rate_limit_message(msg.id)?; let create_comment_like: CreateCommentLike = serde_json::from_str(data)?; let res = Oper::new(create_comment_like).perform(&conn)?; @@ -649,7 +697,6 @@ fn parse_json_message(chat: &mut ChatServer, msg: StandardMessage) -> Result(user_operation, data, &conn) } UserOperation::CreatePrivateMessage => { - chat.check_rate_limit_message(msg.id)?; let create_private_message: CreatePrivateMessage = serde_json::from_str(data)?; let recipient_id = create_private_message.recipient_id; let res = Oper::new(create_private_message).perform(&conn)?; From 9fb5d55569a1c1a5107d696f92eafb63c9c609e4 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 6 Feb 2020 16:16:51 -0500 Subject: [PATCH 16/22] Version v0.6.12 --- ansible/VERSION | 2 +- docker/prod/docker-compose.yml | 2 +- server/src/version.rs | 2 +- ui/src/version.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ansible/VERSION b/ansible/VERSION index 882307ccd..00a9fa57a 100644 --- a/ansible/VERSION +++ b/ansible/VERSION @@ -1 +1 @@ -v0.6.11 +v0.6.12 diff --git a/docker/prod/docker-compose.yml b/docker/prod/docker-compose.yml index da78126c3..52689cc40 100644 --- a/docker/prod/docker-compose.yml +++ b/docker/prod/docker-compose.yml @@ -11,7 +11,7 @@ services: - lemmy_db:/var/lib/postgresql/data restart: always lemmy: - image: dessalines/lemmy:v0.6.11 + image: dessalines/lemmy:v0.6.12 ports: - "127.0.0.1:8536:8536" restart: always diff --git a/server/src/version.rs b/server/src/version.rs index 28373cf57..2f84f1b80 100644 --- a/server/src/version.rs +++ b/server/src/version.rs @@ -1 +1 @@ -pub const VERSION: &str = "v0.6.11"; +pub const VERSION: &str = "v0.6.12"; diff --git a/ui/src/version.ts b/ui/src/version.ts index f851d7188..3f3f923fc 100644 --- a/ui/src/version.ts +++ b/ui/src/version.ts @@ -1 +1 @@ -export const version: string = 'v0.6.11'; +export const version: string = 'v0.6.12'; From c9060f76b47dfef5ec1a82b7d3943df2e8e38752 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 6 Feb 2020 16:26:03 -0500 Subject: [PATCH 17/22] Minor fixes to docs. --- docs/src/administration_configuration.md | 2 -- docs/src/contributing_local_development.md | 2 -- 2 files changed, 4 deletions(-) diff --git a/docs/src/administration_configuration.md b/docs/src/administration_configuration.md index 55f93f05b..8900ce8d5 100644 --- a/docs/src/administration_configuration.md +++ b/docs/src/administration_configuration.md @@ -10,8 +10,6 @@ An additional option `LEMMY_DATABASE_URL` is available, which can be used with a If the Docker container is not used, manually create the database specified above by running the following commands: ```bash -# Start at the root of the Lemmy repository - cd server ./db-init.sh ``` diff --git a/docs/src/contributing_local_development.md b/docs/src/contributing_local_development.md index 7d782925a..175b000c7 100644 --- a/docs/src/contributing_local_development.md +++ b/docs/src/contributing_local_development.md @@ -7,8 +7,6 @@ #### Set up Postgres DB ```bash -# Start at the root of the Lemmy repository - cd server ./db-init.sh ``` From bbc7159ede28e4ae335504f6d7d6e0170b2a2a46 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 6 Feb 2020 22:24:23 -0500 Subject: [PATCH 18/22] Fix expanded image height. Fixes #455 --- ui/assets/css/main.css | 5 +++++ ui/src/components/post-listing.tsx | 2 +- ui/src/utils.ts | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ui/assets/css/main.css b/ui/assets/css/main.css index 2703d550c..b1ad884a5 100644 --- a/ui/assets/css/main.css +++ b/ui/assets/css/main.css @@ -37,6 +37,7 @@ } .md-div img { + max-height: 90vh; max-width: 100%; height: auto; } @@ -170,3 +171,7 @@ hr { -o-filter: blur(10px); -ms-filter: blur(10px); } + +.img-expanded { + max-height: 90vh; +} diff --git a/ui/src/components/post-listing.tsx b/ui/src/components/post-listing.tsx index 9b3141c42..f11d9e144 100644 --- a/ui/src/components/post-listing.tsx +++ b/ui/src/components/post-listing.tsx @@ -237,7 +237,7 @@ export class PostListing extends Component { class="pointer" onClick={linkEvent(this, this.handleImageExpandClick)} > - + diff --git a/ui/src/utils.ts b/ui/src/utils.ts index c53ee76a1..9ad0920f4 100644 --- a/ui/src/utils.ts +++ b/ui/src/utils.ts @@ -384,7 +384,7 @@ export function showAvatars(): boolean { export function imageThumbnailer(url: string): string { let split = url.split('pictshare'); if (split.length > 1) { - let out = `${split[0]}pictshare/140x140${split[1]}`; + let out = `${split[0]}pictshare/192x192${split[1]}`; return out; } else { return url; From 514c1ab298d858b24d30af67578251db19bbc5d8 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 6 Feb 2020 22:48:43 -0500 Subject: [PATCH 19/22] Fixing rate limiting. --- server/src/websocket/server.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/server/src/websocket/server.rs b/server/src/websocket/server.rs index fc838c1fc..bf3249e1d 100644 --- a/server/src/websocket/server.rs +++ b/server/src/websocket/server.rs @@ -318,11 +318,9 @@ impl ChatServer { }; rate_limit.last_checked = current; - if !check_only { - rate_limit.allowance += time_passed * (rate as f64 / per as f64); - if rate_limit.allowance > rate as f64 { - rate_limit.allowance = rate as f64; - } + rate_limit.allowance += time_passed * (rate as f64 / per as f64); + if !check_only && rate_limit.allowance > rate as f64 { + rate_limit.allowance = rate as f64; } if rate_limit.allowance < 1.0 { From 1c182e381b4de718e1504186e4bd418552d9e34a Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 6 Feb 2020 23:02:26 -0500 Subject: [PATCH 20/22] Version v0.6.13 --- ansible/VERSION | 2 +- docker/prod/docker-compose.yml | 2 +- server/src/version.rs | 2 +- ui/src/version.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ansible/VERSION b/ansible/VERSION index 00a9fa57a..1adfd94d3 100644 --- a/ansible/VERSION +++ b/ansible/VERSION @@ -1 +1 @@ -v0.6.12 +v0.6.13 diff --git a/docker/prod/docker-compose.yml b/docker/prod/docker-compose.yml index 52689cc40..a5c2918ab 100644 --- a/docker/prod/docker-compose.yml +++ b/docker/prod/docker-compose.yml @@ -11,7 +11,7 @@ services: - lemmy_db:/var/lib/postgresql/data restart: always lemmy: - image: dessalines/lemmy:v0.6.12 + image: dessalines/lemmy:v0.6.13 ports: - "127.0.0.1:8536:8536" restart: always diff --git a/server/src/version.rs b/server/src/version.rs index 2f84f1b80..2d9ff73cd 100644 --- a/server/src/version.rs +++ b/server/src/version.rs @@ -1 +1 @@ -pub const VERSION: &str = "v0.6.12"; +pub const VERSION: &str = "v0.6.13"; diff --git a/ui/src/version.ts b/ui/src/version.ts index 3f3f923fc..845bbef1e 100644 --- a/ui/src/version.ts +++ b/ui/src/version.ts @@ -1 +1 @@ -export const version: string = 'v0.6.12'; +export const version: string = 'v0.6.13'; From 68ac96147c32f6bc9f119cfda3f8da9697f77c43 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Fri, 7 Feb 2020 10:12:05 -0500 Subject: [PATCH 21/22] Fix issue with post creating redirecting other posts. Fixes #520 --- ui/src/components/post-form.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ui/src/components/post-form.tsx b/ui/src/components/post-form.tsx index 35d4e5956..7984c2a85 100644 --- a/ui/src/components/post-form.tsx +++ b/ui/src/components/post-form.tsx @@ -516,12 +516,16 @@ export class PostForm extends Component { this.setState(this.state); } else if (res.op == UserOperation.CreatePost) { let data = res.data as PostResponse; - this.state.loading = false; - this.props.onCreate(data.post.id); + if (data.post.creator_id == UserService.Instance.user.id) { + this.state.loading = false; + this.props.onCreate(data.post.id); + } } else if (res.op == UserOperation.EditPost) { let data = res.data as PostResponse; - this.state.loading = false; - this.props.onEdit(data.post); + if (data.post.creator_id == UserService.Instance.user.id) { + this.state.loading = false; + this.props.onEdit(data.post); + } } else if (res.op == UserOperation.Search) { let data = res.data as SearchResponse; From 65145b719c342732d9d7c6f6376e3d4ebbed241e Mon Sep 17 00:00:00 2001 From: Dessalines Date: Fri, 7 Feb 2020 11:17:15 -0500 Subject: [PATCH 22/22] Adding post body searching. Fixes #507 --- server/src/db/post_view.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/src/db/post_view.rs b/server/src/db/post_view.rs index c80d16967..4d09308d8 100644 --- a/server/src/db/post_view.rs +++ b/server/src/db/post_view.rs @@ -178,7 +178,11 @@ impl<'a> PostQueryBuilder<'a> { pub fn search_term>(mut self, search_term: T) -> Self { use super::post_view::post_mview::dsl::*; if let Some(search_term) = search_term.get_optional() { - self.query = self.query.filter(name.ilike(fuzzy_search(&search_term))); + let searcher = fuzzy_search(&search_term); + self.query = self + .query + .filter(name.ilike(searcher.to_owned())) + .or_filter(body.ilike(searcher)); } self }