Merge branch 'master' into glitch-soc/merge-upstream
Conflicts: app/controllers/oauth/authorizations_controller.rb Just two changes being too close to one another. Took both.
This commit is contained in:
commit
cd99255698
27 changed files with 506 additions and 148 deletions
313
AUTHORS.md
313
AUTHORS.md
|
@ -3,76 +3,85 @@ and provided thanks to the work of the following contributors:
|
||||||
|
|
||||||
* [Gargron](https://github.com/Gargron)
|
* [Gargron](https://github.com/Gargron)
|
||||||
* [ykzts](https://github.com/ykzts)
|
* [ykzts](https://github.com/ykzts)
|
||||||
* [mjankowski](https://github.com/mjankowski)
|
|
||||||
* [akihikodaki](https://github.com/akihikodaki)
|
* [akihikodaki](https://github.com/akihikodaki)
|
||||||
|
* [mjankowski](https://github.com/mjankowski)
|
||||||
* [unarist](https://github.com/unarist)
|
* [unarist](https://github.com/unarist)
|
||||||
* [yiskah](https://github.com/yiskah)
|
* [ThibG](https://github.com/ThibG)
|
||||||
* [m4sk1n](https://github.com/m4sk1n)
|
* [m4sk1n](https://github.com/m4sk1n)
|
||||||
|
* [yiskah](https://github.com/yiskah)
|
||||||
* [nolanlawson](https://github.com/nolanlawson)
|
* [nolanlawson](https://github.com/nolanlawson)
|
||||||
* [sorin-davidoi](https://github.com/sorin-davidoi)
|
* [sorin-davidoi](https://github.com/sorin-davidoi)
|
||||||
* [abcang](https://github.com/abcang)
|
* [abcang](https://github.com/abcang)
|
||||||
* [ThibG](https://github.com/ThibG)
|
|
||||||
* [lynlynlynx](https://github.com/lynlynlynx)
|
* [lynlynlynx](https://github.com/lynlynlynx)
|
||||||
* [alpaca-tc](https://github.com/alpaca-tc)
|
* [alpaca-tc](https://github.com/alpaca-tc)
|
||||||
* [nclm](https://github.com/nclm)
|
* [nclm](https://github.com/nclm)
|
||||||
* [ineffyble](https://github.com/ineffyble)
|
* [ineffyble](https://github.com/ineffyble)
|
||||||
|
* [renatolond](https://github.com/renatolond)
|
||||||
* [jeroenpraat](https://github.com/jeroenpraat)
|
* [jeroenpraat](https://github.com/jeroenpraat)
|
||||||
* [blackle](https://github.com/blackle)
|
* [blackle](https://github.com/blackle)
|
||||||
* [Quent-in](https://github.com/Quent-in)
|
* [Quent-in](https://github.com/Quent-in)
|
||||||
* [JantsoP](https://github.com/JantsoP)
|
* [JantsoP](https://github.com/JantsoP)
|
||||||
* [nullkal](https://github.com/nullkal)
|
* [nullkal](https://github.com/nullkal)
|
||||||
* [yookoala](https://github.com/yookoala)
|
* [yookoala](https://github.com/yookoala)
|
||||||
* [ysksn](https://github.com/ysksn)
|
|
||||||
* [ashfurrow](https://github.com/ashfurrow)
|
|
||||||
* [eramdam](https://github.com/eramdam)
|
|
||||||
* [mayaeh](https://github.com/mayaeh)
|
* [mayaeh](https://github.com/mayaeh)
|
||||||
|
* [ysksn](https://github.com/ysksn)
|
||||||
|
* [shuheiktgw](https://github.com/shuheiktgw)
|
||||||
|
* [ashfurrow](https://github.com/ashfurrow)
|
||||||
* [zunda](https://github.com/zunda)
|
* [zunda](https://github.com/zunda)
|
||||||
* [ticky](https://github.com/ticky)
|
* [eramdam](https://github.com/eramdam)
|
||||||
|
* [Kjwon15](https://github.com/Kjwon15)
|
||||||
* [masarakki](https://github.com/masarakki)
|
* [masarakki](https://github.com/masarakki)
|
||||||
|
* [ticky](https://github.com/ticky)
|
||||||
|
* [Quenty31](https://github.com/Quenty31)
|
||||||
|
* [danhunsaker](https://github.com/danhunsaker)
|
||||||
|
* [ThisIsMissEm](https://github.com/ThisIsMissEm)
|
||||||
|
* [hcmiya](https://github.com/hcmiya)
|
||||||
|
* [stephenburgess8](https://github.com/stephenburgess8)
|
||||||
* [Wonderfall](https://github.com/Wonderfall)
|
* [Wonderfall](https://github.com/Wonderfall)
|
||||||
|
* [takayamaki](https://github.com/takayamaki)
|
||||||
* [matteoaquila](https://github.com/matteoaquila)
|
* [matteoaquila](https://github.com/matteoaquila)
|
||||||
* [rkarabut](https://github.com/rkarabut)
|
* [rkarabut](https://github.com/rkarabut)
|
||||||
* [stephenburgess8](https://github.com/stephenburgess8)
|
|
||||||
* [Kjwon15](https://github.com/Kjwon15)
|
|
||||||
* [Artoria2e5](https://github.com/Artoria2e5)
|
* [Artoria2e5](https://github.com/Artoria2e5)
|
||||||
* [yukimochi](https://github.com/yukimochi)
|
* [yukimochi](https://github.com/yukimochi)
|
||||||
* [marrus-sh](https://github.com/marrus-sh)
|
* [marrus-sh](https://github.com/marrus-sh)
|
||||||
* [krainboltgreene](https://github.com/krainboltgreene)
|
* [krainboltgreene](https://github.com/krainboltgreene)
|
||||||
* [renatolond](https://github.com/renatolond)
|
* [patf](https://github.com/patf)
|
||||||
|
* [Aldarone](https://github.com/Aldarone)
|
||||||
* [BoFFire](https://github.com/BoFFire)
|
* [BoFFire](https://github.com/BoFFire)
|
||||||
* [clworld](https://github.com/clworld)
|
* [clworld](https://github.com/clworld)
|
||||||
* [danhunsaker](https://github.com/danhunsaker)
|
* [dracos](https://github.com/dracos)
|
||||||
* [patf](https://github.com/patf)
|
* [SerCom_KC](mailto:sercom-kc@users.noreply.github.com)
|
||||||
* [Quenty31](https://github.com/Quenty31)
|
* [Sylvhem](https://github.com/Sylvhem)
|
||||||
* [MitarashiDango](https://github.com/MitarashiDango)
|
* [nightpool](https://github.com/nightpool)
|
||||||
* [Aldarone](https://github.com/Aldarone)
|
* [MasterGroosha](https://github.com/MasterGroosha)
|
||||||
* [JeanGauthier](https://github.com/JeanGauthier)
|
* [JeanGauthier](https://github.com/JeanGauthier)
|
||||||
* [kschaper](https://github.com/kschaper)
|
* [kschaper](https://github.com/kschaper)
|
||||||
* [takayamaki](https://github.com/takayamaki)
|
* [mabkenar](https://github.com/mabkenar)
|
||||||
|
* [MitarashiDango](mailto:mitarashidango@users.noreply.github.com)
|
||||||
|
* [beatrix-bitrot](https://github.com/beatrix-bitrot)
|
||||||
* [adbelle](https://github.com/adbelle)
|
* [adbelle](https://github.com/adbelle)
|
||||||
* [evanminto](https://github.com/evanminto)
|
* [evanminto](https://github.com/evanminto)
|
||||||
* [mabkenar](https://github.com/mabkenar)
|
|
||||||
* [MightyPork](https://github.com/MightyPork)
|
* [MightyPork](https://github.com/MightyPork)
|
||||||
* [beatrix-bitrot](https://github.com/beatrix-bitrot)
|
|
||||||
* [yhirano55](https://github.com/yhirano55)
|
* [yhirano55](https://github.com/yhirano55)
|
||||||
* [camponez](https://github.com/camponez)
|
* [camponez](https://github.com/camponez)
|
||||||
|
* [MaciekBaron](https://github.com/MaciekBaron)
|
||||||
|
* [SerCom-KC](https://github.com/SerCom-KC)
|
||||||
* [aschmitz](https://github.com/aschmitz)
|
* [aschmitz](https://github.com/aschmitz)
|
||||||
* [fpiesche](https://github.com/fpiesche)
|
* [fpiesche](https://github.com/fpiesche)
|
||||||
* [gandaro](https://github.com/gandaro)
|
* [gandaro](https://github.com/gandaro)
|
||||||
* [johnsudaar](https://github.com/johnsudaar)
|
* [johnsudaar](https://github.com/johnsudaar)
|
||||||
* [trebmuh](https://github.com/trebmuh)
|
* [trebmuh](https://github.com/trebmuh)
|
||||||
* [Sylvhem](https://github.com/Sylvhem)
|
* [Rakib Hasan](mailto:rmhasan@gmail.com)
|
||||||
* [lindwurm](https://github.com/lindwurm)
|
* [lindwurm](https://github.com/lindwurm)
|
||||||
|
* [victorhck](mailto:victorhck@geeko.site)
|
||||||
* [voidsatisfaction](https://github.com/voidsatisfaction)
|
* [voidsatisfaction](https://github.com/voidsatisfaction)
|
||||||
* [neetshin](https://github.com/neetshin)
|
|
||||||
* [valentin2105](https://github.com/valentin2105)
|
* [valentin2105](https://github.com/valentin2105)
|
||||||
|
* [devkral](https://github.com/devkral)
|
||||||
* [hikari-no-yume](https://github.com/hikari-no-yume)
|
* [hikari-no-yume](https://github.com/hikari-no-yume)
|
||||||
* [Angristan](https://github.com/Angristan)
|
* [angristan](https://github.com/angristan)
|
||||||
* [seefood](https://github.com/seefood)
|
* [seefood](https://github.com/seefood)
|
||||||
* [jackjennings](https://github.com/jackjennings)
|
* [jackjennings](https://github.com/jackjennings)
|
||||||
* [hcmiya](https://github.com/hcmiya)
|
* [spla](mailto:spla@mastodont.cat)
|
||||||
* [nightpool](https://github.com/nightpool)
|
|
||||||
* [salvadorpla](https://github.com/salvadorpla)
|
|
||||||
* [expenses](https://github.com/expenses)
|
* [expenses](https://github.com/expenses)
|
||||||
* [walf443](https://github.com/walf443)
|
* [walf443](https://github.com/walf443)
|
||||||
* [JoelQ](https://github.com/JoelQ)
|
* [JoelQ](https://github.com/JoelQ)
|
||||||
|
@ -85,65 +94,75 @@ and provided thanks to the work of the following contributors:
|
||||||
* [victorhck](https://github.com/victorhck)
|
* [victorhck](https://github.com/victorhck)
|
||||||
* [puckipedia](https://github.com/puckipedia)
|
* [puckipedia](https://github.com/puckipedia)
|
||||||
* [contraexemplo](https://github.com/contraexemplo)
|
* [contraexemplo](https://github.com/contraexemplo)
|
||||||
|
* [hugogameiro](https://github.com/hugogameiro)
|
||||||
* [kazu9su](https://github.com/kazu9su)
|
* [kazu9su](https://github.com/kazu9su)
|
||||||
* [Komic](https://github.com/Komic)
|
* [Komic](https://github.com/Komic)
|
||||||
* [diomed](https://github.com/diomed)
|
* [diomed](https://github.com/diomed)
|
||||||
|
* [ariasuni](https://github.com/ariasuni)
|
||||||
|
* [Neetshin](mailto:neetshin@neetsh.in)
|
||||||
* [rainyday](https://github.com/rainyday)
|
* [rainyday](https://github.com/rainyday)
|
||||||
|
* [ProgVal](https://github.com/ProgVal)
|
||||||
|
* [yuntan](https://github.com/yuntan)
|
||||||
|
* [goofy-bz](mailto:goofy@babelzilla.org)
|
||||||
* [kadiix](https://github.com/kadiix)
|
* [kadiix](https://github.com/kadiix)
|
||||||
* [kodacs](https://github.com/kodacs)
|
* [kodacs](https://github.com/kodacs)
|
||||||
* [ProgVal](https://github.com/ProgVal)
|
* [fvh-P](https://github.com/fvh-P)
|
||||||
|
* [rtucker](https://github.com/rtucker)
|
||||||
|
* [KScl](https://github.com/KScl)
|
||||||
* [sterdev](https://github.com/sterdev)
|
* [sterdev](https://github.com/sterdev)
|
||||||
* [TheKinrar](https://github.com/TheKinrar)
|
* [TheKinrar](https://github.com/TheKinrar)
|
||||||
* [AA4ch1](https://github.com/AA4ch1)
|
* [AA4ch1](https://github.com/AA4ch1)
|
||||||
* [alexgleason](https://github.com/alexgleason)
|
* [alexgleason](https://github.com/alexgleason)
|
||||||
* [cpytel](https://github.com/cpytel)
|
* [cpytel](https://github.com/cpytel)
|
||||||
* [northerner](https://github.com/northerner)
|
* [northerner](https://github.com/northerner)
|
||||||
|
* [fhemberger](https://github.com/fhemberger)
|
||||||
* [hnrysmth](https://github.com/hnrysmth)
|
* [hnrysmth](https://github.com/hnrysmth)
|
||||||
* [hugogameiro](https://github.com/hugogameiro)
|
* [d6rkaiz](https://github.com/d6rkaiz)
|
||||||
|
* [JMendyk](https://github.com/JMendyk)
|
||||||
* [JohnD28](https://github.com/JohnD28)
|
* [JohnD28](https://github.com/JohnD28)
|
||||||
* [znz](https://github.com/znz)
|
* [znz](https://github.com/znz)
|
||||||
* [Naouak](https://github.com/Naouak)
|
* [Naouak](https://github.com/Naouak)
|
||||||
* [rtucker](https://github.com/rtucker)
|
|
||||||
* [reneklacan](https://github.com/reneklacan)
|
* [reneklacan](https://github.com/reneklacan)
|
||||||
* [KScl](https://github.com/KScl)
|
* [ekiru](https://github.com/ekiru)
|
||||||
* [SerCom-KC](https://github.com/SerCom-KC)
|
|
||||||
* [tcitworld](https://github.com/tcitworld)
|
* [tcitworld](https://github.com/tcitworld)
|
||||||
* [geta6](https://github.com/geta6)
|
* [geta6](https://github.com/geta6)
|
||||||
* [goofy-bz](https://github.com/goofy-bz)
|
|
||||||
* [happycoloredbanana](https://github.com/happycoloredbanana)
|
* [happycoloredbanana](https://github.com/happycoloredbanana)
|
||||||
* [leopku](https://github.com/leopku)
|
* [leopku](https://github.com/leopku)
|
||||||
* [SansPseudoFix](https://github.com/SansPseudoFix)
|
* [SansPseudoFix](https://github.com/SansPseudoFix)
|
||||||
* [tomfhowe](https://github.com/tomfhowe)
|
* [tomfhowe](https://github.com/tomfhowe)
|
||||||
* [noraworld](https://github.com/noraworld)
|
* [noraworld](https://github.com/noraworld)
|
||||||
* [fvh-P](https://github.com/fvh-P)
|
|
||||||
* [178inaba](https://github.com/178inaba)
|
* [178inaba](https://github.com/178inaba)
|
||||||
* [devkral](https://github.com/devkral)
|
|
||||||
* [alyssais](https://github.com/alyssais)
|
* [alyssais](https://github.com/alyssais)
|
||||||
* [kodnaplakal](https://github.com/kodnaplakal)
|
* [kodnaplakal](https://github.com/kodnaplakal)
|
||||||
* [stalker314314](https://github.com/stalker314314)
|
* [stalker314314](https://github.com/stalker314314)
|
||||||
* [huertanix](https://github.com/huertanix)
|
* [huertanix](https://github.com/huertanix)
|
||||||
* [genesixx](https://github.com/genesixx)
|
* [genesixx](https://github.com/genesixx)
|
||||||
* [fhemberger](https://github.com/fhemberger)
|
|
||||||
* [halkeye](https://github.com/halkeye)
|
* [halkeye](https://github.com/halkeye)
|
||||||
|
* [hinaloe](https://github.com/hinaloe)
|
||||||
* [treby](https://github.com/treby)
|
* [treby](https://github.com/treby)
|
||||||
* [d6rkaiz](https://github.com/d6rkaiz)
|
|
||||||
* [jpdevries](https://github.com/jpdevries)
|
* [jpdevries](https://github.com/jpdevries)
|
||||||
* [rndm-stranger](https://github.com/rndm-stranger)
|
* [00x9d](https://github.com/00x9d)
|
||||||
|
* [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name)
|
||||||
* [saper](https://github.com/saper)
|
* [saper](https://github.com/saper)
|
||||||
* [nevillepark](https://github.com/nevillepark)
|
* [nevillepark](https://github.com/nevillepark)
|
||||||
* [ornithocoder](https://github.com/ornithocoder)
|
* [ornithocoder](https://github.com/ornithocoder)
|
||||||
* [pierreozoux](https://github.com/pierreozoux)
|
* [pierreozoux](https://github.com/pierreozoux)
|
||||||
* [ramlmn](https://github.com/ramlmn)
|
* [Ram Lmn](mailto:ramlmn@users.noreply.github.com)
|
||||||
* [harukasan](https://github.com/harukasan)
|
* [harukasan](https://github.com/harukasan)
|
||||||
* [stamak](https://github.com/stamak)
|
* [stamak](https://github.com/stamak)
|
||||||
|
* [theboss](https://github.com/theboss)
|
||||||
|
* [Technowix](mailto:technowix@users.noreply.github.com)
|
||||||
* [Eychics](https://github.com/Eychics)
|
* [Eychics](https://github.com/Eychics)
|
||||||
* [thor-the-norseman](https://github.com/thor-the-norseman)
|
* [Thor Harald Johansen](mailto:thj@thj.no)
|
||||||
* [0x70b1a5](https://github.com/0x70b1a5)
|
* [0x70b1a5](https://github.com/0x70b1a5)
|
||||||
* [gled-rs](https://github.com/gled-rs)
|
* [gled-rs](https://github.com/gled-rs)
|
||||||
* [R0ckweb](https://github.com/R0ckweb)
|
* [R0ckweb](https://github.com/R0ckweb)
|
||||||
|
* [caasi](https://github.com/caasi)
|
||||||
* [esetomo](https://github.com/esetomo)
|
* [esetomo](https://github.com/esetomo)
|
||||||
* [foxiehkins](https://github.com/foxiehkins)
|
* [foxiehkins](https://github.com/foxiehkins)
|
||||||
* [sdukhovni](https://github.com/sdukhovni)
|
* [hoodie](mailto:hoodiekitten@outlook.com)
|
||||||
|
* [luzi82](https://github.com/luzi82)
|
||||||
|
* [duxovni](https://github.com/duxovni)
|
||||||
* [unsmell](https://github.com/unsmell)
|
* [unsmell](https://github.com/unsmell)
|
||||||
* [chriswmartin](https://github.com/chriswmartin)
|
* [chriswmartin](https://github.com/chriswmartin)
|
||||||
* [vahnj](https://github.com/vahnj)
|
* [vahnj](https://github.com/vahnj)
|
||||||
|
@ -152,6 +171,7 @@ and provided thanks to the work of the following contributors:
|
||||||
* [redtachyons](https://github.com/redtachyons)
|
* [redtachyons](https://github.com/redtachyons)
|
||||||
* [thurloat](https://github.com/thurloat)
|
* [thurloat](https://github.com/thurloat)
|
||||||
* [aaribaud](https://github.com/aaribaud)
|
* [aaribaud](https://github.com/aaribaud)
|
||||||
|
* [Andrew](mailto:andrewlchronister@gmail.com)
|
||||||
* [estuans](https://github.com/estuans)
|
* [estuans](https://github.com/estuans)
|
||||||
* [dissolve](https://github.com/dissolve)
|
* [dissolve](https://github.com/dissolve)
|
||||||
* [PurpleBooth](https://github.com/PurpleBooth)
|
* [PurpleBooth](https://github.com/PurpleBooth)
|
||||||
|
@ -165,7 +185,6 @@ and provided thanks to the work of the following contributors:
|
||||||
* [farlistener](https://github.com/farlistener)
|
* [farlistener](https://github.com/farlistener)
|
||||||
* [DavidLibeau](https://github.com/DavidLibeau)
|
* [DavidLibeau](https://github.com/DavidLibeau)
|
||||||
* [SirCmpwn](https://github.com/SirCmpwn)
|
* [SirCmpwn](https://github.com/SirCmpwn)
|
||||||
* [MasterGroosha](https://github.com/MasterGroosha)
|
|
||||||
* [Fjoerfoks](https://github.com/Fjoerfoks)
|
* [Fjoerfoks](https://github.com/Fjoerfoks)
|
||||||
* [fmauNeko](https://github.com/fmauNeko)
|
* [fmauNeko](https://github.com/fmauNeko)
|
||||||
* [gloaec](https://github.com/gloaec)
|
* [gloaec](https://github.com/gloaec)
|
||||||
|
@ -175,26 +194,37 @@ and provided thanks to the work of the following contributors:
|
||||||
* [h-izumi](https://github.com/h-izumi)
|
* [h-izumi](https://github.com/h-izumi)
|
||||||
* [ErikXXon](https://github.com/ErikXXon)
|
* [ErikXXon](https://github.com/ErikXXon)
|
||||||
* [ian-kelling](https://github.com/ian-kelling)
|
* [ian-kelling](https://github.com/ian-kelling)
|
||||||
|
* [immae](https://github.com/immae)
|
||||||
|
* [Reverite](https://github.com/Reverite)
|
||||||
* [foozmeat](https://github.com/foozmeat)
|
* [foozmeat](https://github.com/foozmeat)
|
||||||
* [jasonrhodes](https://github.com/jasonrhodes)
|
* [jasonrhodes](https://github.com/jasonrhodes)
|
||||||
* [asm](https://github.com/asm)
|
* [Jason Snell](mailto:jason@newrelic.com)
|
||||||
* [jviide](https://github.com/jviide)
|
* [jviide](https://github.com/jviide)
|
||||||
* [crakaC](https://github.com/crakaC)
|
* [crakaC](https://github.com/crakaC)
|
||||||
* [tkbky](https://github.com/tkbky)
|
* [tkbky](https://github.com/tkbky)
|
||||||
|
* [Kaylee](mailto:kaylee@codethat.sucks)
|
||||||
* [Kazhnuz](https://github.com/Kazhnuz)
|
* [Kazhnuz](https://github.com/Kazhnuz)
|
||||||
|
* [connyduck](https://github.com/connyduck)
|
||||||
|
* [Lindsey Bieda](mailto:lindseyb@users.noreply.github.com)
|
||||||
|
* [Lorenz Diener](mailto:halcyon@icosahedron.website)
|
||||||
* [alimony](https://github.com/alimony)
|
* [alimony](https://github.com/alimony)
|
||||||
* [mig5](https://github.com/mig5)
|
* [mig5](https://github.com/mig5)
|
||||||
* [ndarville](https://github.com/ndarville)
|
* [ndarville](https://github.com/ndarville)
|
||||||
* [Abzol](https://github.com/Abzol)
|
* [Abzol](https://github.com/Abzol)
|
||||||
|
* [pwoolcoc](https://github.com/pwoolcoc)
|
||||||
* [xPaw](https://github.com/xPaw)
|
* [xPaw](https://github.com/xPaw)
|
||||||
|
* [petzah](https://github.com/petzah)
|
||||||
|
* [ignisf](https://github.com/ignisf)
|
||||||
* [raymestalez](https://github.com/raymestalez)
|
* [raymestalez](https://github.com/raymestalez)
|
||||||
|
* [u1-liquid](https://github.com/u1-liquid)
|
||||||
* [sim6](https://github.com/sim6)
|
* [sim6](https://github.com/sim6)
|
||||||
* [ekiru](https://github.com/ekiru)
|
* [stemid](https://github.com/stemid)
|
||||||
* [Technowix](https://github.com/Technowix)
|
|
||||||
* [ThomasLeister](https://github.com/ThomasLeister)
|
* [ThomasLeister](https://github.com/ThomasLeister)
|
||||||
* [mcat-ee](https://github.com/mcat-ee)
|
* [mcat-ee](https://github.com/mcat-ee)
|
||||||
* [tototoshi](https://github.com/tototoshi)
|
* [tototoshi](https://github.com/tototoshi)
|
||||||
|
* [TrashMacNugget](https://github.com/TrashMacNugget)
|
||||||
* [VirtuBox](https://github.com/VirtuBox)
|
* [VirtuBox](https://github.com/VirtuBox)
|
||||||
|
* [Vladyslav](mailto:vaden@tuta.io)
|
||||||
* [kaniini](https://github.com/kaniini)
|
* [kaniini](https://github.com/kaniini)
|
||||||
* [vayan](https://github.com/vayan)
|
* [vayan](https://github.com/vayan)
|
||||||
* [yannicka](https://github.com/yannicka)
|
* [yannicka](https://github.com/yannicka)
|
||||||
|
@ -202,12 +232,16 @@ and provided thanks to the work of the following contributors:
|
||||||
* [zacanger](https://github.com/zacanger)
|
* [zacanger](https://github.com/zacanger)
|
||||||
* [amazedkoumei](https://github.com/amazedkoumei)
|
* [amazedkoumei](https://github.com/amazedkoumei)
|
||||||
* [anon5r](https://github.com/anon5r)
|
* [anon5r](https://github.com/anon5r)
|
||||||
|
* [bsky](mailto:me@imbsky.net)
|
||||||
|
* [chr-1x](https://github.com/chr-1x)
|
||||||
* [codl](https://github.com/codl)
|
* [codl](https://github.com/codl)
|
||||||
|
* [cpsdqs](https://github.com/cpsdqs)
|
||||||
* [barzamin](https://github.com/barzamin)
|
* [barzamin](https://github.com/barzamin)
|
||||||
* [fhalna](https://github.com/fhalna)
|
* [fhalna](https://github.com/fhalna)
|
||||||
* [haoyayoi](https://github.com/haoyayoi)
|
* [haoyayoi](https://github.com/haoyayoi)
|
||||||
* [ik11235](https://github.com/ik11235)
|
* [ik11235](https://github.com/ik11235)
|
||||||
* [kawax](https://github.com/kawax)
|
* [kawax](https://github.com/kawax)
|
||||||
|
* [kedamaDQ](https://github.com/kedamaDQ)
|
||||||
* [007lva](https://github.com/007lva)
|
* [007lva](https://github.com/007lva)
|
||||||
* [matsurai25](https://github.com/matsurai25)
|
* [matsurai25](https://github.com/matsurai25)
|
||||||
* [mecab](https://github.com/mecab)
|
* [mecab](https://github.com/mecab)
|
||||||
|
@ -215,32 +249,41 @@ and provided thanks to the work of the following contributors:
|
||||||
* [oliverkeeble](https://github.com/oliverkeeble)
|
* [oliverkeeble](https://github.com/oliverkeeble)
|
||||||
* [pinfort](https://github.com/pinfort)
|
* [pinfort](https://github.com/pinfort)
|
||||||
* [rbaumert](https://github.com/rbaumert)
|
* [rbaumert](https://github.com/rbaumert)
|
||||||
|
* [trwnh](https://github.com/trwnh)
|
||||||
* [usagi-f](https://github.com/usagi-f)
|
* [usagi-f](https://github.com/usagi-f)
|
||||||
* [vidarlee](https://github.com/vidarlee)
|
* [vidarlee](https://github.com/vidarlee)
|
||||||
* [vjackson725](https://github.com/vjackson725)
|
* [vjackson725](https://github.com/vjackson725)
|
||||||
* [wxcafe](https://github.com/wxcafe)
|
* [wxcafe](https://github.com/wxcafe)
|
||||||
* [rinsuki](https://github.com/rinsuki)
|
* [rinsuki](https://github.com/rinsuki)
|
||||||
|
* [新都心(Neet Shin)](mailto:nucx@dio-vox.com)
|
||||||
* [cygnan](https://github.com/cygnan)
|
* [cygnan](https://github.com/cygnan)
|
||||||
* [Awea](https://github.com/Awea)
|
* [Awea](https://github.com/Awea)
|
||||||
* [halcy](https://github.com/halcy)
|
* [halcy](https://github.com/halcy)
|
||||||
* [bounshi](https://github.com/bounshi)
|
* [naaaaaaaaaaaf](https://github.com/naaaaaaaaaaaf)
|
||||||
|
* [NecroTechno](https://github.com/NecroTechno)
|
||||||
* [8398a7](https://github.com/8398a7)
|
* [8398a7](https://github.com/8398a7)
|
||||||
* [857b](https://github.com/857b)
|
* [857b](https://github.com/857b)
|
||||||
|
* [insom](https://github.com/insom)
|
||||||
|
* [Aditoo17](https://github.com/Aditoo17)
|
||||||
* [unascribed](https://github.com/unascribed)
|
* [unascribed](https://github.com/unascribed)
|
||||||
* [Aguay-val](https://github.com/Aguay-val)
|
* [Aguay-val](https://github.com/Aguay-val)
|
||||||
* [knu](https://github.com/knu)
|
* [knu](https://github.com/knu)
|
||||||
|
* [h3poteto](https://github.com/h3poteto)
|
||||||
|
* [unleashed](https://github.com/unleashed)
|
||||||
* [alxrcs](https://github.com/alxrcs)
|
* [alxrcs](https://github.com/alxrcs)
|
||||||
* [console-cowboy](https://github.com/console-cowboy)
|
* [console-cowboy](https://github.com/console-cowboy)
|
||||||
* [pointlessone](https://github.com/pointlessone)
|
* [pointlessone](https://github.com/pointlessone)
|
||||||
* [a2](https://github.com/a2)
|
* [a2](https://github.com/a2)
|
||||||
* [0xa](https://github.com/0xa)
|
* [0xa](https://github.com/0xa)
|
||||||
|
* [palindromordnilap](https://github.com/palindromordnilap)
|
||||||
* [virtualpain](https://github.com/virtualpain)
|
* [virtualpain](https://github.com/virtualpain)
|
||||||
* [sapphirus](https://github.com/sapphirus)
|
* [sapphirus](https://github.com/sapphirus)
|
||||||
* [amandavisconti](https://github.com/amandavisconti)
|
* [amandavisconti](https://github.com/amandavisconti)
|
||||||
* [ameliavoncat](https://github.com/ameliavoncat)
|
* [ameliavoncat](https://github.com/ameliavoncat)
|
||||||
* [ilpianista](https://github.com/ilpianista)
|
* [ilpianista](https://github.com/ilpianista)
|
||||||
* [andydrop](https://github.com/andydrop)
|
* [Andreas Drop](mailto:andy@remline.de)
|
||||||
* [schas002](https://github.com/schas002)
|
* [schas002](https://github.com/schas002)
|
||||||
|
* [abackstrom](https://github.com/abackstrom)
|
||||||
* [jumbosushi](https://github.com/jumbosushi)
|
* [jumbosushi](https://github.com/jumbosushi)
|
||||||
* [ayumin](https://github.com/ayumin)
|
* [ayumin](https://github.com/ayumin)
|
||||||
* [BaptisteGelez](https://github.com/BaptisteGelez)
|
* [BaptisteGelez](https://github.com/BaptisteGelez)
|
||||||
|
@ -251,6 +294,7 @@ and provided thanks to the work of the following contributors:
|
||||||
* [brycied00d](https://github.com/brycied00d)
|
* [brycied00d](https://github.com/brycied00d)
|
||||||
* [carlosjs23](https://github.com/carlosjs23)
|
* [carlosjs23](https://github.com/carlosjs23)
|
||||||
* [cgxxx](https://github.com/cgxxx)
|
* [cgxxx](https://github.com/cgxxx)
|
||||||
|
* [kibitan](https://github.com/kibitan)
|
||||||
* [chrisheninger](https://github.com/chrisheninger)
|
* [chrisheninger](https://github.com/chrisheninger)
|
||||||
* [chris-martin](https://github.com/chris-martin)
|
* [chris-martin](https://github.com/chris-martin)
|
||||||
* [DoubleMalt](https://github.com/DoubleMalt)
|
* [DoubleMalt](https://github.com/DoubleMalt)
|
||||||
|
@ -259,21 +303,30 @@ and provided thanks to the work of the following contributors:
|
||||||
* [chriswk](https://github.com/chriswk)
|
* [chriswk](https://github.com/chriswk)
|
||||||
* [csu](https://github.com/csu)
|
* [csu](https://github.com/csu)
|
||||||
* [kklleemm](https://github.com/kklleemm)
|
* [kklleemm](https://github.com/kklleemm)
|
||||||
|
* [dachinat](https://github.com/dachinat)
|
||||||
* [monsterpit-daggertooth](https://github.com/monsterpit-daggertooth)
|
* [monsterpit-daggertooth](https://github.com/monsterpit-daggertooth)
|
||||||
* [watilde](https://github.com/watilde)
|
* [watilde](https://github.com/watilde)
|
||||||
* [daprice](https://github.com/daprice)
|
* [daprice](https://github.com/daprice)
|
||||||
* [dar5hak](https://github.com/dar5hak)
|
* [dar5hak](https://github.com/dar5hak)
|
||||||
* [kant](https://github.com/kant)
|
* [kant](https://github.com/kant)
|
||||||
|
* [maxolasersquad](https://github.com/maxolasersquad)
|
||||||
* [singingwolfboy](https://github.com/singingwolfboy)
|
* [singingwolfboy](https://github.com/singingwolfboy)
|
||||||
* [davidcelis](https://github.com/davidcelis)
|
* [davidcelis](https://github.com/davidcelis)
|
||||||
|
* [davefp](https://github.com/davefp)
|
||||||
* [yipdw](https://github.com/yipdw)
|
* [yipdw](https://github.com/yipdw)
|
||||||
* [debanshuk](https://github.com/debanshuk)
|
* [debanshuk](https://github.com/debanshuk)
|
||||||
|
* [Derek Lewis](mailto:derekcecillewis@gmail.com)
|
||||||
* [dblandin](https://github.com/dblandin)
|
* [dblandin](https://github.com/dblandin)
|
||||||
* [aranaur](https://github.com/aranaur)
|
* [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)
|
* [d3vgru](https://github.com/d3vgru)
|
||||||
* [Elizafox](https://github.com/Elizafox)
|
* [Elizafox](https://github.com/Elizafox)
|
||||||
* [ericblade](https://github.com/ericblade)
|
* [ericblade](https://github.com/ericblade)
|
||||||
* [mikoim](https://github.com/mikoim)
|
* [mikoim](https://github.com/mikoim)
|
||||||
|
* [espenronnevik](https://github.com/espenronnevik)
|
||||||
|
* [Finariel](https://github.com/Finariel)
|
||||||
* [siuying](https://github.com/siuying)
|
* [siuying](https://github.com/siuying)
|
||||||
* [hattori6789](https://github.com/hattori6789)
|
* [hattori6789](https://github.com/hattori6789)
|
||||||
* [algernon](https://github.com/algernon)
|
* [algernon](https://github.com/algernon)
|
||||||
|
@ -283,21 +336,23 @@ and provided thanks to the work of the following contributors:
|
||||||
* [Fiaxhs](https://github.com/Fiaxhs)
|
* [Fiaxhs](https://github.com/Fiaxhs)
|
||||||
* [reedcourty](https://github.com/reedcourty)
|
* [reedcourty](https://github.com/reedcourty)
|
||||||
* [anneau](https://github.com/anneau)
|
* [anneau](https://github.com/anneau)
|
||||||
|
* [Harmon758](https://github.com/Harmon758)
|
||||||
* [HellPie](https://github.com/HellPie)
|
* [HellPie](https://github.com/HellPie)
|
||||||
* [Habu-Kagumba](https://github.com/Habu-Kagumba)
|
* [Habu-Kagumba](https://github.com/Habu-Kagumba)
|
||||||
* [hinaloe](https://github.com/hinaloe)
|
|
||||||
* [suzukaze](https://github.com/suzukaze)
|
* [suzukaze](https://github.com/suzukaze)
|
||||||
* [Hiromi-Kai](https://github.com/Hiromi-Kai)
|
* [Hiromi-Kai](https://github.com/Hiromi-Kai)
|
||||||
|
* [hishamhm](https://github.com/hishamhm)
|
||||||
* [musashino205](https://github.com/musashino205)
|
* [musashino205](https://github.com/musashino205)
|
||||||
* [iwaim](https://github.com/iwaim)
|
* [iwaim](https://github.com/iwaim)
|
||||||
* [valrus](https://github.com/valrus)
|
* [valrus](https://github.com/valrus)
|
||||||
* [IMcD23](https://github.com/IMcD23)
|
* [IMcD23](https://github.com/IMcD23)
|
||||||
* [yi0713](https://github.com/yi0713)
|
* [yi0713](https://github.com/yi0713)
|
||||||
* [immae](https://github.com/immae)
|
|
||||||
* [iblech](https://github.com/iblech)
|
* [iblech](https://github.com/iblech)
|
||||||
|
* [usbsnowcrash](https://github.com/usbsnowcrash)
|
||||||
* [jack-michaud](https://github.com/jack-michaud)
|
* [jack-michaud](https://github.com/jack-michaud)
|
||||||
* [Floppy](https://github.com/Floppy)
|
* [Floppy](https://github.com/Floppy)
|
||||||
* [loomchild](https://github.com/loomchild)
|
* [loomchild](https://github.com/loomchild)
|
||||||
|
* [jenkr55](https://github.com/jenkr55)
|
||||||
* [docjkl](https://github.com/docjkl)
|
* [docjkl](https://github.com/docjkl)
|
||||||
* [TrollDecker](https://github.com/TrollDecker)
|
* [TrollDecker](https://github.com/TrollDecker)
|
||||||
* [jmontane](https://github.com/jmontane)
|
* [jmontane](https://github.com/jmontane)
|
||||||
|
@ -311,24 +366,29 @@ and provided thanks to the work of the following contributors:
|
||||||
* [j0k3r](https://github.com/j0k3r)
|
* [j0k3r](https://github.com/j0k3r)
|
||||||
* [KEINOS](https://github.com/KEINOS)
|
* [KEINOS](https://github.com/KEINOS)
|
||||||
* [futoase](https://github.com/futoase)
|
* [futoase](https://github.com/futoase)
|
||||||
* [abjectio](https://github.com/abjectio)
|
* [Pneumaticat](https://github.com/Pneumaticat)
|
||||||
|
* [Kit Redgrave](mailto:qwertyitis@gmail.com)
|
||||||
|
* [Knut Erik](mailto:abjectio@users.noreply.github.com)
|
||||||
* [mkody](https://github.com/mkody)
|
* [mkody](https://github.com/mkody)
|
||||||
* [connyduck](https://github.com/connyduck)
|
|
||||||
* [k0ta0uchi](https://github.com/k0ta0uchi)
|
* [k0ta0uchi](https://github.com/k0ta0uchi)
|
||||||
* [KrzysiekJ](https://github.com/KrzysiekJ)
|
* [KrzysiekJ](https://github.com/KrzysiekJ)
|
||||||
* [leowzukw](https://github.com/leowzukw)
|
* [leowzukw](https://github.com/leowzukw)
|
||||||
* [lmorchard](https://github.com/lmorchard)
|
* [lmorchard](https://github.com/lmorchard)
|
||||||
|
* [Tak](https://github.com/Tak)
|
||||||
* [cacheflow](https://github.com/cacheflow)
|
* [cacheflow](https://github.com/cacheflow)
|
||||||
* [ldidry](https://github.com/ldidry)
|
* [ldidry](https://github.com/ldidry)
|
||||||
* [jemus42](https://github.com/jemus42)
|
* [jemus42](https://github.com/jemus42)
|
||||||
* [lfuelling](https://github.com/lfuelling)
|
* [lfuelling](https://github.com/lfuelling)
|
||||||
* [Grabacr07](https://github.com/Grabacr07)
|
* [Grabacr07](https://github.com/Grabacr07)
|
||||||
* [mistermantas](https://github.com/mistermantas)
|
* [mistermantas](https://github.com/mistermantas)
|
||||||
|
* [mareklach](https://github.com/mareklach)
|
||||||
* [wirehack7](https://github.com/wirehack7)
|
* [wirehack7](https://github.com/wirehack7)
|
||||||
|
* [martymcguire](https://github.com/martymcguire)
|
||||||
* [marvinkopf](https://github.com/marvinkopf)
|
* [marvinkopf](https://github.com/marvinkopf)
|
||||||
* [otsune](https://github.com/otsune)
|
* [otsune](https://github.com/otsune)
|
||||||
* [m-blc](https://github.com/m-blc)
|
* [Mathias B](mailto:10813340+mathias-b@users.noreply.github.com)
|
||||||
* [matt-auckland](https://github.com/matt-auckland)
|
* [matt-auckland](https://github.com/matt-auckland)
|
||||||
|
* [matthiasbeyer](https://github.com/matthiasbeyer)
|
||||||
* [mattjmattj](https://github.com/mattjmattj)
|
* [mattjmattj](https://github.com/mattjmattj)
|
||||||
* [mtparet](https://github.com/mtparet)
|
* [mtparet](https://github.com/mtparet)
|
||||||
* [maximeborges](https://github.com/maximeborges)
|
* [maximeborges](https://github.com/maximeborges)
|
||||||
|
@ -336,7 +396,7 @@ and provided thanks to the work of the following contributors:
|
||||||
* [michaeljdeeb](https://github.com/michaeljdeeb)
|
* [michaeljdeeb](https://github.com/michaeljdeeb)
|
||||||
* [Themimitoof](https://github.com/Themimitoof)
|
* [Themimitoof](https://github.com/Themimitoof)
|
||||||
* [cyweo](https://github.com/cyweo)
|
* [cyweo](https://github.com/cyweo)
|
||||||
* [M1dgard](https://github.com/M1dgard)
|
* [Midgard](mailto:m1dgard@users.noreply.github.com)
|
||||||
* [mike-burns](https://github.com/mike-burns)
|
* [mike-burns](https://github.com/mike-burns)
|
||||||
* [verymilan](https://github.com/verymilan)
|
* [verymilan](https://github.com/verymilan)
|
||||||
* [milmazz](https://github.com/milmazz)
|
* [milmazz](https://github.com/milmazz)
|
||||||
|
@ -344,29 +404,38 @@ and provided thanks to the work of the following contributors:
|
||||||
* [mitchhentges](https://github.com/mitchhentges)
|
* [mitchhentges](https://github.com/mitchhentges)
|
||||||
* [moritzheiber](https://github.com/moritzheiber)
|
* [moritzheiber](https://github.com/moritzheiber)
|
||||||
* [mouse-reeve](https://github.com/mouse-reeve)
|
* [mouse-reeve](https://github.com/mouse-reeve)
|
||||||
|
* [Mozinet-fr](https://github.com/Mozinet-fr)
|
||||||
* [lae](https://github.com/lae)
|
* [lae](https://github.com/lae)
|
||||||
* [Nanamachi](https://github.com/Nanamachi)
|
* [Nanamachi](https://github.com/Nanamachi)
|
||||||
|
* [orinthe](https://github.com/orinthe)
|
||||||
|
* [Dar13](https://github.com/Dar13)
|
||||||
* [ngerakines](https://github.com/ngerakines)
|
* [ngerakines](https://github.com/ngerakines)
|
||||||
* [vonneudeck](https://github.com/vonneudeck)
|
* [vonneudeck](https://github.com/vonneudeck)
|
||||||
* [Ninetailed](https://github.com/Ninetailed)
|
* [Ninetailed](https://github.com/Ninetailed)
|
||||||
* [k24](https://github.com/k24)
|
* [k24](https://github.com/k24)
|
||||||
* [noiob](https://github.com/noiob)
|
* [Noiob](mailto:noiob@users.noreply.github.com)
|
||||||
* [kwaio](https://github.com/kwaio)
|
* [kwaio](https://github.com/kwaio)
|
||||||
* [norayr](https://github.com/norayr)
|
* [norayr](https://github.com/norayr)
|
||||||
* [joyeusenoelle](https://github.com/joyeusenoelle)
|
* [joyeusenoelle](https://github.com/joyeusenoelle)
|
||||||
* [OlivierNicole](https://github.com/OlivierNicole)
|
* [OlivierNicole](https://github.com/OlivierNicole)
|
||||||
|
* [noppa](https://github.com/noppa)
|
||||||
* [Otakan951](https://github.com/Otakan951)
|
* [Otakan951](https://github.com/Otakan951)
|
||||||
* [fahy](https://github.com/fahy)
|
* [fahy](https://github.com/fahy)
|
||||||
|
* [PatrickRWells](https://github.com/PatrickRWells)
|
||||||
* [Pangoraw](https://github.com/Pangoraw)
|
* [Pangoraw](https://github.com/Pangoraw)
|
||||||
* [pwoolcoc](https://github.com/pwoolcoc)
|
|
||||||
* [peterkeen](https://github.com/peterkeen)
|
* [peterkeen](https://github.com/peterkeen)
|
||||||
* [petzah](https://github.com/petzah)
|
* [pgate](https://github.com/pgate)
|
||||||
* [ignisf](https://github.com/ignisf)
|
* [qguv](https://github.com/qguv)
|
||||||
|
* [remram44](https://github.com/remram44)
|
||||||
|
* [retokromer](https://github.com/retokromer)
|
||||||
* [rfwatson](https://github.com/rfwatson)
|
* [rfwatson](https://github.com/rfwatson)
|
||||||
* [rfreebern](https://github.com/rfreebern)
|
* [rfreebern](https://github.com/rfreebern)
|
||||||
|
* [Ryan Wade](mailto:ryan.wade@protonmail.com)
|
||||||
* [sylph01](https://github.com/sylph01)
|
* [sylph01](https://github.com/sylph01)
|
||||||
|
* [S-H-GAMELINKS](https://github.com/S-H-GAMELINKS)
|
||||||
* [staticsafe](https://github.com/staticsafe)
|
* [staticsafe](https://github.com/staticsafe)
|
||||||
* [snwh](https://github.com/snwh)
|
* [snwh](https://github.com/snwh)
|
||||||
|
* [sts10](https://github.com/sts10)
|
||||||
* [skoji](https://github.com/skoji)
|
* [skoji](https://github.com/skoji)
|
||||||
* [ScienJus](https://github.com/ScienJus)
|
* [ScienJus](https://github.com/ScienJus)
|
||||||
* [larkinscott](https://github.com/larkinscott)
|
* [larkinscott](https://github.com/larkinscott)
|
||||||
|
@ -378,73 +447,97 @@ and provided thanks to the work of the following contributors:
|
||||||
* [ernix](https://github.com/ernix)
|
* [ernix](https://github.com/ernix)
|
||||||
* [rosylilly](https://github.com/rosylilly)
|
* [rosylilly](https://github.com/rosylilly)
|
||||||
* [shouko](https://github.com/shouko)
|
* [shouko](https://github.com/shouko)
|
||||||
|
* [Sina Mashek](mailto:sina@mashek.xyz)
|
||||||
* [sossii](https://github.com/sossii)
|
* [sossii](https://github.com/sossii)
|
||||||
|
* [SpankyWorks](https://github.com/SpankyWorks)
|
||||||
* [StefOfficiel](https://github.com/StefOfficiel)
|
* [StefOfficiel](https://github.com/StefOfficiel)
|
||||||
* [svetlik](https://github.com/svetlik)
|
* [svetlik](https://github.com/svetlik)
|
||||||
* [dereckson](https://github.com/dereckson)
|
* [dereckson](https://github.com/dereckson)
|
||||||
* [theboss](https://github.com/theboss)
|
* [phaedryx](https://github.com/phaedryx)
|
||||||
* [takp](https://github.com/takp)
|
* [takp](https://github.com/takp)
|
||||||
* [tkusano](https://github.com/tkusano)
|
* [tkusano](https://github.com/tkusano)
|
||||||
|
* [TakesxiSximada](https://github.com/TakesxiSximada)
|
||||||
* [TheInventrix](https://github.com/TheInventrix)
|
* [TheInventrix](https://github.com/TheInventrix)
|
||||||
* [shug0](https://github.com/shug0)
|
* [shug0](https://github.com/shug0)
|
||||||
* [Fortyseven](https://github.com/Fortyseven)
|
* [Fortyseven](https://github.com/Fortyseven)
|
||||||
* [tobypinder](https://github.com/tobypinder)
|
* [tobypinder](https://github.com/tobypinder)
|
||||||
* [tomosm](https://github.com/tomosm)
|
* [tomosm](https://github.com/tomosm)
|
||||||
* [TomoyaShibata](https://github.com/TomoyaShibata)
|
* [TomoyaShibata](https://github.com/TomoyaShibata)
|
||||||
* [TrashMacNugget](https://github.com/TrashMacNugget)
|
|
||||||
* [treyssatvincent](https://github.com/treyssatvincent)
|
* [treyssatvincent](https://github.com/treyssatvincent)
|
||||||
* [optikfluffel](https://github.com/optikfluffel)
|
* [Udo Kramer](mailto:optik@fluffel.io)
|
||||||
* [vmincev](https://github.com/vmincev)
|
* [Una](mailto:una@unascribed.com)
|
||||||
* [waldyrious](https://github.com/waldyrious)
|
* [Ushitora Anqou](mailto:ushitora_anqou@yahoo.co.jp)
|
||||||
* [tahnok](https://github.com/tahnok)
|
* [Valentin Lorentz](mailto:progval+git@progval.net)
|
||||||
* [YDrogen](https://github.com/YDrogen)
|
* [Vladimir Mincev](mailto:vladimir@canicinteractive.com)
|
||||||
* [YOSHIOKAEiichiro](https://github.com/YOSHIOKAEiichiro)
|
* [Waldir Pimenta](mailto:waldyrious@gmail.com)
|
||||||
* [S-YOU](https://github.com/S-YOU)
|
* [Wesley Ellis](mailto:tahnok@gmail.com)
|
||||||
* [YaQ00](https://github.com/YaQ00)
|
* [Wiktor](mailto:wiktor@metacode.biz)
|
||||||
* [yanakend](https://github.com/yanakend)
|
* [Wonderfall](mailto:wonderfall@schrodinger.io)
|
||||||
* [orzFly](https://github.com/orzFly)
|
* [YDrogen](mailto:ydrogen45@gmail.com)
|
||||||
* [chansuke](https://github.com/chansuke)
|
* [YMHuang](mailto:ymhuang@fmbase.tw)
|
||||||
* [yuntan](https://github.com/yuntan)
|
* [YOSHIOKA Eiichiro](mailto:yoshioka.eiichiro@gmail.com)
|
||||||
* [LogicalDash](https://github.com/LogicalDash)
|
* [YOU](mailto:stackexchange.you@gmail.com)
|
||||||
* [ZiiX](https://github.com/ZiiX)
|
* [YaQ](mailto:i_k_o_m_a_7@yahoo.co.jp)
|
||||||
* [benklop](https://github.com/benklop)
|
* [Yanaken](mailto:yanakend@gmail.com)
|
||||||
* [caasi](https://github.com/caasi)
|
* [Yann Klis](mailto:yann.klis@gmail.com)
|
||||||
* [caesarologia](https://github.com/caesarologia)
|
* [Yeechan Lu](mailto:wz.bluesnow@gmail.com)
|
||||||
* [chrolis](https://github.com/chrolis)
|
* [Yusuke Abe](mailto:moonset20@gmail.com)
|
||||||
* [cormojs](https://github.com/cormojs)
|
* [Zachary Spector](mailto:logicaldash@gmail.com)
|
||||||
* [cpsdqs](https://github.com/cpsdqs)
|
* [ZiiX](mailto:ziix@users.noreply.github.com)
|
||||||
* [d0p1s4m4](https://github.com/d0p1s4m4)
|
* [asria-jp](mailto:is@alicematic.com)
|
||||||
* [evilny0](https://github.com/evilny0)
|
* [ava](mailto:vladooku@users.noreply.github.com)
|
||||||
* [febrezo](https://github.com/febrezo)
|
* [benklop](mailto:benklop@gmail.com)
|
||||||
* [fsubal](https://github.com/fsubal)
|
* [bsky](mailto:git@imbsky.net)
|
||||||
* [dikky1218](https://github.com/dikky1218)
|
* [caesarologia](mailto:lopesgemelli.1@gmail.com)
|
||||||
* [gentarok](https://github.com/gentarok)
|
* [chrolis](mailto:chrolis@users.noreply.github.com)
|
||||||
* [hakoai](https://github.com/hakoai)
|
* [cormo](mailto:cormorant2+github@gmail.com)
|
||||||
* [chaosbunker](https://github.com/chaosbunker)
|
* [d0p1](mailto:dopi-sama@hush.com)
|
||||||
* [isati](https://github.com/isati)
|
* [evilny0](mailto:evilny0@moomoocamp.net)
|
||||||
* [jkap](https://github.com/jkap)
|
* [febrezo](mailto:felixbrezo@gmail.com)
|
||||||
* [jirayudech](https://github.com/jirayudech)
|
* [fsubal](mailto:fsubal@users.noreply.github.com)
|
||||||
* [jukper](https://github.com/jukper)
|
* [fusshi-](mailto:dikky1218@users.noreply.github.com)
|
||||||
* [karlyeurl](https://github.com/karlyeurl)
|
* [gentaro](mailto:gentaroooo@gmail.com)
|
||||||
* [kedamaDQ](https://github.com/kedamaDQ)
|
* [hakoai](mailto:hk--76@qa2.so-net.ne.jp)
|
||||||
* [kuro5hin](https://github.com/kuro5hin)
|
* [haosbvnker](mailto:github@chaosbunker.com)
|
||||||
* [maxypy](https://github.com/maxypy)
|
* [isati](mailto:phil@juchnowi.cz)
|
||||||
* [marcus-herrmann](https://github.com/marcus-herrmann)
|
* [jenn kaplan](mailto:me@jkap.io)
|
||||||
* [mshrtkch](https://github.com/mshrtkch)
|
* [jirayudech](mailto:jirayudech@gmail.com)
|
||||||
* [muan](https://github.com/muan)
|
* [jukper](mailto:jukkaperanto@gmail.com)
|
||||||
* [rch850](https://github.com/rch850)
|
* [jumoru](mailto:jumoru@mailbox.org)
|
||||||
* [roikale](https://github.com/roikale)
|
* [karlyeurl](mailto:karl.yeurl@gmail.com)
|
||||||
* [rysiekpl](https://github.com/rysiekpl)
|
* [kedama](mailto:32974885+kedamadq@users.noreply.github.com)
|
||||||
* [saturday06](https://github.com/saturday06)
|
* [kuro5hin](mailto:rusty@kuro5hin.org)
|
||||||
* [scriptjunkie](https://github.com/scriptjunkie)
|
* [maxypy](mailto:maxime@mpigou.fr)
|
||||||
* [seekr](https://github.com/seekr)
|
* [mhe](mailto:mail@marcus-herrmann.com)
|
||||||
* [syui](https://github.com/syui)
|
* [mimikun](mailto:dzdzble_effort_311@outlook.jp)
|
||||||
* [tackeyy](https://github.com/tackeyy)
|
* [mshrtkch](mailto:mshrtkch@users.noreply.github.com)
|
||||||
* [tmyt](https://github.com/tmyt)
|
* [muan](mailto:muan@github.com)
|
||||||
* [utam0k](https://github.com/utam0k)
|
* [neetshin](mailto:neetshin@neetsh.in)
|
||||||
* [vpzomtrrfrt](https://github.com/vpzomtrrfrt)
|
* [rch850](mailto:rich850@gmail.com)
|
||||||
* [walfie](https://github.com/walfie)
|
* [roikale](mailto:roikale@users.noreply.github.com)
|
||||||
* [y-temp4](https://github.com/y-temp4)
|
* [rysiekpl](mailto:rysiek@hackerspace.pl)
|
||||||
* [ymmtmdk](https://github.com/ymmtmdk)
|
* [saturday06](mailto:dyob@lunaport.net)
|
||||||
|
* [scriptjunkie](mailto:scriptjunkie@scriptjunkie.us)
|
||||||
|
* [seekr](mailto:mario.drs@gmail.com)
|
||||||
|
* [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)
|
||||||
|
* [tmyt](mailto:shigure@refy.net)
|
||||||
|
* [utam0k](mailto:k0ma@utam0k.jp)
|
||||||
|
* [vpzomtrrfrt](mailto:vpzomtrrfrt@gmail.com)
|
||||||
|
* [walfie](mailto:walfington@gmail.com)
|
||||||
|
* [y-temp4](mailto:y.temp4@gmail.com)
|
||||||
|
* [ymmtmdk](mailto:ymmtmdk@gmail.com)
|
||||||
|
* [yoshipc](mailto:yoooo@yoshipc.net)
|
||||||
|
* [Özcan Zafer AYAN](mailto:ozcanzaferayan@gmail.com)
|
||||||
|
* [ばん](mailto:detteiu0321@gmail.com)
|
||||||
|
* [みたらしだんご](mailto:mitarashidango@users.noreply.github.com)
|
||||||
|
* [りんすき](mailto:6533808+rinsuki@users.noreply.github.com)
|
||||||
|
* [ヨイツの賢狼ホロ | 3rd style](mailto:horo@yoitsu.moe)
|
||||||
|
* [猫吸血鬼ディフリス / 猫ロキP](mailto:deflis@gmail.com)
|
||||||
|
* [艮 鮟鱇](mailto:ushitora_anqou@yahoo.co.jp)
|
||||||
|
* [西小倉宏信](mailto:nishiko@mindia.jp)
|
||||||
|
* [雨宮美羽](mailto:k737566@gmail.com)
|
||||||
|
|
||||||
This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/tootsuite/mastodon/graphs/contributors) instead.
|
This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/tootsuite/mastodon/graphs/contributors) instead.
|
||||||
|
|
17
Aptfile
17
Aptfile
|
@ -10,3 +10,20 @@ libxdamage1
|
||||||
libxfixes3
|
libxfixes3
|
||||||
protobuf-compiler
|
protobuf-compiler
|
||||||
zlib1g-dev
|
zlib1g-dev
|
||||||
|
libcairo2
|
||||||
|
libcroco3
|
||||||
|
libdatrie1
|
||||||
|
libgdk-pixbuf2.0-0
|
||||||
|
libgraphite2-3
|
||||||
|
libharfbuzz0b
|
||||||
|
libpango-1.0-0
|
||||||
|
libpangocairo-1.0-0
|
||||||
|
libpangoft2-1.0-0
|
||||||
|
libpixman-1-0
|
||||||
|
librsvg2-2
|
||||||
|
libthai-data
|
||||||
|
libthai0
|
||||||
|
libvpx5
|
||||||
|
libxcb-render0
|
||||||
|
libxcb-shm0
|
||||||
|
libxrender1
|
||||||
|
|
|
@ -53,10 +53,6 @@ class Api::BaseController < ApplicationController
|
||||||
[params[:limit].to_i.abs, default_limit * 2].min
|
[params[:limit].to_i.abs, default_limit * 2].min
|
||||||
end
|
end
|
||||||
|
|
||||||
def truthy_param?(key)
|
|
||||||
ActiveModel::Type::Boolean.new.cast(params[key])
|
|
||||||
end
|
|
||||||
|
|
||||||
def current_resource_owner
|
def current_resource_owner
|
||||||
@current_user ||= User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token
|
@current_user ||= User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token
|
||||||
end
|
end
|
||||||
|
|
|
@ -128,6 +128,10 @@ class ApplicationController < ActionController::Base
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
|
def truthy_param?(key)
|
||||||
|
ActiveModel::Type::Boolean.new.cast(params[key])
|
||||||
|
end
|
||||||
|
|
||||||
def forbidden
|
def forbidden
|
||||||
respond_with_error(403)
|
respond_with_error(403)
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,6 +11,7 @@ class Auth::SessionsController < Devise::SessionsController
|
||||||
prepend_before_action :set_pack
|
prepend_before_action :set_pack
|
||||||
before_action :set_instance_presenter, only: [:new]
|
before_action :set_instance_presenter, only: [:new]
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
|
after_action :clear_site_data, only: [:destroy]
|
||||||
|
|
||||||
def new
|
def new
|
||||||
Devise.omniauth_configs.each do |provider, config|
|
Devise.omniauth_configs.each do |provider, config|
|
||||||
|
@ -28,8 +29,10 @@ class Auth::SessionsController < Devise::SessionsController
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
|
tmp_stored_location = stored_location_for(:user)
|
||||||
super
|
super
|
||||||
flash.delete(:notice)
|
flash.delete(:notice)
|
||||||
|
store_location_for(:user, tmp_stored_location) if continue_after?
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
@ -126,4 +129,16 @@ class Auth::SessionsController < Devise::SessionsController
|
||||||
end
|
end
|
||||||
paths
|
paths
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def clear_site_data
|
||||||
|
return if continue_after?
|
||||||
|
|
||||||
|
# Should be '"*"' but that doen't work in Chrome (neither does '"executionContexts"')
|
||||||
|
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Clear-Site-Data
|
||||||
|
response.headers['Clear-Site-Data'] = '"cache", "cookies", "storage"'
|
||||||
|
end
|
||||||
|
|
||||||
|
def continue_after?
|
||||||
|
truthy_param?(:continue)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -18,4 +18,18 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController
|
||||||
def set_pack
|
def set_pack
|
||||||
use_pack 'auth'
|
use_pack 'auth'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def render_success
|
||||||
|
if skip_authorization? || (matching_token? && !truthy_param?('force_login'))
|
||||||
|
redirect_or_render authorize_response
|
||||||
|
elsif Doorkeeper.configuration.api_only
|
||||||
|
render json: pre_auth
|
||||||
|
else
|
||||||
|
render :new
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def truthy_param?(key)
|
||||||
|
ActiveModel::Type::Boolean.new.cast(params[key])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,6 +8,7 @@ module SettingsHelper
|
||||||
bg: 'Български',
|
bg: 'Български',
|
||||||
ca: 'Català',
|
ca: 'Català',
|
||||||
co: 'Corsu',
|
co: 'Corsu',
|
||||||
|
cs: 'Čeština',
|
||||||
cy: 'Cymraeg',
|
cy: 'Cymraeg',
|
||||||
da: 'Dansk',
|
da: 'Dansk',
|
||||||
de: 'Deutsch',
|
de: 'Deutsch',
|
||||||
|
|
|
@ -63,7 +63,7 @@
|
||||||
"column_header.show_settings": "Показать настройки",
|
"column_header.show_settings": "Показать настройки",
|
||||||
"column_header.unpin": "Открепить",
|
"column_header.unpin": "Открепить",
|
||||||
"column_subheading.settings": "Настройки",
|
"column_subheading.settings": "Настройки",
|
||||||
"community.column_settings.media_only": "Только медиа",
|
"community.column_settings.media_only": "Только с медиа",
|
||||||
"compose_form.direct_message_warning": "Этот статус будет виден только упомянутым пользователям.",
|
"compose_form.direct_message_warning": "Этот статус будет виден только упомянутым пользователям.",
|
||||||
"compose_form.direct_message_warning_learn_more": "Узнать больше",
|
"compose_form.direct_message_warning_learn_more": "Узнать больше",
|
||||||
"compose_form.hashtag_warning": "Этот пост не будет показывается в поиске по хэштегу, т.к. он непубличный. Только публичные посты можно найти в поиске по хэштегу.",
|
"compose_form.hashtag_warning": "Этот пост не будет показывается в поиске по хэштегу, т.к. он непубличный. Только публичные посты можно найти в поиске по хэштегу.",
|
||||||
|
@ -76,7 +76,7 @@
|
||||||
"compose_form.sensitive.unmarked": "Медиафайлы не отмечены как чувствительные",
|
"compose_form.sensitive.unmarked": "Медиафайлы не отмечены как чувствительные",
|
||||||
"compose_form.spoiler.marked": "Текст скрыт за предупреждением",
|
"compose_form.spoiler.marked": "Текст скрыт за предупреждением",
|
||||||
"compose_form.spoiler.unmarked": "Текст не скрыт",
|
"compose_form.spoiler.unmarked": "Текст не скрыт",
|
||||||
"compose_form.spoiler_placeholder": "Напишите свое предупреждение здесь",
|
"compose_form.spoiler_placeholder": "Текст предупреждения",
|
||||||
"confirmation_modal.cancel": "Отмена",
|
"confirmation_modal.cancel": "Отмена",
|
||||||
"confirmations.block.confirm": "Заблокировать",
|
"confirmations.block.confirm": "Заблокировать",
|
||||||
"confirmations.block.message": "Вы уверены, что хотите заблокировать {name}?",
|
"confirmations.block.message": "Вы уверены, что хотите заблокировать {name}?",
|
||||||
|
@ -290,7 +290,7 @@
|
||||||
"status.mention": "Упомянуть @{name}",
|
"status.mention": "Упомянуть @{name}",
|
||||||
"status.more": "Больше",
|
"status.more": "Больше",
|
||||||
"status.mute": "Заглушить @{name}",
|
"status.mute": "Заглушить @{name}",
|
||||||
"status.mute_conversation": "Заглушить тред",
|
"status.mute_conversation": "Заглушить всю цепочку",
|
||||||
"status.open": "Развернуть статус",
|
"status.open": "Развернуть статус",
|
||||||
"status.pin": "Закрепить в профиле",
|
"status.pin": "Закрепить в профиле",
|
||||||
"status.pinned": "Закреплённый статус",
|
"status.pinned": "Закреплённый статус",
|
||||||
|
@ -300,7 +300,7 @@
|
||||||
"status.reblogs.empty": "Никто ещё не продвинул этот статус. Как только кто-то это сделает, они появятся здесь.",
|
"status.reblogs.empty": "Никто ещё не продвинул этот статус. Как только кто-то это сделает, они появятся здесь.",
|
||||||
"status.redraft": "Удалить и исправить",
|
"status.redraft": "Удалить и исправить",
|
||||||
"status.reply": "Ответить",
|
"status.reply": "Ответить",
|
||||||
"status.replyAll": "Ответить на тред",
|
"status.replyAll": "Ответить всем",
|
||||||
"status.report": "Пожаловаться",
|
"status.report": "Пожаловаться",
|
||||||
"status.sensitive_toggle": "Нажмите для просмотра",
|
"status.sensitive_toggle": "Нажмите для просмотра",
|
||||||
"status.sensitive_warning": "Чувствительный контент",
|
"status.sensitive_warning": "Чувствительный контент",
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
$black-emojis: '8ball' 'ant' 'back' 'black_circle' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bust_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'end' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'lower_left_fountain_pen' 'on' 'registered' 'soon' 'spades' 'spider' 'tm' 'top' 'waving_black_flag' 'wavy_dash' 'video_game';
|
$black-emojis: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash';
|
||||||
|
|
||||||
%white-emoji-outline {
|
%white-emoji-outline {
|
||||||
filter: drop-shadow(1px 1px 0 $white) drop-shadow(-1px 1px 0 $white) drop-shadow(1px -1px 0 $white) drop-shadow(-1px -1px 0 $white);
|
filter: drop-shadow(1px 1px 0 $white) drop-shadow(-1px 1px 0 $white) drop-shadow(1px -1px 0 $white) drop-shadow(-1px -1px 0 $white);
|
||||||
|
|
|
@ -1666,14 +1666,14 @@ a.account__display-name {
|
||||||
|
|
||||||
&.top {
|
&.top {
|
||||||
bottom: -5px;
|
bottom: -5px;
|
||||||
margin-left: -13px;
|
margin-left: -7px;
|
||||||
border-width: 5px 7px 0;
|
border-width: 5px 7px 0;
|
||||||
border-top-color: $ui-secondary-color;
|
border-top-color: $ui-secondary-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.bottom {
|
&.bottom {
|
||||||
top: -5px;
|
top: -5px;
|
||||||
margin-left: -13px;
|
margin-left: -7px;
|
||||||
border-width: 0 7px 5px;
|
border-width: 0 7px 5px;
|
||||||
border-bottom-color: $ui-secondary-color;
|
border-bottom-color: $ui-secondary-color;
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,6 +53,11 @@ table {
|
||||||
border-spacing: 0;
|
border-spacing: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
scrollbar-face-color: lighten($ui-base-color, 4%);
|
||||||
|
scrollbar-track-color: rgba($base-overlay-background, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
::-webkit-scrollbar {
|
::-webkit-scrollbar {
|
||||||
width: 12px;
|
width: 12px;
|
||||||
height: 12px;
|
height: 12px;
|
||||||
|
|
|
@ -87,34 +87,36 @@ class FetchLinkCardService < BaseService
|
||||||
end
|
end
|
||||||
|
|
||||||
def attempt_oembed
|
def attempt_oembed
|
||||||
embed = FetchOEmbedService.new.call(@url, html: @html)
|
service = FetchOEmbedService.new
|
||||||
|
embed = service.call(@url, html: @html)
|
||||||
|
url = Addressable::URI.parse(service.endpoint_url)
|
||||||
|
|
||||||
return false if embed.nil?
|
return false if embed.nil?
|
||||||
|
|
||||||
@card.type = embed[:type]
|
@card.type = embed[:type]
|
||||||
@card.title = embed[:title] || ''
|
@card.title = embed[:title] || ''
|
||||||
@card.author_name = embed[:author_name] || ''
|
@card.author_name = embed[:author_name] || ''
|
||||||
@card.author_url = embed[:author_url] || ''
|
@card.author_url = embed[:author_url].present? ? (url + embed[:author_url]).to_s : ''
|
||||||
@card.provider_name = embed[:provider_name] || ''
|
@card.provider_name = embed[:provider_name] || ''
|
||||||
@card.provider_url = embed[:provider_url] || ''
|
@card.provider_url = embed[:provider_url].present? ? (url + embed[:provider_url]).to_s : ''
|
||||||
@card.width = 0
|
@card.width = 0
|
||||||
@card.height = 0
|
@card.height = 0
|
||||||
|
|
||||||
case @card.type
|
case @card.type
|
||||||
when 'link'
|
when 'link'
|
||||||
@card.image_remote_url = embed[:thumbnail_url] if embed[:thumbnail_url].present?
|
@card.image_remote_url = (url + embed[:thumbnail_url]).to_s if embed[:thumbnail_url].present?
|
||||||
when 'photo'
|
when 'photo'
|
||||||
return false if embed[:url].blank?
|
return false if embed[:url].blank?
|
||||||
|
|
||||||
@card.embed_url = embed[:url]
|
@card.embed_url = (url + embed[:url]).to_s
|
||||||
@card.image_remote_url = embed[:url]
|
@card.image_remote_url = (url + embed[:url]).to_s
|
||||||
@card.width = embed[:width].presence || 0
|
@card.width = embed[:width].presence || 0
|
||||||
@card.height = embed[:height].presence || 0
|
@card.height = embed[:height].presence || 0
|
||||||
when 'video'
|
when 'video'
|
||||||
@card.width = embed[:width].presence || 0
|
@card.width = embed[:width].presence || 0
|
||||||
@card.height = embed[:height].presence || 0
|
@card.height = embed[:height].presence || 0
|
||||||
@card.html = Formatter.instance.sanitize(embed[:html], Sanitize::Config::MASTODON_OEMBED)
|
@card.html = Formatter.instance.sanitize(embed[:html], Sanitize::Config::MASTODON_OEMBED)
|
||||||
@card.image_remote_url = embed[:thumbnail_url] if embed[:thumbnail_url].present?
|
@card.image_remote_url = (url + embed[:thumbnail_url]).to_s if embed[:thumbnail_url].present?
|
||||||
when 'rich'
|
when 'rich'
|
||||||
# Most providers rely on <script> tags, which is a no-no
|
# Most providers rely on <script> tags, which is a no-no
|
||||||
return false
|
return false
|
||||||
|
@ -146,7 +148,7 @@ class FetchLinkCardService < BaseService
|
||||||
|
|
||||||
@card.title = meta_property(page, 'og:title').presence || page.at_xpath('//title')&.content || ''
|
@card.title = meta_property(page, 'og:title').presence || page.at_xpath('//title')&.content || ''
|
||||||
@card.description = meta_property(page, 'og:description').presence || meta_property(page, 'description') || ''
|
@card.description = meta_property(page, 'og:description').presence || meta_property(page, 'description') || ''
|
||||||
@card.image_remote_url = meta_property(page, 'og:image') if meta_property(page, 'og:image')
|
@card.image_remote_url = (Addressable::URI.parse(@url) + meta_property(page, 'og:image')).to_s if meta_property(page, 'og:image')
|
||||||
|
|
||||||
return if @card.title.blank? && @card.html.blank?
|
return if @card.title.blank? && @card.html.blank?
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ class FetchOEmbedService
|
||||||
|
|
||||||
return if @endpoint_url.blank?
|
return if @endpoint_url.blank?
|
||||||
|
|
||||||
@endpoint_url = Addressable::URI.parse(@endpoint_url).to_s
|
@endpoint_url = (Addressable::URI.parse(@url) + @endpoint_url).to_s
|
||||||
rescue Addressable::URI::InvalidURIError
|
rescue Addressable::URI::InvalidURIError
|
||||||
@endpoint_url = nil
|
@endpoint_url = nil
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,10 @@
|
||||||
= image_tag account.header.url, class: 'parallax'
|
= image_tag account.header.url, class: 'parallax'
|
||||||
.public-account-header__bar
|
.public-account-header__bar
|
||||||
= link_to short_account_url(account), class: 'avatar' do
|
= link_to short_account_url(account), class: 'avatar' do
|
||||||
= image_tag account.avatar.url
|
- if current_account&.user&.setting_auto_play_gif
|
||||||
|
= image_tag account.avatar_original_url
|
||||||
|
- else
|
||||||
|
= image_tag account.avatar_static_url
|
||||||
.public-account-header__tabs
|
.public-account-header__tabs
|
||||||
.public-account-header__tabs__name
|
.public-account-header__tabs__name
|
||||||
%h1
|
%h1
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
.name
|
.name
|
||||||
= t 'users.signed_in_as'
|
= t 'users.signed_in_as'
|
||||||
%span.username @#{current_account.local_username_and_domain}
|
%span.username @#{current_account.local_username_and_domain}
|
||||||
= link_to destroy_user_session_path, method: :delete, class: 'logout-link icon-button' do
|
= link_to destroy_user_session_path(continue: true), method: :delete, class: 'logout-link icon-button' do
|
||||||
= fa_icon 'sign-out'
|
= fa_icon 'sign-out'
|
||||||
|
|
||||||
.container-alt= yield
|
.container-alt= yield
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#!/usr/bin/env ruby
|
#!/usr/bin/env ruby
|
||||||
APP_PATH = File.expand_path('../config/application', __dir__)
|
APP_PATH = File.expand_path('../config/application', __dir__)
|
||||||
|
require_relative '../config/boot'
|
||||||
require_relative '../lib/cli'
|
require_relative '../lib/cli'
|
||||||
Mastodon::CLI.start(ARGV)
|
Mastodon::CLI.start(ARGV)
|
||||||
|
|
|
@ -43,6 +43,7 @@ module Mastodon
|
||||||
:bg,
|
:bg,
|
||||||
:ca,
|
:ca,
|
||||||
:co,
|
:co,
|
||||||
|
:cs,
|
||||||
:cy,
|
:cy,
|
||||||
:da,
|
:da,
|
||||||
:de,
|
:de,
|
||||||
|
|
|
@ -10,6 +10,7 @@ Warden::Manager.after_set_user except: :fetch do |user, warden|
|
||||||
expires: 1.year.from_now,
|
expires: 1.year.from_now,
|
||||||
httponly: true,
|
httponly: true,
|
||||||
secure: (Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true'),
|
secure: (Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true'),
|
||||||
|
same_site: :lax,
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -20,6 +21,7 @@ Warden::Manager.after_fetch do |user, warden|
|
||||||
expires: 1.year.from_now,
|
expires: 1.year.from_now,
|
||||||
httponly: true,
|
httponly: true,
|
||||||
secure: (Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true'),
|
secure: (Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true'),
|
||||||
|
same_site: :lax,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
warden.logout
|
warden.logout
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
# Be sure to restart your server when you modify this file.
|
# Be sure to restart your server when you modify this file.
|
||||||
|
|
||||||
Rails.application.config.session_store :cookie_store, key: '_mastodon_session', secure: (Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true')
|
Rails.application.config.session_store :cookie_store, key: '_mastodon_session', secure: (Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true'), same_site: :lax
|
||||||
|
|
|
@ -6,7 +6,7 @@ ru:
|
||||||
about_this: Об этом узле
|
about_this: Об этом узле
|
||||||
administered_by: 'Администратор узла:'
|
administered_by: 'Администратор узла:'
|
||||||
api: API
|
api: API
|
||||||
apps: Мобильные приложения
|
apps: Приложения
|
||||||
closed_registrations: В данный момент регистрация на этом узле закрыта. Но вы можете найти другой узел, создать на нём учётную запись и получить доступ к той же сети оттуда.
|
closed_registrations: В данный момент регистрация на этом узле закрыта. Но вы можете найти другой узел, создать на нём учётную запись и получить доступ к той же сети оттуда.
|
||||||
contact: Связаться
|
contact: Связаться
|
||||||
contact_missing: Не установлено
|
contact_missing: Не установлено
|
||||||
|
@ -51,7 +51,7 @@ ru:
|
||||||
many: подписчиков
|
many: подписчиков
|
||||||
one: подписчик
|
one: подписчик
|
||||||
other: подписчиков
|
other: подписчиков
|
||||||
following: Подписан(а)
|
following: подписки
|
||||||
joined: 'Дата регистрации: %{date}'
|
joined: 'Дата регистрации: %{date}'
|
||||||
media: Медиа
|
media: Медиа
|
||||||
moved_html: "%{name} переехал(а) на %{new_profile_link}:"
|
moved_html: "%{name} переехал(а) на %{new_profile_link}:"
|
||||||
|
@ -206,7 +206,7 @@ ru:
|
||||||
custom_emojis:
|
custom_emojis:
|
||||||
by_domain: Домен
|
by_domain: Домен
|
||||||
copied_msg: Локальная копия эмодзи успешно создана
|
copied_msg: Локальная копия эмодзи успешно создана
|
||||||
copy: Скопироват
|
copy: Копировать
|
||||||
copy_failed_msg: Не удалось создать локальную копию эмодзи
|
copy_failed_msg: Не удалось создать локальную копию эмодзи
|
||||||
created_msg: Эмодзи успешно создано!
|
created_msg: Эмодзи успешно создано!
|
||||||
delete: Удалить
|
delete: Удалить
|
||||||
|
@ -231,11 +231,11 @@ ru:
|
||||||
dashboard:
|
dashboard:
|
||||||
backlog: задачи
|
backlog: задачи
|
||||||
config: Конфигурация
|
config: Конфигурация
|
||||||
feature_deletions: Аккаунтов удалено
|
feature_deletions: Удаление аккаунтов
|
||||||
feature_invites: Пригласительные ссылки
|
feature_invites: Пригласительные ссылки
|
||||||
feature_registrations: Регистрации
|
feature_registrations: Регистрация
|
||||||
feature_relay: Ретрансляторов сети
|
feature_relay: Ретрансляторы
|
||||||
features: Нововведения
|
features: Возможности
|
||||||
hidden_service: Федерация со скрытыми сервисами
|
hidden_service: Федерация со скрытыми сервисами
|
||||||
open_reports: открытых жалоб
|
open_reports: открытых жалоб
|
||||||
recent_users: Недавние пользователи
|
recent_users: Недавние пользователи
|
||||||
|
@ -300,7 +300,7 @@ ru:
|
||||||
search: Поиск
|
search: Поиск
|
||||||
title: Известные узлы
|
title: Известные узлы
|
||||||
invites:
|
invites:
|
||||||
deactivate_all: Удалить все
|
deactivate_all: Отключить все
|
||||||
filter:
|
filter:
|
||||||
all: Все
|
all: Все
|
||||||
available: Актуальные
|
available: Актуальные
|
||||||
|
@ -314,7 +314,7 @@ ru:
|
||||||
inbox_url: URL ретранслятора
|
inbox_url: URL ретранслятора
|
||||||
pending: Ожидание подтверждения ретранслятора
|
pending: Ожидание подтверждения ретранслятора
|
||||||
save_and_enable: Сохранить и включить
|
save_and_enable: Сохранить и включить
|
||||||
setup: Настроте соединение с ретранслятором
|
setup: Настроить соединение с ретранслятором
|
||||||
status: Состояние
|
status: Состояние
|
||||||
title: Ретрансляторы
|
title: Ретрансляторы
|
||||||
report_notes:
|
report_notes:
|
||||||
|
@ -405,7 +405,7 @@ ru:
|
||||||
title: Расширенное описание узла
|
title: Расширенное описание узла
|
||||||
site_short_description:
|
site_short_description:
|
||||||
desc_html: Отображается в боковой панели и в тегах. Опишите, что такое Mastodon и что делает именно этот узел особенным. Если пусто, используется описание узла по умолчанию.
|
desc_html: Отображается в боковой панели и в тегах. Опишите, что такое Mastodon и что делает именно этот узел особенным. Если пусто, используется описание узла по умолчанию.
|
||||||
title: Короткое описание узла
|
title: Краткое описание узла
|
||||||
site_terms:
|
site_terms:
|
||||||
desc_html: Вы можете добавить сюда собственную политику конфиденциальности, пользовательское соглашение и другие документы. Можно использовать теги HTML.
|
desc_html: Вы можете добавить сюда собственную политику конфиденциальности, пользовательское соглашение и другие документы. Можно использовать теги HTML.
|
||||||
title: Условия использования
|
title: Условия использования
|
||||||
|
@ -791,7 +791,7 @@ ru:
|
||||||
ownership: Нельзя закрепить чужой статус
|
ownership: Нельзя закрепить чужой статус
|
||||||
private: Нельзя закрепить непубличный статус
|
private: Нельзя закрепить непубличный статус
|
||||||
reblog: Нельзя закрепить продвинутый статус
|
reblog: Нельзя закрепить продвинутый статус
|
||||||
show_more: Подробнее
|
show_more: Ещё
|
||||||
sign_in_to_participate: Войдите, чтобы принять участие в дискуссии
|
sign_in_to_participate: Войдите, чтобы принять участие в дискуссии
|
||||||
title: '%{name}: "%{quote}"'
|
title: '%{name}: "%{quote}"'
|
||||||
visibilities:
|
visibilities:
|
||||||
|
|
|
@ -35,6 +35,8 @@ ru:
|
||||||
data: Файл CSV, экспортированный с другого узла Mastodon
|
data: Файл CSV, экспортированный с другого узла Mastodon
|
||||||
sessions:
|
sessions:
|
||||||
otp: 'Введите код двухфакторной аутентификации, сгенерированный в мобильном приложении, или используйте один из Ваших кодов восстановления:'
|
otp: 'Введите код двухфакторной аутентификации, сгенерированный в мобильном приложении, или используйте один из Ваших кодов восстановления:'
|
||||||
|
user:
|
||||||
|
chosen_languages: Если выбрано, то в публичных лентах будут показаны только посты на выбранных языках
|
||||||
labels:
|
labels:
|
||||||
account:
|
account:
|
||||||
fields:
|
fields:
|
||||||
|
|
|
@ -43,6 +43,145 @@ module Mastodon
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
option :email, required: true
|
||||||
|
option :confirmed, type: :boolean
|
||||||
|
option :role, default: 'user'
|
||||||
|
option :reattach, type: :boolean
|
||||||
|
option :force, type: :boolean
|
||||||
|
desc 'add USERNAME', 'Create a new user'
|
||||||
|
long_desc <<-LONG_DESC
|
||||||
|
Create a new user account with a given USERNAME and an
|
||||||
|
e-mail address provided with --email.
|
||||||
|
|
||||||
|
With the --confirmed option, the confirmation e-mail will
|
||||||
|
be skipped and the account will be active straight away.
|
||||||
|
|
||||||
|
With the --role option one of "user", "admin" or "moderator"
|
||||||
|
can be supplied. Defaults to "user"
|
||||||
|
|
||||||
|
With the --reattach option, the new user will be reattached
|
||||||
|
to a given existing username of an old account. If the old
|
||||||
|
account is still in use by someone else, you can supply
|
||||||
|
the --force option to delete the old record and reattach the
|
||||||
|
username to the new account anyway.
|
||||||
|
LONG_DESC
|
||||||
|
def add(username)
|
||||||
|
account = Account.new(username: username)
|
||||||
|
password = SecureRandom.hex
|
||||||
|
user = User.new(email: options[:email], password: password, admin: options[:role] == 'admin', moderator: options[:role] == 'moderator', confirmed_at: Time.now.utc)
|
||||||
|
|
||||||
|
if options[:reattach]
|
||||||
|
account = Account.find_local(username) || Account.new(username: username)
|
||||||
|
|
||||||
|
if account.user.present? && !options[:force]
|
||||||
|
say('The chosen username is currently in use', :red)
|
||||||
|
say('Use --force to reattach it anyway and delete the other user')
|
||||||
|
return
|
||||||
|
elsif account.user.present?
|
||||||
|
account.user.destroy!
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
user.account = account
|
||||||
|
|
||||||
|
if user.save
|
||||||
|
if options[:confirmed]
|
||||||
|
user.confirmed_at = nil
|
||||||
|
user.confirm!
|
||||||
|
end
|
||||||
|
|
||||||
|
say('OK', :green)
|
||||||
|
say("New password: #{password}")
|
||||||
|
else
|
||||||
|
user.errors.to_h.each do |key, error|
|
||||||
|
say('Failure/Error: ', :red)
|
||||||
|
say(key)
|
||||||
|
say(' ' + error, :red)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
desc 'del USERNAME', 'Delete a user'
|
||||||
|
long_desc <<-LONG_DESC
|
||||||
|
Remove a user account with a given USERNAME.
|
||||||
|
LONG_DESC
|
||||||
|
def del(username)
|
||||||
|
account = Account.find_local(username)
|
||||||
|
|
||||||
|
if account.nil?
|
||||||
|
say('No user with such username', :red)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
say("Deleting user with #{account.statuses_count}, this might take a while...")
|
||||||
|
SuspendAccountService.new.call(account, remove_user: true)
|
||||||
|
say('OK', :green)
|
||||||
|
end
|
||||||
|
|
||||||
|
option :dry_run, type: :boolean
|
||||||
|
desc 'cull', 'Remove remote accounts that no longer exist'
|
||||||
|
long_desc <<-LONG_DESC
|
||||||
|
Query every single remote account in the database to determine
|
||||||
|
if it still exists on the origin server, and if it doesn't,
|
||||||
|
remove it from the database.
|
||||||
|
|
||||||
|
Accounts that have had confirmed activity within the last week
|
||||||
|
are excluded from the checks.
|
||||||
|
|
||||||
|
If 10 or more accounts from the same domain cannot be queried
|
||||||
|
due to a connection error (such as missing DNS records) then
|
||||||
|
the domain is considered dead, and all other accounts from it
|
||||||
|
are deleted without further querying.
|
||||||
|
|
||||||
|
With the --dry-run option, no deletes will actually be carried
|
||||||
|
out.
|
||||||
|
LONG_DESC
|
||||||
|
def cull
|
||||||
|
domain_thresholds = Hash.new { |hash, key| hash[key] = 0 }
|
||||||
|
skip_threshold = 7.days.ago
|
||||||
|
culled = 0
|
||||||
|
dead_servers = []
|
||||||
|
dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
|
||||||
|
|
||||||
|
Account.remote.where(protocol: :activitypub).partitioned.find_each do |account|
|
||||||
|
next if account.updated_at >= skip_threshold || account.last_webfingered_at >= skip_threshold
|
||||||
|
|
||||||
|
unless dead_servers.include?(account.domain)
|
||||||
|
begin
|
||||||
|
code = Request.new(:head, account.uri).perform(&:code)
|
||||||
|
rescue HTTP::ConnectionError
|
||||||
|
domain_thresholds[account.domain] += 1
|
||||||
|
|
||||||
|
if domain_thresholds[account.domain] >= 10
|
||||||
|
dead_servers << account.domain
|
||||||
|
end
|
||||||
|
rescue StandardError
|
||||||
|
next
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if [404, 410].include?(code) || dead_servers.include?(account.domain)
|
||||||
|
unless options[:dry_run]
|
||||||
|
SuspendAccountService.new.call(account)
|
||||||
|
account.destroy
|
||||||
|
end
|
||||||
|
|
||||||
|
culled += 1
|
||||||
|
say('.', :green, false)
|
||||||
|
else
|
||||||
|
say('.', nil, false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
say
|
||||||
|
say("Removed #{culled} accounts (#{dead_servers.size} dead servers)#{dry_run}", :green)
|
||||||
|
|
||||||
|
unless dead_servers.empty?
|
||||||
|
say('R.I.P.:', :yellow)
|
||||||
|
dead_servers.each { |domain| say(' ' + domain) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def rotate_keys_for_account(account, delay = 0)
|
def rotate_keys_for_account(account, delay = 0)
|
||||||
|
|
|
@ -4,5 +4,6 @@ dev_null = Logger.new('/dev/null')
|
||||||
|
|
||||||
Rails.logger = dev_null
|
Rails.logger = dev_null
|
||||||
ActiveRecord::Base.logger = dev_null
|
ActiveRecord::Base.logger = dev_null
|
||||||
|
ActiveJob::Base.logger = dev_null
|
||||||
HttpLog.configuration.logger = dev_null
|
HttpLog.configuration.logger = dev_null
|
||||||
Paperclip.options[:log] = false
|
Paperclip.options[:log] = false
|
||||||
|
|
30
lib/tasks/repo.rake
Normal file
30
lib/tasks/repo.rake
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
namespace :repo do
|
||||||
|
desc 'Generate the authors.md file'
|
||||||
|
task :authors do
|
||||||
|
file = File.open('AUTHORS.md', 'w')
|
||||||
|
file << <<~HEADER
|
||||||
|
Mastodon is available on [GitHub](https://github.com/tootsuite/mastodon)
|
||||||
|
and provided thanks to the work of the following contributors:
|
||||||
|
|
||||||
|
HEADER
|
||||||
|
|
||||||
|
url = 'https://api.github.com/repos/tootsuite/mastodon/contributors?anon=1'
|
||||||
|
HttpLog.config.compact_log = true
|
||||||
|
while url.present?
|
||||||
|
response = HTTP.get(url)
|
||||||
|
contributors = Oj.load(response.body)
|
||||||
|
contributors.each do |c|
|
||||||
|
file << "* [#{c['login']}](#{c['html_url']})\n" if c['login']
|
||||||
|
file << "* [#{c['name']}](mailto:#{c['email']})\n" if c['name']
|
||||||
|
end
|
||||||
|
url = LinkHeader.parse(response.headers['Link']).find_link(%w(rel next))&.href
|
||||||
|
end
|
||||||
|
|
||||||
|
file << <<~FOOTER
|
||||||
|
|
||||||
|
This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/tootsuite/mastodon/graphs/contributors) instead.
|
||||||
|
FOOTER
|
||||||
|
end
|
||||||
|
end
|
|
@ -30,6 +30,13 @@ RSpec.describe Auth::SessionsController, type: :controller do
|
||||||
|
|
||||||
expect(response).to redirect_to(new_user_session_path)
|
expect(response).to redirect_to(new_user_session_path)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'does not delete redirect location with continue=true' do
|
||||||
|
sign_in(user, scope: :user)
|
||||||
|
controller.store_location_for(:user, '/authorize')
|
||||||
|
delete :destroy, params: { continue: 'true' }
|
||||||
|
expect(controller.stored_location_for(:user)).to eq '/authorize'
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with a suspended user' do
|
context 'with a suspended user' do
|
||||||
|
|
|
@ -5,23 +5,25 @@ require 'rails_helper'
|
||||||
RSpec.describe Oauth::AuthorizationsController, type: :controller do
|
RSpec.describe Oauth::AuthorizationsController, type: :controller do
|
||||||
render_views
|
render_views
|
||||||
|
|
||||||
let(:app) { Doorkeeper::Application.create!(name: 'test', redirect_uri: 'http://localhost/') }
|
let(:app) { Doorkeeper::Application.create!(name: 'test', redirect_uri: 'http://localhost/', scopes: 'read') }
|
||||||
|
|
||||||
describe 'GET #new' do
|
describe 'GET #new' do
|
||||||
subject do
|
subject do
|
||||||
get :new, params: { client_id: app.uid, response_type: 'code', redirect_uri: 'http://localhost/' }
|
get :new, params: { client_id: app.uid, response_type: 'code', redirect_uri: 'http://localhost/', scope: 'read' }
|
||||||
end
|
end
|
||||||
|
|
||||||
shared_examples 'stores location for user' do
|
shared_examples 'stores location for user' do
|
||||||
it 'stores location for user' do
|
it 'stores location for user' do
|
||||||
subject
|
subject
|
||||||
expect(controller.stored_location_for(:user)).to eq "/oauth/authorize?client_id=#{app.uid}&redirect_uri=http%3A%2F%2Flocalhost%2F&response_type=code"
|
expect(controller.stored_location_for(:user)).to eq "/oauth/authorize?client_id=#{app.uid}&redirect_uri=http%3A%2F%2Flocalhost%2F&response_type=code&scope=read"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when signed in' do
|
context 'when signed in' do
|
||||||
|
let!(:user) { Fabricate(:user) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
sign_in Fabricate(:user), scope: :user
|
sign_in user, scope: :user
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'returns http success' do
|
it 'returns http success' do
|
||||||
|
@ -35,6 +37,28 @@ RSpec.describe Oauth::AuthorizationsController, type: :controller do
|
||||||
end
|
end
|
||||||
|
|
||||||
include_examples 'stores location for user'
|
include_examples 'stores location for user'
|
||||||
|
|
||||||
|
context 'when app is already authorized' do
|
||||||
|
before do
|
||||||
|
Doorkeeper::AccessToken.find_or_create_for(
|
||||||
|
app,
|
||||||
|
user.id,
|
||||||
|
app.scopes,
|
||||||
|
Doorkeeper.configuration.access_token_expires_in,
|
||||||
|
Doorkeeper.configuration.refresh_token_enabled?
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'redirects to callback' do
|
||||||
|
subject
|
||||||
|
expect(response).to redirect_to(/\A#{app.redirect_uri}/)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'does not redirect to callback with force_login=true' do
|
||||||
|
get :new, params: { client_id: app.uid, response_type: 'code', redirect_uri: 'http://localhost/', scope: 'read', force_login: 'true' }
|
||||||
|
expect(response.body).to match(/Authorize/)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when not signed in' do
|
context 'when not signed in' do
|
||||||
|
|
|
@ -29,6 +29,7 @@ Devise::Test::ControllerHelpers.module_eval do
|
||||||
value: resource.activate_session(warden.request),
|
value: resource.activate_session(warden.request),
|
||||||
expires: 1.year.from_now,
|
expires: 1.year.from_now,
|
||||||
httponly: true,
|
httponly: true,
|
||||||
|
same_site: :lax,
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue