Compare commits
438 Commits
2.1.0-rc.3
...
chapril
Author | SHA1 | Date |
---|---|---|
Tykayn | c2a61801c1 | |
Tykayn | a89aaf9d09 | |
Tykayn | 0ea9cc416f | |
Tykayn | d21ec65cc6 | |
Tykayn | e827c0face | |
Tykayn | 6198507117 | |
Tykayn | b0b5251211 | |
Thomas Citharel | 98229e8165 | |
Thomas Citharel | 5c39fd2852 | |
Thomas Citharel | 6ea060291c | |
DignifiedSilence | f82e96a5fe | |
Thomas Citharel | 79a51e5237 | |
Thomas Citharel | f86b82f0d5 | |
Thomas Citharel | 63e56b5b24 | |
setop | 57d4abae68 | |
Thomas Citharel | 2b852c622e | |
Thomas Citharel | 4213e1f1ec | |
Thomas Citharel | c05243f839 | |
Thomas Citharel | ab622cb424 | |
Thomas Citharel | 90980bc2c5 | |
Thomas Citharel | ef26f1a684 | |
Thomas Citharel | 18ceeb450a | |
Thomas Citharel | 123eee675a | |
Thomas Citharel | 46236dbe1d | |
Thomas Citharel | 1eb111f52f | |
Thomas Citharel | 3fea2d0395 | |
Thomas Citharel | 44b2ca26bd | |
Thomas Citharel | 5bc63185fd | |
Thomas Citharel | 071185204e | |
Thomas Citharel | 5bc9245dce | |
Thomas Citharel | 4fc5554142 | |
Thomas Citharel | f07d6d63de | |
Berto Te | f6cd91ad1f | |
Henri Febleux | 5b4e6ed473 | |
Thomas Citharel | 9be4ed84da | |
Thomas Citharel | 7a6a013d93 | |
Thomas Citharel | 3b8b150d48 | |
Thomas Citharel | 888d2ef4b8 | |
Thomas Citharel | 3982977121 | |
Thomas Citharel | aff1959030 | |
Thomas Citharel | 0b49021f8b | |
Thomas Citharel | f58d6829da | |
Thomas Citharel | d3bc76afbf | |
Thomas Citharel | 578bd99be2 | |
Thomas Citharel | c9ebd76cc9 | |
Thomas Citharel | 05724476aa | |
Thomas Citharel | 6eb2b6d31a | |
Thomas Citharel | cd3d0c5fc4 | |
Thomas Citharel | 6a937d6ede | |
Thomas Citharel | 2651f4cf40 | |
Thomas Citharel | 8549a16ade | |
Thomas Citharel | 3fcb44642a | |
Berto Te | 41dfc2bc1c | |
Thomas Citharel | a84ec21aba | |
Thomas Citharel | 61e6200b02 | |
Thomas Citharel | b1205b6912 | |
Thomas Citharel | 26cf892758 | |
Thomas Citharel | d85f708c37 | |
Thomas Citharel | a400499a57 | |
Thomas Citharel | 87214b038f | |
Thomas Citharel | 90158f1112 | |
Luca Eichler | 75502e2a4b | |
Thomas Citharel | ec849b1488 | |
Thomas Citharel | 1e9a7c2cbb | |
Thomas Citharel | 63a23748ac | |
Thomas Citharel | 999a33c7c3 | |
Thomas Citharel | f6a17d8b3a | |
Thomas Citharel | a18c4daf4c | |
Thomas Citharel | c0d8b2d39a | |
Thomas Citharel | b3e7f23604 | |
Thomas Citharel | 20542d3b68 | |
Thomas Citharel | 1299b3baf1 | |
Thomas Citharel | d7887ccb83 | |
Thomas Citharel | 62248b2f81 | |
Thomas Citharel | ada22e24ef | |
Thomas Citharel | bf7ebfd989 | |
Thomas Citharel | a4cc566ee7 | |
Thomas Citharel | cd61a98f4d | |
Thomas Citharel | 926dd01272 | |
Thomas Citharel | d87261a6fb | |
Thomas Citharel | 93805dca11 | |
setop | f071f70d1f | |
Thomas Citharel | 6596e2d6bd | |
אנטולי מהגבעות האדומות | 7e71399065 | |
Thomas Citharel | d2ebe86c9f | |
Thomas Citharel | c91e8f6bf3 | |
Thomas Citharel | f997f573ba | |
Thomas Citharel | 82255b46eb | |
Thomas Citharel | 9ab0768684 | |
GunChleoc | 303a6f8bd8 | |
Thomas Citharel | da80fa6235 | |
GunChleoc | 2aedf3027e | |
GunChleoc | d308752f25 | |
Norwin | ee037e57fa | |
Thebigal Wisi | 66055e706a | |
Norwin | 9bc8342a32 | |
fluxx | 2e9bb1e1fd | |
Thorsten Panknin | d81e584e24 | |
Thebigal Wisi | a5c684b050 | |
tunda | faee93fe43 | |
Norwin | 8ec2cfe17f | |
Thebigal Wisi | f4bfc8e5f3 | |
Norwin | 874ec0fa49 | |
Kira Sinn | e1e0cb5030 | |
Thomas Citharel | 2b3be8a5d2 | |
Thomas Citharel | 81a9c5011b | |
Thomas Citharel | 0ee7e649a7 | |
Thomas Citharel | 00c3212950 | |
Thomas Citharel | 762d20213a | |
Thomas Citharel | 13fbc9667d | |
Thomas Citharel | 4830750a1d | |
Thomas Citharel | bfc25b115a | |
Berto Te | 27ea14f8f2 | |
Thomas Citharel | 5f64eff8d3 | |
Thomas Citharel | 774e4a514c | |
Thomas Citharel | 16fd012e9b | |
Thomas Citharel | c2f0ee7928 | |
Thomas Citharel | 29062ff883 | |
Thomas Citharel | d075522f75 | |
Thomas Citharel | 96b93ac841 | |
Thomas Citharel | 2a2e5808f5 | |
Thomas Citharel | bd074cf9fc | |
Marco Ciampa | 11ac1631f0 | |
Thomas Citharel | d5e8330c7f | |
Thomas Citharel | 48af135fd6 | |
Thomas Citharel | 0994a8bbae | |
Thomas Citharel | 25ac2ab5e5 | |
Thomas Citharel | 97989f8de1 | |
Thomas Citharel | e3b4d29a43 | |
Thomas Citharel | ef4be72b7f | |
Thomas Citharel | 9c53888c30 | |
Thomas Citharel | c1ed270aa6 | |
Thomas Citharel | 8d85c3ed8f | |
Thomas Citharel | 680463a5f9 | |
Thomas Citharel | aa56724bef | |
Thomas Citharel | 5c65a4b892 | |
Thomas Citharel | b849a63cc6 | |
Thomas Citharel | 379e97107f | |
Thomas Citharel | 2d99fe877c | |
Thomas Citharel | 47f188a277 | |
Thomas Citharel | 6db5a0e801 | |
Thomas Citharel | ea991cd8f8 | |
jim@killock.org.uk | 0e2d279de1 | |
Thomas Citharel | 84b5bf339e | |
Marco Ciampa | 8620f2ff4a | |
Eivind Ødegård | 02032f5ec0 | |
Philip Bernhart | c7e713048f | |
Kenneth Aalberg | 242dff05d0 | |
Amanda Graven | 6211b183f6 | |
Kenneth Aalberg | e2e6e58900 | |
Amanda Graven | b864f4ddbb | |
Amanda Graven | 90389bbac8 | |
Amanda Graven | f2cf046733 | |
Thebigal Wisi | 7a229f9525 | |
Thebigal Wisi | 852f730734 | |
Mark | 2bc23747f0 | |
Eivind Ødegård | 4ad209c115 | |
Eivind Ødegård | 1895e19fa1 | |
Thebigal Wisi | 3d1f1fbcc6 | |
Mark | db95bdb5fe | |
Mark | 0d006c76f2 | |
Jiri Podhorecky | f3b33e1b4a | |
Jiri Podhorecky | df0ad6b633 | |
אנטולי מהגבעות האדומות | fa6846d2a3 | |
אנטולי מהגבעות האדומות | dc740f6380 | |
אנטולי מהגבעות האדומות | 8e46a70baf | |
Thomas Citharel | 976503cd29 | |
Thomas Citharel | 32ec220372 | |
deadmorose | 72061d9fe2 | |
deadmorose | 3962a7cf1e | |
Jiri Podhorecky | df42cfa537 | |
Jiri Podhorecky | ff56b77fa6 | |
Jiri Podhorecky | 5dffceebad | |
Jiri Podhorecky | 5c2f60561c | |
Jiri Podhorecky | 792435da91 | |
Mark | 6894f678c7 | |
Mark | 2fa3285aca | |
GunChleoc | c59487a34c | |
Mark | fa60c6c904 | |
Novel Martin Harianto | b0cbfc52d3 | |
Al Wisi | 9f60802a15 | |
Weblate | 16f880e56b | |
setop | 96f405eb43 | |
Al Wisi | 748ff7f8e4 | |
Al Wisi | 37599d416f | |
Al Wisi | b2b8356033 | |
Al Wisi | 89fab03d26 | |
Jiri Podhorecky | 56338a4cfb | |
Al Wisi | 60586e454a | |
Al Wisi | 8eedf93090 | |
Al Wisi | 3dd1667ac1 | |
Al Wisi | 95186c5fe6 | |
setop | 16999ce19b | |
Berto Te | 4ed400910f | |
Berto Te | 6bfb1cc861 | |
Thomas Citharel | 01e159d5e1 | |
Berto Te | 1d31518d38 | |
Berto Te | 3822275ac0 | |
Berto Te | cd026e0edb | |
Thomas Citharel | 40785d7f26 | |
Thomas Citharel | c35cfc8181 | |
Thomas Citharel | 77945c8236 | |
Thomas Citharel | cb1e348665 | |
Thomas Citharel | f3215190c5 | |
Thomas Citharel | 644647fa38 | |
Thomas Citharel | 95c355d586 | |
Thomas Citharel | 9cc0acdaeb | |
Thomas Citharel | 54afcbee06 | |
Thomas Citharel | 254d29558a | |
Thomas Citharel | 2a6ddb4958 | |
Weblate | 0842ecbc79 | |
Anonymous | 5bc430f47f | |
Anonymous | 6e10b024ef | |
Anonymous | 1e420d5448 | |
Anonymous | 348199ba8f | |
Anonymous | dc5e64593a | |
Anonymous | 1431e362c9 | |
Anonymous | 7695393a74 | |
Anonymous | e3db9d24ef | |
Anonymous | fbeb4e4553 | |
Anonymous | 2230afc2af | |
Anonymous | 9a049302b1 | |
Anonymous | c7d16ecdcf | |
Anonymous | f80b604f39 | |
Anonymous | 1dddf901b0 | |
Anonymous | 59e62a9bdb | |
Anonymous | 6e3ce82dcf | |
Anonymous | 24fe461043 | |
Anonymous | 9e851e4a57 | |
Anonymous | 776164e7d9 | |
Anonymous | 8060171753 | |
Anonymous | 17df07188e | |
Anonymous | 329b7498f8 | |
Anonymous | 9da434308e | |
Anonymous | 720295b64f | |
Anonymous | f72c5d8673 | |
Anonymous | 5084422c85 | |
Anonymous | b58a6b1a1a | |
Anonymous | 6f1625a55c | |
Anonymous | e0b9bc1539 | |
Thomas Citharel | b45b703143 | |
Thomas Citharel | 0b2dde0bff | |
Thomas Citharel | 93e6831403 | |
Thomas Citharel | 17d910ea88 | |
Thomas Citharel | 759ebe2298 | |
Thomas Citharel | deda6da6f5 | |
Thomas Citharel | d47094ecad | |
Thomas Citharel | 012c2ad344 | |
Thomas Citharel | b098ae202d | |
Thomas Citharel | 23864deffe | |
Thomas Citharel | d5545e01b0 | |
Thomas Citharel | 19005d3199 | |
Thomas Citharel | d8574e0d15 | |
Thomas Citharel | b47dad5659 | |
Thomas Citharel | cb7e4bddf5 | |
Thomas Citharel | 2d57ac6466 | |
Thomas Citharel | 22d9d716ee | |
setop | 9364331a1d | |
Mark | 0e4440a9e8 | |
Mark | 7610fe3fa7 | |
Mark | d150e45fce | |
Kristoffer Grundström | 21b9b1ab9d | |
Anders Trobäck | a8db378010 | |
Kristoffer Grundström | a98d4fee4b | |
Kristoffer Grundström | ea6e80f056 | |
Kristoffer Grundström | 0bc59325fb | |
Quentin PAGÈS | 080b3f9a50 | |
Quentin PAGÈS | d36b664c6b | |
Quentin PAGÈS | fe9aa78feb | |
Jiri Podhorecky | 56a2f0da49 | |
Jiri Podhorecky | 43e0502c57 | |
Thomas Citharel | 5b886ec767 | |
Thomas Citharel | f2c1770459 | |
Thomas Citharel | 7334e6b5b8 | |
Thomas Citharel | 73c5429058 | |
Thomas Citharel | c279511ffe | |
Thomas Citharel | 546da074d1 | |
Thomas Citharel | 5cea3f3cf0 | |
Weblate | becf688d8d | |
Weblate | 0eef3a5e4a | |
Weblate | a8a8890117 | |
Thomas Citharel | d59077edca | |
Thomas Citharel | 3fc1a723ac | |
Thomas Citharel | 44de57fffa | |
Thomas Citharel | f083dcb687 | |
Thomas Citharel | b02580d654 | |
Thomas Citharel | 09b61af22f | |
Thomas Citharel | 003a8fe4e4 | |
fr33domlover | 07dc83c9dd | |
fr33domlover | e149be864d | |
Berto Te | b5cd09d91a | |
Thomas Citharel | ce443ce708 | |
Thomas Citharel | 0136bb7f87 | |
Thomas Citharel | 36f19916b5 | |
Thomas Citharel | ddadf4c3d4 | |
Thomas Citharel | 53ab9ac7b2 | |
Thomas Citharel | 124a9cb6a6 | |
Thomas Citharel | 9f8bd5c87a | |
Thomas Citharel | 7f2aa2a9f9 | |
Jiri Podhorecky | c6de89e145 | |
Jiri Podhorecky | 747ce883ce | |
Jiri Podhorecky | 4370e2e406 | |
Jiri Podhorecky | fb7c78eadb | |
Jiri Podhorecky | 66dfd54632 | |
Jiri Podhorecky | 0f2c4b6897 | |
Jiri Podhorecky | 6385e29cc3 | |
Jiri Podhorecky | f89105d49d | |
Thomas Frenzel | 3a925afeea | |
Jiri Podhorecky | 594ee50a1f | |
Jiri Podhorecky | 594dbfbaab | |
Thomas Frenzel | 3c763c953a | |
Jiri Podhorecky | 4e1165da23 | |
Jiri Podhorecky | b608ba9444 | |
Thomas Frenzel | 6000625985 | |
Jiri Podhorecky | b1197cbefa | |
Jiri Podhorecky | 05ac4a679c | |
Jiri Podhorecky | a2cee5314e | |
Jiri Podhorecky | d1e4069451 | |
Jiri Podhorecky | 718cb0ca6a | |
Jiri Podhorecky | c09c92df2d | |
Jiri Podhorecky | 4a93104c62 | |
Luka Filipović | 3a2160dd4c | |
Jiri Podhorecky | 383acdb052 | |
Jiri Podhorecky | be7bc3a437 | |
Luka Filipović | 13ca024dc6 | |
Jiri Podhorecky | 75ed8b93e1 | |
Jiri Podhorecky | f62ad4a3fb | |
Jiri Podhorecky | 6666539554 | |
Jiri Podhorecky | 923d3ca994 | |
Marco Ciampa | 8230c35d49 | |
Jiri Podhorecky | e140d86846 | |
deadmorose | d87be1f4f0 | |
Jiri Podhorecky | 6fa3dcd339 | |
Thomas Frenzel | 32684bd350 | |
Luka Filipović | b02456cb6a | |
Jiri Podhorecky | a739e9d887 | |
Jiri Podhorecky | 34400156b8 | |
Thomas Frenzel | 35e4760942 | |
Jiri Podhorecky | 7b13cd9aef | |
Jiri Podhorecky | 18b455e45b | |
Jiri Podhorecky | 152d5f47e5 | |
Luka Filipović | b39fe54faa | |
Luka Filipović | d6660b2a9a | |
Quentin PAGÈS | 9b64de803d | |
Thorsten Panknin | a1f73c951a | |
Thomas Citharel | c6fe85458b | |
Luka Filipović | 5db44c9b6b | |
Mostafa Ahangarha | 4fec053546 | |
Quentin PAGÈS | 2c62d5ac87 | |
Luca E | 1fb47cda4c | |
Thorsten Panknin | 081f8082d1 | |
Thomas Citharel | b91b0fdc6f | |
Thomas Citharel | 97285e4f1a | |
Thomas Citharel | 9665b15f96 | |
Thomas Citharel | e9ca950067 | |
Thomas Citharel | 30f220f73f | |
Thomas Citharel | 4568a4f4c2 | |
Thomas Citharel | 7ef481dad3 | |
David Clubb | 6e3d8157d0 | |
Luka Filipović | 8dcd3043ad | |
Luka Filipović | ab17b9a829 | |
Thomas Citharel | 06ae4a5436 | |
Thomas Citharel | 5f39d8fb26 | |
Thomas Citharel | 21fb9c9f1c | |
Thomas Citharel | 6980bbfea4 | |
Thomas Citharel | 605868c13f | |
Thomas Citharel | e45eae178a | |
David Clubb | 6fecdb1e23 | |
Jiri Podhorecky | 72f52f7bcf | |
Luc Didry | d55565f54d | |
Luc Didry | 4f4083f9f8 | |
Luc Didry | da5be99197 | |
Luc Didry | c112a98773 | |
David Clubb | ec77dbcfa0 | |
Thomas Citharel | a6abb22cfc | |
Thomas Citharel | 328068155b | |
Thomas Citharel | 796f03f8fa | |
Thomas Citharel | e03a09da45 | |
Thomas Citharel | 72877423c5 | |
Thomas Citharel | d96923d29a | |
Thomas Citharel | 6fdb01308b | |
Thomas Citharel | f618318d8d | |
Thomas Citharel | 33c7c5247e | |
Thomas Citharel | ba4752dee6 | |
TA | 6ca9cfc144 | |
Balázs Úr | 7f252a5866 | |
GunChleoc | 22941101af | |
Balázs Úr | d3d76e9d4e | |
Balázs Úr | ea42f63cc8 | |
Balázs Úr | 64f9a54c1c | |
Thomas Citharel | 9f3a2e1801 | |
Thomas Citharel | 8e7bb4f3fc | |
Thomas Citharel | 9c60d5c670 | |
Tykayn | b579379582 | |
Tykayn | 780971f19c | |
Tykayn | 8b9b1f7acc | |
Tykayn | fa372387aa | |
tykayn | 716dba7998 | |
Tykayn | faa0e2fd3e | |
Tykayn | 19863fc6bf | |
Tykayn | f66845efa4 | |
Tykayn | 973ae96f1a | |
Tykayn | 98bfe24fe3 | |
Tykayn | 4dafbca54b | |
Tykayn | 2b6233c283 | |
Tykayn | c82f8c5161 | |
tykayn | 55adf7b5a0 | |
tykayn | 8e06e853b8 | |
Tykayn | 8a259c4c62 | |
Tykayn | 78934c9234 | |
Tykayn | 12045b7b21 | |
Tykayn | 6d26952307 | |
Tykayn | 74a3757e1e | |
Thomas Citharel | c6590415a3 | |
Tykayn | 73bfac679a | |
Tykayn | 61b1235c97 | |
Tykayn | 7eb95a1641 | |
Tykayn | adbe90bc87 | |
tykayn | 5bb6f21060 | |
tykayn | 27331eb7db | |
tykayn | fad649c8eb | |
tykayn | 247c76e038 | |
tykayn | 88ad804268 | |
Tykayn | fa89c90c28 | |
tykayn | d3860eb81e | |
tykayn | 1f35ea213a | |
tykayn | 4e7d3aa157 | |
tykayn | b9cfcfcfb5 | |
Tykayn | 987add5308 | |
Tykayn | 0ded17fee2 | |
tykayn | d9ec8da925 | |
tykayn | c9fc73ddbf | |
tykayn | 529b7d48de | |
tykayn | 12e327552d | |
tykayn | 229c16df3b | |
tykayn | f80bf34605 | |
tykayn | 47ce4803f5 | |
tykayn | b0bf280ee8 |
|
@ -238,13 +238,13 @@ build-docker-tag:
|
|||
|
||||
# Packaging app for amd64
|
||||
package-app:
|
||||
image: mobilizon/buildpack:1.13.4-erlang-24.3.3-${OS}
|
||||
image: mobilizon/buildpack:1.13.4-erlang-24.3.3-debian-buster
|
||||
stage: package
|
||||
variables: &release-variables
|
||||
MIX_ENV: "prod"
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
TZ: Etc/UTC
|
||||
APP_ASSET: "${CI_PROJECT_NAME}_${CI_COMMIT_REF_NAME}_${ARCH}_${OS}.tar.gz"
|
||||
APP_ASSET: "${CI_PROJECT_NAME}_${CI_COMMIT_REF_NAME}_${ARCH}.tar.gz"
|
||||
script: &release-script
|
||||
- mix local.hex --force
|
||||
- mix local.rebar --force
|
||||
|
@ -263,9 +263,6 @@ package-app:
|
|||
expire_in: 2 days
|
||||
paths:
|
||||
- ${APP_ASSET}
|
||||
parallel:
|
||||
matrix:
|
||||
- OS: ["debian-bullseye", "debian-buster", "ubuntu-focal", "ubuntu-bionic", "fedora-35", "fedora-36", "alpine-3.14.5", "alpine-3.15.3"]
|
||||
|
||||
package-app-dev:
|
||||
stage: package
|
||||
|
@ -288,9 +285,8 @@ multi-arch-release:
|
|||
DOCKER_TLS_VERIFY: 1
|
||||
DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client"
|
||||
DOCKER_DRIVER: overlay2
|
||||
APP_ASSET: "${CI_PROJECT_NAME}_${CI_COMMIT_REF_NAME}_${ARCH}_${OS}.tar.gz"
|
||||
# For now, arm and arm64 are only build for debian bullseye version
|
||||
OS: debian-bullseye
|
||||
APP_ASSET: "${CI_PROJECT_NAME}_${CI_COMMIT_REF_NAME}_${ARCH}.tar.gz"
|
||||
OS: debian-buster
|
||||
services:
|
||||
- docker:20.10.12-dind
|
||||
cache: {}
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
elixir 1.13.3-otp-24
|
||||
elixir 1.13.4-otp-24
|
||||
erlang 24.3.3
|
||||
|
|
332
CHANGELOG.md
|
@ -1,68 +1,237 @@
|
|||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## 2.1.0 - 2022-05-16
|
||||
|
||||
### Added
|
||||
|
||||
- Added an event category field. Administrators can extend the pre-configured list of categories through configuration.
|
||||
- Added possibility for administrators to have analytics (Matomo, Plausible supported) and error handling (Sentry supported) on front-end.
|
||||
- Redesigned federation admin section with dedicated instance pages
|
||||
- Allow to filter moderation reports by domain
|
||||
- Added a button to go to past events of a group if it has no upcoming events
|
||||
- Add Überauth CAS Strategy
|
||||
- Add a CLI command to delete actors
|
||||
|
||||
### Changed
|
||||
|
||||
- Changed mailer library from Bamboo to Swoosh, should fix emails being considered spam. **Some configuration changes are required, see below.**
|
||||
- Expose some fields to ActivityStreams event representation: `isOnline`, `remainingAttendeeCapacity` and `participantCount`
|
||||
- Expose a new field to ActivityStreams group representation: `memberCount`
|
||||
- Improve group creation errors feedback
|
||||
- Only display locality in event card
|
||||
- Stale groups are now excluded from group search
|
||||
- Event default visibility is now set according to group privacy setting
|
||||
- Remove Koena Connect button
|
||||
- Hide the whole metadata block if group has no description
|
||||
- Increase task timeout in Refresher to 60 seconds
|
||||
- Allow webfinger to be fetched over http (not https) in dev mode
|
||||
- Improve reactions when approving/rejecting an instance follow
|
||||
- Improve instance admin view for mobile
|
||||
- Allow to reject instance following
|
||||
- Allow instance to have non-standard ports
|
||||
- Add pagination to the instances list
|
||||
- Eventually fetch actors in mentions
|
||||
- Improve IdentityPicker, JoinGroupWithAccount and ActorInline components
|
||||
- Various group and posts improvements
|
||||
- Update schema.graphql file
|
||||
- Add "Accept-Language" header to sentry request metadata
|
||||
- Hide address blocks when address has no real data
|
||||
- Remove obsolete attribute type="text/css" from <style> tags
|
||||
- Improve actor cards integration
|
||||
- Use upstream dependencies for Ueberauth providers
|
||||
- Include ongoing events in search
|
||||
- Send push notification into own task
|
||||
- Add appropriate timeouts for Repo.transactions
|
||||
- Add a proper error message when adding an instance follow that doesn't respond
|
||||
- Allow the instance to be followed from Mastodon (through relays)
|
||||
- Remove unused fragment from FETCH_PERSON GraphQL query
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed actor refreshment being impossible
|
||||
- Fixed ical export for undefined datetimes
|
||||
- Fixed parsing links with hashtag characters
|
||||
- Fixed fetching link details from Twitter
|
||||
- Fixed Thunderbird accessing ICS feed endpoint with special `Accept` HTTP header
|
||||
- Make sure every ICS/Feed caches are emptied when modifying entities
|
||||
- Fixed time issues with DST changes
|
||||
- Fixed group preview card not truncating description
|
||||
- Fixed redirection after login
|
||||
- Fixed user admin section showing button to confirm user when the user is already confirmed
|
||||
- Fixed creating event from group view not always setting the group as organizer
|
||||
- Fixed invalid addresses blocking event metadata preview rendering
|
||||
- Fixed group deletion with comments that caused foreign key issues
|
||||
- Fixed incoming Accept activities from participations we don't already have
|
||||
- Fixed resources that didn't have metadata size limits
|
||||
- Properly fallback to UTC when sending notifications and the user doesn't have a timezone setting set
|
||||
- Fix posts creation
|
||||
- Fix rejecting instance follow
|
||||
- Fix pagination of group events
|
||||
- Add proper fallback for when a TZ isn't registered
|
||||
- Hide side of report modal on low width screens
|
||||
- Fix Telegram Logo being replaced with Mastodon logo in ShareGroupModal
|
||||
- Change URL for Mastodon Share Manager
|
||||
- Fix receiving Flag activities on federated events
|
||||
- Fix activity notifications by preloading user.activity_settings
|
||||
- Fix text overflow on group card description
|
||||
- Exclude tags with more than 40 characters from being extracted
|
||||
- Avoid duplicate tags with different casing
|
||||
- Fix invalid HTML (<div> inside <label>)
|
||||
- Fix latest group not refreshing in admin section
|
||||
- Add missing "relay@" part of federated address to follow
|
||||
- Fix Ueberauth use of CSRF with session
|
||||
- Fix being an administrator when using 3rd-party auth provider
|
||||
- Make sure activity recipient can't be nil
|
||||
- Make sure users can't create profiles or groups with non-valid patterns
|
||||
- Add description field to address representation
|
||||
- Make sure prompt show the correct message and not just "Continue?" in mix mode
|
||||
- Make sure activity notification recaps can't be sent multiple times
|
||||
- Fix group notification of new event being sent multiple times
|
||||
- Fix links to group page in group membership emails and participation
|
||||
- Fix clicking on map crashing the app
|
||||
|
||||
### Translations
|
||||
|
||||
- Arabic
|
||||
- Basque
|
||||
- Belarusian
|
||||
- Bengali
|
||||
- Catalan
|
||||
- Chinese (Traditional)
|
||||
- Croatian
|
||||
- Czech
|
||||
- Danish
|
||||
- Dutch
|
||||
- Esperanto
|
||||
- Finnish
|
||||
- French
|
||||
- Gaelic
|
||||
- Galician
|
||||
- German
|
||||
- Hebrew
|
||||
- Hungarian
|
||||
- Indonesian
|
||||
- Italian
|
||||
- Japanese
|
||||
- Kabyle
|
||||
- Kannada
|
||||
- Norwegian Nynorsk
|
||||
- Occitan
|
||||
- Persian
|
||||
- Polish
|
||||
- Portuguese
|
||||
- Portuguese (Brazil)
|
||||
- Russian
|
||||
- Slovenian
|
||||
- Spanish
|
||||
- Swedish
|
||||
- Welsh
|
||||
|
||||
## 2.1.0-rc.6 - 2022-05-11
|
||||
|
||||
Changes since rc.5:
|
||||
|
||||
- Allow the instance to be followed from Mastodon (through relays)
|
||||
- Make sure activity recipient can't be nil
|
||||
- Make sure users can't create profiles or groups with non-valid patterns
|
||||
- Add description field to address representation
|
||||
- Make sure prompt show the correct message and not just "Continue?" in mix mode
|
||||
- Add a CLI command to delete actors
|
||||
- Make sure activity notification recaps can't be sent multiple times
|
||||
- Fix group notification of new event being sent multiple times
|
||||
- Fix links to group page in group membership emails and participation
|
||||
- Fix clicking on map crashing the app
|
||||
- Remove unused fragment from FETCH_PERSON GraphQL query
|
||||
|
||||
## 2.1.0-rc.5 - 2022-05-06
|
||||
|
||||
Changes since rc.4:
|
||||
|
||||
- Add appropriate timeouts for Repo.transactions
|
||||
- Remove OS-specific packages
|
||||
- Remove refresh instance triggers
|
||||
- Add a proper error message when adding an instance follow that doesn't respond
|
||||
|
||||
## 2.1.0-rc.4 - 2022-05-03
|
||||
|
||||
Changes since rc.3:
|
||||
|
||||
- Use upstream dependencies for Ueberauth providers
|
||||
- Fix Ueberauth use of CSRF with session
|
||||
- Fix being an administrator when using 3rd-party auth provider
|
||||
- Include ongoing events in search
|
||||
- Send push notification into own task
|
||||
- Add Überauth CAS Strategy
|
||||
|
||||
## 2.1.0-rc.3 - 2022-04-24
|
||||
|
||||
Changes since rc.2:
|
||||
* Fix activity notifications by preloading user.activity_settings
|
||||
* Add "Accept-Language" header to sentry request metadata
|
||||
* Hide address blocks when address has no real data
|
||||
* Fix text overflow on group card description
|
||||
* Exclude tags with more than 40 characters from being extracted
|
||||
* Avoid duplicate tags with different casing
|
||||
* Fix invalid HTML (<div> inside <label>)
|
||||
* Remove attribute type="text/css" from <style> tags
|
||||
* Improve actor cards integration
|
||||
* Fix latest group not refreshing in admin section
|
||||
* Add missing "relay@" part of federated address to follow
|
||||
|
||||
- Fix activity notifications by preloading user.activity_settings
|
||||
- Add "Accept-Language" header to sentry request metadata
|
||||
- Hide address blocks when address has no real data
|
||||
- Fix text overflow on group card description
|
||||
- Exclude tags with more than 40 characters from being extracted
|
||||
- Avoid duplicate tags with different casing
|
||||
- Fix invalid HTML (<div> inside <label>)
|
||||
- Remove attribute type="text/css" from <style> tags
|
||||
- Improve actor cards integration
|
||||
- Fix latest group not refreshing in admin section
|
||||
- Add missing "relay@" part of federated address to follow
|
||||
|
||||
## 2.1.0-rc.2 - 2022-04-20
|
||||
|
||||
Changes since rc.1:
|
||||
* Hide the whole metadata block if group has no description
|
||||
* Increase task timeout in Refresher to 60 seconds
|
||||
* Allow webfinger to be fetched over http (not https) in dev mode
|
||||
* Fix rejecting instance follow
|
||||
* Allow instance to have non-standard ports
|
||||
* Improve reactions when approving/rejecting an instance follow
|
||||
* Improve instance admin view for mobile
|
||||
* Allow to reject instance following
|
||||
* Fix pagination of group events
|
||||
* Add pagination to the instances list
|
||||
* Upgrade deps
|
||||
* Eventually fetch actors in mentions
|
||||
* Add proper fallback for when a TZ isn't registered
|
||||
* Improve IdentityPicker
|
||||
* Hide side of report modal on low width screens
|
||||
* Improve JoinGroupWithAccount component
|
||||
* Various group and posts improvements
|
||||
* Fix Telegram Logo being replaced with Mastodon logo in ShareGroupModal
|
||||
* Change URL to Mastodon Share Manager
|
||||
* Improve ActorInline component
|
||||
* Avoid assuming we're on Debian-based in release build
|
||||
* Fix receiving Flag activities on federated events
|
||||
* Update schema.graphql file
|
||||
|
||||
- Hide the whole metadata block if group has no description
|
||||
- Increase task timeout in Refresher to 60 seconds
|
||||
- Allow webfinger to be fetched over http (not https) in dev mode
|
||||
- Fix rejecting instance follow
|
||||
- Allow instance to have non-standard ports
|
||||
- Improve reactions when approving/rejecting an instance follow
|
||||
- Improve instance admin view for mobile
|
||||
- Allow to reject instance following
|
||||
- Fix pagination of group events
|
||||
- Add pagination to the instances list
|
||||
- Upgrade deps
|
||||
- Eventually fetch actors in mentions
|
||||
- Add proper fallback for when a TZ isn't registered
|
||||
- Improve IdentityPicker
|
||||
- Hide side of report modal on low width screens
|
||||
- Improve JoinGroupWithAccount component
|
||||
- Various group and posts improvements
|
||||
- Fix Telegram Logo being replaced with Mastodon logo in ShareGroupModal
|
||||
- Change URL to Mastodon Share Manager
|
||||
- Improve ActorInline component
|
||||
- Avoid assuming we're on Debian-based in release build
|
||||
- Fix receiving Flag activities on federated events
|
||||
- Update schema.graphql file
|
||||
|
||||
## 2.1.0-rc.1 - 2022-04-18
|
||||
|
||||
Changes since beta.3:
|
||||
* Fix posts creation
|
||||
* Fix some typespecs
|
||||
* Remove Koena Connect button
|
||||
* Update dependencies
|
||||
|
||||
- Fix posts creation
|
||||
- Fix some typespecs
|
||||
- Remove Koena Connect button
|
||||
- Update dependencies
|
||||
|
||||
## 2.1.0-beta.3 - 2022-04-09
|
||||
|
||||
Changes since beta.2:
|
||||
* Add Fedora and Alpine builds
|
||||
|
||||
- Add Fedora and Alpine builds
|
||||
|
||||
## 2.1.0-beta.2 - 2022-04-08
|
||||
|
||||
Changes since beta.1 :
|
||||
* Build release packages for several distributions (Debian Bullseye, Debian Buster, Ubuntu Focal, Ubuntu Bionic) because of libc version changes
|
||||
|
||||
- Build release packages for several distributions (Debian Bullseye, Debian Buster, Ubuntu Focal, Ubuntu Bionic) because of libc version changes
|
||||
|
||||
## 2.1.0-beta.1 - 2022-04-07
|
||||
|
||||
|
@ -75,6 +244,7 @@ Changes since beta.1 :
|
|||
- Added a button to go to past events of a group if it has no upcoming events
|
||||
|
||||
### Changed
|
||||
|
||||
- Changed mailer library from Bamboo to Swoosh, should fix emails being considered spam. **Some configuration changes are required, see below.**
|
||||
- Expose some fields to ActivityStreams event representation: `isOnline`, `remainingAttendeeCapacity` and `participantCount`
|
||||
- Expose a new field to ActivityStreams group representation: `memberCount`
|
||||
|
@ -155,6 +325,7 @@ Changes since beta.1 :
|
|||
- Fixed the admin page when a group/profile/user was not found
|
||||
- Fixed group members pagination on admin group profile view
|
||||
- Fixed admin edition of the instance's language
|
||||
|
||||
### Translations
|
||||
|
||||
- Croatian
|
||||
|
@ -327,7 +498,6 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
|
|||
- Slovenian
|
||||
- Spanish
|
||||
|
||||
|
||||
## 2.0.0-rc.3 - 2021-11-22
|
||||
|
||||
This lists changes since 2.0.0-rc.3. Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/main/UPGRADE.md#upgrading-from-13-to-20) file as well.
|
||||
|
@ -348,11 +518,13 @@ This lists changes since 2.0.0-rc.1. Please read the [UPGRADE.md](https://framag
|
|||
- Improve MyEvents page description text
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix spacing in organizer picker
|
||||
- Increase number of close events and follow group events
|
||||
- Fix accessing user profile in admin section
|
||||
- Set initial values for some EventMetadata elements, fixing submitting them right away with no value
|
||||
- Avoid giving an error page if the apollo futureParticipations query is undefined
|
||||
|
||||
### Translations
|
||||
|
||||
- German
|
||||
|
@ -373,6 +545,7 @@ This lists changes since 2.0.0-beta.2. Please read the [UPGRADE.md](https://fram
|
|||
- Add "formerType" and "delete" attributes on Tombstones ActivityPub objects representation
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed creating group activities when creating events with some fields
|
||||
- Move release package at correct path for CI upload
|
||||
- Fixed event contacts that were not exposed and fetched over federation
|
||||
|
@ -391,6 +564,7 @@ This lists changes since 2.0.0-beta.2. Please read the [UPGRADE.md](https://fram
|
|||
## 2.0.0-beta.2 - 2021-11-15
|
||||
|
||||
This lists changes since 2.0.0-beta.1. Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/main/UPGRADE.md#upgrading-from-13-to-20) file as well.
|
||||
|
||||
### Added
|
||||
|
||||
- Group followers and members get an notification email by default when a group publishes a new event (subject to activity notification settings)
|
||||
|
@ -427,6 +601,7 @@ This lists changes since 2.0.0-beta.1. Please read the [UPGRADE.md](https://fram
|
|||
## 2.0.0-beta.1 - 2021-11-09
|
||||
|
||||
Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/main/UPGRADE.md#upgrading-from-13-to-20) file as well.
|
||||
|
||||
### Added
|
||||
|
||||
- Added possibility to follow groups and be notified from new upcoming events
|
||||
|
@ -491,6 +666,7 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
|
|||
### Security
|
||||
|
||||
- Fixed private messages sent as event replies from Mastodon that were shown publically as public comments. They are now discarded.
|
||||
|
||||
### Translations
|
||||
|
||||
- Czech
|
||||
|
@ -558,7 +734,7 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
|
|||
### Fixed
|
||||
|
||||
- Fixed links contained in event & post description that didn't open in new tabs
|
||||
- Add back missing RSS/ical links on public group pages
|
||||
- Add back missing RSS/ical links on public group pages
|
||||
- Fixed links to Framacolibri forum
|
||||
- Fixed drafts and restricted visibility events & posts listed on group page
|
||||
- Fixed notification page on Safari
|
||||
|
@ -580,7 +756,6 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
|
|||
- Fixed token refreshment issues
|
||||
- Fixed search from 404 page
|
||||
|
||||
|
||||
### Translations
|
||||
|
||||
- Catalan
|
||||
|
@ -606,9 +781,10 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
|
|||
- Fixed group discussions with deleted comments
|
||||
|
||||
## 1.2.2 - 2021-07-01
|
||||
|
||||
### Changed
|
||||
|
||||
- Improved UI for participations when message is too long
|
||||
- Improved UI for participations when message is too long
|
||||
|
||||
### Fixed
|
||||
|
||||
|
@ -616,7 +792,7 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
|
|||
- Fixed crash when trying to notify activities not from groups
|
||||
- Fixed imagemagick missing from Dockerfile
|
||||
- Fixed push notifications for group, members & post activities
|
||||
- Fixed ellipsis in DiscussionListView
|
||||
- Fixed ellipsis in DiscussionListView
|
||||
- Fixed submission button for posts not visible on mobile
|
||||
- Fixed remote profile suspension
|
||||
|
||||
|
@ -632,6 +808,7 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
|
|||
- Fixed compatibility check in Notification section for service workers
|
||||
|
||||
## 1.2.0 - 2021-06-29
|
||||
|
||||
### Added
|
||||
|
||||
- **Notifications for various group and event activity, both by email and browser push notifications. Daily and weekly digests are also available.**
|
||||
|
@ -646,7 +823,7 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
|
|||
- **Various improvements to mobile views**
|
||||
- Make JWT access tokens short-lived
|
||||
- Disabled Cldr warning that the `Cldr.Plug.AcceptLanguage` plug didn't many any known locale
|
||||
- Replaced GraphiQL web interface with graphql-playground
|
||||
- Replaced GraphiQL web interface with graphql-playground
|
||||
|
||||
### Removed
|
||||
|
||||
|
@ -806,7 +983,7 @@ Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/mai
|
|||
### Changed
|
||||
|
||||
- Added an unique index on the addresses url
|
||||
- Added org.opencontainers.image.source annotation to the Docker image
|
||||
- Added org.opencontainers.image.source annotation to the Docker image
|
||||
- Improved the moderation action logs interface
|
||||
|
||||
### Fixes
|
||||
|
@ -927,7 +1104,7 @@ This version introduces a new way to install and host Mobilizon : Elixir releas
|
|||
- Fixed getting metadata from tweets when creating a resource
|
||||
- Fixed bad handling of duplicate usernames
|
||||
- Fixed handling of bad URIs to proxify
|
||||
- Fixed creating discussion with title containing only spaces
|
||||
- Fixed creating discussion with title containing only spaces
|
||||
- Fixed registering new user account with same email as unconfirmed
|
||||
- Fixed handling changing default actor unlogged
|
||||
- Fixed handling getting organized events from an actor when not authorized
|
||||
|
@ -999,6 +1176,7 @@ This version introduces a new way to install and host Mobilizon : Elixir releas
|
|||
- Hungarian
|
||||
- Russian
|
||||
- Spanish
|
||||
|
||||
## 1.1.0-rc.1 - 2021-03-29
|
||||
|
||||
### Added
|
||||
|
@ -1024,7 +1202,7 @@ This version introduces a new way to install and host Mobilizon : Elixir releas
|
|||
- Fixed getting metadata from tweets when creating a resource
|
||||
- Fixed bad handling of duplicate usernames
|
||||
- Fixed handling of bad URIs to proxify
|
||||
- Fixed creating discussion with title containing only spaces
|
||||
- Fixed creating discussion with title containing only spaces
|
||||
- Fixed registering new user account with same email as unconfirmed
|
||||
- Fixed handling changing default actor unlogged
|
||||
- Fixed handling getting organized events from an actor when not authorized
|
||||
|
@ -1046,11 +1224,13 @@ This version introduces a new way to install and host Mobilizon : Elixir releas
|
|||
## 1.1.0-beta.6 - 2021-03-17
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed a typo in range/radius showing the wrong radius for close events on homepage
|
||||
|
||||
## 1.1.0-beta.5 - 2021-03-17
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed a typo in range/radius preventing close events from showing up
|
||||
|
||||
## 1.1.0-beta.4 - 2021-03-17
|
||||
|
@ -1064,15 +1244,18 @@ This version introduces a new way to install and host Mobilizon : Elixir releas
|
|||
## 1.1.0-beta.3 - 2021-03-16
|
||||
|
||||
### Fixed
|
||||
|
||||
- Handle ActivityPub Fetcher returning text that's not JSON
|
||||
- Fix accessing a group profile when not a member
|
||||
|
||||
## 1.1.0-beta.2 - 2021-03-16
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed geospatial configuration only being evaluated at compile-time, not at runtime
|
||||
|
||||
### Translations
|
||||
|
||||
- Slovenian
|
||||
|
||||
## 1.1.0-beta.1 - 2021-03-10
|
||||
|
@ -1214,23 +1397,23 @@ This version introduces a new way to install and host Mobilizon : Elixir releas
|
|||
|
||||
### Special operations
|
||||
|
||||
* **Reattach media files to their entity.**
|
||||
- **Reattach media files to their entity.**
|
||||
When media files were uploaded and added in events and posts bodies, they were only attached to the profile that uploaded them, not to the event or post. This task attaches them back to their entity so that the command to clean orphan media files doesn't remove them.
|
||||
|
||||
* Source install
|
||||
- Source install
|
||||
`MIX_ENV=prod mix mobilizon.maintenance.fix_unattached_media_in_body`
|
||||
* Docker
|
||||
- Docker
|
||||
`docker-compose exec mobilizon mobilizon_ctl maintenance.fix_unattached_media_in_body`
|
||||
|
||||
* **Refresh remote profiles to save avatars locally**
|
||||
- **Refresh remote profiles to save avatars locally**
|
||||
Profile avatars and banners were previously only proxified and cached. Now we save them locally. Refreshing all remote actors will save profile media locally instead.
|
||||
|
||||
* Source install
|
||||
- Source install
|
||||
`MIX_ENV=prod mix mobilizon.actors.refresh --all`
|
||||
* Docker
|
||||
- Docker
|
||||
`docker-compose exec mobilizon mobilizon_ctl actors.refresh --all`
|
||||
|
||||
* **imagemagick and webp are now a required dependency** to build Mobilizon.
|
||||
- **imagemagick and webp are now a required dependency** to build Mobilizon.
|
||||
Optimized versions of Mobilizon's pictures are now produced during front-end build.
|
||||
See [the documentation](https://docs.joinmobilizon.org/administration/dependencies/#misc) to make sure these dependencies are installed.
|
||||
|
||||
|
@ -1273,7 +1456,7 @@ This version introduces a new way to install and host Mobilizon : Elixir releas
|
|||
- Fixed error message not showing up when you are already an anonymous participant for an event
|
||||
- Fixed error message not showing up when you pick an username already in user for a new profile or a group
|
||||
- Fixed translations not fallbacking properly to english when not found
|
||||
-
|
||||
-
|
||||
|
||||
### Security
|
||||
|
||||
|
@ -1282,6 +1465,7 @@ This version introduces a new way to install and host Mobilizon : Elixir releas
|
|||
### Translations
|
||||
|
||||
Updated translations:
|
||||
|
||||
- Catalan
|
||||
- Dutch
|
||||
- English
|
||||
|
@ -1454,20 +1638,21 @@ Updated translations:
|
|||
|
||||
### Special operations
|
||||
|
||||
* We added `application/ld+json` as acceptable MIME type for ActivityPub requests, so you'll need to recompile the `mime` library we use before recompiling Mobilizon:
|
||||
```
|
||||
MIX_ENV=prod mix deps.clean mime --build
|
||||
```
|
||||
- We added `application/ld+json` as acceptable MIME type for ActivityPub requests, so you'll need to recompile the `mime` library we use before recompiling Mobilizon:
|
||||
|
||||
* The [nginx configuration](https://framagit.org/framasoft/mobilizon/-/blob/main/support/nginx/mobilizon.conf) has been changed with improvements and support for custom error pages.
|
||||
```
|
||||
MIX_ENV=prod mix deps.clean mime --build
|
||||
```
|
||||
|
||||
* The cmake dependency has been added (see [our documentation](https://docs.joinmobilizon.org/administration/dependencies/#basic-tools))
|
||||
- The [nginx configuration](https://framagit.org/framasoft/mobilizon/-/blob/main/support/nginx/mobilizon.conf) has been changed with improvements and support for custom error pages.
|
||||
|
||||
- The cmake dependency has been added (see [our documentation](https://docs.joinmobilizon.org/administration/dependencies/#basic-tools))
|
||||
|
||||
### Added
|
||||
|
||||
- Possibility to login using LDAP
|
||||
- Possibility to login using OAuth providers
|
||||
- Enabled group features in production mode
|
||||
- Enabled group features in production mode
|
||||
- including posts (that can be public, unlisted, or restricted to your group members)
|
||||
- resources (collections of links, with folders, accessible to your group members)
|
||||
- discussions (group private and organized chats)
|
||||
|
@ -1491,11 +1676,12 @@ Updated translations:
|
|||
### Security
|
||||
|
||||
- Fix group settings being accessible and editable by non-group-admins (thx @pigpig for reporting this responsibly)
|
||||
- Fix events being editable by profiles without permissions (thx @pigpig for reporting this responsibly)
|
||||
- Fix events being editable by profiles without permissions (thx @pigpig for reporting this responsibly)
|
||||
|
||||
## [1.0.0-beta.3] - 2020-06-24
|
||||
|
||||
### Special operations
|
||||
|
||||
Config has moved from `.env` files to a more traditional way to handle things in the Elixir world, with `.exs` files.
|
||||
|
||||
To migrate existing configuration, you can simply run `mix mobilizon.instance gen` and fill in the adequate values previously in `.env` files (you don't need to perform the operations to create the database).
|
||||
|
@ -1505,6 +1691,7 @@ A minimal file template [is available](https://framagit.org/framasoft/mobilizon/
|
|||
Also make sure to remove the `EnvironmentFile=` line from the systemd service and set `Environment=MIX_ENV=prod` instead. See [the updated file](https://framagit.org/framasoft/mobilizon/blob/main/support/systemd/mobilizon.service).
|
||||
|
||||
### Added
|
||||
|
||||
- Possibility to participate to an event without an account (confirmation through email required)
|
||||
- Possibility to participate to a remote event (being redirected by providing federated identity)
|
||||
- Possibility to add a note as a participant when event participation is manually validated (required when participating without an account)
|
||||
|
@ -1521,6 +1708,7 @@ Also make sure to remove the `EnvironmentFile=` line from the systemd service an
|
|||
- Allow user to change language
|
||||
|
||||
### Changed
|
||||
|
||||
- Configuration handling (see above)
|
||||
- Improved a bit color theme
|
||||
- Signature validation also now checks if `Date` header has acceptable values
|
||||
|
@ -1531,6 +1719,7 @@ Also make sure to remove the `EnvironmentFile=` line from the systemd service an
|
|||
- Improved public event page
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed URL search
|
||||
- Fixed content accessed through URL search being public
|
||||
- Fix event links in some emails
|
||||
|
@ -1538,17 +1727,21 @@ Also make sure to remove the `EnvironmentFile=` line from the systemd service an
|
|||
## [1.0.0-beta.2] - 2019-12-18
|
||||
|
||||
### Special operations
|
||||
|
||||
These two operations couldn't be handled during migrations.
|
||||
They are optional, but you won't be able to search or get participant stats on existing events if they are not executed.
|
||||
These commands will be removed in Mobilizon 1.0.0-beta.3.
|
||||
|
||||
In order to populate search index for existing events, you need to run the following command (with prod environment):
|
||||
* `mix mobilizon.setup_search`
|
||||
|
||||
- `mix mobilizon.setup_search`
|
||||
|
||||
In order to move participant stats to the event table for existing events, you need to run the following command (with prod environment):
|
||||
* `mix mobilizon.move_participant_stats`
|
||||
|
||||
- `mix mobilizon.move_participant_stats`
|
||||
|
||||
### Added
|
||||
|
||||
- Federation is active
|
||||
- Added an interface for admins to view and manage instance followers and followings
|
||||
- Ability to comment below events
|
||||
|
@ -1573,6 +1766,7 @@ In order to move participant stats to the event table for existing events, you n
|
|||
- Upgraded frontend and backend dependencies
|
||||
|
||||
### Changed
|
||||
|
||||
- Move participant stats to event table **(read special instructions above)**
|
||||
- Limit length (20 characters) and number (10) of tags allowed
|
||||
- Added some backend changes and validation for field length
|
||||
|
@ -1586,6 +1780,7 @@ In order to move participant stats to the event table for existing events, you n
|
|||
- Also consider the PeerTube `CommentsEnabled` property to know if you can reply to an event
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix event URL validation and check if hostname is correct before showing it
|
||||
- Fix participations stats on the MyEvents page
|
||||
- Fix event description lists margin
|
||||
|
@ -1615,8 +1810,11 @@ In order to move participant stats to the event table for existing events, you n
|
|||
- Fixed event HTML representation when `GET` request has no `Accept` header
|
||||
|
||||
### Security
|
||||
|
||||
- Sanitize event title to avoid XSS
|
||||
|
||||
## [1.0.0-beta.1] - 2019-10-15
|
||||
|
||||
### Added
|
||||
|
||||
- Initial release
|
||||
|
|
29
README.md
|
@ -20,7 +20,7 @@ Mobilizon is your federated organization and mobilization platform. Gather peopl
|
|||
|
||||
Mobilizon is a tool designed to create platforms for managing communities and events. Its purpose is to help as many people as possible to free themselves from Facebook groups and events, from Meetup, etc.
|
||||
|
||||
The Mobilizon software is under a Free licence, so anyone can host a Mobilizon server, called an instance. These instances may federate with each other, so any person with an account on *ExampleMeet* will be able to register to an event created on *SpecimenEvent*.
|
||||
The Mobilizon software is under a Free licence, so anyone can host a Mobilizon server, called an instance. These instances may federate with each other, so any person with an account on _ExampleMeet_ will be able to register to an event created on _SpecimenEvent_.
|
||||
|
||||
## ✨ Features
|
||||
|
||||
|
@ -33,7 +33,7 @@ You will have the power to create multiple identities from the same account, lik
|
|||
|
||||
### 📅 Events and groups
|
||||
|
||||
Create your events and make sure they will appeal to everybody.
|
||||
Create your events and make sure they will appeal to everybody.
|
||||
Privacy settings and participants roles are supported.
|
||||
There's no lock-in, you can interact with the event without registration.
|
||||
|
||||
|
@ -46,23 +46,26 @@ We appreciate any contribution to Mobilizon. Check our [CONTRIBUTING](CONTRIBUTI
|
|||
## Links
|
||||
|
||||
### Learn more
|
||||
* 🌐 Official website: [https://joinmobilizon.org](https://joinmobilizon.org)
|
||||
* 🔢 Pick an instance [https://mobilizon.org](https://mobilizon.org)
|
||||
* 💻 Source: [https://framagit.org/framasoft/mobilizon](https://framagit.org/framasoft/mobilizon)
|
||||
* 📜 Documentation [https://docs.joinmobilizon.org](https://docs.joinmobilizon.org)
|
||||
|
||||
|
||||
- 🌐 Official website: [https://joinmobilizon.org](https://joinmobilizon.org)
|
||||
- 🔢 Pick an instance [https://mobilizon.org](https://mobilizon.org)
|
||||
- 💻 Source: [https://framagit.org/framasoft/mobilizon](https://framagit.org/framasoft/mobilizon)
|
||||
- 📜 Documentation [https://docs.joinmobilizon.org](https://docs.joinmobilizon.org)
|
||||
|
||||
### Discuss
|
||||
* 💬 Element/Matrix: [https://matrix.to/#/#Mobilizon:matrix.org](https://matrix.to/#/#Mobilizon:matrix.org)
|
||||
* 🗣️ Forum: [https://framacolibri.org/c/mobilizon](https://framacolibri.org/c/mobilizon)
|
||||
|
||||
- 💬 Element/Matrix: [https://matrix.to/#/#Mobilizon:matrix.org](https://matrix.to/#/#Mobilizon:matrix.org)
|
||||
- 🗣️ Forum: [https://framacolibri.org/c/mobilizon](https://framacolibri.org/c/mobilizon)
|
||||
|
||||
### Follow
|
||||
* 🐘 Mastodon: [https://framapiaf.org/@mobilizon](https://framapiaf.org/@mobilizon)
|
||||
* 🐦 Twitter [https://twitter.com/@joinmobilizon](https://twitter.com/@joinmobilizon)
|
||||
|
||||
|
||||
- 🐘 Mastodon: [https://framapiaf.org/@mobilizon](https://framapiaf.org/@mobilizon)
|
||||
- 🐦 Twitter [https://twitter.com/@joinmobilizon](https://twitter.com/@joinmobilizon)
|
||||
|
||||
Note: Most federation code comes from [Pleroma](https://pleroma.social), which is `Copyright © 2017-2018 Pleroma Authors - AGPL-3.0`.
|
||||
|
||||
|
||||
## ❤️ Supports of our crowdfunding
|
||||
|
||||
---
|
||||
|
||||
We have run [a crowdfunding campaign](https://framablog.org/2019/05/14/mobilizon-lets-finance-a-software-to-free-our-events-from-facebook/) to pave the road to the version 1.0.0 of Mobilizon. Thanks to everyone who pitched in and shared the news around! The list of [everyone who donated is available here](https://joinmobilizon.org/hall-of-fame).
|
||||
|
|
32
SECURITY.md
|
@ -5,15 +5,15 @@ Framasoft, the Mobilizon maintainer team and community take all security bugs in
|
|||
|
||||
### Goals
|
||||
|
||||
* Mobilizon users can understand the distinctions between public data and private data/metadata on Mobilizon.
|
||||
- Mobilizon users can understand the distinctions between public data and private data/metadata on Mobilizon.
|
||||
|
||||
* Users always know where their private data/metadata resides, who has access to it, and are able to access, export, and delete it.
|
||||
- Users always know where their private data/metadata resides, who has access to it, and are able to access, export, and delete it.
|
||||
|
||||
* Protect private user data/metadata, not just from hackers but also (as much as is possible) from other users, instance admins, community moderators, and external applications.
|
||||
- Protect private user data/metadata, not just from hackers but also (as much as is possible) from other users, instance admins, community moderators, and external applications.
|
||||
|
||||
* Secure from malicious creation, alteration or deletion of public data.
|
||||
- Secure from malicious creation, alteration or deletion of public data.
|
||||
|
||||
* GDPR compliance.
|
||||
- GDPR compliance.
|
||||
|
||||
Framasoft is both a developer of open-source/free/libre self-hosted software, and a service provider with users in the European Union. As a result, we are putting user privacy, data sovereignty, and GDPR compliance into our security plans, including asking both the Framasoft community and outside hackers to review our approaches and implementations.
|
||||
|
||||
|
@ -21,11 +21,11 @@ Framasoft is both a developer of open-source/free/libre self-hosted software, an
|
|||
|
||||
[Mobilizon](https://joinmobilizon.org) will be challenging to keep secure, as it is:
|
||||
|
||||
* open source, both back-end and front-end
|
||||
- open source, both back-end and front-end
|
||||
|
||||
* self-hosted by diverse organisations and individuals
|
||||
- self-hosted by diverse organisations and individuals
|
||||
|
||||
* federated (data is transmitted between different hosted instances)
|
||||
- federated (data is transmitted between different hosted instances)
|
||||
|
||||
This means there are more attack surfaces compared to typical proprietary, centralised platforms, but also means that hackers and even users can review every part of Mobilizon and make sure that it works as expected. This should result in more secure software, and higher trust in the application and its ecosystem.
|
||||
|
||||
|
@ -33,14 +33,14 @@ This means there are more attack surfaces compared to typical proprietary, centr
|
|||
|
||||
We are committed to working with security researchers to verify, reproduce, and respond to legitimate reported vulnerabilities. You can help us by following these simple guidelines:
|
||||
|
||||
* Alert us about the vulnerability as soon as you become aware of it by emailing the lead maintainer at tcit+mobilizon@framasoft.org.
|
||||
* Provide details needed to reproduce and validate the vulnerability and a Proof of Concept (PoC) as soon as possible
|
||||
* Act in good faith to avoid privacy violations, destruction of data, and interruption or degradation of services
|
||||
* Do not access or modify users’ private data, without explicit permission of the owner. Only interact with your own accounts or test accounts for security research purposes;
|
||||
* Contact Framasoft or a maintainer of the Mobilizon project (or the instance admin) immediately if you do inadvertently encounter user data. Do not view, alter, save, store, transfer, or otherwise access the data, and immediately purge any local information upon reporting the vulnerability;
|
||||
* The lead maintainer will acknowledge your email within 48 hours, and will send a more detailed response within 48 hours indicating the next steps in handling your report. After the initial reply to your report, the security team will endeavor to keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance.
|
||||
* Give us time to confirm, determine the affected versions and prepare fixes to correct the issue before disclosing it to other parties (if after waiting a reasonable amount of time, we are clearly unable or unwilling to do anything about it, please do hold us accountable!)
|
||||
* Please test against a local instance of the software, and refrain from running any Denial of Service or automated testing tools against Framasoft's (and our partners') infrastructure
|
||||
- Alert us about the vulnerability as soon as you become aware of it by emailing the lead maintainer at tcit+mobilizon@framasoft.org.
|
||||
- Provide details needed to reproduce and validate the vulnerability and a Proof of Concept (PoC) as soon as possible
|
||||
- Act in good faith to avoid privacy violations, destruction of data, and interruption or degradation of services
|
||||
- Do not access or modify users’ private data, without explicit permission of the owner. Only interact with your own accounts or test accounts for security research purposes;
|
||||
- Contact Framasoft or a maintainer of the Mobilizon project (or the instance admin) immediately if you do inadvertently encounter user data. Do not view, alter, save, store, transfer, or otherwise access the data, and immediately purge any local information upon reporting the vulnerability;
|
||||
- The lead maintainer will acknowledge your email within 48 hours, and will send a more detailed response within 48 hours indicating the next steps in handling your report. After the initial reply to your report, the security team will endeavor to keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance.
|
||||
- Give us time to confirm, determine the affected versions and prepare fixes to correct the issue before disclosing it to other parties (if after waiting a reasonable amount of time, we are clearly unable or unwilling to do anything about it, please do hold us accountable!)
|
||||
- Please test against a local instance of the software, and refrain from running any Denial of Service or automated testing tools against Framasoft's (and our partners') infrastructure
|
||||
|
||||
Note : Please report security bugs in third-party modules to the person or team maintaining the module.
|
||||
|
||||
|
|
95
UPGRADE.md
|
@ -1,26 +1,5 @@
|
|||
# Upgrading from 2.0 to 2.1
|
||||
|
||||
## Distro-specific packages
|
||||
|
||||
Elixir releases are precompiled binaries and are therefore dependent on the host they've been compiled to be compatible with your system (architecture, libc version, …) ([read more](https://hexdocs.pm/mix/Mix.Tasks.Release.html#module-requirements)). For instance, the release build on Debian Bullseye (with libc 2.31) cannot be run on Debian Buster (which only provides libc 2.28). Another example is Red Hat-relative distributions (Fedora, CentOS, …) which have an OpenSSL library version that's not compatible with the version compiled (because of [potential patent issues with Elliptic curves](https://github.com/kerl/kerl#compiling-crypto-on-red-hat-systems)).
|
||||
|
||||
In order to make sure the releases package we redistribute , we now build distro-version-specific packages.
|
||||
The list of packages built for version 2.1.0 with the amd64 (x86_64) architecture is the following:
|
||||
- Debian Buster (10)
|
||||
- Debian Bullseye (11)
|
||||
- Ubuntu Bionic (18.04)
|
||||
- Ubuntu Focal (20.04)
|
||||
- Fedora 35
|
||||
- Fedora 36
|
||||
- Alpine 3.14.5
|
||||
- Alpine 3.15.3
|
||||
|
||||
As building for non-`amd64` architectures is quite difficult (because of the time and extra resources cross-compiling takes), these architectures are only built against Debian Bullseye (11) at the moment.
|
||||
|
||||
We want to expand this list in the future to make sure it covers most uses, so feel free to give us feedback from what you need.
|
||||
|
||||
Note: Docker images are also built for `amd64`/`arm`/`arm64` architectures, and of course you can always install Mobilizon from source on pretty much any unix-compatible system.
|
||||
|
||||
## Mailer library change
|
||||
|
||||
### Docker
|
||||
|
@ -30,10 +9,11 @@ The change is already applied. You may remove the `MOBILIZON_SMTP_HOSTNAME` envi
|
|||
### Release and source mode
|
||||
|
||||
In your configuration file under `config :mobilizon, Mobilizon.Web.Email.Mailer`,
|
||||
* Change `Bamboo.SMTPAdapter` to `Swoosh.Adapters.SMTP`,
|
||||
* rename the `server` key to `relay`
|
||||
* remove the `hostname` key,
|
||||
* the default value of the username and password fields is an empty string and no longer `nil`.
|
||||
|
||||
- Change `Bamboo.SMTPAdapter` to `Swoosh.Adapters.SMTP`,
|
||||
- rename the `server` key to `relay`
|
||||
- remove the `hostname` key,
|
||||
- the default value of the username and password fields is an empty string and no longer `nil`.
|
||||
|
||||
```diff
|
||||
config :mobilizon, Mobilizon.Web.Email.Mailer,
|
||||
|
@ -61,7 +41,9 @@ In your configuration file under `config :mobilizon, Mobilizon.Web.Email.Mailer`
|
|||
# Upgrading from 1.3 to 2.0
|
||||
|
||||
Requirements dependencies depend on the way Mobilizon is installed.
|
||||
|
||||
## New Elixir version requirement
|
||||
|
||||
### Docker and Release install
|
||||
|
||||
You are already using latest Elixir version in the release tarball and Docker images.
|
||||
|
@ -77,17 +59,19 @@ Mobilizon 2.0 uses data based on [timezone-boundary-builder](https://github.com/
|
|||
### Docker install
|
||||
|
||||
The geographic timezone data is already bundled into the image, you have nothing to do.
|
||||
|
||||
### Release install
|
||||
|
||||
In order to keep the release tarballs light, the geographic timezone data is not bundled directly. You need to download the data :
|
||||
* either raw from Github, but **requires an extra ~1Gio of memory** to process the data
|
||||
|
||||
- either raw from Github, but **requires an extra ~1Gio of memory** to process the data
|
||||
|
||||
```sh
|
||||
sudo -u mobilizon mkdir /var/lib/mobilizon/timezones
|
||||
sudo -u mobilizon ./bin/mobilizon_ctl tz_world.update
|
||||
```
|
||||
|
||||
* either already processed from our own distribution server
|
||||
- either already processed from our own distribution server
|
||||
|
||||
```sh
|
||||
sudo -u mobilizon mkdir /var/lib/mobilizon/timezones
|
||||
|
@ -95,6 +79,7 @@ In order to keep the release tarballs light, the geographic timezone data is not
|
|||
```
|
||||
|
||||
In both cases, ~700Mio of disk will be used. You may use the following configuration to specify where the data is expected if you decide to change it from the default location (`/var/lib/mobilizon/timezones`) :
|
||||
|
||||
```elixir
|
||||
config :tz_world, data_dir: "/some/place"
|
||||
```
|
||||
|
@ -102,14 +87,15 @@ config :tz_world, data_dir: "/some/place"
|
|||
### Source install
|
||||
|
||||
You need to download the data :
|
||||
* either raw from Github, but **requires an extra ~1Gio of memory** to process the data
|
||||
|
||||
- either raw from Github, but **requires an extra ~1Gio of memory** to process the data
|
||||
|
||||
```sh
|
||||
sudo -u mobilizon mkdir /var/lib/mobilizon/timezones
|
||||
sudo -u mobilizon mix mobilizon.tz_world.update
|
||||
```
|
||||
|
||||
* either already processed from our own distribution server
|
||||
- either already processed from our own distribution server
|
||||
|
||||
```sh
|
||||
sudo -u mobilizon mkdir /var/lib/mobilizon/timezones
|
||||
|
@ -117,6 +103,7 @@ You need to download the data :
|
|||
```
|
||||
|
||||
In both cases, ~700Mio of disk will be used. You may use the following configuration to specify where the data is expected:
|
||||
|
||||
```elixir
|
||||
config :tz_world, data_dir: "/some/place"
|
||||
```
|
||||
|
@ -135,14 +122,18 @@ Files in this folder are temporary and are cleaned once an hour.
|
|||
## New optional dependencies
|
||||
|
||||
These are optional, installing them will allow Mobilizon to export to PDF and ODS as well. Mobilizon 2.0 allows to export the participant list, but more is planned.
|
||||
|
||||
### Docker
|
||||
|
||||
Everything is included in our Docker image.
|
||||
|
||||
### Release and source install
|
||||
|
||||
New optional Python dependencies:
|
||||
* `Python` >= 3.6
|
||||
* `weasyprint` for PDF export (with [a few extra dependencies](https://doc.courtbouillon.org/weasyprint/stable/first_steps.html))
|
||||
* `pyexcel-ods3` for ODS export (no extra dependencies)
|
||||
|
||||
- `Python` >= 3.6
|
||||
- `weasyprint` for PDF export (with [a few extra dependencies](https://doc.courtbouillon.org/weasyprint/stable/first_steps.html))
|
||||
- `pyexcel-ods3` for ODS export (no extra dependencies)
|
||||
|
||||
Both can be installed through pip. You need to enable and configure exports for PDF and ODS in the configuration afterwards. Read [the dedicated docs page about this](https://docs.joinmobilizon.org/administration/configure/exports/).
|
||||
|
||||
|
@ -151,35 +142,41 @@ Both can be installed through pip. You need to enable and configure exports for
|
|||
The 1.1 version of Mobilizon brings Elixir releases support. An Elixir release is a self-contained directory that contains all of Mobilizon's code (front-end and backend), it's dependencies, as well as the Erlang Virtual Machine and runtime (only the parts you need). As long as the release has been assembled on the same OS and architecture, it can be deploy and run straight away. [Read more about releases](https://elixir-lang.org/getting-started/mix-otp/config-and-releases.html#releases).
|
||||
|
||||
## Comparison
|
||||
|
||||
Migrating to releases means:
|
||||
* You only get a precompiled binary, so you avoid compilation times when updating
|
||||
* No need to have Elixir/NodeJS installed on the system
|
||||
* Code/data/config location is more common (/opt, /var/lib, /etc)
|
||||
* More efficient, as only what you need from the Elixir/Erlang standard libraries is included and all of the code is directly preloaded
|
||||
* You can't hardcode modifications in Mobilizon's code
|
||||
|
||||
- You only get a precompiled binary, so you avoid compilation times when updating
|
||||
- No need to have Elixir/NodeJS installed on the system
|
||||
- Code/data/config location is more common (/opt, /var/lib, /etc)
|
||||
- More efficient, as only what you need from the Elixir/Erlang standard libraries is included and all of the code is directly preloaded
|
||||
- You can't hardcode modifications in Mobilizon's code
|
||||
|
||||
Staying on source releases means:
|
||||
* You need to recompile everything with each update
|
||||
* Compiling frontend and backend has higher system requirements than just running Mobilizon
|
||||
* You can change things in Mobilizon's code and recompile right away to test changes
|
||||
|
||||
- You need to recompile everything with each update
|
||||
- Compiling frontend and backend has higher system requirements than just running Mobilizon
|
||||
- You can change things in Mobilizon's code and recompile right away to test changes
|
||||
|
||||
## Releases
|
||||
|
||||
If you want to migrate to releases, [we provide a full guide](https://docs.joinmobilizon.org/administration/upgrading/source_to_release/). You may do this at any time.
|
||||
|
||||
## Source install
|
||||
|
||||
To stay on a source release, you just need to check the following things:
|
||||
* Rename your configuration file `config/prod.secret.exs` to `config/runtime.exs`.
|
||||
* If your config file includes `server: true` under `Mobilizon.Web.Endpoint`, remove it.
|
||||
```diff
|
||||
config :mobilizon, Mobilizon.Web.Endpoint,
|
||||
- server: true,
|
||||
```
|
||||
* The uploads default directory is now `/var/lib/mobilizon/uploads`. To keep it in the previous `uploads/` directory, just add the following line to `config/runtime.exs`:
|
||||
|
||||
- Rename your configuration file `config/prod.secret.exs` to `config/runtime.exs`.
|
||||
- If your config file includes `server: true` under `Mobilizon.Web.Endpoint`, remove it.
|
||||
```diff
|
||||
config :mobilizon, Mobilizon.Web.Endpoint,
|
||||
- server: true,
|
||||
```
|
||||
- The uploads default directory is now `/var/lib/mobilizon/uploads`. To keep it in the previous `uploads/` directory, just add the following line to `config/runtime.exs`:
|
||||
```elixir
|
||||
config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "uploads"
|
||||
```
|
||||
Or you may use any other directory where the `mobilizon` user has write permissions.
|
||||
* The GeoIP database default directory is now `/var/lib/mobilizon/geo/GeoLite2-City.mmdb`. To keep it in the previous `priv/data/GeoLite2-City.mmdb` directory, just add the following line to `config/runtime.exs`:
|
||||
- The GeoIP database default directory is now `/var/lib/mobilizon/geo/GeoLite2-City.mmdb`. To keep it in the previous `priv/data/GeoLite2-City.mmdb` directory, just add the following line to `config/runtime.exs`:
|
||||
```elixir
|
||||
config :geolix, databases: [
|
||||
%{
|
||||
|
@ -189,4 +186,4 @@ To stay on a source release, you just need to check the following things:
|
|||
}
|
||||
]
|
||||
```
|
||||
Or you may use any other directory where the `mobilizon` user has read permissions.
|
||||
Or you may use any other directory where the `mobilizon` user has read permissions.
|
||||
|
|
|
@ -13,14 +13,14 @@ config :mobilizon,
|
|||
config :mobilizon, Mobilizon.Storage.Repo, types: Mobilizon.Storage.PostgresTypes
|
||||
|
||||
config :mobilizon, :instance,
|
||||
name: "My Mobilizon Instance",
|
||||
description: "Change this to a proper description of your instance",
|
||||
name: "Mobilizon du Chapril",
|
||||
description: "Instance du Chapril",
|
||||
hostname: "localhost",
|
||||
registrations_open: false,
|
||||
registrations_open: true,
|
||||
registration_email_allowlist: [],
|
||||
registration_email_denylist: [],
|
||||
languages: [],
|
||||
default_language: "en",
|
||||
default_language: "fr",
|
||||
demo: false,
|
||||
repository: Mix.Project.config()[:source_url],
|
||||
allow_relay: true,
|
||||
|
@ -35,9 +35,9 @@ config :mobilizon, :instance,
|
|||
unconfirmed_user_grace_period_hours: 48,
|
||||
activity_expire_days: 365,
|
||||
activity_keep_number: 100,
|
||||
enable_instance_feeds: false,
|
||||
email_from: "noreply@localhost",
|
||||
email_reply_to: "noreply@localhost"
|
||||
enable_instance_feeds: true,
|
||||
email_from: "noreply@mobilizon.chapril.org",
|
||||
email_reply_to: "noreply@mobilizon.chapril.org"
|
||||
|
||||
config :mobilizon, :groups, enabled: true
|
||||
config :mobilizon, :events, creation: true
|
||||
|
@ -90,7 +90,7 @@ config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "/var/lib/mobil
|
|||
|
||||
config :tz_world, data_dir: "/var/lib/mobilizon/timezones"
|
||||
|
||||
config :mobilizon, Timex.Gettext, default_locale: "en"
|
||||
config :mobilizon, Timex.Gettext, default_locale: "fr"
|
||||
|
||||
config :mobilizon, :media_proxy,
|
||||
enabled: true,
|
||||
|
@ -342,7 +342,9 @@ config :mobilizon, Mobilizon.Service.Notifier.Push, enabled: true
|
|||
config :mobilizon, :exports,
|
||||
path: "/var/lib/mobilizon/uploads/exports",
|
||||
formats: [
|
||||
Mobilizon.Service.Export.Participants.CSV
|
||||
Mobilizon.Service.Export.Participants.CSV,
|
||||
Mobilizon.Service.Export.Participants.PDF,
|
||||
Mobilizon.Service.Export.Participants.ODS
|
||||
]
|
||||
|
||||
config :mobilizon, :analytics, providers: []
|
||||
|
|
|
@ -16,29 +16,29 @@ config :logger, level: :info
|
|||
# Load all locales in production
|
||||
config :mobilizon, :cldr,
|
||||
locales: [
|
||||
"ar",
|
||||
"be",
|
||||
"bn",
|
||||
"ca",
|
||||
"cs",
|
||||
"cy",
|
||||
"de",
|
||||
# "ar",
|
||||
# "be",
|
||||
# "bn",
|
||||
# "ca",
|
||||
# "cs",
|
||||
# "cy",
|
||||
# "de",
|
||||
"en",
|
||||
"es",
|
||||
"fa",
|
||||
"fi",
|
||||
# "es",
|
||||
# "fa",
|
||||
# "fi",
|
||||
"fr",
|
||||
"gd",
|
||||
"gl",
|
||||
"hu",
|
||||
"id",
|
||||
"it",
|
||||
"ja",
|
||||
"nl",
|
||||
"nn",
|
||||
"pl",
|
||||
"pt",
|
||||
"ru",
|
||||
"sv",
|
||||
"zh_Hant"
|
||||
# "gd",
|
||||
# "gl",
|
||||
# "hu",
|
||||
# "id",
|
||||
# "it",
|
||||
# "ja",
|
||||
# "nl",
|
||||
# "nn",
|
||||
# "pl",
|
||||
# "pt",
|
||||
# "ru",
|
||||
# "sv",
|
||||
# "zh_Hant"
|
||||
]
|
||||
|
|
|
@ -23,3 +23,4 @@ yarn-error.log*
|
|||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
.yarn
|
|
@ -0,0 +1,3 @@
|
|||
nodeLinker: node-modules
|
||||
|
||||
#yarnPath: .yarn/releases/yarn-3.1.1.cjs
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "mobilizon",
|
||||
"version": "2.1.0-rc.3",
|
||||
"version": "2.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"serve": "vue-cli-service serve",
|
||||
|
@ -18,7 +18,7 @@
|
|||
"@mdi/font": "^6.1.95",
|
||||
"@sentry/tracing": "^6.16.1",
|
||||
"@sentry/vue": "^6.16.1",
|
||||
"@tailwindcss/line-clamp": "^0.3.0",
|
||||
"@tailwindcss/line-clamp": "^0.4.0",
|
||||
"@tiptap/core": "^2.0.0-beta.41",
|
||||
"@tiptap/extension-blockquote": "^2.0.0-beta.25",
|
||||
"@tiptap/extension-bold": "^2.0.0-beta.24",
|
||||
|
@ -125,5 +125,6 @@
|
|||
"vue-i18n-extract": "^2.0.4",
|
||||
"vue-template-compiler": "^2.6.11",
|
||||
"webpack-cli": "^4.7.0"
|
||||
}
|
||||
},
|
||||
"packageManager": "yarn@3.1.1"
|
||||
}
|
||||
|
|
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 507 B |
After Width: | Height: | Size: 668 B |
After Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 185 KiB |
After Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 12 KiB |
|
@ -0,0 +1,11 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 248.16 46.78">
|
||||
<title>Mobilizon Logo</title>
|
||||
<g data-name="header">
|
||||
<path d="M0 45.82l3.18-40.8a29.88 29.88 0 015.07-.36 27.74 27.74 0 014.95.36l4.86 17.16a92.19 92.19 0 012.34 10.08h.36a92.19 92.19 0 012.34-10.08L28 5.02a29.23 29.23 0 015-.36 29.23 29.23 0 015 .36l3.18 40.8a13.61 13.61 0 01-3.63.42 23.41 23.41 0 01-3.63-.24l-1.2-19.92q-.36-5.52-.48-12.84h-.44l-7.32 26.51a25.62 25.62 0 01-4 .3 23.36 23.36 0 01-3.84-.3L9.36 13.24H9q-.3 8.94-.48 12.84L7.26 46a22.47 22.47 0 01-3.6.24A13.75 13.75 0 010 45.82zM74 31.06q0 8-4.26 12.3a12.21 12.21 0 01-9 3.42 12.21 12.21 0 01-9-3.42q-4.26-4.26-4.26-12.3t4.24-12.31a12.21 12.21 0 019-3.42 12.21 12.21 0 019 3.42Q74 23.02 74 31.06zM60.75 20.98q-5.67 0-5.67 10.08t5.67 10.08q5.67 0 5.67-10.08t-5.67-10.08zM103.2 19.75q2.7 4.11 2.7 11.28T102 42.31a13.18 13.18 0 01-10 4.11 31.41 31.41 0 01-11.34-2V2.2l.4-.45h2.76A4 4 0 0187 2.83a5.38 5.38 0 01.93 3.57v11.94a12.08 12.08 0 017.56-2.7 8.71 8.71 0 017.71 4.11zm-9.72 2a7.28 7.28 0 00-5.58 2.82v16a15 15 0 004.08.54 5.25 5.25 0 004.68-2.67q1.68-2.67 1.68-7.59 0-9.03-4.86-9.1zM121 22v23.94a20.85 20.85 0 01-3.66.3 23 23 0 01-3.78-.3V24.75q0-3.24-2.7-3.24h-.72a9.32 9.32 0 01-.3-2.58 10.7 10.7 0 01.3-2.7 39.63 39.63 0 014.38-.24h1a5.19 5.19 0 014 1.62A6.27 6.27 0 01121 22z" />
|
||||
<path d="M119.82.84a7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.93 7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.93z" fill="#fff" />
|
||||
<path d="M139.08 40.42h2a10.23 10.23 0 01.6 3.18 9.24 9.24 0 01-.18 2.1 38.47 38.47 0 01-5.64.54q-6.48 0-6.48-7v-37l.36-.42h2.88a3.94 3.94 0 013.12 1.05 5.52 5.52 0 01.9 3.57v31.31q-.02 2.67 2.44 2.67zM155.94 22v23.94a20.85 20.85 0 01-3.66.3 23 23 0 01-3.78-.3V24.75q0-3.24-2.7-3.24h-.72a9.32 9.32 0 01-.3-2.58 10.7 10.7 0 01.3-2.7 39.63 39.63 0 014.38-.24h1a5.19 5.19 0 014.05 1.62 6.27 6.27 0 011.43 4.39z" />
|
||||
<path d="M154.8 2.84a7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.93 7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.93z" fill="#fff" />
|
||||
<path d="M163.08 39.22l8.76-11.82q1.32-1.8 4.8-5.7l-.18-.3a63.09 63.09 0 01-7.74.42H163a9.79 9.79 0 01-.24-2.34 15.8 15.8 0 01.42-3.3h20.4a16.31 16.31 0 011 4.26 4.1 4.1 0 01-.78 2.34L175 34.66a64.65 64.65 0 01-4.56 5.7l.18.24q3.12-.3 5.22-.3h2.58a15.35 15.35 0 006.12-.9 9.4 9.4 0 01.72 3.12q0 3.42-4.32 3.42h-18a14.27 14.27 0 01-.9-3.93 5.08 5.08 0 011.04-2.79zM215.88 31.06q0 8-4.26 12.3a13.63 13.63 0 01-18.06 0q-4.26-4.26-4.26-12.3t4.26-12.31a13.63 13.63 0 0118.06 0q4.26 4.27 4.26 12.31zm-13.29-10.08q-5.67 0-5.67 10.08t5.67 10.08q5.67 0 5.67-10.08t-5.67-10.08zM247 25.84v13.32a11 11 0 001.2 5.64 7 7 0 01-4.41 1.56q-2.43 0-3.33-1.14a5.69 5.69 0 01-.9-3.54V27.4a7.74 7.74 0 00-.72-3.87 2.78 2.78 0 00-2.58-1.17 8.62 8.62 0 00-6.3 3v20.58a20.85 20.85 0 01-3.66.3 23 23 0 01-3.78-.3v-29.7l.42-.36h2.76q3.42 0 4.08 3.6 4.38-3.84 8.73-3.84t6.42 2.82a12.17 12.17 0 012.07 7.38z" />
|
||||
<path d="M57.26 10.75a7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.84 7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.84zM198.26 10.75a7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.84 7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.84z" fill="#fff" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 5.5 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 6.3 KiB |
|
@ -0,0 +1,11 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 248.16 46.78">
|
||||
<title>Mobilizon Logo</title>
|
||||
<g data-name="header">
|
||||
<path d="M0 45.82l3.18-40.8a29.88 29.88 0 015.07-.36 27.74 27.74 0 014.95.36l4.86 17.16a92.19 92.19 0 012.34 10.08h.36a92.19 92.19 0 012.34-10.08L28 5.02a29.23 29.23 0 015-.36 29.23 29.23 0 015 .36l3.18 40.8a13.61 13.61 0 01-3.63.42 23.41 23.41 0 01-3.63-.24l-1.2-19.92q-.36-5.52-.48-12.84h-.44l-7.32 26.51a25.62 25.62 0 01-4 .3 23.36 23.36 0 01-3.84-.3L9.36 13.24H9q-.3 8.94-.48 12.84L7.26 46a22.47 22.47 0 01-3.6.24A13.75 13.75 0 010 45.82zM74 31.06q0 8-4.26 12.3a12.21 12.21 0 01-9 3.42 12.21 12.21 0 01-9-3.42q-4.26-4.26-4.26-12.3t4.24-12.31a12.21 12.21 0 019-3.42 12.21 12.21 0 019 3.42Q74 23.02 74 31.06zM60.75 20.98q-5.67 0-5.67 10.08t5.67 10.08q5.67 0 5.67-10.08t-5.67-10.08zM103.2 19.75q2.7 4.11 2.7 11.28T102 42.31a13.18 13.18 0 01-10 4.11 31.41 31.41 0 01-11.34-2V2.2l.4-.45h2.76A4 4 0 0187 2.83a5.38 5.38 0 01.93 3.57v11.94a12.08 12.08 0 017.56-2.7 8.71 8.71 0 017.71 4.11zm-9.72 2a7.28 7.28 0 00-5.58 2.82v16a15 15 0 004.08.54 5.25 5.25 0 004.68-2.67q1.68-2.67 1.68-7.59 0-9.03-4.86-9.1zM121 22v23.94a20.85 20.85 0 01-3.66.3 23 23 0 01-3.78-.3V24.75q0-3.24-2.7-3.24h-.72a9.32 9.32 0 01-.3-2.58 10.7 10.7 0 01.3-2.7 39.63 39.63 0 014.38-.24h1a5.19 5.19 0 014 1.62A6.27 6.27 0 01121 22z" />
|
||||
<path d="M119.82.84a7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.93 7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.93z" fill="#fff" />
|
||||
<path d="M139.08 40.42h2a10.23 10.23 0 01.6 3.18 9.24 9.24 0 01-.18 2.1 38.47 38.47 0 01-5.64.54q-6.48 0-6.48-7v-37l.36-.42h2.88a3.94 3.94 0 013.12 1.05 5.52 5.52 0 01.9 3.57v31.31q-.02 2.67 2.44 2.67zM155.94 22v23.94a20.85 20.85 0 01-3.66.3 23 23 0 01-3.78-.3V24.75q0-3.24-2.7-3.24h-.72a9.32 9.32 0 01-.3-2.58 10.7 10.7 0 01.3-2.7 39.63 39.63 0 014.38-.24h1a5.19 5.19 0 014.05 1.62 6.27 6.27 0 011.43 4.39z" />
|
||||
<path d="M154.8 2.84a7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.93 7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.93z" fill="#fff" />
|
||||
<path d="M163.08 39.22l8.76-11.82q1.32-1.8 4.8-5.7l-.18-.3a63.09 63.09 0 01-7.74.42H163a9.79 9.79 0 01-.24-2.34 15.8 15.8 0 01.42-3.3h20.4a16.31 16.31 0 011 4.26 4.1 4.1 0 01-.78 2.34L175 34.66a64.65 64.65 0 01-4.56 5.7l.18.24q3.12-.3 5.22-.3h2.58a15.35 15.35 0 006.12-.9 9.4 9.4 0 01.72 3.12q0 3.42-4.32 3.42h-18a14.27 14.27 0 01-.9-3.93 5.08 5.08 0 011.04-2.79zM215.88 31.06q0 8-4.26 12.3a13.63 13.63 0 01-18.06 0q-4.26-4.26-4.26-12.3t4.26-12.31a13.63 13.63 0 0118.06 0q4.26 4.27 4.26 12.31zm-13.29-10.08q-5.67 0-5.67 10.08t5.67 10.08q5.67 0 5.67-10.08t-5.67-10.08zM247 25.84v13.32a11 11 0 001.2 5.64 7 7 0 01-4.41 1.56q-2.43 0-3.33-1.14a5.69 5.69 0 01-.9-3.54V27.4a7.74 7.74 0 00-.72-3.87 2.78 2.78 0 00-2.58-1.17 8.62 8.62 0 00-6.3 3v20.58a20.85 20.85 0 01-3.66.3 23 23 0 01-3.78-.3v-29.7l.42-.36h2.76q3.42 0 4.08 3.6 4.38-3.84 8.73-3.84t6.42 2.82a12.17 12.17 0 012.07 7.38z" />
|
||||
<path d="M57.26 10.75a7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.84 7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.84zM198.26 10.75a7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.84 7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.84z" fill="#fff" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.4 KiB |
|
@ -41,8 +41,8 @@
|
|||
)
|
||||
}}
|
||||
</p>
|
||||
<div class="has-text-centered">
|
||||
<code>{{ `${currentActor.preferredUsername}@${domain}` }}</code>
|
||||
<div class="has-text-centered has-text-primary has-background-success">
|
||||
<pre>{{ `${currentActor.preferredUsername}@${domain}` }}</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -566,7 +566,7 @@ $color-white: #eee;
|
|||
}
|
||||
&.is-selected,
|
||||
&:hover {
|
||||
background-color: rgba($color-white, 0.2);
|
||||
background-color: rgba(#eee, 0.2);
|
||||
}
|
||||
&.is-empty {
|
||||
opacity: 0.5;
|
||||
|
@ -583,7 +583,7 @@ $color-white: #eee;
|
|||
padding: 0;
|
||||
font-size: 1rem;
|
||||
text-align: inherit;
|
||||
color: $color-white;
|
||||
color: #eee;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
|
|
|
@ -54,10 +54,13 @@ export default class DateCalendarIcon extends Vue {
|
|||
|
||||
<style lang="scss" scoped>
|
||||
div.datetime-container {
|
||||
background: #fff;
|
||||
border: 1px solid $borders;
|
||||
border-radius: 8px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
padding: 8px;
|
||||
text-align: center;
|
||||
overflow-y: hidden;
|
||||
overflow-x: hidden;
|
||||
|
|
|
@ -546,4 +546,11 @@ article.box {
|
|||
}
|
||||
padding: 0;
|
||||
}
|
||||
.content h3.event-title-card {
|
||||
line-height: 1em;
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
.participation-actor {
|
||||
margin-top: 1em;
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -40,6 +40,11 @@
|
|||
$t("About")
|
||||
}}</router-link>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://www.chapril.org/Mentions-legales.html">
|
||||
Mentions légales
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<router-link :to="{ name: RouteName.TERMS }">{{
|
||||
$t("Terms")
|
||||
|
@ -49,11 +54,14 @@
|
|||
<a
|
||||
rel="external"
|
||||
hreflang="en"
|
||||
href="https://framagit.org/framasoft/mobilizon/blob/main/LICENSE"
|
||||
href="https://forge.april.org/Chapril/mobilizon.chapril.org-mobilizon/src/branch/chapril/LICENSE"
|
||||
>
|
||||
{{ $t("License") }}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="mailto:mobilizon-support@chapril.org">{{ $t("Contact") }}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#navbar">{{ $t("Back to top") }}</a>
|
||||
</li>
|
||||
|
|
|
@ -1,34 +1,12 @@
|
|||
<template>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 248.16 46.78">
|
||||
<title>Mobilizon Logo</title>
|
||||
<g data-name="header">
|
||||
<path
|
||||
d="M0 45.82l3.18-40.8a29.88 29.88 0 015.07-.36 27.74 27.74 0 014.95.36l4.86 17.16a92.19 92.19 0 012.34 10.08h.36a92.19 92.19 0 012.34-10.08L28 5.02a29.23 29.23 0 015-.36 29.23 29.23 0 015 .36l3.18 40.8a13.61 13.61 0 01-3.63.42 23.41 23.41 0 01-3.63-.24l-1.2-19.92q-.36-5.52-.48-12.84h-.44l-7.32 26.51a25.62 25.62 0 01-4 .3 23.36 23.36 0 01-3.84-.3L9.36 13.24H9q-.3 8.94-.48 12.84L7.26 46a22.47 22.47 0 01-3.6.24A13.75 13.75 0 010 45.82zM74 31.06q0 8-4.26 12.3a12.21 12.21 0 01-9 3.42 12.21 12.21 0 01-9-3.42q-4.26-4.26-4.26-12.3t4.24-12.31a12.21 12.21 0 019-3.42 12.21 12.21 0 019 3.42Q74 23.02 74 31.06zM60.75 20.98q-5.67 0-5.67 10.08t5.67 10.08q5.67 0 5.67-10.08t-5.67-10.08zM103.2 19.75q2.7 4.11 2.7 11.28T102 42.31a13.18 13.18 0 01-10 4.11 31.41 31.41 0 01-11.34-2V2.2l.4-.45h2.76A4 4 0 0187 2.83a5.38 5.38 0 01.93 3.57v11.94a12.08 12.08 0 017.56-2.7 8.71 8.71 0 017.71 4.11zm-9.72 2a7.28 7.28 0 00-5.58 2.82v16a15 15 0 004.08.54 5.25 5.25 0 004.68-2.67q1.68-2.67 1.68-7.59 0-9.03-4.86-9.1zM121 22v23.94a20.85 20.85 0 01-3.66.3 23 23 0 01-3.78-.3V24.75q0-3.24-2.7-3.24h-.72a9.32 9.32 0 01-.3-2.58 10.7 10.7 0 01.3-2.7 39.63 39.63 0 014.38-.24h1a5.19 5.19 0 014 1.62A6.27 6.27 0 01121 22z"
|
||||
/>
|
||||
<path
|
||||
d="M119.82.84a7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.93 7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.93z"
|
||||
fill="#fff"
|
||||
/>
|
||||
<path
|
||||
d="M139.08 40.42h2a10.23 10.23 0 01.6 3.18 9.24 9.24 0 01-.18 2.1 38.47 38.47 0 01-5.64.54q-6.48 0-6.48-7v-37l.36-.42h2.88a3.94 3.94 0 013.12 1.05 5.52 5.52 0 01.9 3.57v31.31q-.02 2.67 2.44 2.67zM155.94 22v23.94a20.85 20.85 0 01-3.66.3 23 23 0 01-3.78-.3V24.75q0-3.24-2.7-3.24h-.72a9.32 9.32 0 01-.3-2.58 10.7 10.7 0 01.3-2.7 39.63 39.63 0 014.38-.24h1a5.19 5.19 0 014.05 1.62 6.27 6.27 0 011.43 4.39z"
|
||||
/>
|
||||
<path
|
||||
d="M154.8 2.84a7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.93 7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.93z"
|
||||
fill="#fff"
|
||||
/>
|
||||
<path
|
||||
d="M163.08 39.22l8.76-11.82q1.32-1.8 4.8-5.7l-.18-.3a63.09 63.09 0 01-7.74.42H163a9.79 9.79 0 01-.24-2.34 15.8 15.8 0 01.42-3.3h20.4a16.31 16.31 0 011 4.26 4.1 4.1 0 01-.78 2.34L175 34.66a64.65 64.65 0 01-4.56 5.7l.18.24q3.12-.3 5.22-.3h2.58a15.35 15.35 0 006.12-.9 9.4 9.4 0 01.72 3.12q0 3.42-4.32 3.42h-18a14.27 14.27 0 01-.9-3.93 5.08 5.08 0 011.04-2.79zM215.88 31.06q0 8-4.26 12.3a13.63 13.63 0 01-18.06 0q-4.26-4.26-4.26-12.3t4.26-12.31a13.63 13.63 0 0118.06 0q4.26 4.27 4.26 12.31zm-13.29-10.08q-5.67 0-5.67 10.08t5.67 10.08q5.67 0 5.67-10.08t-5.67-10.08zM247 25.84v13.32a11 11 0 001.2 5.64 7 7 0 01-4.41 1.56q-2.43 0-3.33-1.14a5.69 5.69 0 01-.9-3.54V27.4a7.74 7.74 0 00-.72-3.87 2.78 2.78 0 00-2.58-1.17 8.62 8.62 0 00-6.3 3v20.58a20.85 20.85 0 01-3.66.3 23 23 0 01-3.78-.3v-29.7l.42-.36h2.76q3.42 0 4.08 3.6 4.38-3.84 8.73-3.84t6.42 2.82a12.17 12.17 0 012.07 7.38z"
|
||||
/>
|
||||
<path
|
||||
d="M57.26 10.75a7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.84 7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.84zM198.26 10.75a7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.84 7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.84z"
|
||||
fill="#fff"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
<img src="img/pics/logo_chapril_mobilizon.png" alt="logo chapril" />
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { Component, Prop, Vue } from "vue-property-decorator";
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
// import MobilizonLogo from "../assets/logo_chapril_mobilizon.png";
|
||||
|
||||
@Component
|
||||
export default class Logo extends Vue {
|
||||
|
|
|
@ -142,7 +142,9 @@ export default class Map extends Vue {
|
|||
}
|
||||
|
||||
updateDraggableMarkerPosition(e: LatLng): void {
|
||||
this.updateDraggableMarkerCallback(e, this.zoom);
|
||||
if (this.updateDraggableMarkerCallback) {
|
||||
this.updateDraggableMarkerCallback(e, this.zoom);
|
||||
}
|
||||
}
|
||||
|
||||
updateZoom(zoom: number): void {
|
||||
|
|
|
@ -11,7 +11,11 @@
|
|||
:to="{ name: RouteName.HOME }"
|
||||
:aria-label="$t('Home')"
|
||||
>
|
||||
<logo />
|
||||
<img
|
||||
src="/img/long_logo_chapril_mobilizon.png"
|
||||
alt="logo mobilizon"
|
||||
style="width: 5em"
|
||||
/>
|
||||
</b-navbar-item>
|
||||
</template>
|
||||
<template slot="start">
|
||||
|
@ -54,6 +58,15 @@
|
|||
</b-navbar-item>
|
||||
</template>
|
||||
<template slot="end">
|
||||
<b-navbar-item
|
||||
href="https://www.chapril.org"
|
||||
:aria-label="'www.chapril.org'"
|
||||
>
|
||||
<img
|
||||
src="/img/pics/logo_chapril_mobilizon.png"
|
||||
alt="logo chapril mobilizon"
|
||||
/>
|
||||
</b-navbar-item>
|
||||
<b-navbar-item tag="div">
|
||||
<search-field @navbar-search="mobileNavbarActive = false" />
|
||||
</b-navbar-item>
|
||||
|
@ -133,8 +146,8 @@
|
|||
v-if="currentUser.role === ICurrentUserRole.ADMINISTRATOR"
|
||||
tag="router-link"
|
||||
:to="{ name: RouteName.ADMIN_DASHBOARD }"
|
||||
>{{ $t("Administration") }}</b-navbar-item
|
||||
>
|
||||
>{{ $t("Administration") }}
|
||||
</b-navbar-item>
|
||||
|
||||
<b-navbar-item
|
||||
tag="span"
|
||||
|
|
|
@ -17,10 +17,8 @@ h2 {
|
|||
margin: 15px 0 30px;
|
||||
|
||||
span {
|
||||
background: $secondary;
|
||||
display: inline;
|
||||
padding: 3px 8px;
|
||||
color: #3a384c;
|
||||
font-family: "Liberation Sans", "Helvetica Neue", Roboto, Helvetica, Arial,
|
||||
serif;
|
||||
font-weight: 400;
|
||||
|
|
|
@ -34,16 +34,6 @@ export const FETCH_PERSON = gql`
|
|||
feedTokens {
|
||||
token
|
||||
}
|
||||
organizedEvents {
|
||||
total
|
||||
elements {
|
||||
id
|
||||
uuid
|
||||
title
|
||||
beginsOn
|
||||
status
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
${ACTOR_FRAGMENT}
|
||||
|
|
|
@ -74,6 +74,7 @@ export const INSTANCE_FRAGMENT = gql`
|
|||
fragment InstanceFragment on Instance {
|
||||
domain
|
||||
hasRelay
|
||||
relayAddress
|
||||
followerStatus
|
||||
followedStatus
|
||||
eventCount
|
||||
|
@ -131,15 +132,6 @@ export const ADD_INSTANCE = gql`
|
|||
${INSTANCE_FRAGMENT}
|
||||
`;
|
||||
|
||||
export const ADD_RELAY = gql`
|
||||
mutation addRelay($address: String!) {
|
||||
addRelay(address: $address) {
|
||||
...relayFragment
|
||||
}
|
||||
}
|
||||
${RELAY_FRAGMENT}
|
||||
`;
|
||||
|
||||
export const REMOVE_RELAY = gql`
|
||||
mutation removeRelay($address: String!) {
|
||||
removeRelay(address: $address) {
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
"Account settings": "Roghainnean a’ chunntais",
|
||||
"Actions": "Gnìomhan",
|
||||
"Activate browser push notifications": "Gnìomhaich brathan putaidh a’ bhrabhsair",
|
||||
"Activate notifications": "Gnìomhaich na brathan",
|
||||
"Activated": "An gnìomh",
|
||||
"Active": "Gnìomhach",
|
||||
"Activity": "Gnìomhachd",
|
||||
|
@ -103,6 +104,7 @@
|
|||
"Anonymous participant": "Freastalaiche gun ainm",
|
||||
"Anonymous participants will be asked to confirm their participation through e-mail.": "Thèid iarraidh air freastalaichean gun ainm gun dearbh iad an com-pàirteachadh air a’ phost-d.",
|
||||
"Anonymous participations": "Com-pàirteachaidhean gun ainm",
|
||||
"Any category": "Roinn-seòrsa sam bith",
|
||||
"Any day": "Latha sam bith",
|
||||
"Any type": "Seòrsa sam bith",
|
||||
"Anyone can join freely": "Faodaidh neach sam bith a dhol an sàs ann gu saor",
|
||||
|
@ -135,6 +137,7 @@
|
|||
"Back to top": "Air ais gun bhàrr",
|
||||
"Back to user list": "Air ais gu liosta nan cleachdaichean",
|
||||
"Banner": "Bratach",
|
||||
"Become part of the community and start organizing events": "Faigh ballrachd sa choimhearsnachd agus tòisich air tachartasan a chur air dòigh",
|
||||
"Before you can login, you need to click on the link inside it to validate your account.": "Mus urrainn dhut clàradh a-steach, feumaidh tu briogadh air a’ cheangal ’na broinn gus an cunntas agad a dhearbhadh.",
|
||||
"Begins on": "Tòisichidh e aig",
|
||||
"Big Blue Button": "Big Blue Button",
|
||||
|
@ -158,6 +161,7 @@
|
|||
"Cancel my participation…": "Sguir dhen chom-pàirteachadh agam…",
|
||||
"Cancelled": "Chaidh a chur gu neoini",
|
||||
"Cancelled: Won't happen": "Sguireadh dheth: Cha tachair seo",
|
||||
"Category": "Roinn-seòrsa",
|
||||
"Change": "Atharraich",
|
||||
"Change email": "Atharraich am post-d",
|
||||
"Change my email": "Atharraich am post-d agam",
|
||||
|
@ -192,7 +196,7 @@
|
|||
"Confirm my particpation": "Dearbh an com-pàirteachadh agam",
|
||||
"Confirm participation": "Dearbh an com-pàirteachadh",
|
||||
"Confirm user": "Dearbh an cleachdaiche",
|
||||
"Confirmed": "Air a dhearbhachadh",
|
||||
"Confirmed": "Air a dhearbhadh",
|
||||
"Confirmed at": "Chaidh a dhearbhachadh",
|
||||
"Confirmed: Will happen": "Air dearbhadh: Tachraidh seo",
|
||||
"Congratulations, your account is now created!": "Meal do naidheachd, chaidh an cunntas agad a chruthachadh!",
|
||||
|
@ -239,6 +243,7 @@
|
|||
"Date and time": "Ceann-là ’s àm",
|
||||
"Date and time settings": "Roghainnean a’ chinn-là ’s an ama",
|
||||
"Date parameters": "Paramadairean a’ chinn-là",
|
||||
"Deactivate notifications": "Cuir na brathan à gnìomh",
|
||||
"Decline": "Diùlt",
|
||||
"Decrease": "Lùghdaich",
|
||||
"Default": "Bun-roghainn",
|
||||
|
@ -365,6 +370,8 @@
|
|||
"Follow": "Lean air",
|
||||
"Follow a new instance": "Lean air ionstans ùr",
|
||||
"Follow instance": "Lean air an ionstans",
|
||||
"Follow request pending approval": "Iarrtas leantainn ri aontachadh",
|
||||
"Follow requests will be approved by a group moderator": "Thèid aontachadh ri iarrtasan leantainn le maor a’ bhuidhinn",
|
||||
"Follow status": "Staid na leantainn",
|
||||
"Followed": "’Ga leantainn leinne",
|
||||
"Followed, pending response": "’Ga leantainn leinne, a’ feitheamh air freagairt",
|
||||
|
@ -392,6 +399,7 @@
|
|||
"General information": "Fiosrachadh coitcheann",
|
||||
"General settings": "Roghainnean coitcheann",
|
||||
"Geolocation was not determined in time.": "Cha deach leis a’ gheò-lorgadh ri àm.",
|
||||
"Get informed of the upcoming public events": "Faigh naidheachdan mu thachartasan poblach ri thighinn",
|
||||
"Getting location": "A’ faighinn an ionaid",
|
||||
"Getting there": "Mar a gheibh thu ann",
|
||||
"Glossary": "Briathrachan",
|
||||
|
@ -436,6 +444,7 @@
|
|||
"I want to approve every participation request": "Tha mi airson aontachadh ris a h-uile iarrtas air com-pàirteachadh",
|
||||
"I've been mentionned in a comment under an event": "Chaidh iomradh a thoirt orm ann am beachd fo thachartas",
|
||||
"I've been mentionned in a group discussion": "Chaidh iomradh a thoirt orm ann an deasbad buidhinn",
|
||||
"I've clicked on X, then on Y": "Briog mi air X ’s an uairsin air Y",
|
||||
"ICS feed for events": "Inbhir ICS dha na tachartasan",
|
||||
"ICS/WebCal Feed": "Inbhir ICS/WebCal",
|
||||
"IP Address": "Seòladh IP",
|
||||
|
@ -484,6 +493,7 @@
|
|||
"It is possible that the content is not accessible on this instance, because this instance has blocked the profiles or groups behind this content.": "Dh’fhaoidte nach gabh an t-susbaint inntrigeadh air an ionstans seo on a bhac an t-ionstans seo na pròifilean no buidhnean a tha air cùlaibh na susbainte seo.",
|
||||
"Italic": "Eadailteach",
|
||||
"Jitsi Meet": "Jitsi Meet",
|
||||
"Join": "Faigh ballrachd",
|
||||
"Join <b>{instance}</b>, a Mobilizon instance": "Faigh ballrachd air <b>{instance}</b>, seo ionstans Mobilizon",
|
||||
"Join group": "Faigh ballrachd sa bhuidheann",
|
||||
"Join group {group}": "Faigh ballrachd sa bhuidheann {group}",
|
||||
|
@ -532,6 +542,7 @@
|
|||
"Member": "Ball",
|
||||
"Members": "Buill",
|
||||
"Members-only post": "Post do bhuill a-mhàin",
|
||||
"Membership requests will be approved by a group moderator": "Thèid aontachadh ri iarrtasan ballrachd le maor a’ bhuidhinn",
|
||||
"Memberships": "Ballrachdan",
|
||||
"Mentions": "Iomraidhean",
|
||||
"Message": "Teachdaireachd",
|
||||
|
@ -818,6 +829,7 @@
|
|||
"Search": "Lorg",
|
||||
"Search events, groups, etc.": "Lorg tachartasan, buidhnean is msaa.",
|
||||
"Searching…": "’Ga lorg…",
|
||||
"Select a category": "Tagh roinn-seòrsa",
|
||||
"Select a language": "Tagh cànan",
|
||||
"Select a radius": "Tagh astar",
|
||||
"Select a timezone": "Tagh roinn-tìde",
|
||||
|
@ -825,6 +837,7 @@
|
|||
"Select the activities for which you wish to receive an email or a push notification.": "Tagh na gnìomhachdan dhan fhaigh thu post-d no brath putaidh.",
|
||||
"Send": "Cuir",
|
||||
"Send email": "Cuir post-d",
|
||||
"Send feedback": "Cuir do bheachd thugainn",
|
||||
"Send notification e-mails": "Cuir puist-d bhrathan",
|
||||
"Send password reset": "Cuir ath-shuidheachadh an fhacail-fhaire",
|
||||
"Send the confirmation email again": "Cuir am post-d dearbhaidh a-rithist",
|
||||
|
@ -851,6 +864,7 @@
|
|||
"Skip to main content": "Thoir leum gun phrìomh shusbaint",
|
||||
"Social": "Sòisealta",
|
||||
"Some terms, technical or otherwise, used in the text below may cover concepts that are difficult to grasp. We have provided a glossary here to help you understand them better:": "Tha cuid dhe na faclan a tha ’gan cleachdadh san teacsa gu h-ìosal, co-dhiù an e faclan teicnigeach a th’ annta gus nach e, mu bheachdan a tha caran doirbh a thuigsinn ma dh’fhaoidte. Rinn sinn briathrachan ach am bhiod e na b’ fhasa dhut an tuigsinn:",
|
||||
"Sorry, we wen't able to save your feedback. Don't worry, we'll try to fix this issue anyway.": "Tha sinn duilich ach cha b’ urrainn dhuinn do bheachd a shàbhaladh. Na gabh dragh, feuchaidh sinn gun càraich sinn an duilgheadas co-dhiù.",
|
||||
"Starts on…": "Àm-tòiseachaidh…",
|
||||
"Status": "Staid",
|
||||
"Stop following instance": "Na lean tuilleadh air an ionstans",
|
||||
|
@ -870,6 +884,7 @@
|
|||
"Terms": "Teirmichean",
|
||||
"Terms of service": "Teirmichean na seirbheise",
|
||||
"Text": "Teacsa",
|
||||
"Thanks a lot, your feedback was submitted!": "Mòran taing, chaidh do bheachdan a chur thugainn!",
|
||||
"That you follow or of which you are a member": "A tha thu a’ leantainn orra no ’nad bhall ann",
|
||||
"The Big Blue Button video teleconference URL": "URL co-labhairt video Big Blue Button",
|
||||
"The Google Meet video teleconference URL": "URL co-labhairt video Google Meet",
|
||||
|
@ -943,6 +958,7 @@
|
|||
"This event has been cancelled.": "Chaidh an tachartas seo a chur gu neoini.",
|
||||
"This event is accessible only through it's link. Be careful where you post this link.": "Cha ghabh an tachartas seo inntrigeadh ach leis a’ cheangal aige. Thoir an aire mus postaich thu an ceangal seo am badeigin.",
|
||||
"This group doesn't have a description yet.": "Chan eil tuairisgeul aig a’ bhuidheann seo fhathast.",
|
||||
"This group is a remote group, it's possible the original instance has more informations.": "’S e buidheann cèin a tha seo agus dh’fhaoidte gu bheil barrachd fiosrachaidh aig an ionstans tùsail.",
|
||||
"This group is accessible only through it's link. Be careful where you post this link.": "Cha ghabh an tachartas seo inntrigeadh ach leis a’ cheangal aige. Thoir an aire mus postaich thu an ceangal seo am badeigin.",
|
||||
"This group is invite-only": "Feumaidh tu cuireadh airson ballrachd fhaighinn sa bhuidheann seo",
|
||||
"This group was not found": "Cha deach am buidheann seo a lorg",
|
||||
|
@ -1044,6 +1060,8 @@
|
|||
"View less": "Seall nas lugha",
|
||||
"View more": "Seall barrachd",
|
||||
"View page on {hostname} (in a new window)": "Seall an duilleag air {hostname} (ann an uinneag ùr)",
|
||||
"View past events": "Seall na tachartasan san àm a dh’fhalbh",
|
||||
"View the group profile on the original instance": "Faic pròifil a’ buidhinn air an ionstans tùsail",
|
||||
"Visibility was set to an unknown value.": "Chaidh luach nach aithne dhuinn a shuidheachadh air an t-so-fhaicsinneachd.",
|
||||
"Visibility was set to private.": "Chaidh so-fhaicsinneachd phrìobhaideach a shuidheachadh air.",
|
||||
"Visibility was set to public.": "Chaidh so-fhaicsinneachd phoblach a shuidheachadh air.",
|
||||
|
@ -1051,6 +1069,7 @@
|
|||
"Visible everywhere on the web (public)": "Chithear air feadh an lìn e (poblach)",
|
||||
"Waiting for organization team approval.": "A’ feitheamh air aontachadh leis an sgioba eagrachaidh.",
|
||||
"Warning": "Rabhadh",
|
||||
"We collect your feedback and the error information in order to improve this service.": "Cruinnichidh sinn do bheachdan agus am fiosrachadh mun mhearachd ach an doir sinn piseach air an t-seirbheis seo.",
|
||||
"We couldn't save your participation inside this browser. Not to worry, you have successfully confirmed your participation, we just couldn't save it's status in this browser because of a technical issue.": "Cha b’ urrainn dhuinn an com-pàirteachadh agad a shàbhaladh sa bhrabhsair seo. Na gabh dragh, dhearbh thu gun gabh thu pàirt ann ach cha b’ urrainn dhuinn sin a shàbhaladh sa bhrabhsair seo ri linn duilgheadas teicnigeach.",
|
||||
"We improve this software thanks to your feedback. To let us know about this issue, two possibilities (both unfortunately require user account creation):": "Bheir sinn piseach air a’ bhathar-bhog le taic do bheachdan. Tha dà dhòigh ann airson innse dhuinn mu dhèidhinn na trioblaide seo (gu mì-fhortanach, feumaidh tu cunntas a chruthachadh dhaibh):",
|
||||
"We just sent an email to {email}": "Tha sinn air post-d a chur gu {email}",
|
||||
|
@ -1066,6 +1085,7 @@
|
|||
"Welcome back!": "Fàilte air ais!",
|
||||
"Welcome to Mobilizon, {username}!": "Fàilte gu Mobilizon, {username}!",
|
||||
"What can I do to help?": "Dè nì mi airson cuideachadh?",
|
||||
"What happened?": "Dè thachair?",
|
||||
"Wheelchair accessibility": "Inntrigeadh cathrach-cuibhle",
|
||||
"When a moderator from the group creates an event and attributes it to the group, it will show up here.": "Nuair a chruthaicheas maor a’ bhuidhinn tachartas le iomruineadh dhan bhuidheann, nochdaidh e an-seo.",
|
||||
"When the event is private, you'll need to share the link around.": "Nuair a bhios an tachartas prìobhaideach, feumaidh tu fhèin an ceangal a cho-roinneadh.",
|
||||
|
@ -1124,7 +1144,9 @@
|
|||
"You have one event tomorrow.": "Bidh {count} tachartas agad a-màireach| Bidh {count} thachartas agad a-màireach| Bidh {count} tachartasan agad a-màireach| Bidh {count} tachartas agad a-màireach",
|
||||
"You haven't interacted with other instances yet.": "Cha do rinn thu eadar-ghnìomh le ionstans sam bith eile fhathast.",
|
||||
"You invited {member}.": "Thug thu cuireadh dha {member}.",
|
||||
"You may also:": "’S urrainn dhut cuideachd:",
|
||||
"You may clear all participation information for this device with the buttons below.": "’S urrainn dhut gach fiosrachadh mun chom-pàirteachadh a shuathadh bàn on uidheam seo leis na putanan gu h-ìosal.",
|
||||
"You may now close this page or {return_to_the_homepage}.": "’S urrainn dhut an duilleag seo a dhùnadh a-nis no {return_to_the_homepage}.",
|
||||
"You may now close this window, or {return_to_event}.": "’S urrainn dhut an uinneag seo a dhùnadh a-nis no {return_to_event}.",
|
||||
"You may show some members as contacts.": "Faodaidh tu cuid a bhuill a shealltainn ’nan luchd-aithne.",
|
||||
"You moved the folder {resource} into {new_path}.": "Ghluais thu am pasgan {resource} gu {new_path}.",
|
||||
|
@ -1176,6 +1198,7 @@
|
|||
"Your email is being changed": "Tha am post-d agad ’ga atharrachadh",
|
||||
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.": "Cha dèid am post-d agad a chleachdadh ach airson dearbhadh gur e neach a th’ annad agus airson naidheachdan a chur thugad mun tachartas seo. ’S ann NACH DÈID a thar-chur gu ionstansan eile no gu eagraiche an tachartais.",
|
||||
"Your federated identity": "An dearbh-aithne co-naisgte agad",
|
||||
"Your membership is pending approval": "Tha do bhallrachd a’ feitheamh ri aontachadh",
|
||||
"Your membership was approved by {profile}.": "Dh’aontaich {profile} gum faigh thu ballrachd.",
|
||||
"Your participation has been confirmed": "Chaidh an com-pàirteachadh agad a dhearbhadh",
|
||||
"Your participation has been rejected": "Chaidh an com-pàirteachadh agad a dhiùltadh",
|
||||
|
@ -1226,6 +1249,7 @@
|
|||
"profile@instance": "ainm@ionstans",
|
||||
"report #{report_number}": "gearan #{report_number}",
|
||||
"return to the event's page": "till gu duilleag an tachartais",
|
||||
"return to the homepage": "tilleadh dhan duilleag-dhachaigh",
|
||||
"terms of service": "teirmichean na seirbheise",
|
||||
"with another identity…": "le dearbh-aithne eile…",
|
||||
"your notification settings": "roghainnean nam brathan",
|
||||
|
|
|
@ -258,10 +258,16 @@
|
|||
"Previous page": "הדף הקודם",
|
||||
"Privacy Policy": "מדיניות פרטיות",
|
||||
"Private event": "אירוע פרטי",
|
||||
"Private feeds": "היזנים פרטיים",
|
||||
"Profiles": "פרופילים",
|
||||
"Public RSS/Atom Feed": "ערוץ RSS/Atom פומבי",
|
||||
"Public comment moderation": "בקרת תגובות פומביות",
|
||||
"Public event": "אירוע פומבי",
|
||||
"Public feeds": "היזנים פומביים",
|
||||
"Public iCal Feed": "ערוץ iCal פומבי",
|
||||
"Publish": "פרסום",
|
||||
"Published events with <b>{comments}</b> comments and <b>{participations}</b> confirmed participations": "אירועים שפורסמו שיש להם <b>{comments}</b> תגובות ו־<b>{participations}</b> אישורי השתתפות",
|
||||
"RSS/Atom Feed": "היזן רסס/אטום",
|
||||
"Region": "אזור",
|
||||
"Registration is allowed, anyone can register.": "ההרשמה מאופשרת, כל אחד.ת יכול.ה להירשם.",
|
||||
"Registration is closed.": "ההרשמה סגורה.",
|
||||
|
@ -272,9 +278,11 @@
|
|||
"Report": "דיווח",
|
||||
"Report this comment": "דיווח על תגובה זו",
|
||||
"Report this event": "דיווח על אירוע זה",
|
||||
"Reported": "מדווח",
|
||||
"Reported by": "דווח על־ידי",
|
||||
"Reported by someone on {domain}": "דווח על־ידי מישהו.י מהאתר {domain}",
|
||||
"Reported by {reporter}": "דווח על־ידי {reporter}",
|
||||
"Reported identity": "זהות מדווחת",
|
||||
"Reports": "דיווחים",
|
||||
"Reset my password": "איפוס הססמה שלי",
|
||||
"Resolved": "נפתר",
|
||||
|
@ -287,6 +295,7 @@
|
|||
"Searching…": "מחפש…",
|
||||
"Send email": "שליחת דוא\"ל",
|
||||
"Send the report": "שליחת הדיווח",
|
||||
"Set an URL to a page with your own terms.": "הגדרת קישור לעמוד עם תנאים משלך.",
|
||||
"Settings": "הגדרות",
|
||||
"Share this event": "שיתוף אירוע זה",
|
||||
"Show map": "הצגת מפה",
|
||||
|
@ -294,6 +303,8 @@
|
|||
"Show the time when the event begins": "הצגת זמן תחילת האירוע",
|
||||
"Show the time when the event ends": "הצגת זמן סיום האירוע",
|
||||
"Sign up": "הרשמה",
|
||||
"Starts on…": "מתחיל ב…",
|
||||
"Status": "מצב",
|
||||
"Street": "רחוב",
|
||||
"Tentative: Will be confirmed later": "לא סופי: יאושר בהמשך",
|
||||
"Terms": "תנאים",
|
||||
|
@ -304,5 +315,27 @@
|
|||
"The event has been created as a draft": "האירוע נוצר כטיוטה",
|
||||
"The event has been published": "האירוע פורסם",
|
||||
"The event has been updated": "האירוע עודכן",
|
||||
"The event has been updated and published": "האירוע עודכן ופורסם"
|
||||
"The event has been updated and published": "האירוע עודכן ופורסם",
|
||||
"The event organiser has chosen to validate manually participations. Do you want to add a little note to explain why you want to participate to this event?": "בקשות השתתפות מאושרות ידנית על־ידי מארגנ.ת האירוע. האם ברצונך להוסיף הערה עם הסבר מדוע את.ה רוצה להשתתף באירוע זה?",
|
||||
"The event organizer didn't add any description.": "מארגנ.ת האירוע לא הוסיפ.ה תיאור.",
|
||||
"The event organizer manually approves participations. Since you've chosen to participate without an account, please explain why you want to participate to this event.": "בקשות השתתפות מאושרות ידנית על־ידי מארגנ.ת האירוע. היות ובחרת להשתתף ללא חשבון, אנא צרפ.י הסבר מדוע את.ה רוצה להשתתף באירוע זה.",
|
||||
"The event title will be ellipsed.": "כותרת האירוע תוצג באופן מקוצר עם שלוש נקודות בסוף.",
|
||||
"The page you're looking for doesn't exist.": "העמוד שחיפשת לא קיים.",
|
||||
"The password was successfully changed": "הססמה שונתה בהצלחה",
|
||||
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "הדיווח יישלח למנהלים.ות של השרת שלך. ניתן להסביר למטה את סיבת הדיווח של תוכן זה.",
|
||||
"The {default_terms} will be used. They will be translated in the user's language.": "ייעשה שימוש ב{default_terms}. הם יתורגמו לשפה של המשתמש.ת.",
|
||||
"There are {participants} participants.": "יש {participants} משתתפים.ות.",
|
||||
"There will be no way to recover your data.": "לא תהיה אפשרות לשחזר את המידע שלך.",
|
||||
"These events may interest you": "האירועים האלה עשויים לעניין אותך",
|
||||
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "שרת מוביליזון זה ואירוע זה מאפשרים בקשת השתתפות ללא חשבון, אך נדרש אימות באמצעות דואר אלקטרוני.",
|
||||
"This information is saved only on your computer. Click for details": "מידע זה נשמר רק על המחשב שלך. לפרטים לחצ.י",
|
||||
"This instance isn't opened to registrations, but you can register on other instances.": "שרת זה אינו פתוח להרשמה, אך ניתן להירשם בשרתים אחרים.",
|
||||
"This is a demonstration site to test Mobilizon.": "זהו אתר הדגמה לצורך בדיקה של מוביליזון.",
|
||||
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "הדבר ימחק / יהפוך לאנונימי את כל התוכן (אירועים, תגובות, הודעות, אישורי השתתפות…) שנוצר מתוך זהות זו.",
|
||||
"Title": "כותרת",
|
||||
"To confirm, type your event title \"{eventTitle}\"": "לאישור, נא להזין את כותרת האירוע \"{eventTitle}\"",
|
||||
"To confirm, type your identity username \"{preferredUsername}\"": "לאישור, נא להזין את שם המשתמש.ת שלך \"{preferredUsername}\"",
|
||||
"Transfer to {outsideDomain}": "העברה לשרת {outsideDomain}",
|
||||
"Type": "סוג",
|
||||
"URL": "קישור"
|
||||
}
|
||||
|
|
1021
js/src/i18n/ja.json
|
@ -3,6 +3,7 @@ import { InstanceFollowStatus } from "./enums";
|
|||
export interface IInstance {
|
||||
domain: string;
|
||||
hasRelay: boolean;
|
||||
relayAddress: string | null;
|
||||
followerStatus: InstanceFollowStatus;
|
||||
followedStatus: InstanceFollowStatus;
|
||||
personCount: number;
|
||||
|
|
|
@ -140,4 +140,5 @@ export const SELECTED_PROVIDERS: { [key: string]: string } = {
|
|||
google: "Google",
|
||||
keycloak: "Keycloak",
|
||||
ldap: "LDAP",
|
||||
cas: "CAS",
|
||||
};
|
||||
|
|
|
@ -2,6 +2,13 @@
|
|||
@import "~bulma/sass/utilities/initial-variables.sass";
|
||||
@import "~bulma/sass/utilities/derived-variables.sass";
|
||||
|
||||
|
||||
// chapril colors
|
||||
$chapril_blue: #2e5281;
|
||||
$chapril_blue_light: #bcd0e5;
|
||||
$chapril_orange: #ff5e00;
|
||||
$chapril_grey: #5f5f5f;
|
||||
// other
|
||||
$bleuvert: #1e7d97;
|
||||
$jaune: #ffd599;
|
||||
$violet: #424056;
|
||||
|
@ -20,78 +27,79 @@ $violet-3: #3c376e;
|
|||
/**
|
||||
* Borders
|
||||
*/
|
||||
$borders: #d7d6de;
|
||||
$backgrounds: #ecebf2;
|
||||
$borders: mix($chapril_blue, #d7d6de);
|
||||
$backgrounds: mix($chapril_blue, #ecebf2);
|
||||
|
||||
/**
|
||||
* Text
|
||||
*/
|
||||
$purple-1: #757199;
|
||||
$purple-1: mix($chapril_blue, #757199);
|
||||
|
||||
/**
|
||||
* Background
|
||||
*/
|
||||
$purple-2: #cdcaea;
|
||||
$purple-3: #e6e4f4;
|
||||
$purple-2: mix($chapril_blue, #cdcaea);
|
||||
$purple-3: mix($chapril_blue, #e6e4f4);
|
||||
|
||||
$orange-2: #ed8d07;
|
||||
$orange-3: #d35204;
|
||||
$orange-2: mix($chapril_blue, #ed8d07);
|
||||
$orange-3: mix($chapril_blue, #d35204);
|
||||
|
||||
$yellow-1: #ffd599;
|
||||
$yellow-2: #fff1de;
|
||||
$yellow-3: #fbd5cb;
|
||||
$yellow-4: #f7ba30;
|
||||
$yellow-1: mix($chapril_blue, #fff1e8);
|
||||
$yellow-2: mix($chapril_blue, #fff1de);
|
||||
$yellow-3: mix($chapril_blue, #fff8f6);
|
||||
$yellow-4: mix($chapril_blue, #b4f0ff);
|
||||
|
||||
$primary: $bleuvert;
|
||||
$primary: $chapril_blue;
|
||||
$primary-invert: findColorInvert($primary);
|
||||
$secondary: $jaune;
|
||||
$secondary: lighten($chapril_blue, 20%);
|
||||
$secondary-invert: findColorInvert($secondary);
|
||||
|
||||
$background-color: $violet-2;
|
||||
$background-color: mix($chapril_blue, $violet-2);
|
||||
$background-color-darker: darken($background-color,10%);
|
||||
|
||||
$success: #0d8758;
|
||||
$success: mix($chapril_blue, #0d8758);
|
||||
$success-invert: findColorInvert($success);
|
||||
$info: #36bcd4;
|
||||
$info: mix($chapril_blue, #36bcd4);
|
||||
$info-invert: findColorInvert($info);
|
||||
$danger: #cd2026;
|
||||
$danger: mix($chapril_blue, #ff2e54);
|
||||
$danger-invert: findColorInvert($danger);
|
||||
$link: $primary;
|
||||
$link-invert: $primary-invert;
|
||||
$text: $violet-1;
|
||||
$grey: #757575;
|
||||
$text: mix($chapril_blue, $violet-1);
|
||||
|
||||
$colors: map-merge(
|
||||
$colors,
|
||||
(
|
||||
"primary": (
|
||||
$primary,
|
||||
$primary-invert,
|
||||
),
|
||||
"secondary": (
|
||||
$secondary,
|
||||
$secondary-invert,
|
||||
),
|
||||
"success": (
|
||||
$success,
|
||||
$success-invert,
|
||||
),
|
||||
"info": (
|
||||
$info,
|
||||
$info-invert,
|
||||
),
|
||||
"danger": (
|
||||
$danger,
|
||||
$danger-invert,
|
||||
),
|
||||
"link": (
|
||||
$link,
|
||||
$link-invert,
|
||||
),
|
||||
"grey": (
|
||||
$grey,
|
||||
findColorInvert($grey),
|
||||
),
|
||||
)
|
||||
$colors,
|
||||
(
|
||||
"primary": (
|
||||
$primary,
|
||||
$primary-invert,
|
||||
),
|
||||
"secondary": (
|
||||
$secondary,
|
||||
$secondary-invert,
|
||||
),
|
||||
"success": (
|
||||
$success,
|
||||
$success-invert,
|
||||
),
|
||||
"info": (
|
||||
$info,
|
||||
$info-invert,
|
||||
),
|
||||
"danger": (
|
||||
$danger,
|
||||
$danger-invert,
|
||||
),
|
||||
"link": (
|
||||
$link,
|
||||
$link-invert,
|
||||
),
|
||||
|
||||
"grey": (
|
||||
$grey,
|
||||
findColorInvert($grey),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
// Navbar
|
||||
|
@ -103,7 +111,7 @@ $navbar-height: 4rem;
|
|||
$footer-padding: 3rem 1.5rem 1rem;
|
||||
$footer-background-color: $background-color;
|
||||
|
||||
$body-background-color: #efeef4;
|
||||
$body-background-color: mix( $chapril_blue, #efeef4);
|
||||
$fullhd-enabled: false;
|
||||
$hero-body-padding-medium: 6rem 1.5rem;
|
||||
|
||||
|
@ -112,22 +120,26 @@ main > .container {
|
|||
min-height: 70vh;
|
||||
}
|
||||
|
||||
$title-color: #3c376e;
|
||||
$title-color: $chapril_blue;
|
||||
$title-family: "Liberation Sans", "Helvetica Neue", Roboto, Helvetica, Arial,
|
||||
serif;
|
||||
serif;
|
||||
$title-weight: 700;
|
||||
$title-size: 40px;
|
||||
$title-sub-size: 45px;
|
||||
$title-sup-size: 30px;
|
||||
|
||||
$subtitle-color: #3a384c;
|
||||
$subtitle-color: $chapril_grey;
|
||||
$subtitle-family: "Liberation Sans", "Helvetica Neue", Roboto, Helvetica, Arial,
|
||||
serif;
|
||||
serif;
|
||||
$subtitle-weight: 400;
|
||||
$subtitle-size: 32px;
|
||||
$subtitle-sub-size: 30px;
|
||||
$subtitle-sup-size: 15px;
|
||||
|
||||
.title {
|
||||
margin: 30px auto 45px;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
background: $secondary;
|
||||
display: inline;
|
||||
|
|
|
@ -0,0 +1,140 @@
|
|||
@import "~bulma/sass/utilities/functions.sass";
|
||||
@import "~bulma/sass/utilities/initial-variables.sass";
|
||||
@import "~bulma/sass/utilities/derived-variables.sass";
|
||||
|
||||
$bleuvert: #1e7d97;
|
||||
$jaune: #ffd599;
|
||||
$violet: #424056;
|
||||
|
||||
/**
|
||||
* Text body, paragraphs
|
||||
*/
|
||||
$violet-1: #3a384c;
|
||||
$violet-2: #474467;
|
||||
|
||||
/**
|
||||
* Titles, dark borders, buttons
|
||||
*/
|
||||
$violet-3: #3c376e;
|
||||
|
||||
/**
|
||||
* Borders
|
||||
*/
|
||||
$borders: #d7d6de;
|
||||
$backgrounds: #ecebf2;
|
||||
|
||||
/**
|
||||
* Text
|
||||
*/
|
||||
$purple-1: #757199;
|
||||
|
||||
/**
|
||||
* Background
|
||||
*/
|
||||
$purple-2: #cdcaea;
|
||||
$purple-3: #e6e4f4;
|
||||
|
||||
$orange-2: #ed8d07;
|
||||
$orange-3: #d35204;
|
||||
|
||||
$yellow-1: #ffd599;
|
||||
$yellow-2: #fff1de;
|
||||
$yellow-3: #fbd5cb;
|
||||
$yellow-4: #f7ba30;
|
||||
|
||||
$primary: $bleuvert;
|
||||
$primary-invert: findColorInvert($primary);
|
||||
$secondary: $jaune;
|
||||
$secondary-invert: findColorInvert($secondary);
|
||||
|
||||
$background-color: $violet-2;
|
||||
|
||||
$success: #0d8758;
|
||||
$success-invert: findColorInvert($success);
|
||||
$info: #36bcd4;
|
||||
$info-invert: findColorInvert($info);
|
||||
$danger: #ff2e54;
|
||||
$danger-invert: findColorInvert($danger);
|
||||
$link: $primary;
|
||||
$link-invert: $primary-invert;
|
||||
$text: $violet-1;
|
||||
|
||||
$colors: map-merge(
|
||||
$colors,
|
||||
(
|
||||
"primary": (
|
||||
$primary,
|
||||
$primary-invert,
|
||||
),
|
||||
"secondary": (
|
||||
$secondary,
|
||||
$secondary-invert,
|
||||
),
|
||||
"success": (
|
||||
$success,
|
||||
$success-invert,
|
||||
),
|
||||
"info": (
|
||||
$info,
|
||||
$info-invert,
|
||||
),
|
||||
"danger": (
|
||||
$danger,
|
||||
$danger-invert,
|
||||
),
|
||||
"link": (
|
||||
$link,
|
||||
$link-invert,
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
// Navbar
|
||||
$navbar-background-color: $secondary;
|
||||
$navbar-item-color: $background-color;
|
||||
$navbar-height: 4rem;
|
||||
|
||||
// Footer
|
||||
$footer-padding: 3rem 1.5rem 1rem;
|
||||
$footer-background-color: $background-color;
|
||||
|
||||
$body-background-color: #efeef4;
|
||||
$fullhd-enabled: false;
|
||||
$hero-body-padding-medium: 6rem 1.5rem;
|
||||
|
||||
main > .container {
|
||||
background: $body-background-color;
|
||||
min-height: 70vh;
|
||||
}
|
||||
|
||||
$title-color: #3c376e;
|
||||
$title-family: "Liberation Sans", "Helvetica Neue", Roboto, Helvetica, Arial,
|
||||
serif;
|
||||
$title-weight: 700;
|
||||
$title-size: 40px;
|
||||
$title-sub-size: 45px;
|
||||
$title-sup-size: 30px;
|
||||
|
||||
$subtitle-color: #3a384c;
|
||||
$subtitle-family: "Liberation Sans", "Helvetica Neue", Roboto, Helvetica, Arial,
|
||||
serif;
|
||||
$subtitle-weight: 400;
|
||||
$subtitle-size: 32px;
|
||||
$subtitle-sub-size: 30px;
|
||||
$subtitle-sup-size: 15px;
|
||||
|
||||
.title {
|
||||
margin: 30px auto 45px;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
background: $secondary;
|
||||
display: inline;
|
||||
padding: 3px 8px;
|
||||
margin: 15px auto 30px;
|
||||
}
|
||||
|
||||
//$input-border-color: #dbdbdb;
|
||||
$breadcrumb-item-color: $primary;
|
||||
$checkbox-background-color: #fff;
|
||||
$title-color: $violet-3;
|
|
@ -1,160 +0,0 @@
|
|||
<template>
|
||||
<section class="container">
|
||||
<div v-if="person">
|
||||
<div class="card-image" v-if="person.banner">
|
||||
<figure class="image">
|
||||
<img :src="person.banner.url" />
|
||||
</figure>
|
||||
</div>
|
||||
<div class="card-content">
|
||||
<div class="media">
|
||||
<div class="media-left">
|
||||
<figure class="image is-48x48" v-if="person.avatar">
|
||||
<img :src="person.avatar.url" />
|
||||
</figure>
|
||||
</div>
|
||||
<div class="media-content">
|
||||
<p class="title">{{ person.name }}</p>
|
||||
<p class="subtitle">@{{ person.preferredUsername }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content">
|
||||
<vue-simple-markdown :source="person.summary"></vue-simple-markdown>
|
||||
</div>
|
||||
|
||||
<b-dropdown hoverable has-link aria-role="list">
|
||||
<button class="button is-primary" slot="trigger">
|
||||
{{ $t("Public feeds") }}
|
||||
<b-icon icon="menu-down"></b-icon>
|
||||
</button>
|
||||
|
||||
<b-dropdown-item aria-role="listitem">
|
||||
<a :href="feedUrls('atom', true)">
|
||||
{{ $t("Public RSS/Atom Feed") }}
|
||||
</a>
|
||||
</b-dropdown-item>
|
||||
<b-dropdown-item aria-role="listitem">
|
||||
<a :href="feedUrls('ics', true)">
|
||||
{{ $t("Public iCal Feed") }}
|
||||
</a>
|
||||
</b-dropdown-item>
|
||||
</b-dropdown>
|
||||
|
||||
<b-dropdown
|
||||
hoverable
|
||||
has-link
|
||||
aria-role="list"
|
||||
v-if="person.feedTokens.length > 0"
|
||||
>
|
||||
<button class="button is-info" slot="trigger">
|
||||
{{ $t("Private feeds") }}
|
||||
<b-icon icon="menu-down"></b-icon>
|
||||
</button>
|
||||
|
||||
<b-dropdown-item aria-role="listitem">
|
||||
<a :href="feedUrls('atom', false)">
|
||||
{{ $t("RSS/Atom Feed") }}
|
||||
</a>
|
||||
</b-dropdown-item>
|
||||
<b-dropdown-item aria-role="listitem">
|
||||
<a :href="feedUrls('ics', false)">
|
||||
{{ $t("iCal Feed") }}
|
||||
</a>
|
||||
</b-dropdown-item>
|
||||
</b-dropdown>
|
||||
<a
|
||||
class="button"
|
||||
v-if="currentActor.id === person.id"
|
||||
@click="createToken"
|
||||
>
|
||||
{{ $t("Create token") }}
|
||||
</a>
|
||||
</div>
|
||||
<section v-if="person.organizedEvents.length > 0">
|
||||
<h2 class="subtitle">
|
||||
{{ $t("Organized") }}
|
||||
</h2>
|
||||
<div class="columns">
|
||||
<EventCard
|
||||
v-for="event in person.organizedEvents"
|
||||
:event="event"
|
||||
:options="{ hideDetails: true, organizerActor: person }"
|
||||
:key="event.uuid"
|
||||
class="column is-one-third"
|
||||
/>
|
||||
</div>
|
||||
<div class="field is-grouped">
|
||||
<p class="control">
|
||||
<a
|
||||
class="button"
|
||||
@click="deleteProfile()"
|
||||
v-if="currentActor && currentActor.id === person.id"
|
||||
>
|
||||
{{ $t("Delete") }}
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { Component, Prop, Vue } from "vue-property-decorator";
|
||||
import EventCard from "@/components/Event/EventCard.vue";
|
||||
import { FETCH_PERSON, CURRENT_ACTOR_CLIENT } from "../../graphql/actor";
|
||||
import { MOBILIZON_INSTANCE_HOST } from "../../api/_entrypoint";
|
||||
import { IPerson } from "../../types/actor";
|
||||
import { CREATE_FEED_TOKEN_ACTOR } from "../../graphql/feed_tokens";
|
||||
|
||||
@Component({
|
||||
apollo: {
|
||||
person: {
|
||||
query: FETCH_PERSON,
|
||||
variables() {
|
||||
return {
|
||||
username: this.$route.params.name,
|
||||
};
|
||||
},
|
||||
},
|
||||
currentActor: {
|
||||
query: CURRENT_ACTOR_CLIENT,
|
||||
},
|
||||
},
|
||||
components: {
|
||||
EventCard,
|
||||
},
|
||||
metaInfo() {
|
||||
return {
|
||||
title: this.$t("Profile") as string,
|
||||
};
|
||||
},
|
||||
})
|
||||
export default class Profile extends Vue {
|
||||
@Prop({ type: String, required: true }) name!: string;
|
||||
|
||||
person!: IPerson;
|
||||
|
||||
currentActor!: IPerson;
|
||||
|
||||
feedUrls(format: "ics" | "webcal:" | "atom", isPublic = true): string {
|
||||
let url = format === "ics" ? "webcal:" : "";
|
||||
url += `//${MOBILIZON_INSTANCE_HOST}/`;
|
||||
if (isPublic === true) {
|
||||
url += `@${this.person.preferredUsername}/feed/`;
|
||||
} else {
|
||||
url += `events/going/${this.person.feedTokens[0].token}/`;
|
||||
}
|
||||
return url + (format === "ics" ? "ics" : "atom");
|
||||
}
|
||||
|
||||
async createToken(): Promise<void> {
|
||||
const { data } = await this.$apollo.mutate({
|
||||
mutation: CREATE_FEED_TOKEN_ACTOR,
|
||||
variables: { actor_id: this.person.id },
|
||||
});
|
||||
|
||||
this.person.feedTokens.push(data);
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -66,8 +66,11 @@
|
|||
<span class="text-sm block">{{ $t("Uploaded media size") }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-3 grid xl:grid-cols-2 gap-4" v-if="instance.hasRelay">
|
||||
<div class="border bg-white p-6 shadow-md rounded-md">
|
||||
<div class="mt-3 grid xl:grid-cols-2 gap-4">
|
||||
<div
|
||||
class="border bg-white p-6 shadow-md rounded-md"
|
||||
v-if="instance.hasRelay"
|
||||
>
|
||||
<button
|
||||
@click="removeInstanceFollow"
|
||||
v-if="instance.followedStatus == InstanceFollowStatus.APPROVED"
|
||||
|
@ -90,6 +93,9 @@
|
|||
{{ $t("Follow instance") }}
|
||||
</button>
|
||||
</div>
|
||||
<div v-else class="md:h-48 py-16 text-center opacity-50">
|
||||
{{ $t("Only Mobilizon instances can be followed") }}
|
||||
</div>
|
||||
<div class="border bg-white p-6 shadow-md rounded-md flex flex-col gap-2">
|
||||
<button
|
||||
@click="acceptInstance"
|
||||
|
@ -110,9 +116,6 @@
|
|||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else class="md:h-48 py-16 text-center opacity-50">
|
||||
{{ $t("Only Mobilizon instances can be followed") }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
|
@ -159,7 +162,7 @@ export default class Instance extends Vue {
|
|||
await this.$apollo.mutate({
|
||||
mutation: ACCEPT_RELAY,
|
||||
variables: {
|
||||
address: `relay@${this.domain}`,
|
||||
address: this.instance.relayAddress,
|
||||
},
|
||||
update(cache: ApolloCache<any>) {
|
||||
cache.writeFragment({
|
||||
|
@ -191,7 +194,7 @@ export default class Instance extends Vue {
|
|||
await this.$apollo.mutate({
|
||||
mutation: REJECT_RELAY,
|
||||
variables: {
|
||||
address: `relay@${this.domain}`,
|
||||
address: this.instance.relayAddress,
|
||||
},
|
||||
update(cache: ApolloCache<any>) {
|
||||
cache.writeFragment({
|
||||
|
@ -239,7 +242,7 @@ export default class Instance extends Vue {
|
|||
await this.$apollo.mutate({
|
||||
mutation: REMOVE_RELAY,
|
||||
variables: {
|
||||
address: `relay@${this.domain}`,
|
||||
address: this.instance.relayAddress,
|
||||
},
|
||||
update(cache: ApolloCache<any>) {
|
||||
cache.writeFragment({
|
||||
|
|
|
@ -21,6 +21,11 @@
|
|||
<b-button type="is-primary" native-type="submit">{{
|
||||
$t("Add an instance")
|
||||
}}</b-button>
|
||||
<b-loading
|
||||
:is-full-page="true"
|
||||
v-model="followInstanceLoading"
|
||||
:can-cancel="false"
|
||||
/>
|
||||
</p>
|
||||
</b-field>
|
||||
</b-field>
|
||||
|
@ -171,7 +176,6 @@ import {
|
|||
InstanceFilterFollowStatus,
|
||||
InstanceFollowStatus,
|
||||
} from "@/types/enums";
|
||||
import { SnackbarProgrammatic as Snackbar } from "buefy";
|
||||
const { isNavigationFailure, NavigationFailureType } = VueRouter;
|
||||
|
||||
const INSTANCES_PAGE_LIMIT = 10;
|
||||
|
@ -203,6 +207,8 @@ const INSTANCES_PAGE_LIMIT = 10;
|
|||
export default class Follows extends Vue {
|
||||
RouteName = RouteName;
|
||||
|
||||
followInstanceLoading = false;
|
||||
|
||||
newRelayAddress = "";
|
||||
|
||||
instances!: Paginate<IInstance>;
|
||||
|
@ -257,6 +263,7 @@ export default class Follows extends Vue {
|
|||
|
||||
async followInstance(e: Event): Promise<void> {
|
||||
e.preventDefault();
|
||||
this.followInstanceLoading = true;
|
||||
const domain = this.newRelayAddress.trim(); // trim to fix copy and paste domain name spaces and tabs
|
||||
try {
|
||||
await this.$apollo.mutate<{ relayFollowings: Paginate<IFollower> }>({
|
||||
|
@ -266,18 +273,18 @@ export default class Follows extends Vue {
|
|||
},
|
||||
});
|
||||
this.newRelayAddress = "";
|
||||
this.followInstanceLoading = false;
|
||||
this.$router.push({
|
||||
name: RouteName.INSTANCE,
|
||||
params: { domain },
|
||||
});
|
||||
} catch (err: any) {
|
||||
if (err.message) {
|
||||
Snackbar.open({
|
||||
message: err.message,
|
||||
type: "is-danger",
|
||||
position: "is-bottom",
|
||||
});
|
||||
} catch (error: any) {
|
||||
if (error.message) {
|
||||
if (error.graphQLErrors && error.graphQLErrors.length > 0) {
|
||||
this.$notifier.error(error.graphQLErrors[0].message);
|
||||
}
|
||||
}
|
||||
this.followInstanceLoading = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -523,7 +523,6 @@ h2.subtitle {
|
|||
span {
|
||||
padding: 5px 7px;
|
||||
display: inline;
|
||||
background: $secondary;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -13,9 +13,9 @@
|
|||
</h1>
|
||||
<p
|
||||
v-html="
|
||||
$t('Join <b>{instance}</b>, a Mobilizon instance', {
|
||||
`${$t('Join <b>{instance}</b>, a Mobilizon instance', {
|
||||
instance: config.name,
|
||||
})
|
||||
})}.`
|
||||
"
|
||||
/>
|
||||
<p class="instance-description">{{ config.description }}</p>
|
||||
|
@ -29,7 +29,15 @@
|
|||
tag="router-link"
|
||||
:to="{ name: RouteName.REGISTER }"
|
||||
v-if="config.registrationsOpen"
|
||||
>{{ $t("Create an account") }}</b-button
|
||||
>
|
||||
<i class="mdi mdi-account"></i>
|
||||
{{ $t("Create an account") }}</b-button
|
||||
>
|
||||
<a
|
||||
class="button is-light"
|
||||
:title="config.contact"
|
||||
href="mailto:mobilizon-support@chapril.org"
|
||||
>{{ $t("Contact") }}</a
|
||||
>
|
||||
<!-- We don't invite to find other instances yet -->
|
||||
<!-- <b-button v-else type="is-link" tag="a" href="https://joinmastodon.org">{{ $t('Find an instance') }}</b-button> -->
|
||||
|
@ -613,12 +621,12 @@ export default class Home extends Vue {
|
|||
@import "~bulma/sass/utilities/mixins.sass";
|
||||
|
||||
main > div > .container {
|
||||
background: $white;
|
||||
background: #eee;
|
||||
padding: 1rem 0.5rem 3rem;
|
||||
}
|
||||
|
||||
.search-autocomplete {
|
||||
border: 1px solid #dbdbdb;
|
||||
border: 1px solid $borders;
|
||||
color: rgba(0, 0, 0, 0.87);
|
||||
}
|
||||
|
||||
|
@ -726,8 +734,6 @@ section.hero {
|
|||
}
|
||||
|
||||
.container.section {
|
||||
background: $white;
|
||||
|
||||
@include tablet {
|
||||
margin-top: -4rem;
|
||||
}
|
||||
|
@ -746,7 +752,7 @@ section.hero {
|
|||
}
|
||||
|
||||
#homepage {
|
||||
background: $white;
|
||||
background: #eee;
|
||||
}
|
||||
|
||||
.home-separator {
|
||||
|
|
|
@ -18,7 +18,9 @@
|
|||
$t(
|
||||
"Error while login with {provider}. Retry or login another way.",
|
||||
{
|
||||
provider: $route.query.provider,
|
||||
provider:
|
||||
SELECTED_PROVIDERS[$route.query.provider] ||
|
||||
"unknown provider",
|
||||
}
|
||||
)
|
||||
}}</b-message
|
||||
|
@ -31,7 +33,9 @@
|
|||
$t(
|
||||
"Error while login with {provider}. This login provider doesn't exist.",
|
||||
{
|
||||
provider: $route.query.provider,
|
||||
provider:
|
||||
SELECTED_PROVIDERS[$route.query.provider] ||
|
||||
"unknown provider",
|
||||
}
|
||||
)
|
||||
}}</b-message
|
||||
|
@ -136,6 +140,7 @@ import {
|
|||
initializeCurrentActor,
|
||||
NoIdentitiesException,
|
||||
saveUserData,
|
||||
SELECTED_PROVIDERS,
|
||||
} from "../../utils/auth";
|
||||
import { ILogin } from "../../types/login.model";
|
||||
import {
|
||||
|
@ -198,6 +203,8 @@ export default class Login extends Vue {
|
|||
email: validateEmailField,
|
||||
};
|
||||
|
||||
SELECTED_PROVIDERS = SELECTED_PROVIDERS;
|
||||
|
||||
submitted = false;
|
||||
|
||||
mounted(): void {
|
||||
|
|
|
@ -46,7 +46,7 @@ export default class ProviderValidate extends Vue {
|
|||
id: userId,
|
||||
email: userEmail,
|
||||
isLoggedIn: true,
|
||||
role: ICurrentUserRole.USER,
|
||||
role: userRole,
|
||||
},
|
||||
});
|
||||
const { data } = await this.$apollo.query<{ loggedUser: IUser }>({
|
||||
|
|
|
@ -348,10 +348,8 @@ export default class Register extends Vue {
|
|||
}
|
||||
|
||||
h2.title {
|
||||
color: $primary;
|
||||
font-size: 2.5rem;
|
||||
text-decoration: underline;
|
||||
text-decoration-color: $secondary;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
|
|
|
@ -97,11 +97,13 @@ export default class ResendConfirmation extends Vue {
|
|||
e.preventDefault();
|
||||
this.error = false;
|
||||
|
||||
console.log("this.credentials.email", this.credentials.email);
|
||||
console.log("this.email", this.email);
|
||||
try {
|
||||
await this.$apollo.mutate({
|
||||
mutation: RESEND_CONFIRMATION_EMAIL,
|
||||
variables: {
|
||||
email: this.credentials.email,
|
||||
email: this.credentials.email || this.email,
|
||||
},
|
||||
});
|
||||
} catch (err) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<template>
|
||||
<div class="section container">
|
||||
<div class="section container bg-white">
|
||||
<h1 class="title">{{ $t("Let's define a few settings") }}</h1>
|
||||
<b-steps v-model="stepIndex" :has-navigation="false">
|
||||
<b-step-item step="1" :label="$t('Settings')">
|
||||
|
@ -93,6 +93,7 @@ export default class SettingsOnboard extends Vue {
|
|||
</script>
|
||||
<style scoped lang="scss">
|
||||
.section.container {
|
||||
background: white;
|
||||
.has-text-centered.section.buttons {
|
||||
justify-content: center;
|
||||
}
|
||||
|
|
24380
js/yarn.lock
|
@ -228,13 +228,13 @@ defmodule Mobilizon.Federation.ActivityPub.Audience do
|
|||
|> Enum.uniq()
|
||||
end
|
||||
|
||||
defp add_event_contacts(%Event{contacts: contacts}) do
|
||||
defp add_event_contacts(%Event{contacts: contacts}) when is_list(contacts) do
|
||||
contacts
|
||||
|> Enum.map(& &1.url)
|
||||
|> Enum.uniq()
|
||||
end
|
||||
|
||||
defp add_event_contacts(%Event{}), do: []
|
||||
defp add_event_contacts(_), do: []
|
||||
|
||||
defp process_mention({_, mentioned_actor}), do: mentioned_actor.url
|
||||
|
||||
|
|
|
@ -110,13 +110,17 @@ defmodule Mobilizon.Federation.ActivityPub.Publisher do
|
|||
@spec convert_followers_in_recipients(list(String.t())) :: {list(String.t()), list(String.t())}
|
||||
defp convert_followers_in_recipients(recipients) do
|
||||
Enum.reduce(recipients, {recipients, []}, fn recipient, {recipients, follower_actors} = acc ->
|
||||
case Actors.get_actor_by_followers_url(recipient) do
|
||||
%Actor{} = group ->
|
||||
{Enum.filter(recipients, fn recipient -> recipient != group.followers_url end),
|
||||
follower_actors ++ Actors.list_external_followers_for_actor(group)}
|
||||
if is_nil(recipient) do
|
||||
acc
|
||||
else
|
||||
case Actors.get_actor_by_followers_url(recipient) do
|
||||
%Actor{} = group ->
|
||||
{Enum.filter(recipients, fn recipient -> recipient != group.followers_url end),
|
||||
follower_actors ++ Actors.list_external_followers_for_actor(group)}
|
||||
|
||||
nil ->
|
||||
acc
|
||||
nil ->
|
||||
acc
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
@ -128,19 +132,23 @@ defmodule Mobilizon.Federation.ActivityPub.Publisher do
|
|||
@spec convert_members_in_recipients(list(String.t())) :: {list(String.t()), list(Actor.t())}
|
||||
defp convert_members_in_recipients(recipients) do
|
||||
Enum.reduce(recipients, {recipients, []}, fn recipient, {recipients, member_actors} = acc ->
|
||||
case Actors.get_group_by_members_url(recipient) do
|
||||
# If the group is local just add external members
|
||||
%Actor{domain: domain} = group when is_nil(domain) ->
|
||||
{Enum.filter(recipients, fn recipient -> recipient != group.members_url end),
|
||||
member_actors ++ Actors.list_external_actors_members_for_group(group)}
|
||||
if is_nil(recipient) do
|
||||
acc
|
||||
else
|
||||
case Actors.get_group_by_members_url(recipient) do
|
||||
# If the group is local just add external members
|
||||
%Actor{domain: domain} = group when is_nil(domain) ->
|
||||
{Enum.filter(recipients, fn recipient -> recipient != group.members_url end),
|
||||
member_actors ++ Actors.list_external_actors_members_for_group(group)}
|
||||
|
||||
# If it's remote add the remote group actor as well
|
||||
%Actor{} = group ->
|
||||
{Enum.filter(recipients, fn recipient -> recipient != group.members_url end),
|
||||
member_actors ++ Actors.list_external_actors_members_for_group(group) ++ [group]}
|
||||
# If it's remote add the remote group actor as well
|
||||
%Actor{} = group ->
|
||||
{Enum.filter(recipients, fn recipient -> recipient != group.members_url end),
|
||||
member_actors ++ Actors.list_external_actors_members_for_group(group) ++ [group]}
|
||||
|
||||
_ ->
|
||||
acc
|
||||
_ ->
|
||||
acc
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
|
|
@ -191,8 +191,8 @@ defmodule Mobilizon.Federation.ActivityPub.Refresher do
|
|||
defp process_collection(_, _), do: :error
|
||||
|
||||
# If we're handling an activity
|
||||
@spec handling_element(map()) :: {:ok, any, struct} | :error
|
||||
@spec handling_element(String.t()) :: {:ok, struct} | {:ok, atom, struct} | {:error, any()}
|
||||
@spec handling_element(map() | String.t()) ::
|
||||
{:ok, any, struct} | {:ok, struct} | {:ok, atom, struct} | {:error, any()} | :error
|
||||
defp handling_element(%{"type" => activity_type} = data)
|
||||
when activity_type in ["Create", "Update", "Delete"] do
|
||||
object = get_in(data, ["object"])
|
||||
|
|
|
@ -192,5 +192,5 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Actor do
|
|||
Map.put(res, "location", AddressConverter.model_to_as(physical_address))
|
||||
end
|
||||
|
||||
defp maybe_add_physical_address(res, %ActorModel{physical_address: _}), do: res
|
||||
defp maybe_add_physical_address(res, _), do: res
|
||||
end
|
||||
|
|
|
@ -48,12 +48,8 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Discussion do
|
|||
@impl Converter
|
||||
@spec as_to_model_data(map) :: map() | {:error, atom()}
|
||||
def as_to_model_data(%{"type" => "Note", "name" => name} = object) when is_valid_string(name) do
|
||||
case extract_actors(object) do
|
||||
%{actor_id: actor_id, creator_id: creator_id} ->
|
||||
%{actor_id: actor_id, creator_id: creator_id, title: name, url: object["id"]}
|
||||
|
||||
{:error, error} ->
|
||||
{:error, error}
|
||||
with %{actor_id: actor_id, creator_id: creator_id} <- extract_actors(object) do
|
||||
%{actor_id: actor_id, creator_id: creator_id, title: name, url: object["id"]}
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -46,22 +46,18 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Media do
|
|||
actor_id
|
||||
)
|
||||
when is_binary(media_url) do
|
||||
case upload_media(media_url, name) do
|
||||
{:error, err} ->
|
||||
{:error, err}
|
||||
with {:ok, %{url: url} = uploaded} <- upload_media(media_url, name) do
|
||||
case Medias.get_media_by_url(url) do
|
||||
%MediaModel{file: _file} = media ->
|
||||
{:ok, media}
|
||||
|
||||
{:ok, %{url: url} = uploaded} ->
|
||||
case Medias.get_media_by_url(url) do
|
||||
%MediaModel{file: _file} = media ->
|
||||
{:ok, media}
|
||||
|
||||
nil ->
|
||||
Medias.create_media(%{
|
||||
file: Map.take(uploaded, [:url, :name, :content_type, :size]),
|
||||
metadata: Map.take(uploaded, [:width, :height, :blurhash]),
|
||||
actor_id: actor_id
|
||||
})
|
||||
end
|
||||
nil ->
|
||||
Medias.create_media(%{
|
||||
file: Map.take(uploaded, [:url, :name, :content_type, :size]),
|
||||
metadata: Map.take(uploaded, [:width, :height, :blurhash]),
|
||||
actor_id: actor_id
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -468,12 +468,16 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do
|
|||
context: %{current_user: %User{role: role}}
|
||||
})
|
||||
when is_admin(role) do
|
||||
has_relay = Actors.has_relay?(domain)
|
||||
remote_relay = Actors.get_actor_by_name("relay@#{domain}")
|
||||
remote_relay = Actors.get_relay(domain)
|
||||
local_relay = Relay.get_actor()
|
||||
|
||||
result = %{
|
||||
has_relay: has_relay,
|
||||
has_relay: !is_nil(remote_relay),
|
||||
relay_address:
|
||||
if(is_nil(remote_relay),
|
||||
do: nil,
|
||||
else: "#{remote_relay.preferred_username}@#{remote_relay.domain}"
|
||||
),
|
||||
follower_status: follow_status(remote_relay, local_relay),
|
||||
followed_status: follow_status(local_relay, remote_relay)
|
||||
}
|
||||
|
@ -489,24 +493,25 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do
|
|||
{:error, :unauthenticated}
|
||||
end
|
||||
|
||||
@spec create_instance(any, map(), Absinthe.Resolution.t()) ::
|
||||
{:error, atom() | binary()}
|
||||
| {:ok, Mobilizon.Instances.Instance.t()}
|
||||
def create_instance(
|
||||
parent,
|
||||
%{domain: domain} = args,
|
||||
%{context: %{current_user: %User{role: role}}} = resolution
|
||||
)
|
||||
when is_admin(role) do
|
||||
with {:ok, _activity, _follow} <- Relay.follow(domain) do
|
||||
Instances.refresh()
|
||||
get_instance(parent, args, resolution)
|
||||
end
|
||||
end
|
||||
case Relay.follow(domain) do
|
||||
{:ok, _activity, _follow} ->
|
||||
Instances.refresh()
|
||||
get_instance(parent, args, resolution)
|
||||
|
||||
@spec create_relay(any(), map(), Absinthe.Resolution.t()) ::
|
||||
{:ok, Follower.t()} | {:error, any()}
|
||||
def create_relay(_parent, %{address: address}, %{context: %{current_user: %User{role: role}}})
|
||||
when is_admin(role) do
|
||||
with {:ok, _activity, follow} <- Relay.follow(address) do
|
||||
{:ok, follow}
|
||||
{:error, :http_error} ->
|
||||
{:error, dgettext("errors", "Unable to find an instance to follow at this address")}
|
||||
|
||||
{:error, err} ->
|
||||
{:error, err}
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -4,9 +4,9 @@ defmodule Mobilizon.GraphQL.Resolvers.Event.Utils do
|
|||
"""
|
||||
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.{Config, Events}
|
||||
alias Mobilizon.Events
|
||||
alias Mobilizon.Events.Event
|
||||
alias Mobilizon.Federation.ActivityPub.Permission
|
||||
alias Mobilizon.Federation.ActivityPub.{Permission, Relay}
|
||||
import Mobilizon.Service.Guards, only: [is_valid_string: 1]
|
||||
|
||||
@spec can_event_be_updated_by?(Event.t(), Actor.t()) ::
|
||||
|
@ -43,7 +43,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Event.Utils do
|
|||
def check_event_access?(%Event{local: true}), do: true
|
||||
|
||||
def check_event_access?(%Event{url: url}) do
|
||||
relay_actor_id = Config.relay_actor_id()
|
||||
Events.check_if_event_has_instance_follow(url, relay_actor_id)
|
||||
relay_actor = Relay.get_actor()
|
||||
Events.check_if_event_has_instance_follow(url, relay_actor.id)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -216,6 +216,10 @@ defmodule Mobilizon.GraphQL.Schema.AdminType do
|
|||
description:
|
||||
"Whether this instance has a relay, meaning that it's a Mobilizon instance that we can follow"
|
||||
)
|
||||
|
||||
field(:relay_address, :string,
|
||||
description: "If this instance has a relay, it's federated username"
|
||||
)
|
||||
end
|
||||
|
||||
@desc """
|
||||
|
@ -352,13 +356,6 @@ defmodule Mobilizon.GraphQL.Schema.AdminType do
|
|||
resolve(&Admin.create_instance/3)
|
||||
end
|
||||
|
||||
@desc "Add a relay subscription"
|
||||
field :add_relay, type: :follower do
|
||||
arg(:address, non_null(:string), description: "The relay hostname to add")
|
||||
|
||||
resolve(&Admin.create_relay/3)
|
||||
end
|
||||
|
||||
@desc "Delete a relay subscription"
|
||||
field :remove_relay, type: :follower do
|
||||
arg(:address, non_null(:string), description: "The relay hostname to delete")
|
||||
|
|
|
@ -0,0 +1,110 @@
|
|||
defmodule Mix.Tasks.Mobilizon.Actors.Delete do
|
||||
@moduledoc """
|
||||
Task to delete an actor
|
||||
"""
|
||||
use Mix.Task
|
||||
alias Mobilizon.{Actors, Users}
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Service.ActorSuspension
|
||||
alias Mobilizon.Users.User
|
||||
import Mix.Tasks.Mobilizon.Common
|
||||
|
||||
@shortdoc "Deletes a Mobilizon person or a group"
|
||||
|
||||
@impl Mix.Task
|
||||
def run([federated_username | rest]) do
|
||||
{options, [], []} =
|
||||
OptionParser.parse(
|
||||
rest,
|
||||
strict: [
|
||||
assume_yes: :boolean,
|
||||
keep_username: :boolean
|
||||
],
|
||||
aliases: [
|
||||
y: :assume_yes,
|
||||
k: :keep_username
|
||||
]
|
||||
)
|
||||
|
||||
assume_yes? = Keyword.get(options, :assume_yes, false)
|
||||
keep_username? = Keyword.get(options, :keep_username, false)
|
||||
|
||||
start_mobilizon()
|
||||
|
||||
# To make sure we can delete actors created by mistake with "@" in their username
|
||||
case Actors.get_local_actor_by_name(federated_username) ||
|
||||
Actors.get_actor_by_name(federated_username) do
|
||||
%Actor{preferred_username: username, domain: nil} when username in ["relay", "anonymous"] ->
|
||||
shell_error("This actor can't be deleted.")
|
||||
|
||||
%Actor{} = actor ->
|
||||
if check_everything(actor, assume_yes?) do
|
||||
ActorSuspension.suspend_actor(actor,
|
||||
reserve_username: keep_username?,
|
||||
suspension: false
|
||||
)
|
||||
|
||||
display_name = Actor.display_name_and_username(actor)
|
||||
|
||||
shell_info("""
|
||||
The actor #{display_name} has been deleted
|
||||
""")
|
||||
else
|
||||
shell_error("Actor has not been deleted.")
|
||||
end
|
||||
|
||||
nil ->
|
||||
shell_error("No actor found with this username")
|
||||
end
|
||||
end
|
||||
|
||||
def run(_) do
|
||||
shell_error(
|
||||
"mobilizon.actors.delete requires an username or a federated username as argument"
|
||||
)
|
||||
end
|
||||
|
||||
@spec check_everything(Actor.t(), boolean()) :: boolean()
|
||||
defp check_everything(%Actor{} = actor, assume_yes?) do
|
||||
display_name = Actor.display_name_and_username(actor)
|
||||
|
||||
(assume_yes? or
|
||||
shell_yes?(
|
||||
"All content by this profile or group will be deleted. Continue with deleting #{display_name}?"
|
||||
)) and
|
||||
check_actor(actor, assume_yes?)
|
||||
end
|
||||
|
||||
@spec check_actor(Actor.t(), boolean()) :: boolean()
|
||||
defp check_actor(%Actor{type: :Group} = group, assume_yes?) do
|
||||
display_name = Actor.display_name_and_username(group)
|
||||
nb_members = Actors.count_members_for_group(group)
|
||||
nb_followers = Actors.count_followers_for_actor(group)
|
||||
|
||||
if nb_followers + nb_members > 0 do
|
||||
shell_info("Group members will be notified of the group deletion.")
|
||||
|
||||
assume_yes? or
|
||||
shell_yes?(
|
||||
"Group #{display_name} has #{nb_members} members and #{nb_followers} followers. Continue deleting?"
|
||||
)
|
||||
else
|
||||
true
|
||||
end
|
||||
end
|
||||
|
||||
defp check_actor(%Actor{type: :Person, domain: nil} = profile, assume_yes?) do
|
||||
%User{actors: actors, email: email} = Users.get_user_with_actors!(profile.user_id)
|
||||
|
||||
if length(actors) == 1 do
|
||||
assume_yes? or
|
||||
shell_yes?(
|
||||
"This profile is the only one user #{email} has. Mobilizon will invite the user to create a new profile on their next login. If you want to remove the whole user account, use the `mobilizon.users.delete` command. Continue deleting?"
|
||||
)
|
||||
else
|
||||
true
|
||||
end
|
||||
end
|
||||
|
||||
defp check_actor(%Actor{} = _actor, assume_yes?), do: assume_yes?
|
||||
end
|
|
@ -54,7 +54,7 @@ defmodule Mix.Tasks.Mobilizon.Common do
|
|||
@spec shell_yes?(String.t()) :: boolean()
|
||||
def shell_yes?(message) do
|
||||
if mix_shell?(),
|
||||
do: Mix.shell().yes?("Continue?"),
|
||||
do: Mix.shell().yes?(message),
|
||||
else: shell_prompt(message, "Continue?") in ~w(Yn Y y)
|
||||
end
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@ defmodule Mobilizon.Actors.Actor do
|
|||
alias Mobilizon.Web.Endpoint
|
||||
alias Mobilizon.Web.Router.Helpers, as: Routes
|
||||
import Mobilizon.Web.Gettext, only: [dgettext: 2]
|
||||
import Mobilizon.Service.Guards, only: [is_valid_string: 1]
|
||||
|
||||
require Logger
|
||||
|
||||
|
@ -224,10 +225,23 @@ defmodule Mobilizon.Actors.Actor do
|
|||
preferred_username_and_domain(actor)
|
||||
end
|
||||
|
||||
def display_name_and_username(%__MODULE__{name: name} = actor) do
|
||||
def display_name_and_username(%__MODULE__{
|
||||
type: :Application,
|
||||
name: name,
|
||||
preferred_username: "relay",
|
||||
domain: domain
|
||||
})
|
||||
when domain not in [nil, ""] and name not in [nil, ""] do
|
||||
"#{name} (#{domain})"
|
||||
end
|
||||
|
||||
def display_name_and_username(%__MODULE__{name: name, preferred_username: username} = actor)
|
||||
when username not in [nil, ""] do
|
||||
"#{name} (@#{preferred_username_and_domain(actor)})"
|
||||
end
|
||||
|
||||
def display_name_and_username(_), do: nil
|
||||
|
||||
@doc """
|
||||
Returns the preferred username with the eventual @domain suffix if it's
|
||||
a distant actor.
|
||||
|
@ -235,8 +249,18 @@ defmodule Mobilizon.Actors.Actor do
|
|||
@spec preferred_username_and_domain(t) :: String.t()
|
||||
def preferred_username_and_domain(%__MODULE__{
|
||||
preferred_username: preferred_username,
|
||||
domain: nil
|
||||
}) do
|
||||
domain: domain
|
||||
})
|
||||
when domain in [nil, ""] do
|
||||
preferred_username
|
||||
end
|
||||
|
||||
def preferred_username_and_domain(%__MODULE__{
|
||||
type: :Application,
|
||||
preferred_username: preferred_username,
|
||||
domain: domain
|
||||
})
|
||||
when not is_nil(domain) and preferred_username == domain do
|
||||
preferred_username
|
||||
end
|
||||
|
||||
|
@ -290,6 +314,7 @@ defmodule Mobilizon.Actors.Actor do
|
|||
|> build_urls()
|
||||
|> common_changeset(attrs)
|
||||
|> unique_username_validator()
|
||||
|> username_validator()
|
||||
|> validate_required(@registration_required_attrs)
|
||||
end
|
||||
|
||||
|
@ -333,6 +358,7 @@ defmodule Mobilizon.Actors.Actor do
|
|||
|> put_change(:keys, Crypto.generate_rsa_2048_private_key())
|
||||
|> put_change(:type, :Group)
|
||||
|> unique_username_validator()
|
||||
|> username_validator()
|
||||
|> validate_required(@group_creation_required_attrs)
|
||||
|> validate_length(:summary, max: 5000)
|
||||
|> validate_length(:preferred_username, max: 100)
|
||||
|
@ -358,6 +384,23 @@ defmodule Mobilizon.Actors.Actor do
|
|||
# When we don't even have any preferred_username, don't even try validating preferred_username
|
||||
defp unique_username_validator(changeset), do: changeset
|
||||
|
||||
defp username_validator(%Ecto.Changeset{} = changeset) do
|
||||
username = Ecto.Changeset.fetch_field!(changeset, :preferred_username)
|
||||
|
||||
if is_valid_string(username) and Regex.match?(~r/^[a-z0-9_]+$/, username) do
|
||||
changeset
|
||||
else
|
||||
add_error(
|
||||
changeset,
|
||||
:preferred_username,
|
||||
dgettext(
|
||||
"errors",
|
||||
"Username must only contain alphanumeric lowercased characters and underscores."
|
||||
)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
@spec build_urls(Ecto.Changeset.t(), atom()) :: Ecto.Changeset.t()
|
||||
defp build_urls(changeset, type \\ :Person)
|
||||
|
||||
|
|
|
@ -848,7 +848,13 @@ defmodule Mobilizon.Actors do
|
|||
@doc """
|
||||
Returns a paginated list of members for a group.
|
||||
"""
|
||||
@spec list_members_for_group(Actor.t(), list(atom()), integer | nil, integer | nil) ::
|
||||
@spec list_members_for_group(
|
||||
Actor.t(),
|
||||
String.t() | nil,
|
||||
list(atom()),
|
||||
integer | nil,
|
||||
integer | nil
|
||||
) ::
|
||||
Page.t(Member.t())
|
||||
def list_members_for_group(
|
||||
%Actor{id: group_id, type: :Group},
|
||||
|
@ -914,7 +920,7 @@ defmodule Mobilizon.Actors do
|
|||
end
|
||||
|
||||
@doc """
|
||||
Returns the number of followers for a group
|
||||
Returns the number of members for a group
|
||||
"""
|
||||
@spec count_members_for_group(Actor.t()) :: integer()
|
||||
def count_members_for_group(%Actor{id: actor_id}) do
|
||||
|
@ -1291,14 +1297,12 @@ defmodule Mobilizon.Actors do
|
|||
:ok
|
||||
end
|
||||
|
||||
@spec has_relay?(String.t()) :: boolean()
|
||||
def has_relay?(domain) do
|
||||
Actor
|
||||
|> where(
|
||||
[a],
|
||||
a.preferred_username == "relay" and a.domain == ^domain and a.type == :Application
|
||||
)
|
||||
|> Repo.exists?()
|
||||
@doc """
|
||||
Returns a relay actor, either `relay@domain` (Mobilizon) or `domain@domain` (Mastodon)
|
||||
"""
|
||||
@spec get_relay(String.t()) :: Actor.t() | nil
|
||||
def get_relay(domain) do
|
||||
get_actor_by_name("relay@#{domain}") || get_actor_by_name("#{domain}@#{domain}")
|
||||
end
|
||||
|
||||
@spec delete_files_if_media_changed(Ecto.Changeset.t()) :: Ecto.Changeset.t()
|
||||
|
|
|
@ -91,7 +91,7 @@ defmodule Mobilizon.Addresses.Address do
|
|||
|
||||
def representation(%__MODULE__{} = address) do
|
||||
String.trim(
|
||||
"#{address.street} #{address.postal_code} #{address.locality} #{address.region} #{address.country}"
|
||||
"#{address.description} #{address.street} #{address.postal_code} #{address.locality} #{address.region} #{address.country}"
|
||||
)
|
||||
end
|
||||
|
||||
|
|
|
@ -322,8 +322,6 @@ defmodule Mobilizon.Config do
|
|||
|
||||
@spec anonymous_actor_id :: integer
|
||||
def anonymous_actor_id, do: get_cached_value(:anonymous_actor_id)
|
||||
@spec relay_actor_id :: integer
|
||||
def relay_actor_id, do: get_cached_value(:relay_actor_id)
|
||||
@spec admin_settings :: map
|
||||
def admin_settings, do: get_cached_value(:admin_config)
|
||||
|
||||
|
@ -401,16 +399,6 @@ defmodule Mobilizon.Config do
|
|||
end
|
||||
end
|
||||
|
||||
defp create_cache(:relay_actor_id) do
|
||||
case Actors.get_or_create_internal_actor("relay") do
|
||||
{:ok, %{id: actor_id}} ->
|
||||
{:ok, actor_id}
|
||||
|
||||
{:error, err} ->
|
||||
{:error, err}
|
||||
end
|
||||
end
|
||||
|
||||
defp create_cache(:admin_config) do
|
||||
data = %{
|
||||
instance_description: instance_description(),
|
||||
|
|
|
@ -28,6 +28,7 @@ defmodule Mobilizon.Events do
|
|||
Track
|
||||
}
|
||||
|
||||
alias Mobilizon.Federation.ActivityPub.Relay
|
||||
alias Mobilizon.Service.Export.Cachable
|
||||
alias Mobilizon.Service.Workers.BuildSearch
|
||||
alias Mobilizon.Service.Workers.EventDelayedNotificationWorker
|
||||
|
@ -1287,7 +1288,12 @@ defmodule Mobilizon.Events do
|
|||
if is_nil(begins_on) do
|
||||
query
|
||||
else
|
||||
where(query, [q], q.begins_on >= ^begins_on)
|
||||
where(
|
||||
query,
|
||||
[q],
|
||||
(not is_nil(q.ends_on) and q.ends_on > ^begins_on) or
|
||||
(is_nil(q.ends_on) and q.begins_on >= ^begins_on)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -1671,7 +1677,7 @@ defmodule Mobilizon.Events do
|
|||
@spec filter_local_or_from_followed_instances_events(Ecto.Queryable.t()) ::
|
||||
Ecto.Query.t()
|
||||
defp filter_local_or_from_followed_instances_events(query) do
|
||||
follower_actor_id = Mobilizon.Config.relay_actor_id()
|
||||
%Actor{id: follower_actor_id} = Relay.get_actor()
|
||||
|
||||
query
|
||||
|> join(:left, [q], s in Share, on: s.uri == q.url)
|
||||
|
|
|
@ -7,6 +7,7 @@ defmodule Mobilizon.Instances.Instance do
|
|||
use Ecto.Schema
|
||||
|
||||
@type t :: %__MODULE__{
|
||||
domain: String.t(),
|
||||
event_count: non_neg_integer(),
|
||||
person_count: non_neg_integer(),
|
||||
group_count: non_neg_integer(),
|
||||
|
|
|
@ -29,7 +29,7 @@ defmodule Mobilizon.Service.Activity.Renderer do
|
|||
|
||||
@type common_render :: %{body: String.t(), url: String.t()}
|
||||
|
||||
@callback render(entity :: Activity.t(), Keyword.t()) :: common_render()
|
||||
@callback render(activity :: Activity.t(), Keyword.t()) :: common_render()
|
||||
|
||||
@spec render(Activity.t()) :: render()
|
||||
def render(%Activity{} = activity, options \\ []) do
|
||||
|
|
|
@ -64,7 +64,7 @@ defmodule Mobilizon.Service.ActorSuspension do
|
|||
|
||||
Logger.debug("Going to run the transaction")
|
||||
|
||||
case Repo.transaction(multi) do
|
||||
case Repo.transaction(multi, timeout: 60_000) do
|
||||
{:ok, %{actor: %Actor{} = actor}} ->
|
||||
{:ok, true} = Cachex.del(:activity_pub, "actor_#{actor.preferred_username}")
|
||||
Cachable.clear_all_caches(actor)
|
||||
|
|
|
@ -205,9 +205,12 @@ defmodule Mobilizon.Service.DateTime do
|
|||
is_first_day_of_week(compare_to_day, locale) && is_between_hours?(options)
|
||||
end
|
||||
|
||||
@spec is_delay_ok_since_last_notification_sent?(DateTime.t()) :: boolean()
|
||||
def is_delay_ok_since_last_notification_sent?(%DateTime{} = last_notification_sent) do
|
||||
DateTime.compare(DateTime.add(last_notification_sent, 3_600), DateTime.utc_now()) ==
|
||||
@spec is_delay_ok_since_last_notification_sent?(DateTime.t(), pos_integer()) :: boolean()
|
||||
def is_delay_ok_since_last_notification_sent?(
|
||||
%DateTime{} = last_notification_sent,
|
||||
delay \\ 3_600
|
||||
) do
|
||||
DateTime.compare(DateTime.add(last_notification_sent, delay), DateTime.utc_now()) ==
|
||||
:lt
|
||||
end
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@ defmodule Mobilizon.Service.Geospatial.GoogleMaps do
|
|||
end
|
||||
end
|
||||
|
||||
@spec build_url(:search | :geocode, map(), list()) :: String.t() | no_return
|
||||
@spec build_url(:search | :geocode | :place_details, map(), list()) :: String.t() | no_return
|
||||
defp build_url(method, args, options) do
|
||||
limit = Keyword.get(options, :limit, 10)
|
||||
lang = Keyword.get(options, :lang, "en")
|
||||
|
|
|
@ -289,7 +289,7 @@ defmodule Mobilizon.Service.Notifications.Scheduler do
|
|||
{:ok, nil}
|
||||
|
||||
# Sending to calculated time
|
||||
true ->
|
||||
match?(%DateTime{}, send_at) ->
|
||||
Notification.enqueue(:pending_membership_notification, params, scheduled_at: send_at)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -12,7 +12,8 @@ defmodule Mobilizon.Service.Notifier.Email do
|
|||
|
||||
import Mobilizon.Service.DateTime,
|
||||
only: [
|
||||
is_delay_ok_since_last_notification_sent?: 1
|
||||
is_delay_ok_since_last_notification_sent?: 1,
|
||||
is_delay_ok_since_last_notification_sent?: 2
|
||||
]
|
||||
|
||||
require Logger
|
||||
|
@ -35,9 +36,10 @@ defmodule Mobilizon.Service.Notifier.Email do
|
|||
def send(%User{email: email, locale: locale} = user, activities, options)
|
||||
when is_list(activities) do
|
||||
activities = Enum.filter(activities, &can_send_activity?(&1, user, options))
|
||||
nb_activities = length(activities)
|
||||
|
||||
if length(activities) > 0 do
|
||||
Logger.debug("Found some activities to send by email")
|
||||
if nb_activities > 0 do
|
||||
Logger.info("Sending email containing #{nb_activities} activities to #{email}")
|
||||
|
||||
email
|
||||
|> EmailActivity.direct_activity(activities, Keyword.put(options, :locale, locale))
|
||||
|
@ -119,6 +121,27 @@ defmodule Mobilizon.Service.Notifier.Email do
|
|||
is_delay_ok_since_last_notification_sent?(last_notification_sent)
|
||||
end
|
||||
|
||||
# Delay ok since last notification
|
||||
defp match_group_notifications_setting(
|
||||
:one_day,
|
||||
_,
|
||||
%DateTime{} = last_notification_sent,
|
||||
options
|
||||
) do
|
||||
is_delay_ok_since_last_notification_sent?(last_notification_sent, 3_600 * 23) and
|
||||
Keyword.get(options, :recap, false) != false
|
||||
end
|
||||
|
||||
defp match_group_notifications_setting(
|
||||
:one_week,
|
||||
_,
|
||||
%DateTime{} = last_notification_sent,
|
||||
options
|
||||
) do
|
||||
is_delay_ok_since_last_notification_sent?(last_notification_sent, 3_600 * 24 * 6) and
|
||||
Keyword.get(options, :recap, false) != false
|
||||
end
|
||||
|
||||
# This is a recap
|
||||
defp match_group_notifications_setting(
|
||||
_group_notifications,
|
||||
|
@ -154,7 +177,8 @@ defmodule Mobilizon.Service.Notifier.Email do
|
|||
end
|
||||
|
||||
@spec save_last_notification_time(User.t()) :: {:ok, Setting.t()} | {:error, Ecto.Changeset.t()}
|
||||
defp save_last_notification_time(%User{id: user_id}) do
|
||||
defp save_last_notification_time(%User{id: user_id, email: email}) do
|
||||
Logger.info("Saving last notification time for user #{email}")
|
||||
attrs = %{user_id: user_id, last_notification_sent: DateTime.utc_now()}
|
||||
|
||||
case Users.get_setting(user_id) do
|
||||
|
|
|
@ -25,7 +25,14 @@ defmodule Mobilizon.Service.Notifier.Push do
|
|||
options = Keyword.put_new(options, :locale, locale)
|
||||
|
||||
%Page{elements: subscriptions} = Users.list_user_push_subscriptions(user_id, 1, 100)
|
||||
Enum.each(subscriptions, &send_subscription(activity, convert_subscription(&1), options))
|
||||
|
||||
subscriptions
|
||||
|> Enum.map(&convert_subscription/1)
|
||||
|> Enum.map(fn subscription ->
|
||||
Task.async(fn -> send_subscription(activity, subscription, options) end)
|
||||
end)
|
||||
|> Task.await_many(10_000)
|
||||
|
||||
{:ok, :sent}
|
||||
else
|
||||
{:ok, :skipped}
|
||||
|
@ -66,7 +73,7 @@ defmodule Mobilizon.Service.Notifier.Push do
|
|||
Map.get(@default_behavior, activity_setting, false)
|
||||
end
|
||||
|
||||
@spec send_subscription(Activity.t(), any, Keyword.t()) :: no_return
|
||||
@spec send_subscription(Activity.t(), any, Keyword.t()) :: any()
|
||||
defp send_subscription(activity, subscription, options) do
|
||||
activity
|
||||
|> payload(options)
|
||||
|
|
|
@ -29,35 +29,38 @@ defmodule Mobilizon.Service.SiteMap do
|
|||
gzip: false
|
||||
]
|
||||
|
||||
Repo.transaction(fn ->
|
||||
Events.stream_events_for_sitemap()
|
||||
|> Stream.concat(Actors.list_groups_for_stream())
|
||||
|> Stream.concat(Posts.list_posts_for_stream())
|
||||
|> Stream.concat(
|
||||
Enum.map(static_routes, fn route ->
|
||||
{url, frequency} =
|
||||
case route do
|
||||
{url, frequency} -> {url, frequency}
|
||||
url when is_binary(url) -> {url, @default_static_frequency}
|
||||
end
|
||||
Repo.transaction(
|
||||
fn ->
|
||||
Events.stream_events_for_sitemap()
|
||||
|> Stream.concat(Actors.list_groups_for_stream())
|
||||
|> Stream.concat(Posts.list_posts_for_stream())
|
||||
|> Stream.concat(
|
||||
Enum.map(static_routes, fn route ->
|
||||
{url, frequency} =
|
||||
case route do
|
||||
{url, frequency} -> {url, frequency}
|
||||
url when is_binary(url) -> {url, @default_static_frequency}
|
||||
end
|
||||
|
||||
%{url: url, updated_at: nil, frequence: frequency}
|
||||
%{url: url, updated_at: nil, frequence: frequency}
|
||||
end)
|
||||
)
|
||||
|> Stream.map(fn %{url: url, updated_at: updated_at} = args ->
|
||||
frequence = Map.get(args, :frequence, :weekly)
|
||||
|
||||
%Sitemapper.URL{
|
||||
loc: url,
|
||||
changefreq: frequence,
|
||||
lastmod: check_date_time(updated_at)
|
||||
}
|
||||
end)
|
||||
)
|
||||
|> Stream.map(fn %{url: url, updated_at: updated_at} = args ->
|
||||
frequence = Map.get(args, :frequence, :weekly)
|
||||
|
||||
%Sitemapper.URL{
|
||||
loc: url,
|
||||
changefreq: frequence,
|
||||
lastmod: check_date_time(updated_at)
|
||||
}
|
||||
end)
|
||||
|> Sitemapper.generate(config)
|
||||
|> Sitemapper.persist(config)
|
||||
|> Sitemapper.ping(config)
|
||||
|> Stream.run()
|
||||
end)
|
||||
|> Sitemapper.generate(config)
|
||||
|> Sitemapper.persist(config)
|
||||
|> Sitemapper.ping(config)
|
||||
|> Stream.run()
|
||||
end,
|
||||
timeout: :infinity
|
||||
)
|
||||
end
|
||||
|
||||
# Sometimes we use naive datetimes
|
||||
|
|
|
@ -41,7 +41,7 @@ defmodule Mobilizon.Service.Workers.Helper do
|
|||
|
||||
alias Oban.Job
|
||||
|
||||
@spec enqueue(String.t() | :atom, map(), Keyword.t()) ::
|
||||
@spec enqueue(String.t() | atom(), map(), Keyword.t()) ::
|
||||
{:ok, Job.t()} | {:error, Ecto.Changeset.t()}
|
||||
def enqueue(operation, params, worker_args \\ []) do
|
||||
params = Map.merge(%{"op" => operation}, params)
|
||||
|
|
|
@ -5,7 +5,9 @@ defmodule Mobilizon.Service.Workers.RefreshInstances do
|
|||
|
||||
use Oban.Worker, unique: [period: :infinity, keys: [:event_uuid, :action]]
|
||||
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor
|
||||
alias Mobilizon.Federation.ActivityPub.Relay
|
||||
alias Mobilizon.Instances
|
||||
alias Mobilizon.Instances.Instance
|
||||
alias Oban.Job
|
||||
|
@ -22,13 +24,20 @@ defmodule Mobilizon.Service.Workers.RefreshInstances do
|
|||
@spec refresh_instance_actor(Instance.t()) ::
|
||||
{:ok, Mobilizon.Actors.Actor.t()}
|
||||
| {:error,
|
||||
Mobilizon.Federation.ActivityPub.Actor.make_actor_errors()
|
||||
ActivityPubActor.make_actor_errors()
|
||||
| Mobilizon.Federation.WebFinger.finger_errors()}
|
||||
defp refresh_instance_actor(%Instance{domain: nil}) do
|
||||
def refresh_instance_actor(%Instance{domain: nil}) do
|
||||
{:error, :not_remote_instance}
|
||||
end
|
||||
|
||||
defp refresh_instance_actor(%Instance{domain: domain}) do
|
||||
ActivityPubActor.find_or_make_actor_from_nickname("relay@#{domain}")
|
||||
def refresh_instance_actor(%Instance{domain: domain}) do
|
||||
%Actor{url: url} = Relay.get_actor()
|
||||
%URI{host: host} = URI.new!(url)
|
||||
|
||||
if host == domain do
|
||||
{:error, :not_remote_instance}
|
||||
else
|
||||
ActivityPubActor.find_or_make_actor_from_nickname("relay@#{domain}")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -10,6 +10,7 @@ defmodule Mobilizon.Service.Workers.SendActivityRecapWorker do
|
|||
alias Mobilizon.Service.Notifier.Email
|
||||
alias Mobilizon.Storage.Repo
|
||||
alias Mobilizon.Users.{Setting, User}
|
||||
require Logger
|
||||
|
||||
import Mobilizon.Service.DateTime,
|
||||
only: [
|
||||
|
@ -20,27 +21,43 @@ defmodule Mobilizon.Service.Workers.SendActivityRecapWorker do
|
|||
|
||||
@impl Oban.Worker
|
||||
def perform(%Job{}) do
|
||||
Repo.transaction(fn ->
|
||||
Users.stream_users_for_recap()
|
||||
|> Enum.to_list()
|
||||
|> Repo.preload([:settings, :activity_settings])
|
||||
|> Enum.filter(&filter_elegible_users/1)
|
||||
|> Enum.map(fn %User{} = user ->
|
||||
%{
|
||||
activities: activities_for_user(user),
|
||||
user: user
|
||||
}
|
||||
end)
|
||||
|> Enum.filter(fn %{activities: activities, user: _user} -> length(activities) > 0 end)
|
||||
|> Enum.map(fn %{
|
||||
activities: activities,
|
||||
user:
|
||||
%User{settings: %Setting{group_notifications: group_notifications}} =
|
||||
user
|
||||
} ->
|
||||
Email.send(user, activities, recap: group_notifications)
|
||||
end)
|
||||
Logger.info("Sending scheduled activity recap")
|
||||
|
||||
case Repo.transaction(&produce_notifications/0, timeout: :infinity) do
|
||||
{:ok, res} ->
|
||||
Logger.info("Processed #{length(res)} notifications to send")
|
||||
|
||||
Enum.each(res, fn %{
|
||||
activities: activities,
|
||||
user:
|
||||
%User{settings: %Setting{group_notifications: group_notifications}} =
|
||||
user
|
||||
} ->
|
||||
Logger.info(
|
||||
"Asking to send email notification #{group_notifications} to user #{user.email} for #{length(activities)} activities"
|
||||
)
|
||||
|
||||
Email.send(user, activities, recap: group_notifications)
|
||||
end)
|
||||
|
||||
{:error, err} ->
|
||||
Logger.error("Error producing notifications #{inspect(err)}")
|
||||
{:error, err}
|
||||
end
|
||||
end
|
||||
|
||||
defp produce_notifications do
|
||||
Users.stream_users_for_recap()
|
||||
|> Enum.to_list()
|
||||
|> Repo.preload([:settings, :activity_settings])
|
||||
|> Enum.filter(&filter_elegible_users/1)
|
||||
|> Enum.map(fn %User{} = user ->
|
||||
%{
|
||||
activities: activities_for_user(user),
|
||||
user: user
|
||||
}
|
||||
end)
|
||||
|> Enum.filter(fn %{activities: activities, user: _user} -> length(activities) > 0 end)
|
||||
end
|
||||
|
||||
defp activities_for_user(
|
||||
|
@ -77,6 +94,7 @@ defmodule Mobilizon.Service.Workers.SendActivityRecapWorker do
|
|||
defp filter_elegible_users(%User{
|
||||
settings: %Setting{last_notification_sent: nil, group_notifications: :one_hour}
|
||||
}) do
|
||||
Logger.debug("Sending because never sent before, and we must do it at most once an hour")
|
||||
true
|
||||
end
|
||||
|
||||
|
@ -86,6 +104,10 @@ defmodule Mobilizon.Service.Workers.SendActivityRecapWorker do
|
|||
group_notifications: :one_hour
|
||||
}
|
||||
}) do
|
||||
Logger.debug(
|
||||
"Testing if it's less than an hour since the last time we sent an activity recap"
|
||||
)
|
||||
|
||||
is_delay_ok_since_last_notification_sent?(last_notification_sent)
|
||||
end
|
||||
|
||||
|
@ -96,6 +118,7 @@ defmodule Mobilizon.Service.Workers.SendActivityRecapWorker do
|
|||
timezone: timezone
|
||||
}
|
||||
}) do
|
||||
Logger.debug("Testing if we're between daily sending hours")
|
||||
is_between_hours?(timezone: timezone || "Etc/UTC")
|
||||
end
|
||||
|
||||
|
@ -107,6 +130,7 @@ defmodule Mobilizon.Service.Workers.SendActivityRecapWorker do
|
|||
timezone: timezone
|
||||
}
|
||||
}) do
|
||||
Logger.debug("Testing if we're between weekly sending day and hours")
|
||||
is_between_hours_on_first_day?(timezone: timezone || "Etc/UTC", locale: locale)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -4,9 +4,18 @@ defmodule Mobilizon.Web.AuthController do
|
|||
alias Mobilizon.Service.Auth.Authenticator
|
||||
alias Mobilizon.Users
|
||||
alias Mobilizon.Users.User
|
||||
import Mobilizon.Service.Guards, only: [is_valid_string: 1]
|
||||
require Logger
|
||||
plug(:put_layout, false)
|
||||
|
||||
config = Application.get_env(:mobilizon, Mobilizon.Web.Endpoint, [])
|
||||
|
||||
plug(Plug.Session,
|
||||
store: :cookie,
|
||||
key: "_auth_callback",
|
||||
signing_salt: Keyword.get(config, :secret_key_base)
|
||||
)
|
||||
|
||||
plug(Ueberauth)
|
||||
|
||||
@spec request(Plug.Conn.t(), map()) :: Plug.Conn.t()
|
||||
|
@ -98,7 +107,11 @@ defmodule Mobilizon.Web.AuthController do
|
|||
defp email_from_ueberauth(%Ueberauth.Auth{
|
||||
extra: %Ueberauth.Auth.Extra{raw_info: %{user: %{"email" => email}}}
|
||||
})
|
||||
when not is_nil(email) and email != "",
|
||||
when is_valid_string(email),
|
||||
do: email
|
||||
|
||||
defp email_from_ueberauth(%Ueberauth.Auth{info: %Ueberauth.Auth.Info{email: email}})
|
||||
when is_valid_string(email),
|
||||
do: email
|
||||
|
||||
defp email_from_ueberauth(_), do: nil
|
||||
|
|
|
@ -113,9 +113,9 @@ defmodule Mobilizon.Web.Email.Admin do
|
|||
|
||||
@spec user_confirmation(User.t()) :: Swoosh.Email.t()
|
||||
def user_confirmation(%User{
|
||||
locale: user_locale,
|
||||
email: email
|
||||
}) do
|
||||
locale: user_locale,
|
||||
email: email
|
||||
}) do
|
||||
Gettext.put_locale(user_locale)
|
||||
|
||||
subject =
|
||||
|
|
|
@ -82,15 +82,18 @@ defmodule Mobilizon.Web.Email.Event do
|
|||
|> MapSet.new()
|
||||
|
||||
if MapSet.size(diff) > 0 do
|
||||
Repo.transaction(fn ->
|
||||
event_id
|
||||
|> Events.list_local_emails_user_participants_for_event_query()
|
||||
|> Repo.stream()
|
||||
|> Enum.to_list()
|
||||
|> Enum.each(
|
||||
&send_notification_for_event_update_to_participant(&1, old_event, event, diff)
|
||||
)
|
||||
end)
|
||||
Repo.transaction(
|
||||
fn ->
|
||||
event_id
|
||||
|> Events.list_local_emails_user_participants_for_event_query()
|
||||
|> Repo.stream()
|
||||
|> Enum.to_list()
|
||||
|> Enum.each(
|
||||
&send_notification_for_event_update_to_participant(&1, old_event, event, diff)
|
||||
)
|
||||
end,
|
||||
timeout: 120_000
|
||||
)
|
||||
else
|
||||
{:ok, :ok}
|
||||
end
|
||||
|
|
|
@ -13,12 +13,12 @@ defmodule Mobilizon.Web.Email.Follow do
|
|||
alias Mobilizon.Web.Email
|
||||
|
||||
@doc """
|
||||
Send follow notification to admins if the followed actor
|
||||
Send follow notification to admins if the followed actor is the relay and the actor follower is an instance
|
||||
"""
|
||||
@spec send_notification_to_admins(Follower.t()) :: :ok
|
||||
def send_notification_to_admins(
|
||||
%Follower{
|
||||
# approved: false,
|
||||
approved: false,
|
||||
actor: %Actor{type: :Application} = follower,
|
||||
target_actor: %Actor{id: target_actor_id}
|
||||
} = _follow
|
||||
|
@ -44,11 +44,19 @@ defmodule Mobilizon.Web.Email.Follow do
|
|||
|
||||
subject =
|
||||
if follower_type == :Application do
|
||||
gettext(
|
||||
"Instance %{name} (%{domain}) requests to follow your instance",
|
||||
name: follower.name,
|
||||
domain: follower.domain
|
||||
)
|
||||
# Mastodon instance actor has no name and an username equal to the domain
|
||||
if is_nil(follower.name) and follower.preferred_username == follower.domain do
|
||||
gettext(
|
||||
"Instance %{domain} requests to follow your instance",
|
||||
domain: follower.domain
|
||||
)
|
||||
else
|
||||
gettext(
|
||||
"Instance %{name} (%{domain}) requests to follow your instance",
|
||||
name: follower.name || follower.preferred_username,
|
||||
domain: follower.domain
|
||||
)
|
||||
end
|
||||
else
|
||||
gettext(
|
||||
"%{name} requests to follow your instance",
|
||||
|
|
|
@ -17,25 +17,27 @@ defmodule Mobilizon.Web.Email.Group do
|
|||
# TODO: When we have events restricted to members, don't send emails to followers
|
||||
group
|
||||
|> Actors.list_actors_to_notify_from_group_event()
|
||||
|> Enum.reduce([], fn actor, users ->
|
||||
# No emails for remote actors
|
||||
if is_nil(actor.user_id) do
|
||||
users
|
||||
else
|
||||
users ++ [Users.get_user_with_activity_settings!(actor.user_id)]
|
||||
end
|
||||
end)
|
||||
|> Enum.each(¬ify_follower(event, group, &1))
|
||||
end
|
||||
|
||||
def notify_of_new_event(%Event{}), do: :ok
|
||||
|
||||
defp notify_follower(%Event{} = _event, %Actor{}, %Actor{user_id: nil}), do: :ok
|
||||
|
||||
defp notify_follower(%Event{} = event, %Actor{type: :Group} = group, %Actor{
|
||||
id: profile_id,
|
||||
user_id: user_id
|
||||
defp notify_follower(%Event{} = event, %Actor{type: :Group} = group, %User{
|
||||
email: email,
|
||||
locale: locale,
|
||||
settings: %Setting{timezone: timezone},
|
||||
activity_settings: activity_settings,
|
||||
default_actor_id: default_actor_id
|
||||
}) do
|
||||
%User{
|
||||
email: email,
|
||||
locale: locale,
|
||||
settings: %Setting{timezone: timezone},
|
||||
activity_settings: activity_settings
|
||||
} = Users.get_user_with_activity_settings!(user_id)
|
||||
|
||||
if profile_id != event.organizer_actor_id &&
|
||||
if default_actor_id != event.organizer_actor_id &&
|
||||
accepts_new_events_notifications(activity_settings) do
|
||||
Gettext.put_locale(locale)
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ defmodule Mobilizon.Web.Email.Mailer do
|
|||
use Swoosh.Mailer, otp_app: :mobilizon
|
||||
alias Mobilizon.Service.ErrorReporting.Sentry
|
||||
|
||||
@spec send_email(Swoosh.Email.t()) :: Swoosh.Email.t()
|
||||
@spec send_email(Swoosh.Email.t()) :: {:ok, term} | {:error, term}
|
||||
def send_email(email) do
|
||||
Mobilizon.Web.Email.Mailer.deliver(email)
|
||||
rescue
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
"Your membership request for group %{link_start}<b>%{group}</b>%{link_end} has been approved.",
|
||||
group: Mobilizon.Actors.Actor.display_name(@group),
|
||||
link_start:
|
||||
"<a href=\"#{Routes.page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(@group))}\">",
|
||||
"<a href=\"#{Routes.page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(@group)) |> URI.decode()}\">",
|
||||
link_end: "</a>"
|
||||
)
|
||||
|> raw %>
|
||||
|
@ -66,7 +66,7 @@
|
|||
<td align="center" style="border-radius: 3px;" bgcolor="#3C376E">
|
||||
<a
|
||||
href={
|
||||
"#{Routes.page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(@group))}"
|
||||
"#{Routes.page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(@group)) |> URI.decode()}"
|
||||
}
|
||||
target="_blank"
|
||||
style="font-size: 20px; font-family: Helvetica, Arial, sans-serif; color: #ffffff; text-decoration: none; padding: 15px 25px; border-radius: 2px; border: 1px solid #3C376E; display: inline-block;"
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
==
|
||||
<%= gettext "Your membership request for group %{group} has been approved.", group: Mobilizon.Actors.Actor.display_name(@group) %>
|
||||
|
||||
<%= Routes.page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(@group)) %>
|
||||
<%= Routes.page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(@group)) |> URI.decode() %>
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
"Your membership request for group %{link_start}<b>%{group}</b>%{link_end} has been rejected.",
|
||||
group: Mobilizon.Actors.Actor.display_name(@group),
|
||||
link_start:
|
||||
"<a href=\"#{Routes.page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(@group))}\">",
|
||||
"<a href=\"#{Routes.page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(@group)) |> URI.decode()}\">",
|
||||
link_end: "</a>"
|
||||
)
|
||||
|> raw %>
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
==
|
||||
<%= gettext "Your membership request for group %{group} has been rejected.", group: Mobilizon.Actors.Actor.display_name(@group) %>
|
||||
|
||||
<%= Routes.page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(@group)) %>
|
||||
<%= Routes.page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(@group)) |> URI.decode() %>
|
||||
|
|
|
@ -44,18 +44,10 @@
|
|||
style="padding: 20px 30px 0px 30px; color: #474467; font-family: 'Roboto', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;"
|
||||
>
|
||||
<p style="margin: 0;">
|
||||
<%= if @follower.type == :Application do %>
|
||||
<%= gettext("<b>%{name} (%{domain})</b> just requested to follow your instance.",
|
||||
name: @follower.name,
|
||||
domain: @follower.domain
|
||||
)
|
||||
|> raw %>
|
||||
<% else %>
|
||||
<%= gettext("<b>%{name}</b> just requested to follow your instance.",
|
||||
name: Mobilizon.Actors.Actor.display_name_and_username(@follower)
|
||||
)
|
||||
|> raw %>
|
||||
<% end %>
|
||||
<%= gettext("<b>%{name}</b> just requested to follow your instance.",
|
||||
name: Mobilizon.Actors.Actor.display_name_and_username(@follower)
|
||||
)
|
||||
|> raw %>
|
||||
<br />
|
||||
<%= if @follower.type == :Application do %>
|
||||
<%= gettext("If you accept, this instance will receive all of your public events.") %>
|
||||
|
@ -74,9 +66,8 @@
|
|||
>
|
||||
<p style="margin: 0;">
|
||||
<%= gettext(
|
||||
"Note: %{name} (%{domain}) following you doesn't necessarily imply that you follow this instance, but you can ask to follow them too.",
|
||||
name: @follower.name,
|
||||
domain: @follower.domain
|
||||
"Note: %{name} following you doesn't necessarily imply that you follow this instance, but you can ask to follow them too.",
|
||||
name: Mobilizon.Actors.Actor.display_name_and_username(@follower)
|
||||
) %>
|
||||
</p>
|
||||
</td>
|
||||
|
|
|
@ -2,9 +2,9 @@
|
|||
|
||||
==
|
||||
|
||||
<%= if @follower.type == :Application do %><%= gettext "%{name} (%{domain}) just requested to follow your instance.", name: @follower.name, domain: @follower.domain %><% else %><%= gettext "%{name} just requested to follow your instance.", name: Mobilizon.Actors.Actor.display_name_and_username(@follower) %><% end %>
|
||||
<%= if @follower.type == :Application do %><%= gettext "%{name} just requested to follow your instance.", name: Mobilizon.Actors.Actor.display_name_and_username(@follower) %><% end %>
|
||||
<%= if @follower.type == :Application do %><%= gettext "If you accept, this instance will receive all of your public events." %><% else %><%= gettext "If you accept, this profile will receive all of your public events." %><% end %>
|
||||
<%= if @follower.type == :Application do %><%= gettext "Note: %{name} (%{domain}) following you doesn't necessarily imply that you follow this instance, but you can ask to follow them too.", name: @follower.name, domain: @follower.domain %><% end %>
|
||||
<%= if @follower.type == :Application do %><%= gettext "Note: %{name} following you doesn't necessarily imply that you follow this instance, but you can ask to follow them too.", name: Mobilizon.Actors.Actor.display_name_and_username(@follower) %><% end %>
|
||||
|
||||
<%= if @follower.type == :Application do %><%= gettext "To accept this invitation, head over to the instance's admin settings." %><% else %><%= gettext "To accept this invitation, head over to the profile's admin page." %><% end %>
|
||||
<%= if @follower.type == :Application do %><%= "#{Mobilizon.Web.Endpoint.url()}/settings/admin/relays/followers" %><% else %><%= "#{Mobilizon.Web.Endpoint.url()}/settings/admin/profiles/#{@follower.id}" %><% end %>
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
:actor,
|
||||
Mobilizon.Actors.Actor.preferred_username_and_domain(@event.attributed_to)
|
||||
)
|
||||
|> raw
|
||||
|> URI.decode()
|
||||
}
|
||||
style="color: rgb(254,56,89); font-family: Helvetica,Arial,sans-serif; font-weight: normal; text-align: left; line-height: 1.3; text-decoration: none; vertical-align: baseline; margin: 0; padding: 0; border: 0;"
|
||||
target="_blank"
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
<%= gettext("Title: %{title}", title: @event.title) %>
|
||||
|
||||
<%= if @event.attributed_to do %><%= gettext("Organizer: %{organizer}", organizer: @event.attributed_to.name || @event.attributed_to.preferred_username) %> <%= Routes.page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(@event.attributed_to)) %><% else %><%= gettext("Organizer: %{organizer}", organizer: @event.organizer_actor.name || @event.organizer_actor.preferred_username) %><% end %>
|
||||
<%= if @event.attributed_to do %><%= gettext("Organizer: %{organizer}", organizer: @event.attributed_to.name || @event.attributed_to.preferred_username) %> <%= Routes.page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(@event.attributed_to)) |> URI.decode() %><% else %><%= gettext("Organizer: %{organizer}", organizer: @event.organizer_actor.name || @event.organizer_actor.preferred_username) %><% end %>
|
|
@ -20,7 +20,7 @@ defmodule Mobilizon.Web.AuthView do
|
|||
Tag.tag(:meta, name: "auth-refresh-token", content: refresh_token),
|
||||
Tag.tag(:meta, name: "auth-user-id", content: user_id),
|
||||
Tag.tag(:meta, name: "auth-user-email", content: user_email),
|
||||
Tag.tag(:meta, name: "auth-user-role", content: user_role),
|
||||
Tag.tag(:meta, name: "auth-user-role", content: String.upcase(to_string(user_role))),
|
||||
Tag.tag(:meta, name: "auth-user-actor-id", content: user_actor_id)
|
||||
]
|
||||
|
||||
|
|
14
mix.exs
|
@ -1,7 +1,7 @@
|
|||
defmodule Mobilizon.Mixfile do
|
||||
use Mix.Project
|
||||
|
||||
@version "2.1.0-rc.3"
|
||||
@version "2.1.0"
|
||||
|
||||
def project do
|
||||
[
|
||||
|
@ -167,8 +167,9 @@ defmodule Mobilizon.Mixfile do
|
|||
{:mogrify, "~> 0.9"},
|
||||
{:linkify, "~> 0.3"},
|
||||
{:http_signatures, "~> 0.1.0"},
|
||||
{:ex_cldr, "~> 2.28.0"},
|
||||
{:ex_cldr, "~> 2.29.0"},
|
||||
{:ex_cldr_dates_times, "~> 2.2"},
|
||||
{:ex_cldr_plugs, "~> 1.0"},
|
||||
{:ex_optimizer, "~> 0.1"},
|
||||
{:progress_bar, "~> 2.0"},
|
||||
{:oban, "~> 2.2"},
|
||||
|
@ -180,10 +181,9 @@ defmodule Mobilizon.Mixfile do
|
|||
{:ueberauth_github, "~> 0.8.1"},
|
||||
{:ueberauth_facebook, "~> 0.9"},
|
||||
{:ueberauth_google, "~> 0.10.1"},
|
||||
{:ueberauth_keycloak_strategy,
|
||||
git: "https://github.com/tcitworld/ueberauth_keycloak.git", branch: "upgrade-deps"},
|
||||
{:ueberauth_gitlab_strategy,
|
||||
git: "https://github.com/tcitworld/ueberauth_gitlab.git", branch: "upgrade-deps"},
|
||||
{:ueberauth_keycloak_strategy, "~> 0.3.0"},
|
||||
{:ueberauth_gitlab_strategy, "~> 0.4.0"},
|
||||
{:ueberauth_cas, "~> 2.0"},
|
||||
{:ecto_shortuuid, "~> 0.1"},
|
||||
{:tesla, "~> 1.4.0"},
|
||||
{:sitemapper, "~> 0.6"},
|
||||
|
@ -194,7 +194,7 @@ defmodule Mobilizon.Mixfile do
|
|||
{:sentry, "~> 8.0"},
|
||||
{:html_entities, "~> 0.5"},
|
||||
{:sweet_xml, "~> 0.7"},
|
||||
{:web_push_encryption, "~> 0.3"},
|
||||
{:web_push_encryption, github: "danhper/elixir-web-push-encryption"},
|
||||
{:eblurhash, "~> 1.2.0"},
|
||||
{:struct_access, "~> 1.1.2"},
|
||||
{:paasaa, "~> 0.5.0"},
|
||||
|
|
38
mix.lock
|
@ -7,7 +7,7 @@
|
|||
"bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm", "7af5c7e09fe1d40f76c8e4f9dd2be7cebd83909f31fee7cd0e9eadc567da8353"},
|
||||
"cachex": {:hex, :cachex, "3.4.0", "868b2959ea4aeb328c6b60ff66c8d5123c083466ad3c33d3d8b5f142e13101fb", [:mix], [{:eternal, "~> 1.2", [hex: :eternal, repo: "hexpm", optional: false]}, {:jumper, "~> 1.0", [hex: :jumper, repo: "hexpm", optional: false]}, {:sleeplocks, "~> 1.1", [hex: :sleeplocks, repo: "hexpm", optional: false]}, {:unsafe, "~> 1.0", [hex: :unsafe, repo: "hexpm", optional: false]}], "hexpm", "370123b1ab4fba4d2965fb18f87fd758325709787c8c5fce35b3fe80645ccbe5"},
|
||||
"certifi": {:hex, :certifi, "2.9.0", "6f2a475689dd47f19fb74334859d460a2dc4e3252a3324bd2111b8f0429e7e21", [:rebar3], [], "hexpm", "266da46bdb06d6c6d35fde799bcb28d36d985d424ad7c08b5bb48f5b5cdd4641"},
|
||||
"cldr_utils": {:hex, :cldr_utils, "2.17.1", "d5532ccfbe4b39cb652ba4566571324278344a6a2fb4500dac213ce8e123732f", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:decimal, "~> 1.9 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "052e0c2cf5ee801018580d69939b25528730d73ea05a05cb2c0e0a8204856d76"},
|
||||
"cldr_utils": {:hex, :cldr_utils, "2.17.2", "4dcb582caa2108d4461a86fb761b9b072ab84a6b191173dae6bff1c67d10115e", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:decimal, "~> 1.9 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "9c5667e647c2ec20f9beba530f7e72557a0dc29f92947738a8ced2d0cdf04c1c"},
|
||||
"codepagex": {:hex, :codepagex, "0.1.6", "49110d09a25ee336a983281a48ef883da4c6190481e0b063afe2db481af6117e", [:mix], [], "hexpm", "1521461097dde281edf084062f525a4edc6a5e49f4fd1f5ec41c9c4955d5bd59"},
|
||||
"combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"},
|
||||
"comeonin": {:hex, :comeonin, "5.3.3", "2c564dac95a35650e9b6acfe6d2952083d8a08e4a89b93a481acb552b325892e", [:mix], [], "hexpm", "3e38c9c2cb080828116597ca8807bb482618a315bfafd98c90bc22a821cc84df"},
|
||||
|
@ -21,31 +21,33 @@
|
|||
"db_connection": {:hex, :db_connection, "2.4.2", "f92e79aff2375299a16bcb069a14ee8615c3414863a6fef93156aee8e86c2ff3", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4fe53ca91b99f55ea249693a0229356a08f4d1a7931d8ffa79289b145fe83668"},
|
||||
"decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"},
|
||||
"dialyxir": {:hex, :dialyxir, "1.1.0", "c5aab0d6e71e5522e77beff7ba9e08f8e02bad90dfbeffae60eaf0cb47e29488", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "07ea8e49c45f15264ebe6d5b93799d4dd56a44036cf42d0ad9c960bc266c0b9a"},
|
||||
"digital_token": {:hex, :digital_token, "0.3.0", "b35d72129f6b559b98a8ace10adb7d87546bab3daed6dabc742cd5581cf7b5e0", [:mix], [{:cldr_utils, "~> 2.17", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "e5995d16bc90aa392cddc875a50fdce17eb91bd7314b4860b6a79768fd676834"},
|
||||
"doctor": {:hex, :doctor, "0.18.0", "114934c1740239953208a39db617699b7e2660770e81129d7f95cdf7837ab766", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "829c88c365f72c0666e443ea670ffb6f180de7b90c23d536edabdd8c722b88f4"},
|
||||
"earmark_parser": {:hex, :earmark_parser, "1.4.25", "2024618731c55ebfcc5439d756852ec4e85978a39d0d58593763924d9a15916f", [:mix], [], "hexpm", "56749c5e1c59447f7b7a23ddb235e4b3defe276afc220a6227237f3efe83f51e"},
|
||||
"eblurhash": {:hex, :eblurhash, "1.2.2", "7da4255aaea984b31bb71155f673257353b0e0554d0d30dcf859547e74602582", [:rebar3], [], "hexpm", "8c20ca00904de023a835a9dcb7b7762fed32264c85a80c3cafa85288e405044c"},
|
||||
"ecto": {:hex, :ecto, "3.7.2", "44c034f88e1980754983cc4400585970b4206841f6f3780967a65a9150ef09a8", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a600da5772d1c31abbf06f3e4a1ffb150e74ed3e2aa92ff3cee95901657a874e"},
|
||||
"ecto": {:hex, :ecto, "3.8.3", "5e681d35bc2cbb46dcca1e2675837c7d666316e5ada14eca6c9c609b6232817c", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "af92dd7815967bcaea0daaaccf31c3b23165432b1c7a475d84144efbc703d105"},
|
||||
"ecto_autoslug_field": {:hex, :ecto_autoslug_field, "3.0.0", "37fbc2f07e6691136afff246f2cf5b159ad395b665a55d06db918975fd2397db", [:mix], [{:ecto, ">= 3.7.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:slugger, ">= 0.3.0", [hex: :slugger, repo: "hexpm", optional: false]}], "hexpm", "8ec252c7cf85f13132062f56a484d6a0ef1f981f7be9ce4ad7e9546dd8c0cc0f"},
|
||||
"ecto_enum": {:hex, :ecto_enum, "1.4.0", "d14b00e04b974afc69c251632d1e49594d899067ee2b376277efd8233027aec8", [:mix], [{:ecto, ">= 3.0.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "> 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:mariaex, ">= 0.0.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "8fb55c087181c2b15eee406519dc22578fa60dd82c088be376d0010172764ee4"},
|
||||
"ecto_shortuuid": {:hex, :ecto_shortuuid, "0.1.3", "d36aede64edf256e4b769be2ad15a8ad5d9d1ff8ad46befe39e8cb4489abcd05", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:shortuuid, "~> 2.1.1", [hex: :shortuuid, repo: "hexpm", optional: false]}], "hexpm", "d215c8ced7125265de94d55abc696125942caef33439cf281fafded9744a4294"},
|
||||
"ecto_sql": {:hex, :ecto_sql, "3.7.2", "55c60aa3a06168912abf145c6df38b0295c34118c3624cf7a6977cd6ce043081", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.7.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.4.0 or ~> 0.5.0 or ~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3c218ea62f305dcaef0b915fb56583195e7b91c91dcfb006ba1f669bfacbff2a"},
|
||||
"ecto_sql": {:hex, :ecto_sql, "3.8.1", "1acaaba32ca0551fd19e492fc7c80414e72fc1a7140fc9395aaa53c2e8629798", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.8.1", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ba7fc75882edce6f2ceca047315d5db27ead773cafea47f1724e35f1e7964525"},
|
||||
"elixir_feed_parser": {:hex, :elixir_feed_parser, "2.1.0", "bb96fb6422158dc7ad59de62ef211cc69d264acbbe63941a64a5dce97bbbc2e6", [:mix], [{:timex, "~> 3.4", [hex: :timex, repo: "hexpm", optional: false]}], "hexpm", "2d3c62fe7b396ee3b73d7160bc8fadbd78bfe9597c98c7d79b3f1038d9cba28f"},
|
||||
"elixir_make": {:hex, :elixir_make, "0.6.3", "bc07d53221216838d79e03a8019d0839786703129599e9619f4ab74c8c096eac", [:mix], [], "hexpm", "f5cbd651c5678bcaabdbb7857658ee106b12509cd976c2c2fca99688e1daf716"},
|
||||
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},
|
||||
"erlport": {:hex, :erlport, "0.10.1", "c96ffa51bbcab0298232fcdfe8c3e110f1598011de71ae6b9082b80c9e2e476a", [:rebar3], [], "hexpm", "34931e8cb62a131d1bc8a2bd04d4007c73c03e4f10e22ee4a218e7172227a918"},
|
||||
"eternal": {:hex, :eternal, "1.2.2", "d1641c86368de99375b98d183042dd6c2b234262b8d08dfd72b9eeaafc2a1abd", [:mix], [], "hexpm", "2c9fe32b9c3726703ba5e1d43a1d255a4f3f2d8f8f9bc19f094c7cb1a7a9e782"},
|
||||
"ex_cldr": {:hex, :ex_cldr, "2.28.0", "8f7a8c70a49dc31f656eb02d4c6280550ab52abd340406e8341dd4ba2390798d", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:cldr_utils, "~> 2.17", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:gettext, "~> 0.19", [hex: :gettext, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "564608c4a344c9cca54874e95fb77cd7149f593ccf522db5cbe8943c0b183630"},
|
||||
"ex_cldr": {:hex, :ex_cldr, "2.29.0", "1c3c90cc7888afcd5e957d38af7bcfc2a0bd62bbc6885e141aef6f790cdacf6a", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:cldr_utils, "~> 2.17", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:gettext, "~> 0.19", [hex: :gettext, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: true]}], "hexpm", "9cbfcb2445e3c6b5652d0d1c435cee4ae585b9ecf533180b442adb6bf375cf74"},
|
||||
"ex_cldr_calendars": {:hex, :ex_cldr_calendars, "1.18.0", "aa86e673f02b3c65d9cc29c483a4dfec1878b2e2460619c2b06c121ef801334e", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:ex_cldr_lists, "~> 2.10", [hex: :ex_cldr_lists, repo: "hexpm", optional: true]}, {:ex_cldr_numbers, "~> 2.25", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:ex_cldr_units, "~> 3.12", [hex: :ex_cldr_units, repo: "hexpm", optional: true]}, {:ex_doc, "~> 0.21", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "5b47bf4e90bdd6746ac9ca9cb3f9d36c3e656c18768ace8366061e3e02899cdc"},
|
||||
"ex_cldr_currencies": {:hex, :ex_cldr_currencies, "2.13.0", "13188b99e527d724ed3dc2af37e54f0dac42dec42b620a34c4ed4d4902fad6dd", [:mix], [{:ex_cldr, "~> 2.24", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "64731e49ac3530aa88872b52c319eb5231bfb1a3ebb0956044c34abc0ed4f520"},
|
||||
"ex_cldr_dates_times": {:hex, :ex_cldr_dates_times, "2.11.0", "eb00d2def8c16feb250ea2436c2e07b31b6e0ad22f9ff569c7714e807c8327df", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:ex_cldr_calendars, "~> 1.18", [hex: :ex_cldr_calendars, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.25", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "36b2dd6bea88f295b9761d6ca26cccce573708cffe6e196f9930a24ca57baecf"},
|
||||
"ex_cldr_dates_times": {:hex, :ex_cldr_dates_times, "2.12.0", "a6b065657b06535914b0b18f0d86549187950256c0b1d1c0e055a27126f753b1", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:ex_cldr_calendars, "~> 1.18", [hex: :ex_cldr_calendars, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.25", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "c15b424c1f9512e1be17cc128415f8b69bd5a283e63db71c44bf60e70253eba0"},
|
||||
"ex_cldr_languages": {:hex, :ex_cldr_languages, "0.3.3", "9787002803552b15a7ade19496c9e46fc921baca992ea80d0394e11fe3acea45", [:mix], [{:ex_cldr, "~> 2.25", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "22fb1fef72b7b4b4872d243b34e7b83734247a78ad87377986bf719089cc447a"},
|
||||
"ex_cldr_numbers": {:hex, :ex_cldr_numbers, "2.26.0", "f1104498a96666fc0b0c0995f17266c8700593e984418aa05e7b731bfd8c5670", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:ex_cldr, "~> 2.28", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_cldr_currencies, "~> 2.13", [hex: :ex_cldr_currencies, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "35b1c7bd6c87149e7f31ef24705d254419b35f9f26fe439af88d02950710e11b"},
|
||||
"ex_doc": {:hex, :ex_doc, "0.28.3", "6eea2f69995f5fba94cd6dd398df369fe4e777a47cd887714a0976930615c9e6", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "05387a6a2655b5f9820f3f627450ed20b4325c25977b2ee69bed90af6688e718"},
|
||||
"ex_cldr_numbers": {:hex, :ex_cldr_numbers, "2.27.0", "a29e49e1e0f990c8fec0307640a6e980074598dd8d4b9af7f85905e82f30c6b2", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:digital_token, "~> 0.3 or ~> 1.0", [hex: :digital_token, repo: "hexpm", optional: false]}, {:ex_cldr, "~> 2.28", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_cldr_currencies, "~> 2.13", [hex: :ex_cldr_currencies, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "1ecb5810d4e3db138e05a18e401626a14cfdd889ad98b49b96bb280c76529ba0"},
|
||||
"ex_cldr_plugs": {:hex, :ex_cldr_plugs, "1.0.0", "d6980eb5007306b2dce8f47319d4f68e5bc6ac8690c3057b1d2477885dc5fd64", [:mix], [{:ex_cldr, "~> 2.29", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:gettext, "~> 0.19", [hex: :gettext, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "1ee31c828e864097af2d589881aa87d88d8266f4afc1917bd9e54be963c4940f"},
|
||||
"ex_doc": {:hex, :ex_doc, "0.28.4", "001a0ea6beac2f810f1abc3dbf4b123e9593eaa5f00dd13ded024eae7c523298", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "bf85d003dd34911d89c8ddb8bda1a958af3471a274a4c2150a9c01c78ac3f8ed"},
|
||||
"ex_ical": {:hex, :ex_ical, "0.2.0", "4b928b554614704016cc0c9ee226eb854da9327a1cc460457621ceacb1ac29a6", [:mix], [{:timex, "~> 3.1", [hex: :timex, repo: "hexpm", optional: false]}], "hexpm", "db76473b2ae0259e6633c6c479a5a4d8603f09497f55c88f9ef4d53d2b75befb"},
|
||||
"ex_machina": {:hex, :ex_machina, "2.7.0", "b792cc3127fd0680fecdb6299235b4727a4944a09ff0fa904cc639272cd92dc7", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "419aa7a39bde11894c87a615c4ecaa52d8f107bbdd81d810465186f783245bf8"},
|
||||
"ex_optimizer": {:hex, :ex_optimizer, "0.1.1", "62da37e206fc2233ff7a4e54e40eae365c40f96c81992fcd15b782eb25169b80", [:mix], [{:file_info, "~> 0.0.4", [hex: :file_info, repo: "hexpm", optional: false]}], "hexpm", "e6f5c059bcd58b66be2f6f257fdc4f69b74b0fa5c9ddd669486af012e4b52286"},
|
||||
"ex_unit_notifier": {:hex, :ex_unit_notifier, "1.2.0", "73ced2ecee0f2da0705e372c21ce61e4e5d927ddb797f73928e52818b9cc1754", [:mix], [], "hexpm", "f38044c9d50de68ad7f0aec4d781a10d9f1c92c62b36bf0227ec0aaa96aee332"},
|
||||
"excoveralls": {:hex, :excoveralls, "0.14.4", "295498f1ae47bdc6dce59af9a585c381e1aefc63298d48172efaaa90c3d251db", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "e3ab02f2df4c1c7a519728a6f0a747e71d7d6e846020aae338173619217931c1"},
|
||||
"excoveralls": {:hex, :excoveralls, "0.14.5", "5c685449596e962c779adc8f4fb0b4de3a5b291c6121097572a3aa5400c386d3", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "e9b4a9bf10e9a6e48b94159e13b4b8a1b05400f17ac16cc363ed8734f26e1f4e"},
|
||||
"exgravatar": {:hex, :exgravatar, "2.0.3", "2349709832ee535f826f48db98cddd294ae62b01acb44d539a16419bd8ebc3e5", [:mix], [], "hexpm", "aca18ff9bd8991d3be3e5446d3bdefc051be084c1ffc9ab2d43b3e65339300e1"},
|
||||
"export": {:hex, :export, "0.1.1", "6dfd268b0692428f89b9285859a2dc02b6dcd2e8fdfbca34ac6e6a331351df91", [:mix], [{:erlport, "~> 0.9", [hex: :erlport, repo: "hexpm", optional: false]}], "hexpm", "3da7444ff4053f1824352f4bdb13fbd2c28c93c2011786fb686b649fdca1021f"},
|
||||
"fast_html": {:hex, :fast_html, "2.0.5", "c61760340606c1077ff1f196f17834056cb1dd3d5cb92a9f2cabf28bc6221c3c", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}], "hexpm", "605f4f4829443c14127694ebabb681778712ceecb4470ec32aa31012330e6506"},
|
||||
|
@ -68,7 +70,6 @@
|
|||
"html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"},
|
||||
"http_signatures": {:hex, :http_signatures, "0.1.1", "ca7ebc1b61542b163644c8c3b1f0e0f41037d35f2395940d3c6c7deceab41fd8", [:mix], [], "hexpm", "cc3b8a007322cc7b624c0c15eec49ee58ac977254ff529a3c482f681465942a3"},
|
||||
"httpoison": {:hex, :httpoison, "1.8.1", "df030d96de89dad2e9983f92b0c506a642d4b1f4a819c96ff77d12796189c63e", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "35156a6d678d6d516b9229e208942c405cf21232edd632327ecfaf4fd03e79e0"},
|
||||
"hut": {:hex, :hut, "1.3.0", "71f2f054e657c03f959cf1acc43f436ea87580696528ca2a55c8afb1b06c85e7", [:"erlang.mk", :rebar, :rebar3], [], "hexpm", "7e15d28555d8a1f2b5a3a931ec120af0753e4853a4c66053db354f35bf9ab563"},
|
||||
"icalendar": {:git, "https://github.com/tcitworld/icalendar.git", "1033d922c82a7223db0ec138e2316557b70ff49f", []},
|
||||
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
|
||||
"inet_cidr": {:hex, :inet_cidr, "1.0.4", "a05744ab7c221ca8e395c926c3919a821eb512e8f36547c062f62c4ca0cf3d6e", [:mix], [], "hexpm", "64a2d30189704ae41ca7dbdd587f5291db5d1dda1414e0774c29ffc81088c1bc"},
|
||||
|
@ -96,10 +97,10 @@
|
|||
"nimble_pool": {:hex, :nimble_pool, "0.2.6", "91f2f4c357da4c4a0a548286c84a3a28004f68f05609b4534526871a22053cde", [:mix], [], "hexpm", "1c715055095d3f2705c4e236c18b618420a35490da94149ff8b580a2144f653f"},
|
||||
"oauth2": {:hex, :oauth2, "2.0.0", "338382079fe16c514420fa218b0903f8ad2d4bfc0ad0c9f988867dfa246731b0", [:mix], [{:hackney, "~> 1.13", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "881b8364ac7385f9fddc7949379cbe3f7081da37233a1aa7aab844670a91e7e7"},
|
||||
"oauther": {:hex, :oauther, "1.3.0", "82b399607f0ca9d01c640438b34d74ebd9e4acd716508f868e864537ecdb1f76", [:mix], [], "hexpm", "78eb888ea875c72ca27b0864a6f550bc6ee84f2eeca37b093d3d833fbcaec04e"},
|
||||
"oban": {:hex, :oban, "2.11.3", "f431f2f0c251b8490a7fa00d2cce7197a1cf4d3f04a3305e80411f083392998f", [:mix], [{:ecto_sql, "~> 3.6", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "26529da52bfca27740c984bfc70e7f954d6411ceeae0c7c94d2c8aa7c00b513d"},
|
||||
"oban": {:hex, :oban, "2.12.0", "bd5a283770c6ab1284aad81e5566cfb89f4119b08f52508d92d73551283c8789", [:mix], [{:ecto_sql, "~> 3.6", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1557b7b046b13c0b5360f55a9fb7e56975f6b5f8247e56f2c54575bd95435ca0"},
|
||||
"paasaa": {:hex, :paasaa, "0.5.1", "58d8bf61902adfd1d04815a115f0eb3b996845c0360f1831854e21073411e822", [:mix], [], "hexpm", "571f1a33b8e184396a93fc18ee5331f2655c96ba9a6fc383dc675e4bc8fc7596"},
|
||||
"parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"},
|
||||
"phoenix": {:hex, :phoenix, "1.6.7", "f1de32418bbbcd471f4fe74d3860ee9c8e8c6c36a0ec173be8ff468a5d72ac90", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b354a4f11d9a2f3a380fb731042dae064f22d7aed8c7e7c024a2459f12994aad"},
|
||||
"phoenix": {:hex, :phoenix, "1.6.8", "9a34e5f4dd3ba959176c199fd5b2277b02e64005462428b71cf6ce9cb5e09cb4", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9f4d616aeb9c5e019bddfc1f9078b8c06f852ffa838e67f925559cc0993e9f71"},
|
||||
"phoenix_ecto": {:hex, :phoenix_ecto, "4.4.0", "0672ed4e4808b3fbed494dded89958e22fb882de47a97634c0b13e7b0b5f7720", [:mix], [{:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "09864e558ed31ee00bd48fcc1d4fc58ae9678c9e81649075431e69dbabb43cc1"},
|
||||
"phoenix_html": {:hex, :phoenix_html, "3.2.0", "1c1219d4b6cb22ac72f12f73dc5fad6c7563104d083f711c3fcd8551a1f4ae11", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "36ec97ba56d25c0136ef1992c37957e4246b649d620958a1f9fa86165f8bc54f"},
|
||||
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.3.3", "3a53772a6118d5679bf50fc1670505a290e32a1d195df9e069d8c53ab040c054", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "766796676e5f558dbae5d1bdb066849673e956005e3730dfd5affd7a6da4abac"},
|
||||
|
@ -110,7 +111,7 @@
|
|||
"plug": {:hex, :plug, "1.13.6", "187beb6b67c6cec50503e940f0434ea4692b19384d47e5fdfd701e93cadb4cc2", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "02b9c6b9955bce92c829f31d6284bf53c591ca63c4fb9ff81dfd0418667a34ff"},
|
||||
"plug_cowboy": {:hex, :plug_cowboy, "2.5.2", "62894ccd601cf9597e2c23911ff12798a8a18d237e9739f58a6b04e4988899fe", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ea6e87f774c8608d60c8d34022a7d073bd7680a0a013f049fc62bf35efea1044"},
|
||||
"plug_crypto": {:hex, :plug_crypto, "1.2.2", "05654514ac717ff3a1843204b424477d9e60c143406aa94daf2274fdd280794d", [:mix], [], "hexpm", "87631c7ad914a5a445f0a3809f99b079113ae4ed4b867348dd9eec288cecb6db"},
|
||||
"postgrex": {:hex, :postgrex, "0.16.2", "0f83198d0e73a36e8d716b90f45f3bde75b5eebf4ade4f43fa1f88c90a812f74", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "a9ea589754d9d4d076121090662b7afe155b374897a6550eb288f11d755acfa0"},
|
||||
"postgrex": {:hex, :postgrex, "0.16.3", "fac79a81a9a234b11c44235a4494d8565303fa4b9147acf57e48978a074971db", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "aeaae1d2d1322da4e5fe90d241b0a564ce03a3add09d7270fb85362166194590"},
|
||||
"progress_bar": {:hex, :progress_bar, "2.0.1", "7b40200112ae533d5adceb80ff75fbe66dc753bca5f6c55c073bfc122d71896d", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "2519eb58a2f149a3a094e729378256d8cb6d96a259ec94841bd69fdc71f18f87"},
|
||||
"ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
|
||||
"remote_ip": {:hex, :remote_ip, "1.0.0", "3d7fb45204a5704443f480cee9515e464997f52c35e0a60b6ece1f81484067ae", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "9e9fcad4e50c43b5234bb6a9629ed6ab223f3ed07147bd35470e4ee5c8caf907"},
|
||||
|
@ -123,21 +124,22 @@
|
|||
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"},
|
||||
"struct_access": {:hex, :struct_access, "1.1.2", "a42e6ceedd9b9ea090ee94a6da089d56e16f374dbbc010c3eebdf8be17df286f", [:mix], [], "hexpm", "e4c411dcc0226081b95709909551fc92b8feb1a3476108348ea7e3f6c12e586a"},
|
||||
"sweet_xml": {:hex, :sweet_xml, "0.7.3", "debb256781c75ff6a8c5cbf7981146312b66f044a2898f453709a53e5031b45b", [:mix], [], "hexpm", "e110c867a1b3fe74bfc7dd9893aa851f0eed5518d0d7cad76d7baafd30e4f5ba"},
|
||||
"swoosh": {:hex, :swoosh, "1.6.4", "ce3a4bf3e5276fd114178ebc5ed072ee0c177a7b3a09e5992aa005778ac143c2", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ad4c8b534812433730b6241a1d9df38b1da75fdfa340f51887a31d7e9343fffe"},
|
||||
"swoosh": {:hex, :swoosh, "1.6.6", "6018c6f4659ac0b4f30684982993b7812b2bb97436d39f76fcfa8c9e3ae74f85", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e92c7206efd442f08484993676ab072afab2f2bb1e87e604230bb1183c5980de"},
|
||||
"telemetry": {:hex, :telemetry, "1.1.0", "a589817034a27eab11144ad24d5c0f9fab1f58173274b1e9bae7074af9cbee51", [:rebar3], [], "hexpm", "b727b2a1f75614774cff2d7565b64d0dfa5bd52ba517f16543e6fc7efcc0df48"},
|
||||
"tesla": {:hex, :tesla, "1.4.4", "bb89aa0c9745190930366f6a2ac612cdf2d0e4d7fff449861baa7875afd797b2", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.3", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "d5503a49f9dec1b287567ea8712d085947e247cb11b06bc54adb05bfde466457"},
|
||||
"timex": {:hex, :timex, "3.7.7", "3ed093cae596a410759104d878ad7b38e78b7c2151c6190340835515d4a46b8a", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "0ec4b09f25fe311321f9fc04144a7e3affe48eb29481d7a5583849b6c4dfa0a7"},
|
||||
"timex": {:hex, :timex, "3.7.8", "0e6e8bf7c0aba95f1e13204889b2446e7a5297b1c8e408f15ab58b2c8dc85f81", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.1", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "8f3b8edc5faab5205d69e5255a1d64a83b190bab7f16baa78aefcb897cf81435"},
|
||||
"tz_world": {:hex, :tz_world, "1.0.0", "53366d7ec1d3fb11e1a34ce7c74d21c354195521b3309cdb9e6cc84b266cae83", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:geo, "~> 1.0 or ~> 2.0 or ~> 3.3", [hex: :geo, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "9d7aeaa078913b6d486d2a1bf3c1fd380cb16180b93415c7f3fde7cabff478f8"},
|
||||
"tzdata": {:hex, :tzdata, "1.1.1", "20c8043476dfda8504952d00adac41c6eda23912278add38edc140ae0c5bcc46", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "a69cec8352eafcd2e198dea28a34113b60fdc6cb57eb5ad65c10292a6ba89787"},
|
||||
"ueberauth": {:hex, :ueberauth, "0.7.0", "9c44f41798b5fa27f872561b6f7d2bb0f10f03fdd22b90f454232d7b087f4b75", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "2efad9022e949834f16cc52cd935165049d81fa9e925690f91035c2e4b58d905"},
|
||||
"ueberauth_facebook": {:hex, :ueberauth_facebook, "0.9.0", "c0b03c33903d1d23db1a13eb2d31238d64f32ee35b5bd51491e24d40168c0bff", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.7", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "f2a0fc914a194431b4578b16cba7a2cfce2298f7cfbefb3aa744283cf1eb47ff"},
|
||||
"ueberauth_cas": {:hex, :ueberauth_cas, "2.2.0", "5f912ed625b5d77fd48b15047d589fbe594427856feadd378d8f8369f17a36fe", [:mix], [{:httpoison, "~> 1.8", [hex: :httpoison, repo: "hexpm", optional: false]}, {:sweet_xml, "~> 0.7", [hex: :sweet_xml, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.6", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "aaa2866b83a7bd95fdc60d809e175647e299508b2bb362c1a7d7868181e00856"},
|
||||
"ueberauth_facebook": {:hex, :ueberauth_facebook, "0.10.0", "0d607fbd1b7c6e0449981571027d869c2d156b8ad20c42e3672346678c05ccf1", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.7", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "bf8ce5d66b1c50da8abff77e8086c1b710bdde63f4acaef19a651ba43a9537a8"},
|
||||
"ueberauth_github": {:hex, :ueberauth_github, "0.8.1", "0be487b5afc29bc805fa5e31636f37c8f09d5159ef73fc08c4c7a98c9cfe2c18", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.7.0", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "143d6130b945ea9bdbd0ef94987f40788f1d7e8090decbfc0722773155e7a74a"},
|
||||
"ueberauth_gitlab_strategy": {:git, "https://github.com/tcitworld/ueberauth_gitlab.git", "9fc5d30b5d87ff7cdef293a1c128f25777dcbe59", [branch: "upgrade-deps"]},
|
||||
"ueberauth_gitlab_strategy": {:hex, :ueberauth_gitlab_strategy, "0.4.0", "96605d304ebb87ce508eccbeb1f94da9ea1c9da20d8913771b6cf24a6cc6c633", [:mix], [{:oauth2, "~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.7.0", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "e86e2e794bb063c07c05a6b1301b73f2be3ba9308d8f47ecc4d510ef9226091e"},
|
||||
"ueberauth_google": {:hex, :ueberauth_google, "0.10.1", "db7bd2d99d2ff38e7449042a08d9560741b0dcaf1c31191729b97188b025465e", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.7.0", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "b799f547d279bb836e1f7039fc9fbb3a9d008a695e2a25bd06bffe591a168ba1"},
|
||||
"ueberauth_keycloak_strategy": {:git, "https://github.com/tcitworld/ueberauth_keycloak.git", "d892f0f9daf9e0023319b69ac2f7c2c6edff2b14", [branch: "upgrade-deps"]},
|
||||
"ueberauth_keycloak_strategy": {:hex, :ueberauth_keycloak_strategy, "0.3.0", "262f25ae9a38886e13a954919a873ae6ea9adf73cf8875eec74b945f0b2c7b2b", [:mix], [{:oauth2, "~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.7", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "d1a0abad08cd5e39722a9899200583b03ac63fee0c264799018ef06eb989db31"},
|
||||
"ueberauth_twitter": {:hex, :ueberauth_twitter, "0.4.1", "92f88b1ad50322cdda719b439bb7f93b225dc0315723117bc25c782e627c8f33", [:mix], [{:httpoison, "~> 1.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:oauther, "~> 1.1", [hex: :oauther, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.7", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "83ca8ea3e1a3f976f1adbebfb323b9ebf53af453fbbf57d0486801a303b16065"},
|
||||
"unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"},
|
||||
"unsafe": {:hex, :unsafe, "1.0.1", "a27e1874f72ee49312e0a9ec2e0b27924214a05e3ddac90e91727bc76f8613d8", [:mix], [], "hexpm", "6c7729a2d214806450d29766abc2afaa7a2cbecf415be64f36a6691afebb50e5"},
|
||||
"web_push_encryption": {:hex, :web_push_encryption, "0.3.1", "76d0e7375142dfee67391e7690e89f92578889cbcf2879377900b5620ee4708d", [:mix], [{:httpoison, "~> 1.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jose, "~> 1.11.1", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "4f82b2e57622fb9337559058e8797cb0df7e7c9790793bdc4e40bc895f70e2a2"},
|
||||
"web_push_encryption": {:git, "https://github.com/danhper/elixir-web-push-encryption.git", "70f00d06cbd88c9ac382e0ad2539e54448e9d8da", []},
|
||||
"xml_builder": {:hex, :xml_builder, "2.2.0", "cc5f1eeefcfcde6e90a9b77fb6c490a20bc1b856a7010ce6396f6da9719cbbab", [:mix], [], "hexpm", "9d66d52fb917565d358166a4314078d39ef04d552904de96f8e73f68f64a62c9"},
|
||||
}
|
||||
|
|