diff --git a/AUTHORS.md b/AUTHORS.md
index 5f5985fba83..5ff241afd36 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -5,62 +5,66 @@ Mastodon is available on [GitHub](https://github.com/tootsuite/mastodon)
and provided thanks to the work of the following contributors:
* [Gargron](https://github.com/Gargron)
+* [dependabot-preview[bot]](https://github.com/apps/dependabot-preview)
* [ThibG](https://github.com/ThibG)
* [ykzts](https://github.com/ykzts)
* [dependabot[bot]](https://github.com/apps/dependabot)
* [akihikodaki](https://github.com/akihikodaki)
-* [dependabot-preview[bot]](https://github.com/apps/dependabot-preview)
* [mjankowski](https://github.com/mjankowski)
* [unarist](https://github.com/unarist)
* [yiskah](https://github.com/yiskah)
* [nolanlawson](https://github.com/nolanlawson)
-* [ysksn](https://github.com/ysksn)
* [abcang](https://github.com/abcang)
+* [ysksn](https://github.com/ysksn)
+* [mayaeh](https://github.com/mayaeh)
* [sorin-davidoi](https://github.com/sorin-davidoi)
* [lynlynlynx](https://github.com/lynlynlynx)
-* [mayaeh](https://github.com/mayaeh)
* [m4sk1n](mailto:me@m4sk.in)
* [Marcin Mikołajczak](mailto:me@m4sk.in)
* [Kjwon15](https://github.com/Kjwon15)
+* [noellabo](https://github.com/noellabo)
* [renatolond](https://github.com/renatolond)
* [alpaca-tc](https://github.com/alpaca-tc)
* [jeroenpraat](https://github.com/jeroenpraat)
* [nclm](https://github.com/nclm)
* [ineffyble](https://github.com/ineffyble)
-* [mabkenar](https://github.com/mabkenar)
+* [shleeable](https://github.com/shleeable)
+* [zunda](https://github.com/zunda)
+* [Masoud Abkenar](mailto:ampbox@gmail.com)
* [blackle](https://github.com/blackle)
* [Quent-in](https://github.com/Quent-in)
* [JantsoP](https://github.com/JantsoP)
-* [zunda](https://github.com/zunda)
* [nullkal](https://github.com/nullkal)
* [yookoala](https://github.com/yookoala)
+* [Sasha-Sorokin](https://github.com/Sasha-Sorokin)
* [Aditoo17](https://github.com/Aditoo17)
* [Quenty31](https://github.com/Quenty31)
* [marek-lach](https://github.com/marek-lach)
* [shuheiktgw](https://github.com/shuheiktgw)
* [ashfurrow](https://github.com/ashfurrow)
-* [eramdam](https://github.com/eramdam)
-* [noellabo](https://github.com/noellabo)
-* [takayamaki](https://github.com/takayamaki)
* [danhunsaker](https://github.com/danhunsaker)
+* [eramdam](https://github.com/eramdam)
+* [takayamaki](https://github.com/takayamaki)
+* [ariasuni](https://github.com/ariasuni)
* [masarakki](https://github.com/masarakki)
* [ticky](https://github.com/ticky)
* [ThisIsMissEm](https://github.com/ThisIsMissEm)
+* [hinaloe](https://github.com/hinaloe)
* [hcmiya](https://github.com/hcmiya)
* [stephenburgess8](https://github.com/stephenburgess8)
-* [Wonderfall](https://github.com/Wonderfall)
+* [Wonderfall](mailto:wonderfall@targaryen.house)
* [matteoaquila](https://github.com/matteoaquila)
* [yukimochi](https://github.com/yukimochi)
* [palindromordnilap](https://github.com/palindromordnilap)
* [rkarabut](https://github.com/rkarabut)
-* [Artoria2e5](https://github.com/Artoria2e5)
+* [trwnh](https://github.com/trwnh)
* [nightpool](https://github.com/nightpool)
+* [Artoria2e5](https://github.com/Artoria2e5)
* [marrus-sh](https://github.com/marrus-sh)
-* [hinaloe](https://github.com/hinaloe)
* [krainboltgreene](https://github.com/krainboltgreene)
* [pfigel](https://github.com/pfigel)
-* [Aldarone](https://github.com/Aldarone)
* [BoFFire](https://github.com/BoFFire)
+* [Aldarone](https://github.com/Aldarone)
* [clworld](https://github.com/clworld)
* [MasterGroosha](https://github.com/MasterGroosha)
* [dracos](https://github.com/dracos)
@@ -68,52 +72,50 @@ and provided thanks to the work of the following contributors:
* [SerCom_KC](mailto:sercom-kc@users.noreply.github.com)
* [Sylvhem](https://github.com/Sylvhem)
* [MitarashiDango](https://github.com/MitarashiDango)
+* [angristan](https://github.com/angristan)
* [JeanGauthier](https://github.com/JeanGauthier)
* [kschaper](https://github.com/kschaper)
* [beatrix-bitrot](https://github.com/beatrix-bitrot)
-* [angristan](https://github.com/angristan)
+* [koyuawsmbrtn](https://github.com/koyuawsmbrtn)
+* [BenLubar](https://github.com/BenLubar)
* [adbelle](https://github.com/adbelle)
* [evanminto](https://github.com/evanminto)
* [MightyPork](https://github.com/MightyPork)
-* [ashleyhull-versent](mailto:ashley.hull@versent.com.au)
+* [ashleyhull-versent](https://github.com/ashleyhull-versent)
* [yhirano55](https://github.com/yhirano55)
* [rinsuki](https://github.com/rinsuki)
+* [dunn](https://github.com/dunn)
+* [devkral](https://github.com/devkral)
* [camponez](https://github.com/camponez)
+* [hugogameiro](https://github.com/hugogameiro)
* [SerCom_KC](mailto:szescxz@gmail.com)
* [aschmitz](https://github.com/aschmitz)
-* [trwnh](https://github.com/trwnh)
-* [devkral](https://github.com/devkral)
* [fpiesche](https://github.com/fpiesche)
-* [hugogameiro](https://github.com/hugogameiro)
* [gandaro](https://github.com/gandaro)
* [johnsudaar](https://github.com/johnsudaar)
-* [ariasuni](https://github.com/ariasuni)
* [trebmuh](https://github.com/trebmuh)
* [rmhasan](https://github.com/rmhasan)
* [kedamaDQ](https://github.com/kedamaDQ)
* [lindwurm](https://github.com/lindwurm)
* [victorhck](mailto:victorhck@geeko.site)
* [voidsatisfaction](https://github.com/voidsatisfaction)
-* [BenLubar](https://github.com/BenLubar)
* [hikari-no-yume](https://github.com/hikari-no-yume)
* [seefood](https://github.com/seefood)
* [jackjennings](https://github.com/jackjennings)
-* [koyuawsmbrtn](https://github.com/koyuawsmbrtn)
+* [mfmfuyu](https://github.com/mfmfuyu)
+* [puckipedia](https://github.com/puckipedia)
* [spla](mailto:spla@mastodont.cat)
-* [expenses](https://github.com/expenses)
* [walf443](https://github.com/walf443)
* [JoelQ](https://github.com/JoelQ)
* [mistydemeo](https://github.com/mistydemeo)
-* [dunn](https://github.com/dunn)
+* [Ashley](mailto:expenses@airmail.cc)
* [xqus](https://github.com/xqus)
* [pfm-eyesightjp](https://github.com/pfm-eyesightjp)
-* [fakenine](https://github.com/fakenine)
-* [Shleeble](https://github.com/Shleeble)
+* [Samy KACIMI](mailto:samy.kacimi@gmail.com)
* [tsuwatch](https://github.com/tsuwatch)
* [victorhck](https://github.com/victorhck)
* [mkljczk](https://github.com/mkljczk)
* [manuelviens](https://github.com/manuelviens)
-* [puckipedia](https://github.com/puckipedia)
* [fvh-P](https://github.com/fvh-P)
* [rtucker](https://github.com/rtucker)
* [Anna e só](mailto:contraexemplos@gmail.com)
@@ -123,6 +125,7 @@ and provided thanks to the work of the following contributors:
* [diomed](https://github.com/diomed)
* [Neetshin](mailto:neetshin@neetsh.in)
* [rainyday](https://github.com/rainyday)
+* [tcitworld](https://github.com/tcitworld)
* [ProgVal](https://github.com/ProgVal)
* [valentin2105](https://github.com/valentin2105)
* [yuntan](https://github.com/yuntan)
@@ -136,44 +139,53 @@ and provided thanks to the work of the following contributors:
* [TheKinrar](https://github.com/TheKinrar)
* [AA4ch1](https://github.com/AA4ch1)
* [alexgleason](https://github.com/alexgleason)
+* [Bèr Kessels](mailto:ber@berk.es)
* [cpytel](https://github.com/cpytel)
* [northerner](https://github.com/northerner)
* [fhemberger](https://github.com/fhemberger)
+* [Gomasy](https://github.com/Gomasy)
* [greysteil](https://github.com/greysteil)
* [hencatsmith](https://github.com/hencatsmith)
* [d6rkaiz](https://github.com/d6rkaiz)
* [Reverite](https://github.com/Reverite)
* [JohnD28](https://github.com/JohnD28)
* [znz](https://github.com/znz)
+* [saper](https://github.com/saper)
* [Naouak](https://github.com/Naouak)
* [pawelngei](https://github.com/pawelngei)
* [reneklacan](https://github.com/reneklacan)
* [ekiru](https://github.com/ekiru)
-* [tcitworld](https://github.com/tcitworld)
* [geta6](https://github.com/geta6)
* [happycoloredbanana](https://github.com/happycoloredbanana)
* [leopku](https://github.com/leopku)
* [SansPseudoFix](https://github.com/SansPseudoFix)
-* [salvadorpla](https://github.com/salvadorpla)
+* [spla](mailto:sp@mastodont.cat)
+* [tateisu](https://github.com/tateisu)
* [tomfhowe](https://github.com/tomfhowe)
* [noraworld](https://github.com/noraworld)
+* [lfuelling](https://github.com/lfuelling)
* [theboss](https://github.com/theboss)
* [nzws](https://github.com/nzws)
+* [duxovni](https://github.com/duxovni)
+* [smorimoto](https://github.com/smorimoto)
* [178inaba](https://github.com/178inaba)
+* [acid-chicken](https://github.com/acid-chicken)
* [xgess](https://github.com/xgess)
* [alyssais](https://github.com/alyssais)
* [aablinov](https://github.com/aablinov)
* [stalker314314](https://github.com/stalker314314)
* [cutls](https://github.com/cutls)
+* [dariusk](https://github.com/dariusk)
* [huertanix](https://github.com/huertanix)
-* [genesixx](https://github.com/genesixx)
+* [eleboucher](https://github.com/eleboucher)
* [halkeye](https://github.com/halkeye)
+* [Hanage999](https://github.com/Hanage999)
* [treby](https://github.com/treby)
* [jpdevries](https://github.com/jpdevries)
* [gdpelican](https://github.com/gdpelican)
* [kmichl](https://github.com/kmichl)
* [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name)
-* [saper](https://github.com/saper)
+* [panarom](https://github.com/panarom)
* [Dar13](https://github.com/Dar13)
* [nevillepark](https://github.com/nevillepark)
* [ornithocoder](https://github.com/ornithocoder)
@@ -181,7 +193,7 @@ and provided thanks to the work of the following contributors:
* [pierreozoux](https://github.com/pierreozoux)
* [qguv](https://github.com/qguv)
* [Ram Lmn](mailto:ramlmn@users.noreply.github.com)
-* [aurelia-sl](https://github.com/aurelia-sl)
+* [Sascha](mailto:sascha@serenitylabs.cloud)
* [harukasan](https://github.com/harukasan)
* [stamak](https://github.com/stamak)
* [Technowix](https://github.com/Technowix)
@@ -196,9 +208,9 @@ and provided thanks to the work of the following contributors:
* [chr-1x](https://github.com/chr-1x)
* [esetomo](https://github.com/esetomo)
* [foxiehkins](https://github.com/foxiehkins)
+* [highemerly](https://github.com/highemerly)
* [hoodie](mailto:hoodiekitten@outlook.com)
* [luzi82](https://github.com/luzi82)
-* [duxovni](https://github.com/duxovni)
* [slice](https://github.com/slice)
* [tmm576](https://github.com/tmm576)
* [unsmell](mailto:unsmell@users.noreply.github.com)
@@ -209,13 +221,12 @@ and provided thanks to the work of the following contributors:
* [AndreLewin](https://github.com/AndreLewin)
* [0xflotus](https://github.com/0xflotus)
* [redtachyons](https://github.com/redtachyons)
-* [acid-chicken](https://github.com/acid-chicken)
* [thurloat](https://github.com/thurloat)
* [aaribaud](https://github.com/aaribaud)
* [pointlessone](https://github.com/pointlessone)
* [Andrew](mailto:andrewlchronister@gmail.com)
* [aurelien-reeves](https://github.com/aurelien-reeves)
-* [AnaGelez](https://github.com/AnaGelez)
+* [elegaanz](https://github.com/elegaanz)
* [estuans](https://github.com/estuans)
* [dissolve](https://github.com/dissolve)
* [PurpleBooth](https://github.com/PurpleBooth)
@@ -227,16 +238,14 @@ and provided thanks to the work of the following contributors:
* [muffinista](https://github.com/muffinista)
* [cdutson](https://github.com/cdutson)
* [farlistener](https://github.com/farlistener)
-* [dariusk](https://github.com/dariusk)
* [DavidLibeau](https://github.com/DavidLibeau)
+* [dmerejkowsky](https://github.com/dmerejkowsky)
* [ddevault](https://github.com/ddevault)
* [Fjoerfoks](https://github.com/Fjoerfoks)
* [fmauNeko](https://github.com/fmauNeko)
* [gloaec](https://github.com/gloaec)
-* [Gomasy](https://github.com/Gomasy)
* [unstabler](https://github.com/unstabler)
* [potato4d](https://github.com/potato4d)
-* [Hanage999](https://github.com/Hanage999)
* [h-izumi](https://github.com/h-izumi)
* [ErikXXon](https://github.com/ErikXXon)
* [ian-kelling](https://github.com/ian-kelling)
@@ -251,13 +260,17 @@ and provided thanks to the work of the following contributors:
* [tkbky](https://github.com/tkbky)
* [Kaylee](mailto:kaylee@codethat.sucks)
* [Kazhnuz](https://github.com/Kazhnuz)
+* [mkody](https://github.com/mkody)
* [connyduck](https://github.com/connyduck)
* [LindseyB](https://github.com/LindseyB)
* [Lorenz Diener](mailto:halcyon@icosahedron.website)
-* [alimony](https://github.com/alimony)
+* [Markus Amalthea Magnuson](mailto:markus.magnuson@gmail.com)
+* [madmath03](https://github.com/madmath03)
* [mig5](https://github.com/mig5)
* [moritzheiber](https://github.com/moritzheiber)
+* [Nathaniel Suchy](mailto:me@lunorian.is)
* [ndarville](https://github.com/ndarville)
+* [NimaBoscarino](https://github.com/NimaBoscarino)
* [Abzol](https://github.com/Abzol)
* [PatOnTheBack](https://github.com/PatOnTheBack)
* [xPaw](https://github.com/xPaw)
@@ -287,16 +300,15 @@ and provided thanks to the work of the following contributors:
* [amazedkoumei](https://github.com/amazedkoumei)
* [anon5r](https://github.com/anon5r)
* [aus-social](https://github.com/aus-social)
-* [imbsky](https://github.com/imbsky)
* [bsky](mailto:me@imbsky.net)
* [codl](https://github.com/codl)
* [cpsdqs](https://github.com/cpsdqs)
* [barzamin](https://github.com/barzamin)
* [fhalna](https://github.com/fhalna)
-* [highemerly](https://github.com/highemerly)
* [haoyayoi](https://github.com/haoyayoi)
* [ik11235](https://github.com/ik11235)
* [kawax](https://github.com/kawax)
+* [shrft](https://github.com/shrft)
* [007lva](https://github.com/007lva)
* [mbajur](https://github.com/mbajur)
* [matsurai25](https://github.com/matsurai25)
@@ -307,15 +319,18 @@ and provided thanks to the work of the following contributors:
* [pinfort](https://github.com/pinfort)
* [rbaumert](https://github.com/rbaumert)
* [rhoio](https://github.com/rhoio)
+* [sclaire-1](https://github.com/sclaire-1)
+* [umonaca](https://github.com/umonaca)
* [usagi-f](https://github.com/usagi-f)
* [vidarlee](https://github.com/vidarlee)
* [vjackson725](https://github.com/vjackson725)
* [wxcafe](https://github.com/wxcafe)
+* [Grawl](https://github.com/Grawl)
* [新都心(Neet Shin)](mailto:nucx@dio-vox.com)
* [clarfon](https://github.com/clarfon)
* [cygnan](https://github.com/cygnan)
* [Awea](https://github.com/Awea)
-* [halcy](https://github.com/halcy)
+* [eai04191](https://github.com/eai04191)
* [8398a7](https://github.com/8398a7)
* [857b](https://github.com/857b)
* [insom](https://github.com/insom)
@@ -332,6 +347,7 @@ and provided thanks to the work of the following contributors:
* [a2](https://github.com/a2)
* [alfiedotwtf](https://github.com/alfiedotwtf)
* [0xa](https://github.com/0xa)
+* [ArisuOngaku](https://github.com/ArisuOngaku)
* [virtualpain](https://github.com/virtualpain)
* [sapphirus](https://github.com/sapphirus)
* [amandavisconti](https://github.com/amandavisconti)
@@ -342,15 +358,22 @@ and provided thanks to the work of the following contributors:
* [schas002](https://github.com/schas002)
* [contraexemplo](https://github.com/contraexemplo)
* [abackstrom](https://github.com/abackstrom)
+* [arielrodrigues](https://github.com/arielrodrigues)
+* [orlea](https://github.com/orlea)
* [armandfardeau](https://github.com/armandfardeau)
* [raboof](https://github.com/raboof)
* [jumbosushi](https://github.com/jumbosushi)
* [ayumin](https://github.com/ayumin)
* [bzg](https://github.com/bzg)
-* [benediktg](https://github.com/benediktg)
+* [BastienDurel](https://github.com/BastienDurel)
+* [li-bei](https://github.com/li-bei)
+* [Benedikt Geißler](mailto:benedikt@g5r.eu)
+* [BenisonSebastian](https://github.com/BenisonSebastian)
* [blakebarnett](https://github.com/blakebarnett)
-* [bradj](https://github.com/bradj)
+* [Brad Janke](mailto:brad.janke@gmail.com)
+* [bclindner](https://github.com/bclindner)
* [brycied00d](https://github.com/brycied00d)
+* [berkes](https://github.com/berkes)
* [carlosjs23](https://github.com/carlosjs23)
* [cgxxx](https://github.com/cgxxx)
* [kibitan](https://github.com/kibitan)
@@ -358,41 +381,48 @@ and provided thanks to the work of the following contributors:
* [chris-martin](https://github.com/chris-martin)
* [DoubleMalt](https://github.com/DoubleMalt)
* [Moosh-be](https://github.com/Moosh-be)
+* [cchoi12](https://github.com/cchoi12)
* [Motoma](https://github.com/Motoma)
* [Christopher Kolstad](mailto:christopher.kolstad@finn.no)
* [csu](https://github.com/csu)
* [kklleemm](https://github.com/kklleemm)
* [colindean](https://github.com/colindean)
+* [DeeUnderscore](https://github.com/DeeUnderscore)
* [dachinat](https://github.com/dachinat)
-* [multiple-creatures](https://github.com/multiple-creatures)
+* [shapeshifter-system](https://github.com/shapeshifter-system)
* [watilde](https://github.com/watilde)
* [daprice](https://github.com/daprice)
* [da2x](https://github.com/da2x)
+* [codesections](https://github.com/codesections)
* [dar5hak](https://github.com/dar5hak)
* [kant](https://github.com/kant)
* [maxolasersquad](https://github.com/maxolasersquad)
* [singingwolfboy](https://github.com/singingwolfboy)
+* [caldwell](https://github.com/caldwell)
* [davidcelis](https://github.com/davidcelis)
+* [divergentdave](https://github.com/divergentdave)
* [davefp](https://github.com/davefp)
* [yipdw](https://github.com/yipdw)
* [debanshuk](https://github.com/debanshuk)
+* [mascali33](https://github.com/mascali33)
* [DerekNonGeneric](https://github.com/DerekNonGeneric)
* [dblandin](https://github.com/dblandin)
* [Drew Gates](mailto:aranaur@users.noreply.github.com)
* [dtschust](https://github.com/dtschust)
* [Dryusdan](https://github.com/Dryusdan)
-* [eai04191](https://github.com/eai04191)
* [d3vgru](https://github.com/d3vgru)
* [Elizafox](https://github.com/Elizafox)
* [enewhuis](https://github.com/enewhuis)
* [ericblade](https://github.com/ericblade)
* [mikoim](https://github.com/mikoim)
* [espenronnevik](https://github.com/espenronnevik)
+* [Expenses](mailto:expenses@airmail.cc)
* [fabianonline](https://github.com/fabianonline)
* [Finariel](https://github.com/Finariel)
* [siuying](https://github.com/siuying)
* [zoc](https://github.com/zoc)
* [fwenzel](https://github.com/fwenzel)
+* [gabrielrumiranda](https://github.com/gabrielrumiranda)
* [GenbuHase](https://github.com/GenbuHase)
* [nilsding](https://github.com/nilsding)
* [hattori6789](https://github.com/hattori6789)
@@ -401,6 +431,7 @@ and provided thanks to the work of the following contributors:
* [myfreeweb](https://github.com/myfreeweb)
* [gfaivre](https://github.com/gfaivre)
* [Fiaxhs](https://github.com/Fiaxhs)
+* [rasjonell](https://github.com/rasjonell)
* [reedcourty](https://github.com/reedcourty)
* [anneau](https://github.com/anneau)
* [lanodan](https://github.com/lanodan)
@@ -421,46 +452,49 @@ and provided thanks to the work of the following contributors:
* [jack-michaud](https://github.com/jack-michaud)
* [Floppy](https://github.com/Floppy)
* [loomchild](https://github.com/loomchild)
+* [jglauche](https://github.com/jglauche)
* [jenkr55](https://github.com/jenkr55)
* [hyenagirl64](https://github.com/hyenagirl64)
* [press5](https://github.com/press5)
* [TrollDecker](https://github.com/TrollDecker)
* [jmontane](https://github.com/jmontane)
-* [jonathanklee](https://github.com/jonathanklee)
-* [jguerder](https://github.com/jguerder)
-* [Jehops](https://github.com/Jehops)
-* [joshuap](https://github.com/joshuap)
-* [Tiwy57](https://github.com/Tiwy57)
-* [xuv](https://github.com/xuv)
-* [Jnsll](https://github.com/Jnsll)
-* [j0k3r](https://github.com/j0k3r)
-* [KEINOS](https://github.com/KEINOS)
-* [futoase](https://github.com/futoase)
-* [pot8to](https://github.com/pot8to)
+* [Jonathan Klee](mailto:klee.jonathan@gmail.com)
+* [Jordan Guerder](mailto:jguerder@fr.pulseheberg.net)
+* [Joseph Mingrone](mailto:jehops@users.noreply.github.com)
+* [Joshua Wood](mailto:josh@joshuawood.net)
+* [Julien](mailto:tiwy57@users.noreply.github.com)
+* [Julien Deswaef](mailto:juego@requiem4tv.com)
+* [June Sallou](mailto:jnsll@users.noreply.github.com)
+* [Jérémy Benoist](mailto:j0k3r@users.noreply.github.com)
+* [KEINOS](mailto:github@keinos.com)
+* [Keiji Matsuzaki](mailto:futoase@gmail.com)
+* [Kevin Liu](mailto:kevin@potatofrom.space)
* [Kit Redgrave](mailto:qwertyitis@gmail.com)
* [Knut Erik](mailto:abjectio@users.noreply.github.com)
-* [mkody](https://github.com/mkody)
-* [k0ta0uchi](https://github.com/k0ta0uchi)
-* [KrzysiekJ](https://github.com/KrzysiekJ)
+* [Kota Ouchi](mailto:k0ta0uchi@gmail.com)
+* [Krzysztof Jurewicz](mailto:krzysztof.jurewicz@gmail.com)
* [Leo Wzukw](mailto:leowzukw@users.noreply.github.com)
-* [Tak](https://github.com/Tak)
-* [cacheflow](https://github.com/cacheflow)
-* [ldidry](https://github.com/ldidry)
-* [jemus42](https://github.com/jemus42)
-* [lfuelling](https://github.com/lfuelling)
-* [Grabacr07](https://github.com/Grabacr07)
-* [mistermantas](https://github.com/mistermantas)
-* [MareenaKunjachan](https://github.com/MareenaKunjachan)
-* [mareklach](https://github.com/mareklach)
-* [wirehack7](https://github.com/wirehack7)
-* [martymcguire](https://github.com/martymcguire)
-* [marvinkopf](https://github.com/marvinkopf)
-* [otsune](https://github.com/otsune)
-* [mbugowski](https://github.com/mbugowski)
+* [Leonie](mailto:62470640+bubblineyuri@users.noreply.github.com)
+* [Levi Bard](mailto:taktaktaktaktaktaktaktaktaktak@gmail.com)
+* [Lex Alexander](mailto:l.alexander10@gmail.com)
+* [Lorenz Diener](mailto:lorenzd@gmail.com)
+* [Luc Didry](mailto:ldidry@users.noreply.github.com)
+* [Lukas Burk](mailto:jemus42@users.noreply.github.com)
+* [Manato Kameya](mailto:grabacr07+github@gmail.com)
+* [Mantas](mailto:mistermantas@users.noreply.github.com)
+* [Marcin Mikołajczak](mailto:me@mkljczk.pl)
+* [Mareena Kunjachan](mailto:mareenakunjachan@gmail.com)
+* [Marek Lach](mailto:marek.brohatwack.lach@gmail.com)
+* [Markus R](mailto:wirehack7@users.noreply.github.com)
+* [Marty McGuire](mailto:schmartissimo@gmail.com)
+* [Marvin Kopf](mailto:marvinkopf@posteo.de)
+* [Masafumi Otsune](mailto:info@otsune.com)
+* [Matej Ľach](mailto:matejlach@users.noreply.github.com)
+* [Mateusz Bugowski](mailto:23140767+mbugowski@users.noreply.github.com)
* [Mathias B](mailto:10813340+mathias-b@users.noreply.github.com)
-* [madmath03](https://github.com/madmath03)
-* [matt-auckland](https://github.com/matt-auckland)
-* [webroo](https://github.com/webroo)
+* [Mathieu Brunot](mailto:mb.mathieu.brunot@gmail.com)
+* [Matt](mailto:matt-auckland@users.noreply.github.com)
+* [Matt Sweetman](mailto:webroo@gmail.com)
* [Matthias Beyer](mailto:mail@beyermatthias.de)
* [Matthias Jouan](mailto:matthias.jouan@gmail.com)
* [Matthieu Paret](mailto:matthieuparet69@gmail.com)
@@ -512,10 +546,11 @@ and provided thanks to the work of the following contributors:
* [S.H](mailto:gamelinks007@gmail.com)
* [Sadiq Saif](mailto:staticsafe@users.noreply.github.com)
* [Sam Hewitt](mailto:hewittsamuel@gmail.com)
-* [Sasha Sorokin](mailto:dafri.nochiterov8@gmail.com)
+* [Sara Aimée Smiseth](mailto:51710585+sarasmiseth@users.noreply.github.com)
* [Satoshi KOJIMA](mailto:skoji@mac.com)
* [ScienJus](mailto:i@scienjus.com)
* [Scott Larkin](mailto:scott@codeclimate.com)
+* [Scott Sweeny](mailto:scott@ssweeny.net)
* [Sebastian Hübner](mailto:imolein@users.noreply.github.com)
* [Sebastian Morr](mailto:sebastian@morr.cc)
* [Sergei Č](mailto:noiwex1911@gmail.com)
@@ -525,10 +560,12 @@ and provided thanks to the work of the following contributors:
* [Shin Kojima](mailto:shin@kojima.org)
* [Shouko Yu](mailto:imshouko@gmail.com)
* [Sina Mashek](mailto:sina@mashek.xyz)
+* [Soft. Dev](mailto:24978+nileshkumar@users.noreply.github.com)
* [Soshi Kato](mailto:mail@sossii.com)
* [Spanky](mailto:2788886+spankyworks@users.noreply.github.com)
* [StefOfficiel](mailto:pichard.stephane@free.fr)
* [Steven Tappert](mailto:admin@dark-it.net)
+* [Stéphane Guillou](mailto:stephane.guillou@member.fsf.org)
* [Svetlozar Todorov](mailto:svetlik@users.noreply.github.com)
* [Sébastien Santoro](mailto:dereckson@espace-win.org)
* [Tad Thorley](mailto:phaedryx@users.noreply.github.com)
@@ -536,7 +573,10 @@ and provided thanks to the work of the following contributors:
* [Takayuki KUSANO](mailto:github@tkusano.jp)
* [TakesxiSximada](mailto:takesxi.sximada@gmail.com)
* [Tao Bror Bojlén](mailto:brortao@users.noreply.github.com)
+* [Taras Gogol](mailto:taras2358@gmail.com)
+* [Tdxdxoz](mailto:tdxdxoz@gmail.com)
* [TheInventrix](mailto:theinventrix@users.noreply.github.com)
+* [TheMainOne](mailto:50847364+theevilskeleton@users.noreply.github.com)
* [Thomas Alberola](mailto:thomas@needacoffee.fr)
* [Toby Deshane](mailto:fortyseven@users.noreply.github.com)
* [Toby Pinder](mailto:gigitrix@gmail.com)
@@ -563,6 +603,7 @@ and provided thanks to the work of the following contributors:
* [Yann Klis](mailto:yann.klis@gmail.com)
* [Yağızhan](mailto:35808275+yagizhan49@users.noreply.github.com)
* [Yeechan Lu](mailto:wz.bluesnow@gmail.com)
+* [Your Name](mailto:lorenzd@gmail.com)
* [Yusuke Abe](mailto:moonset20@gmail.com)
* [Zachary Spector](mailto:logicaldash@gmail.com)
* [ZiiX](mailto:ziix@users.noreply.github.com)
@@ -572,6 +613,7 @@ and provided thanks to the work of the following contributors:
* [bsky](mailto:git@imbsky.net)
* [caesarologia](mailto:lopesgemelli.1@gmail.com)
* [cbayerlein](mailto:c.bayerlein@gmail.com)
+* [chr v1.x](mailto:chr@cybre.space)
* [chrolis](mailto:chrolis@users.noreply.github.com)
* [cormo](mailto:cormorant2+github@gmail.com)
* [d0p1](mailto:dopi-sama@hush.com)
@@ -582,6 +624,7 @@ and provided thanks to the work of the following contributors:
* [fusshi-](mailto:dikky1218@users.noreply.github.com)
* [gentaro](mailto:gentaroooo@gmail.com)
* [gol-cha](mailto:info@mevo.xyz)
+* [guigeekz](mailto:pattusg@gmail.com)
* [hakoai](mailto:hk--76@qa2.so-net.ne.jp)
* [haosbvnker](mailto:github@chaosbunker.com)
* [ichi_i](mailto:51489410+ichi-i@users.noreply.github.com)
@@ -593,10 +636,11 @@ and provided thanks to the work of the following contributors:
* [jooops](mailto:joops@autistici.org)
* [jukper](mailto:jukkaperanto@gmail.com)
* [jumoru](mailto:jumoru@mailbox.org)
+* [kaiyou](mailto:pierre@jaury.eu)
* [karlyeurl](mailto:karl.yeurl@gmail.com)
* [kedama](mailto:32974885+kedamadq@users.noreply.github.com)
-* [kodai](mailto:shirafuta.kodai@gmail.com)
* [kuro5hin](mailto:rusty@kuro5hin.org)
+* [leo60228](mailto:leo@60228.dev)
* [luzpaz](mailto:luzpaz@users.noreply.github.com)
* [maxypy](mailto:maxime@mpigou.fr)
* [mhe](mailto:mail@marcus-herrmann.com)
@@ -607,21 +651,25 @@ and provided thanks to the work of the following contributors:
* [muan](mailto:muan@github.com)
* [namelessGonbai](mailto:43787036+namelessgonbai@users.noreply.github.com)
* [neetshin](mailto:neetshin@neetsh.in)
+* [noiob](mailto:8197071+noiob@users.noreply.github.com)
+* [notozeki](mailto:notozeki@users.noreply.github.com)
+* [ntl-purism](mailto:57806346+ntl-purism@users.noreply.github.com)
* [nzws](mailto:git-yuzu@svk.jp)
* [rch850](mailto:rich850@gmail.com)
* [roikale](mailto:roikale@users.noreply.github.com)
* [rysiekpl](mailto:rysiek@hackerspace.pl)
* [saturday06](mailto:dyob@lunaport.net)
+* [scd31](mailto:57571338+scd31@users.noreply.github.com)
* [scriptjunkie](mailto:scriptjunkie@scriptjunkie.us)
* [seekr](mailto:mario.drs@gmail.com)
+* [sternenseemann](mailto:git@lukasepple.de)
* [sundevour](mailto:31990469+sundevour@users.noreply.github.com)
* [syui](mailto:syui@users.noreply.github.com)
* [tackeyy](mailto:mailto.takita.yusuke@gmail.com)
-* [tateisu](mailto:tateisu@gmail.com)
+* [taicv](mailto:chuvantai@gmail.com)
* [tmyt](mailto:shigure@refy.net)
* [trevDev()](mailto:trev@trevdev.ca)
* [tsia](mailto:github@tsia.de)
-* [umonaca](mailto:53662960+umonaca@users.noreply.github.com)
* [utam0k](mailto:k0ma@utam0k.jp)
* [vpzomtrrfrt](mailto:vpzomtrrfrt@gmail.com)
* [walfie](mailto:walfington@gmail.com)
@@ -634,6 +682,7 @@ and provided thanks to the work of the following contributors:
* [りんすき](mailto:6533808+rinsuki@users.noreply.github.com)
* [ヨイツの賢狼ホロ | 3rd style](mailto:horo@yoitsu.moe)
* [唐宗勛](mailto:tangzongxun@hotmail.com)
+* [夕日](mailto:xirikm@gmail.com)
* [猫吸血鬼ディフリス / 猫ロキP](mailto:deflis@gmail.com)
* [艮 鮟鱇](mailto:ushitora_anqou@yahoo.co.jp)
* [西小倉宏信](mailto:nishiko@mindia.jp)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6296f001673..348d1cefc25 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,149 @@ Changelog
All notable changes to this project will be documented in this file.
+## Unreleased
+### Added
+
+- Add `SMTP_SSL` environment variable ([OmmyZhang](https://github.com/tootsuite/mastodon/pull/14309))
+- Add hotkey for toggling content warning input in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13987))
+- **Add e-mail-based sign in challenge for users with disabled 2FA** ([Gargron](https://github.com/tootsuite/mastodon/pull/14013))
+ - If user tries signing in after:
+ - Being inactive for a while
+ - With a previously unknown IP
+ - Without 2FA being enabled
+ - Require to enter a token sent via e-mail before sigining in
+- Add `limit` param to RSS feeds ([noellabo](https://github.com/tootsuite/mastodon/pull/13743))
+- Add `visibility` param to share page ([noellabo](https://github.com/tootsuite/mastodon/pull/13023))
+- Add blurhash to link previews ([ThibG](https://github.com/tootsuite/mastodon/pull/13984), [ThibG](https://github.com/tootsuite/mastodon/pull/14143), [ThibG](https://github.com/tootsuite/mastodon/pull/13985), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/14267), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/14278), [ThibG](https://github.com/tootsuite/mastodon/pull/14126), [ThibG](https://github.com/tootsuite/mastodon/pull/14261), [ThibG](https://github.com/tootsuite/mastodon/pull/14260))
+ - In web UI, toots cannot be marked as sensitive unless there is media attached
+ - However, it's possible to do via API or ActivityPub
+ - Thumnails of link previews of such posts now use blurhash in web UI
+ - The Card entity in REST API has a new `blurhash` attribute
+- Add support for `summary` field for media description in ActivityPub ([ThibG](https://github.com/tootsuite/mastodon/pull/13763))
+- Add hints about incomplete remote content to web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14031), [noellabo](https://github.com/tootsuite/mastodon/pull/14195))
+- **Add personal notes for accounts** ([ThibG](https://github.com/tootsuite/mastodon/pull/14148), [Gargron](https://github.com/tootsuite/mastodon/pull/14208), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/14251))
+ - To clarify, these are notes only you can see, to help you remember details
+ - Notes can be viewed and edited from profiles in web UI
+ - New REST API: `POST /api/v1/accounts/:id/note` with `comment` param
+ - The Relationship entity in REST API has a new `note` attribute
+- Add Helm chart ([dunn](https://github.com/tootsuite/mastodon/pull/14090), [dunn](https://github.com/tootsuite/mastodon/pull/14256), [dunn](https://github.com/tootsuite/mastodon/pull/14245))
+- **Add customizable thumbnails for audio and video attachments** ([Gargron](https://github.com/tootsuite/mastodon/pull/14145), [Gargron](https://github.com/tootsuite/mastodon/pull/14244), [Gargron](https://github.com/tootsuite/mastodon/pull/14273), [Gargron](https://github.com/tootsuite/mastodon/pull/14203), [ThibG](https://github.com/tootsuite/mastodon/pull/14255), [ThibG](https://github.com/tootsuite/mastodon/pull/14306))
+ - Metadata (album, artist, etc) is no longer stripped from audio files
+ - Album art is automatically extracted from audio files
+ - Thumbnail can be manually uploaded for both audio and video attachments
+ - Media upload APIs now support `thumbnail` param
+ - On `POST /api/v1/media` and `POST /api/v2/media`
+ - And on `PUT /api/v1/media/:id`
+ - ActivityPub representation of media attachments represents custom thumbnails with an `icon` attribute
+- **Add color extraction for thumbnails** ([Gargron](https://github.com/tootsuite/mastodon/pull/14209), [ThibG](https://github.com/tootsuite/mastodon/pull/14264))
+ - The `meta` attribute on the Media Attachment entity in REST API can now have a `colors` attribute which in turn contains three hex colors: `background`, `foreground`, and `accent`
+ - The background color is chosen from the most dominant color around the edges of the thumbnail
+ - The foreground and accent colors are chosen from the colors that are the most different from the background color using the CIEDE2000 algorithm
+ - The most satured color of the two is designated as the accent color
+ - The one with the highest W3C contrast is designated as the foreground color
+ - If there are not enough colors in the thumbnail, new ones are generated using a monochrome pattern
+- Add a visibility indicator to toots in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/14123), [highemerly](https://github.com/tootsuite/mastodon/pull/14292))
+- Add `tootctl email_domain_blocks` ([tateisu](https://github.com/tootsuite/mastodon/pull/13589), [Gargron](https://github.com/tootsuite/mastodon/pull/14147))
+- Add "Add new domain block" to header of federation page in admin UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13934))
+- Add ability to keep emoji picker open with ctrl+click in web UI ([bclindner](https://github.com/tootsuite/mastodon/pull/13896), [noellabo](https://github.com/tootsuite/mastodon/pull/14096))
+
+### Changed
+
+- Change `.env.production.sample` to be leaner and cleaner ([Gargron](https://github.com/tootsuite/mastodon/pull/14206))
+ - It was overloaded as de-facto documentation and getting quite crowded
+ - Defer to the actual documentation while still giving a minimal example
+- Change `tootctl search deploy` to work faster and display progress ([Gargron](https://github.com/tootsuite/mastodon/pull/14300))
+- Change User-Agent of link preview fetching service to include "Bot" ([Gargron](https://github.com/tootsuite/mastodon/pull/14248))
+ - Some websites may not render OpenGraph tags into HTML if that's not the case
+- Change behaviour to carry blocks over when someone migrates their followers ([ThibG](https://github.com/tootsuite/mastodon/pull/14144))
+- Change volume control and download buttons in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14122))
+- **Change design of audio players in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/14095), [ThibG](https://github.com/tootsuite/mastodon/pull/14281), [Gargron](https://github.com/tootsuite/mastodon/pull/14282), [ThibG](https://github.com/tootsuite/mastodon/pull/14118), [Gargron](https://github.com/tootsuite/mastodon/pull/14199))
+- Change reply filter to never filter own toots in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14128))
+- Change boost button to no longer serve as visibility indicator in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/14132))
+- Change contrast of flash messages ([cchoi12](https://github.com/tootsuite/mastodon/pull/13892))
+- Change wording from "Hide media" to "Hide image/images" in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13834))
+- Change appearence of settings pages to be more consistent ([ariasuni](https://github.com/tootsuite/mastodon/pull/13938))
+- Change "Add media" tooltip to not include long list of formats in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13954))
+- Change how badly contrasting emoji are rendered in web UI ([leo60228](https://github.com/tootsuite/mastodon/pull/13773), [ThibG](https://github.com/tootsuite/mastodon/pull/13772), [mfmfuyu](https://github.com/tootsuite/mastodon/pull/14020), [ThibG](https://github.com/tootsuite/mastodon/pull/14015))
+- Change structure of unavailable content section on about page ([ariasuni](https://github.com/tootsuite/mastodon/pull/13930))
+- Change behaviour to accept ActivityPub activities relayed through group actor ([noellabo](https://github.com/tootsuite/mastodon/pull/14279))
+
+### Removed
+
+- Remove the terms "blacklist" and "whitelist" from UX ([Gargron](https://github.com/tootsuite/mastodon/pull/14149), [mayaeh](https://github.com/tootsuite/mastodon/pull/14192))
+ - Environment variables changed (old versions continue to work):
+ - `WHITELIST_MODE` → `LIMITED_FEDERATION_MODE`
+ - `EMAIL_DOMAIN_BLACKLIST` → `EMAIL_DOMAIN_DENYLIST`
+ - `EMAIL_DOMAIN_WHITELIST` → `EMAIL_DOMAIN_ALLOWLIST`
+ - CLI option changed:
+ - `tootctl domains purge --whitelist-mode` → `tootctl domains purge --limited-federation-mode`
+- Remove some unnecessary database indices ([lfuelling](https://github.com/tootsuite/mastodon/pull/13695), [noellabo](https://github.com/tootsuite/mastodon/pull/14259))
+- Remove unnecessary Node.js version upper bound ([ykzts](https://github.com/tootsuite/mastodon/pull/14139))
+
+### Fixed
+
+- Fix large shortened numbers (like 1.2K) using incorrect pluralization ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/14061))
+- Fix streaming server trying to use empty password to connect to Redis when `REDIS_PASSWORD` is given but blank ([ThibG](https://github.com/tootsuite/mastodon/pull/14135))
+- Fix being unable to unboost posts when blocked by their author ([ThibG](https://github.com/tootsuite/mastodon/pull/14308))
+- Fix account domain block not properly unfollowing accounts from domain ([Gargron](https://github.com/tootsuite/mastodon/pull/14304))
+- Fix removing a domain allow wiping known accounts in open federation mode ([ThibG](https://github.com/tootsuite/mastodon/pull/14298))
+- Fix blocks and mutes pagination in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14275))
+- Fix new posts pushing down origin of opened dropdown in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14271))
+- Fix timeline markers not being saved sometimes ([ThibG](https://github.com/tootsuite/mastodon/pull/13887), [ThibG](https://github.com/tootsuite/mastodon/pull/13889), [ThibG](https://github.com/tootsuite/mastodon/pull/14155))
+- Fix CSV uploads being rejected ([noellabo](https://github.com/tootsuite/mastodon/pull/13835))
+- Fix incompatibility with ElasticSearch 7.x ([noellabo](https://github.com/tootsuite/mastodon/pull/13828))
+- Fix being able to search posts where you're in the target audience but not actively mentioned ([noellabo](https://github.com/tootsuite/mastodon/pull/13829))
+- Fix non-local posts appearing on local-only hashtag timelines in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/13827))
+- Fix `tootctl media remove-orphans` choking on unknown files in storage ([Gargron](https://github.com/tootsuite/mastodon/pull/13765))
+- Fix `tootctl upgrade storage-schema` misbehaving ([Gargron](https://github.com/tootsuite/mastodon/pull/13761), [angristan](https://github.com/tootsuite/mastodon/pull/13768))
+ - Fix it marking records as upgraded even though no files were moved
+ - Fix it not working with S3 storage
+ - Fix it not working with custom emojis
+- Fix GIF reader raising incorrect exceptions ([ThibG](https://github.com/tootsuite/mastodon/pull/13760))
+- Fix hashtag search performing account search as well ([ThibG](https://github.com/tootsuite/mastodon/pull/13758))
+- Fix Webfinger returning wrong status code on malformed or missing param ([ThibG](https://github.com/tootsuite/mastodon/pull/13759))
+- Fix `rake mastodon:setup` error when some environment variables are set ([ThibG](https://github.com/tootsuite/mastodon/pull/13928))
+- Fix admin page crashing when trying to block an invalid domain name in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13884))
+- Fix unsent toot confirmation dialog not popping up in single column mode in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13888))
+- Fix performance of follow import ([noellabo](https://github.com/tootsuite/mastodon/pull/13836))
+ - Reduce timeout of Webfinger requests to that of other requests
+ - Use circuit breakers to stop hitting unresponsive servers
+ - Avoid hitting servers that are already known to be generally unavailable
+- Fix filters ignoring media descriptions ([BenLubar](https://github.com/tootsuite/mastodon/pull/13837))
+- Fix soem actions on custom emojis leading to cryptic errors in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13951))
+- Fix ActivityPub serialization of replies when some of them are URIs ([ThibG](https://github.com/tootsuite/mastodon/pull/13957))
+- Fix `rake mastodon:setup` choking on environment variables containing `%` ([ThibG](https://github.com/tootsuite/mastodon/pull/13940))
+- Fix account redirect confirmation message talking about moved followers ([ThibG](https://github.com/tootsuite/mastodon/pull/13950))
+- Fix avatars having the wrong size on public detailed status pages ([ThibG](https://github.com/tootsuite/mastodon/pull/14140))
+- Fix various issues around OpenGraph representation of media ([Gargron](https://github.com/tootsuite/mastodon/pull/14133))
+ - Pages containing audio no longer say "Attached: 1 image" in description
+ - Audio attachments now represented as OpenGraph `og:audio`
+ - The `twitter:player` page now uses Mastodon's proper audio/video player
+ - Audio/video buffered bars now display correctly in audio/video player
+ - Volume and progress bars now respond to movement/move smoother
+- Fix audio/video/images/cards not reacting to window resizes in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14130))
+- Fix very wide media attachments resulting in too thin a thumbnail in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14127))
+- Fix crash when merging posts into home feed after following someone ([ThibG](https://github.com/tootsuite/mastodon/pull/14129))
+- Fix unique username constraint for local users not being enforced in database ([ThibG](https://github.com/tootsuite/mastodon/pull/14099))
+- Fix unnecessary gap under video modal in web UI ([mfmfuyu](https://github.com/tootsuite/mastodon/pull/14098))
+- Fix 2FA and sign in token pages not respecting user locale ([mfmfuyu](https://github.com/tootsuite/mastodon/pull/14087))
+- Fix unapproved users being able to view profiles when in limited-federation mode *and* requiring approval for sign-ups ([ThibG](https://github.com/tootsuite/mastodon/pull/14093))
+- Fix initial audio volume not corresponding to what's displayed in audio player in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14057))
+- Fix timelines sometimes jumping when closing modals in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14019))
+- Fix memory usage of downloading remote files ([Gargron](https://github.com/tootsuite/mastodon/pull/14184), [Gargron](https://github.com/tootsuite/mastodon/pull/14181))
+ - Don't read entire file (up to 40 MB) into memory
+ - Read and write it to temp file in small chunks
+- Fix inconsistent account header padding in web UI ([trwnh](https://github.com/tootsuite/mastodon/pull/14179))
+- Fix Thai being skipped from language detection ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/13989))
+ - Since Thai has its own alphabet, it can be detected more reliably
+- Fix broken hashtag column options styling in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14247))
+- Fix pointer cursor being shown on toots that are not clickable in web UI ([arielrodrigues](https://github.com/tootsuite/mastodon/pull/14185))
+- Fix lock icon not being shown when locking account in profile settings ([ThibG](https://github.com/tootsuite/mastodon/pull/14190))
+- Fix domain blocks doing work the wrong way around ([ThibG](https://github.com/tootsuite/mastodon/pull/13424))
+ - Instead of suspending accounts one by one, mark all as suspended first (quick)
+ - Only then proceed to start removing their data (slow)
+ - Clear out media attachments in a separate worker (slow)
+
## [v3.1.5] - 2020-07-07
### Security
diff --git a/app/javascript/mastodon/features/audio/index.js b/app/javascript/mastodon/features/audio/index.js
index 2f85ebb7e3a..1ab1c3117d7 100644
--- a/app/javascript/mastodon/features/audio/index.js
+++ b/app/javascript/mastodon/features/audio/index.js
@@ -298,6 +298,8 @@ class Audio extends React.PureComponent {
_renderCanvas () {
requestAnimationFrame(() => {
+ if (!this.audio) return;
+
this.handleTimeUpdate();
this._clear();
this._draw();
diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js
index fb12567f0d6..99dcdca2216 100644
--- a/app/javascript/mastodon/features/video/index.js
+++ b/app/javascript/mastodon/features/video/index.js
@@ -182,6 +182,8 @@ class Video extends React.PureComponent {
_updateTime () {
requestAnimationFrame(() => {
+ if (!this.video) return;
+
this.handleTimeUpdate();
if (!this.state.paused) {
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index 7d4c1c45ed0..17c4302c268 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -23,7 +23,7 @@
"account.last_status": "Hoạt động gần đây",
"account.link_verified_on": "Liên kết này đã được xác thực vào {date}",
"account.locked_info": "Người dùng này thiết lập trạng thái ẩn. Họ sẽ tự mình xét duyệt các yêu cầu theo dõi.",
- "account.media": "Đa phương tiện",
+ "account.media": "Bộ sưu tập",
"account.mention": "Nhắc đến @{name}",
"account.moved_to": "{name} đã dời sang:",
"account.mute": "Ẩn @{name}",
@@ -43,7 +43,7 @@
"account.unfollow": "Ngưng theo dõi",
"account.unmute": "Bỏ ẩn @{name}",
"account.unmute_notifications": "Hiển lại thông báo từ @{name}",
- "account_note.placeholder": "Không nói gì thêm",
+ "account_note.placeholder": "Nhấn để thêm ghi chú",
"alert.rate_limited.message": "Vui lòng thử lại sau {retry_time, time, medium}.",
"alert.rate_limited.title": "Vượt giới hạn",
"alert.unexpected.message": "Đã xảy ra lỗi không mong muốn.",
diff --git a/app/services/after_unallow_domain_service.rb b/app/services/after_unallow_domain_service.rb
new file mode 100644
index 00000000000..ccd0b8ae919
--- /dev/null
+++ b/app/services/after_unallow_domain_service.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AfterUnallowDomainService < BaseService
+ def call(domain)
+ Account.where(domain: domain).find_each do |account|
+ SuspendAccountService.new.call(account, reserve_username: false)
+ end
+ end
+end
diff --git a/app/services/unallow_domain_service.rb b/app/services/unallow_domain_service.rb
index 870c799514b..fc526076122 100644
--- a/app/services/unallow_domain_service.rb
+++ b/app/services/unallow_domain_service.rb
@@ -12,8 +12,7 @@ class UnallowDomainService < BaseService
private
def suspend_accounts!(domain)
- Account.where(domain: domain).find_each do |account|
- SuspendAccountService.new.call(account, reserve_username: false)
- end
+ Account.where(domain: domain).in_batches.update_all(suspended_at: Time.now.utc)
+ AfterUnallowDomainWorker.perform_async(domain)
end
end
diff --git a/app/workers/after_unallow_domain_worker.rb b/app/workers/after_unallow_domain_worker.rb
new file mode 100644
index 00000000000..46049cbb2e0
--- /dev/null
+++ b/app/workers/after_unallow_domain_worker.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AfterUnallowDomainWorker
+ include Sidekiq::Worker
+
+ def perform(domain)
+ AfterUnallowDomainService.new.call(domain)
+ end
+end
diff --git a/config/locales/bn.yml b/config/locales/bn.yml
index 928d5426fe4..3b575100f67 100644
--- a/config/locales/bn.yml
+++ b/config/locales/bn.yml
@@ -21,9 +21,7 @@ bn:
federation_hint_html: "%{instance}তে একটা নিবন্ধন থাকলে আপনি যেকোনো মাস্টাডন বা এধরণের অন্যান্য সার্ভারের মানুষের সাথে যুক্ত হতে পারবেন ।"
get_apps: মোবাইল এপ্প একটা ব্যবহার করতে পারেন
hosted_on: এই মাস্টাডনটি আছে %{domain} এ
- instance_actor_flash: 'এই অ্যাকাউন্টটি ভার্চুয়াল এক্টর যা নিজে কোনও সার্ভারের প্রতিনিধিত্ব করতে ব্যবহৃত হয় এবং কোনও পৃথক ব্যবহারকারী নয়। এটি ফেডারেশনের উদ্দেশ্যে ব্যবহৃত হয় এবং আপনি যদি পুরো ইনস্ট্যান্স ব্লক করতে না চান তবে অবরুদ্ধ করা উচিত নয়, সেক্ষেত্রে আপনার ডোমেন ব্লক ব্যবহার করা উচিত।
-
- '
+ instance_actor_flash: এই অ্যাকাউন্টটি ভার্চুয়াল এক্টর যা নিজে কোনও সার্ভারের প্রতিনিধিত্ব করতে ব্যবহৃত হয় এবং কোনও পৃথক ব্যবহারকারী নয়। এটি ফেডারেশনের উদ্দেশ্যে ব্যবহৃত হয় এবং আপনি যদি পুরো ইনস্ট্যান্স ব্লক করতে না চান তবে অবরুদ্ধ করা উচিত নয়, সেক্ষেত্রে আপনার ডোমেন ব্লক ব্যবহার করা উচিত।
learn_more: বিস্তারিত জানুন
privacy_policy: গোপনীয়তা নীতি
see_whats_happening: কী কী হচ্ছে দেখুন
diff --git a/config/locales/devise.zh-HK.yml b/config/locales/devise.zh-HK.yml
index e1bb9f95902..f72fd55a3ce 100644
--- a/config/locales/devise.zh-HK.yml
+++ b/config/locales/devise.zh-HK.yml
@@ -47,7 +47,7 @@ zh-HK:
subject: 'Mastodon: 重設密碼'
title: 重設密碼
two_factor_disabled:
- explanation: 您帳戶的兩步驟驗證已停用。現在只能使用電子信箱位址及密碼登入。
+ explanation: 您帳戶的兩步驟驗證已停用。現在只能使用電子信箱及密碼登入。
subject: Mastodon:已停用兩步驟驗證
title: 已停用 2FA
two_factor_enabled:
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index 3e92dcd3678..fde1a820ead 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -21,9 +21,7 @@ eu:
federation_hint_html: "%{instance} instantzian kontu bat izanda edozein Mastodon zerbitzariko jendea jarraitu ahal izango duzu, eta harago ere."
get_apps: Probatu mugikorrerako aplikazio bat
hosted_on: Mastodon %{domain} domeinuan ostatatua
- instance_actor_flash: 'Kontu hau zerbitzaria bera adierazten duen aktore birtual bat da, ez norbanako bat. Federaziorako erabiltzen da eta ez zenuke blokeatu behar instantzia osoa blokeatu nahi ez baduzu, kasu horretan domeinua blokeatzea egokia litzateke.
-
- '
+ instance_actor_flash: Kontu hau zerbitzaria bera adierazten duen aktore birtual bat da, ez norbanako bat. Federaziorako erabiltzen da eta ez zenuke blokeatu behar instantzia osoa blokeatu nahi ez baduzu, kasu horretan domeinua blokeatzea egokia litzateke.
learn_more: Ikasi gehiago
privacy_policy: Pribatutasun politika
see_whats_happening: Ikusi zer gertatzen ari den
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index 77c5ec911a5..c2fb18d5743 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -21,9 +21,7 @@ gl:
federation_hint_html: Cunha conta en %{instance} poderás seguir ás persoas en calquera servidor do Mastodon e alén.
get_apps: Probar unha aplicación móbil
hosted_on: Mastodon aloxado en %{domain}
- instance_actor_flash: 'Esta conta é un actor virtual utilizado para representar ao servidor e non a unha usuaria individual. Utilízase para propósitos de federación e non debería estar bloqueada a menos que queiras bloquear a toda a instancia, en tal caso deberías utilizar o bloqueo do dominio.
-
- '
+ instance_actor_flash: Esta conta é un actor virtual utilizado para representar ao servidor e non a unha usuaria individual. Utilízase para propósitos de federación e non debería estar bloqueada a menos que queiras bloquear a toda a instancia, en tal caso deberías utilizar o bloqueo do dominio.
learn_more: Saber máis
privacy_policy: Política de privacidade
see_whats_happening: Ver o que está a acontecer
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index 1f5d2a73825..9ae551a3450 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -21,9 +21,7 @@ hu:
federation_hint_html: Egy %{instance} fiókkal bármely más Mastodon szerveren vagy a föderációban lévő felhasználót követni tudsz.
get_apps: Próbálj ki egy mobil appot
hosted_on: "%{domain} Mastodon szerver"
- instance_actor_flash: 'Ez a fiók egy virtuális szereplő, mely magát a szervert reprezentálja, nem egy felhasználót. Ez a föderáció támogatására készült, ezért nem szabad blokkolni, hacsak egy teljes szervert nem akarsz kitiltani, amire persze a domain blokkolása jobb megoldás.
-
- '
+ instance_actor_flash: Ez a fiók egy virtuális szereplő, mely magát a szervert reprezentálja, nem egy felhasználót. Ez a föderáció támogatására készült, ezért nem szabad blokkolni, hacsak egy teljes szervert nem akarsz kitiltani, amire persze a domain blokkolása jobb megoldás.
learn_more: Tudj meg többet
privacy_policy: Adatvédelmi szabályzat
see_whats_happening: Nézd, mi történik
diff --git a/config/locales/id.yml b/config/locales/id.yml
index 1c648e28f90..ad18cefb77e 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -21,9 +21,7 @@ id:
federation_hint_html: Dengan akun di %{instance} Anda dapat mengikuti orang di server Mastodon mana pun dan di luarnya.
get_apps: Coba aplikasi mobile
hosted_on: Mastodon dihosting di %{domain}
- instance_actor_flash: 'Akun ini adalah aktor virtual yang dipakai untuk merepresentasikan server, bukan pengguna individu. Ini dipakai untuk tujuan federasi dan jangan diblokir kecuali Anda ingin memblokir seluruh instansi, yang seharusnya Anda pakai blokir domain.
-
- '
+ instance_actor_flash: Akun ini adalah aktor virtual yang dipakai untuk merepresentasikan server, bukan pengguna individu. Ini dipakai untuk tujuan federasi dan jangan diblokir kecuali Anda ingin memblokir seluruh instansi, yang seharusnya Anda pakai blokir domain.
learn_more: Pelajari selengkapnya
privacy_policy: Kebijakan Privasi
see_whats_happening: Lihat apa yang sedang terjadi
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index bb99ab26c48..fb625554677 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -21,9 +21,7 @@ ja:
federation_hint_html: "%{instance} のアカウントひとつでどんなMastodon互換サーバーのユーザーでもフォローできるでしょう。"
get_apps: モバイルアプリを試す
hosted_on: Mastodon hosted on %{domain}
- instance_actor_flash: 'このアカウントはサーバーそのものを示す仮想的なもので、特定のユーザーを示すものではありません。これはサーバーの連合のために使用されます。サーバー全体をブロックするときは、このアカウントをブロックせずに、ドメインブロックを使用してください。
-
- '
+ instance_actor_flash: このアカウントはサーバーそのものを示す仮想的なもので、特定のユーザーを示すものではありません。これはサーバーの連合のために使用されます。サーバー全体をブロックするときは、このアカウントをブロックせずに、ドメインブロックを使用してください。
learn_more: もっと詳しく
privacy_policy: プライバシーポリシー
see_whats_happening: やりとりを見てみる
diff --git a/config/locales/kab.yml b/config/locales/kab.yml
index cb1b73c8ab9..1d34355b3d5 100644
--- a/config/locales/kab.yml
+++ b/config/locales/kab.yml
@@ -263,6 +263,7 @@ kab:
add_new: Rnu amaynut
delete: Kkes
domain: Taγult
+ from_html: seg %{domain}
new:
create: Rnu taγult
title: Timerna n taɣult tamaynut n imayl ɣer tebdart taberkant
@@ -303,6 +304,9 @@ kab:
title: Imnegliyen
reports:
account:
+ notes:
+ one: "%{count} n tamawt"
+ other: "%{count} n timawin"
reports:
one: "%{count} uneqqis"
other: "%{count} n ineqqisen"
@@ -382,6 +386,7 @@ kab:
view_profile: Ssken-d amaɣnu
view_status: Ssken-d tasuffiɣt
auth:
+ apply_for_account: Suter asnebgi
change_password: Awal uffir
checkbox_agreement_html: Qebleγ ilugan n uqeddac-a akked tiwtilin n useqdec
checkbox_agreement_without_rules_html: Qebleγ tiwtilin n useqdec
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 600f9a6f52f..c92b6c1db52 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -21,9 +21,7 @@ nl:
federation_hint_html: Met een account op %{instance} ben je in staat om mensen die zich op andere Mastodonservers (en op andere plekken) bevinden te volgen.
get_apps: Mobiele apps
hosted_on: Mastodon op %{domain}
- instance_actor_flash: 'Dit account is een virtuel actor dat wordt gebruikt om de server zelf te vertegenwoordigen en is geen individuele gebruiker. Het wordt voor federatiedoeleinden gebruikt en moet niet worden geblokkeerd, tenzij je de hele server wilt blokkeren. In zo''n geval dien je echter een domeinblokkade te gebruiken.
-
- '
+ instance_actor_flash: Dit account is een virtuel actor dat wordt gebruikt om de server zelf te vertegenwoordigen en is geen individuele gebruiker. Het wordt voor federatiedoeleinden gebruikt en moet niet worden geblokkeerd, tenzij je de hele server wilt blokkeren. In zo'n geval dien je echter een domeinblokkade te gebruiken.
learn_more: Meer leren
privacy_policy: Privacybeleid
see_whats_happening: Kijk wat er aan de hand is
diff --git a/config/locales/no.yml b/config/locales/no.yml
index 13834b42883..32368fc9a2b 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -21,9 +21,7 @@
federation_hint_html: Med en konto på %{instance} vil du kunne følge folk på enhver Mastodon-tjener, og mer til.
get_apps: Prøv en mobilapp
hosted_on: Mastodon driftet på %{domain}
- instance_actor_flash: 'Denne brukeren er en virtuell aktør brukt til å representere selve serveren og ingen individuell bruker. Det brukes til foreningsformål og bør ikke blokkeres med mindre du vil blokkere hele instansen, hvor domeneblokkering bør brukes i stedet.
-
- '
+ instance_actor_flash: Denne brukeren er en virtuell aktør brukt til å representere selve serveren og ingen individuell bruker. Det brukes til foreningsformål og bør ikke blokkeres med mindre du vil blokkere hele instansen, hvor domeneblokkering bør brukes i stedet.
learn_more: Lær mer
privacy_policy: Privatlivsretningslinjer
see_whats_happening: Se hva som skjer
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index 43c4a2a7ae4..ebedfb4f944 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -21,9 +21,7 @@ sv:
federation_hint_html: Med ett konto på %{instance} kommer du att kunna följa personer på alla Mastodon-servers och mer än så.
get_apps: Prova en mobilapp
hosted_on: Mastodon-värd på %{domain}
- instance_actor_flash: 'Detta konto är en virtuell agent som används för att representera servern själv och inte någon individuell användare. Det används av sammanslutningsskäl och ska inte blockeras såvitt du inte vill blockera hela instansen, och för detta fall ska domänblockering användas.
-
- '
+ instance_actor_flash: Detta konto är en virtuell agent som används för att representera servern själv och inte någon individuell användare. Det används av sammanslutningsskäl och ska inte blockeras såvitt du inte vill blockera hela instansen, och för detta fall ska domänblockering användas.
learn_more: Lär dig mer
privacy_policy: Integritetspolicy
see_whats_happening: Se vad som händer
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index 8adbaeb5444..7b13c40c0ef 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -21,9 +21,7 @@ uk:
federation_hint_html: З обліковим записом на %{instance} ви зможете слідкувати за людьми на будь-якому сервері Mastodon та поза ним.
get_apps: Спробуйте мобільний додаток
hosted_on: Mastodon розміщено на %{domain}
- instance_actor_flash: 'Цей обліковий запис є віртуальною особою, яка використовується для представлення самого сервера, а не певного користувача. Він використовується для потреб федерації і не повинен бути заблокований, якщо тільки ви не хочете заблокувати весь сервер, у цьому випадку ви повинні скористатися блокуванням домену.
-
- '
+ instance_actor_flash: Цей обліковий запис є віртуальною особою, яка використовується для представлення самого сервера, а не певного користувача. Він використовується для потреб федерації і не повинен бути заблокований, якщо тільки ви не хочете заблокувати весь сервер, у цьому випадку ви повинні скористатися блокуванням домену.
learn_more: Дізнатися більше
privacy_policy: Політика приватності
see_whats_happening: Погляньте, що відбувається
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index d952f05c9ed..1b5cfe1d1e5 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -21,9 +21,7 @@ vi:
federation_hint_html: Đăng ký tài khoản %{instance}, bạn có thể giao tiếp với mọi người trên bất kỳ máy chủ Mastodon nào và hơn thế nữa.
get_apps: Dùng thử ứng dụng di động
hosted_on: "%{domain} vận hành nhờ Mastodon"
- instance_actor_flash: 'Tài khoản này là một tác nhân ảo được sử dụng để đại diện cho chính máy chủ chứ không phải bất kỳ người dùng cá nhân nào. Nó được sử dụng cho mục đích liên kết và không nên bị chặn trừ khi bạn muốn chặn toàn bộ máy chủ.
-
- '
+ instance_actor_flash: Tài khoản này là một tác nhân ảo được sử dụng để đại diện cho chính máy chủ chứ không phải bất kỳ người dùng cá nhân nào. Nó được sử dụng cho mục đích liên kết và không nên bị chặn trừ khi bạn muốn chặn toàn bộ máy chủ.
learn_more: Tìm hiểu thêm
privacy_policy: Chính sách bảo mật
see_whats_happening: Xem những gì đang xảy ra
@@ -60,7 +58,7 @@ vi:
joined: Đã tham gia %{date}
last_active: hoạt động gần đây
link_verified_on: Liên kết này đã được xác thực quyền sở hữu vào %{date}
- media: Đa phương tiện
+ media: Bộ sưu tập
moved_html: "%{name} đã dời sang %{new_profile_link}:"
network_hidden: Thông tin này không còn tồn tại
never_active: Chưa có
@@ -587,7 +585,7 @@ vi:
deleted: Đã xóa
failed_to_execute: Không thể thực thi
media:
- title: Đa phương tiện
+ title: Bộ sưu tập
no_media: Không có ảnh hoặc video
no_status_selected: Không có tút nào thay đổi vì không có tút nào được chọn
title: Trạng thái tài khoản
@@ -723,7 +721,7 @@ vi:
invalid_signature: không phải là chữ ký số Ed25519 đúng
date:
formats:
- default: "%d.%m.%Y"
+ default: "%b.%-m.%Y"
datetime:
distance_in_words:
about_x_hours: "%{count}h"
@@ -1161,7 +1159,7 @@ vi:
mastodon-light: Mastodon (Sáng)
time:
formats:
- default: "%b %d, %Y, %H:%M"
+ default: lúc %H:%M %b %d năm%_Y
month: "%B %Y"
two_factor_authentication:
code_hint: Nhập mã được tạo bởi ứng dụng xác thực của bạn để xác nhận
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 090485ff89a..3d62230d88e 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -21,9 +21,7 @@ zh-CN:
federation_hint_html: 在%{instance} 上拥有账号后,你可以关注任何 Mastodon 服务器或其他服务器上的人。
get_apps: 尝试移动应用
hosted_on: 一个在 %{domain} 上运行的 Mastodon 实例
- instance_actor_flash: '这个账号是个虚拟帐号,不代表任何用户,只用来代表服务器本身。它用于和其它服务器互通,所以不应该被封禁,除非你想封禁整个实例。但是想封禁整个实例的时候,你应该用域名封禁。
-
- '
+ instance_actor_flash: 这个账号是个虚拟帐号,不代表任何用户,只用来代表服务器本身。它用于和其它服务器互通,所以不应该被封禁,除非你想封禁整个实例。但是想封禁整个实例的时候,你应该用域名封禁。
learn_more: 了解详情
privacy_policy: 隐私政策
see_whats_happening: 看一看现在在发生什么
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index 87fc67debd7..2a1783c956b 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -9,15 +9,15 @@ module Mastodon
end
def minor
- 1
+ 2
end
def patch
- 5
+ 0
end
def flags
- ''
+ 'rc1'
end
def suffix
diff --git a/spec/services/unallow_domain_service_spec.rb b/spec/services/unallow_domain_service_spec.rb
new file mode 100644
index 00000000000..559e152fb25
--- /dev/null
+++ b/spec/services/unallow_domain_service_spec.rb
@@ -0,0 +1,64 @@
+require 'rails_helper'
+
+RSpec.describe UnallowDomainService, type: :service do
+ let!(:bad_account) { Fabricate(:account, username: 'badguy666', domain: 'evil.org') }
+ let!(:bad_status1) { Fabricate(:status, account: bad_account, text: 'You suck') }
+ let!(:bad_status2) { Fabricate(:status, account: bad_account, text: 'Hahaha') }
+ let!(:bad_attachment) { Fabricate(:media_attachment, account: bad_account, status: bad_status2, file: attachment_fixture('attachment.jpg')) }
+ let!(:already_banned_account) { Fabricate(:account, username: 'badguy', domain: 'evil.org', suspended: true, silenced: true) }
+ let!(:domain_allow) { Fabricate(:domain_allow, domain: 'evil.org') }
+
+ subject { UnallowDomainService.new }
+
+ context 'in limited federation mode' do
+ before do
+ allow(subject).to receive(:whitelist_mode?).and_return(true)
+ end
+
+ describe '#call' do
+ before do
+ subject.call(domain_allow)
+ end
+
+ it 'removes the allowed domain' do
+ expect(DomainAllow.allowed?('evil.org')).to be false
+ end
+
+ it 'removes remote accounts from that domain' do
+ expect(Account.where(domain: 'evil.org').exists?).to be false
+ end
+
+ it 'removes the remote accounts\'s statuses and media attachments' do
+ expect { bad_status1.reload }.to raise_exception ActiveRecord::RecordNotFound
+ expect { bad_status2.reload }.to raise_exception ActiveRecord::RecordNotFound
+ expect { bad_attachment.reload }.to raise_exception ActiveRecord::RecordNotFound
+ end
+ end
+ end
+
+ context 'without limited federation mode' do
+ before do
+ allow(subject).to receive(:whitelist_mode?).and_return(false)
+ end
+
+ describe '#call' do
+ before do
+ subject.call(domain_allow)
+ end
+
+ it 'removes the allowed domain' do
+ expect(DomainAllow.allowed?('evil.org')).to be false
+ end
+
+ it 'does not remove accounts from that domain' do
+ expect(Account.where(domain: 'evil.org').exists?).to be true
+ end
+
+ it 'removes the remote accounts\'s statuses and media attachments' do
+ expect { bad_status1.reload }.to_not raise_exception ActiveRecord::RecordNotFound
+ expect { bad_status2.reload }.to_not raise_exception ActiveRecord::RecordNotFound
+ expect { bad_attachment.reload }.to_not raise_exception ActiveRecord::RecordNotFound
+ end
+ end
+ end
+end