Commit 8825d827 authored by David Morley's avatar David Morley

Merge remote-tracking branch 'upstream/master'

parents 5f39a9ef 09a425cb
## Refactor
* Harmonize markdown titles sizes [#8029](
## Bug fixes
* Improve handling of mixed case hostnames while fetching OpenGraph data [#8021](
* Fix "remember me" with two factor authentication enabled [#8031](
## Features
* Add line mentioning diaspora\* on the splash page [#7966](
* Improve communication about signing up on closed pods [#7896](
## Refactor
......@@ -42,6 +42,14 @@
padding: 15px;
.part-of-diaspora {
font-style: italic;
a {
color: $white;
.login-form {
fieldset { background: none; }
......@@ -16,6 +16,30 @@
h1 {
font-size: 2.7rem;
h2 {
font-size: 2.3rem;
h3 {
font-size: 2rem;
h4 {
font-size: 1.8rem;
h5 {
font-size: 1.6rem;
h6 {
font-size: 1.4rem;
.img-responsive {
display: inline;
.page-registrations.action-create {
.page-registrations {
.ball {
background: image-url('branding/ball.png') no-repeat;
background-size: contain;
......@@ -12,19 +11,24 @@
height: 633px;
@media (max-width: $screen-xs-max) {
.v-center {
height: auto;
.content {
display: table-cell;
vertical-align: middle;
h2 {
h1 {
font-size: 35px;
margin: 12px;
text-align: center;
margin: 12px 0;
form {
max-width: 400px;
max-width: 500px;
.captcha-img {
......@@ -34,16 +38,13 @@
width: 120px;
.captcha-input {
.form-control.captcha-input {
border-bottom: 1px solid $input-border;
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
box-sizing: border-box;
font-size: 16px;
height: 40px;
line-height: $line-height-base;
padding: 10px 10px 10px 130px;
width: 100%;
padding-left: 130px;
.terms > a {
......@@ -5,9 +5,9 @@
# the COPYRIGHT file.
class RegistrationsController < Devise::RegistrationsController
before_action :check_registrations_open_or_valid_invite!
before_action :check_registrations_open_or_valid_invite!, except: :registrations_closed
layout -> { request.format == :mobile ? "application" : "with_header" }
layout -> { request.format == :mobile ? "application" : "with_header_with_footer" }
def create
@user =
......@@ -28,13 +28,17 @@ class RegistrationsController < Devise::RegistrationsController
def registrations_closed
render "registrations/registrations_closed"
def check_registrations_open_or_valid_invite!
return true if AppConfig.settings.enable_registrations? || invite.try(:can_be_used?)
flash[:error] = params[:invite] ? t("registrations.invalid_invite") : t("registrations.closed")
redirect_to new_user_session_path
flash[:error] = t("registrations.invalid_invite") if params[:invite]
redirect_to registrations_closed_path
def invite
......@@ -12,21 +12,21 @@ class SessionsController < Devise::SessionsController
# rubocop:enable Rails/LexicallyScopedActionFilter
def find_user
return User.find(session[:otp_user_id]) if session[:otp_user_id]
return User.find_for_authentication(username: params[:user][:username]) if params[:user][:username]
User.find_for_authentication(username: params[:user][:username]) if params[:user][:username]
User.find(session[:otp_user_id]) if session[:otp_user_id]
def authenticate_with_2fa
self.resource = find_user
u = find_user
return true unless u&.otp_required_for_login?
return true unless resource&.otp_required_for_login?
if params[:user][:otp_attempt].present? && session[:otp_user_id]
elsif u&.valid_password?(params[:user][:password])
strategy = Warden::Strategies[:database_authenticatable].new(warden.env, :user)
prompt_for_two_factor(strategy.user) if strategy.valid? && strategy._run!.successful?
......@@ -33,7 +33,9 @@ class OpenGraphCache < ApplicationRecord
def fetch_and_save_opengraph_data!
object = OpenGraphReader.fetch!(self.url)
uri = URI.parse(url.start_with?("http") ? url : "http://#{url}")
object = OpenGraphReader.fetch!(uri)
return unless object
......@@ -591,6 +591,10 @@ class User < ApplicationRecord
def remember_me
def clearable_fields
......@@ -37,7 +37,6 @@
autocorrect: "off",
aria: {labelledby: "passwordConfirmationLabel"}
= hidden_field(:user, :remember_me, value: 1)
= f.submit t("devise.passwords.edit.change_password"), class: "btn btn-block btn-primary"
......@@ -4,6 +4,10 @@
%h1= t("home.default.headline", pod_name: pod_name)
- if pod_name != "diaspora*"
!= t("home.default.part_of_diaspora",
diaspora_site_link: link_to(t("home.default.diaspora_site_link"), ""))
%h2= t("home.default.byline")
= render partial: "sessions/form", locals: {mobile: false, resource:, resource_name: :user}
- if AppConfig.settings.enable_registrations? && !current_page?(controller: "/registrations", action: :new)
- unless current_page?(controller: "/registrations", action: :new)
%li= link_to t("devise.shared.links.sign_up"), new_user_registration_path, class: "login"
- unless current_page?(controller: "/sessions", action: :new)
%li= link_to t("devise.shared.links.sign_in"), new_user_session_path, class: "login"
......@@ -4,7 +4,7 @@
- if mobile
= image_tag("branding/logos/header-logo2x.png", height: 40, width: 40)
= t("aspects.aspect_stream.make_something")
= AppConfig.settings.pod_name
- if mobile
= f.label :email, t(""), class: "control-label", id: "emailLabel"
= t("devise.shared.links.sign_up_closed")
!= t("registrations.closed.closed_pod",
wiki: link_to(t("registrations.closed.another_pod"), ""))
!= t("registrations.closed.find_pods",
poduptime: link_to("Poduptime", ""))
!= t("registrations.closed.other_questions",
wiki: link_to("Wiki", ""))
= AppConfig.settings.pod_name
= AppConfig.settings.pod_name
= render partial: "form", locals: {mobile: false}
= render partial: "form", locals: {mobile: false}
= render partial: "registrations_closed"
- flash.each do |name, msg|
.flash-message{class: "message alert alert-#{flash_class name}", role: "alert"}
= msg
= render partial: "registrations_closed"
......@@ -40,5 +40,4 @@
autocorrect: "off",
aria: {labelledby: "passwordLabel"}
= f.hidden_field :remember_me, value: 1
= f.submit t(""), class: "btn btn-large btn-block btn-primary"
......@@ -4,7 +4,7 @@
number: "" # Do not touch unless doing a release, do not backport the version number that's in master
number: "" # Do not touch unless doing a release, do not backport the version number that's in master
heroku: false
url: "http://localhost:3000/"
......@@ -15,11 +15,6 @@ end
# Use this hook to configure devise mailer, warden hooks and so forth.
# Many of these configuration options can be set straight in your model.
Devise.setup do |config|
config.warden do |manager|
manager.default_strategies(scope: :user).unshift :two_factor_authenticatable
manager.default_strategies(scope: :user).unshift :two_factor_backupable
# The secret key used by Devise. Devise uses this key to generate
# random tokens. Changing this key will render invalid all existing
# confirmation, reset password and unlock tokens in the database.
......@@ -86,7 +86,7 @@ pt-BR:
remember_me: "Lembre-se de mim"
sign_in: "Entrar"
username: "Nome de usuário"
signed_in: "Você entrou com sucesso."
signed_in: "Você entrou."
signed_out: "Você saiu com sucesso."
......@@ -442,7 +442,6 @@ ar:
updated: "تم تحديث ملفك الشخصى"
public: "عامّ"
closed: "التسجيلات مغلقة على هذه المنصة"
success: "لقد انضممت الى دياسبرا "
......@@ -15,7 +15,7 @@ be:
taken: "павінна быць унікальным у кантактах гэтага карыстальніка."
taken: "мусіць быць унікальным у кантактах гэтага карыстальніка."
......@@ -23,7 +23,7 @@ be:
taken: "Добра, але гэта ты ўжо перапосціў!"
taken: "Падабаецца? Але ты ўжо падзяліуся гэтым!"
......@@ -33,42 +33,52 @@ be:
invalid: "Памылка. Дазваляюцца літары, лічбы і падкрэсліванні."
taken: "ужо існуе."
all_aspects: "усе катыгорыі"
all_aspects: "Усе аспекты"
are_you_sure: "сапраўды?"
are_you_sure_delete_account: "Вы сапраўды хочаце выдаліць Ваш акаўнт? Гэта не магчыма будзе адмяніць!"
are_you_sure_delete_account: "Вы сапраўды жадаеце выдаліць Ваш акаўнт? Гэта не магчыма будзе адмяніць!"
failure: "Памылка пры спробе дадаць кантакты да аспекта."
success: "Кантакты паспяхова дададзены ў аспект."
add_an_aspect: "+ дадаць катыгорыю"
stay_updated: "Заўжды на сувязі"
failure: "%{name} не пустая і не можа быць выдалена."
failure: "%{name} не магчыма выдаліць."
success: "%{name} паспяхова выдалена"
aspect_list_is_not_visible: "спіс катыгорый не бачны для ўсіх"
aspect_list_is_visible: "спіс катыгорый бачны для ўсіх"
aspect_list_is_not_visible: "Кантакты ў гэтым аспекце ня бачны нікому"
aspect_list_is_visible: "Кантакты ў гэтым аспекце бачны для ўсіх"
confirm_remove_aspect: "ты сапраўды жадаешь выдаліць гэтую катыгорыю?"
rename: "перайменаваць"
update: "абнавіць"
updating: "абнаўляю ..."
update: "аднавіць"
updating: "аднаўляю ..."
donate: "падзяка"
do_you: "Гэта тычыцца:"
here_to_help: "Супольнасці Diaspora тут!"
need_help: "дапамога патрэбна?"
feature_suggestion: "... жадаеце нешта %{link} прапанаваць?"
find_a_bug: "... знайшлі %{link}?"
have_a_question: "... маеце %{link}?"
here_to_help: "Суполка Дыаспара* заўсёды побач!"
need_help: "Патрэбна дапамога?"
tag_bug: "памылка"
tag_feature: "функцыя"
tag_question: "пытанне"
introduce_yourself: "Гэта ваша ручаіна. Скокайце ды пакажыце сябе."
follow: "Сачы за %{link} і вітай новых карыстальнікаў diaspora*!"
learn_more: "паказаць больш"
title: "Прывітанне, Новы Ўдзельнік!(чалавек)"
title: "Прывітай новых удзельнікаў"
content: "Вы можаце дадаць наступныя паслугі ў diaspora*:"
heading: "Далучыць паслугі"
welcome_to_diaspora: "Вітаем ў Diaspora, %{name}!"
community_spotlight: "супольны прагляд"
community_spotlight: "Рэкамендуемыя удзельнікі"
or_spotlight: "ты можаш таксама падзяліцца %{link}"
try_adding_some_more_contacts: "ты можаш знайсці ці дадаць новыя катракты"
try_adding_some_more_contacts: "ты можаш знайсці ці %{invite_link} новыя кантакты."
you_should_add_some_more_contacts: "спачатку дадай пару кантактаў"
acquaintances: "знаёмыя"
......@@ -79,13 +89,31 @@ be:
failure: "не магчыма захаваць катыгорыю %{name}, занадта дліная назва."
success: "катыгорыя %{name} была паспяхова выдалена"
cancel: "адмяніць"
comment: "Каментарыі"
commenting: "Каменціраванне"
all_contacts: "усе кантакты"
all_contacts: "Усе кантакты"
my_contacts: "Мае кантакты"
start_a_conversation: "Пачаць гутарку"
title: "Кантакты"
fail: "Памылковае паведамленне"
sent: "Паведамленне даслана"
inbox: "Уваходныя"
no_messages: "Няма паведамленняў"
send: "даслаць"
sending: "адсылаю ..."
subject: "Тэма"
delete: "Выдаліць гутарку"
reply: "Адачаць"
replying: "Адказваем..."
delete: "выдаліць"
email: "Email"
......@@ -93,16 +121,33 @@ be:
correct_the_following_errors_and_try_again: "спраўляй памылкі і паспрабуй зноў."
fill_me_out: "запоўні мяне"
find_people: "Пошук людзей ці #тэгаў"
title: "Аспекты"
what_is_an_aspect_q: "Што такое аспект?"
no_more: "Больш няма запрашенняў"
invite_someone_to_join: "запрасі каго-небудзь да Diaspora!"
invite_someone_to_join: "Запрасі яшчэ кагосці да Diaspora*!"
language: "мова"
send_an_invitation: "Даслаць запрашэнне"
powered_by: "Заснавана на diaspora*"
whats_new: "Што новага?"
code: "Код"
logout: "Выйсці"
profile: "Профіль"
settings: "налады"
limited: "абмежавана"
more: "больш"
no_results: "нічога не знайшлось"
no_results: "Нічога не знайшлось"
click_here: "Націсні сюды"
hello: "Вітаем, %{name}!"
thanks: "Дзякуй,"
nsfw: "не дзеля ўсіх вачэй"
ok: "ok"
privacy: "Прыватнасць"
......@@ -110,4 +155,11 @@ be:
public: "адкрыта"
search: "Пошук"
settings: "Налады"
username: "Імя карыстальніка"
\ No newline at end of file
title: "Мае аспекты"
aspects_stream: "Аспекты"
username: "Імя карыстальніка"
auto_follow_aspect: "Дадаваць гэтых карыстальнікаў у аспект:"
\ No newline at end of file
......@@ -404,7 +404,6 @@ bg:
updated: "Профилът е обновен"
public: "Публична"
closed: "Нови регистрации не са възможни на този pod на Diaspora."
success: "Вие се присъединихте към Diaspora!"
invalid_invite: "Връзката за покана, която предоставихте, вече не е валидна!"
......@@ -505,7 +505,6 @@ br:
updated: "Patrom nevesaet"
public: "A-wel d'an holl"
closed: "Stanket eo an enskrivadur war ar pod diaspora*-mañ"
success: "Enskrivet oc'h war diaspora* !"
invalid_invite: "Al liamm pedadenn roet ganeoc'h n'eo ket mat ken"
......@@ -495,7 +495,6 @@ bs:
updated: "Profil ažuriran"
public: "Javno"
closed: "Prijave su zatvorene na ovom Diaspora podu."
success: "Pridružili ste se Diaspori!"
invalid_invite: "Veza pozivnice koji ste obezbijedili više nije važeća!"
......@@ -1017,7 +1017,6 @@ cs:
updated: "Profil aktualizován"
public: "Veřejné"
closed: "Přihlášky nejsou na tomto podu diaspory* otevřeny."
success: "Připojili jste se k diaspoře*!"
invalid_invite: "Odkaz na pozvánku, který jste poskytli, již neplatí!"
......@@ -593,9 +593,11 @@ da:
byline: "Det sociale netværk hvor det er dig der har kontrollen"
choose_your_audience: "Vælg dit publikum"
choose_your_audience_info: "Ved hjælp af Diasporas aspekter kan du vælge de mennesker du vil dele med. Du kan privat eller offentlig som du har lyst til. Del et sjovt foto med hele verden, eller en dyb hemmelighed kun med dine nærmeste. Du bestemmer."
diaspora_site_link: "Diaspora fødereret netværk"
headline: "Velkommen til %{pod_name}"
own_your_data: "Vær i besiddelse af dine egne data"
own_your_data_info: "Mange sociale netværk tjener penge dine data ved at analysere din opførsel og derefter bruge informationen til at sælge reklamer. Diaspora bruger ikke dine data til noget, men står til rådighed du kan kommunikere og dele med andre."
part_of_diaspora: "Del af %{diaspora_site_link}"
byline: "Du er i gang med at ændre internettet. Lad os komme i gang."
configuration_info: "Åben %{database_path} og %{diaspora_path} i din favorit editor og gennemgå dem omhyggeligt. De er udførligt kommenteret."
......@@ -1011,7 +1013,11 @@ da:
updated: "Profil opdateret"
public: "Offentlig"
closed: "Der er lukket for tilmeldinger denne Diaspora server."
another_pod: "en anden pod"
closed_pod: "Denne pod er for tiden lukket for tilgang. Du kan dog stadig blive en del af Diaspora-netværket ved at tilmelde dig %{wiki}. Fordi alle Diasporas pods er forbundet, vil du stadig have adgang til det samme indhold der."
find_pods: "Der er en liste over de pods du kan tilmelde dig %{poduptime}."
other_questions: "Har du nogen spørgsmål vedrørende valg af pod, se vores %{wiki}."
success: "Du er nu en del af Diaspora!"
invalid_invite: "Det invitations-link som du anvendte er ikke længere gyldigt!"
......@@ -592,7 +592,6 @@ de-CH:
updated: "Pofil aktualisiert"
public: "Öffentlich"
closed: "Uf dem pod isch d'Registrierig deaktiviert"
success: "Du bisch ez volle Hahne bi diaspora* debii!"
invalid_invite: "De Iiladigslink wo'd benutzt hesch isch nüme gültig!"
......@@ -90,15 +90,18 @@ de-moo:
week: "Woche"
account_closed: "Konto wurde geschlossen"
admin: "Leitkuh"
diaspora_handle: "diaspora* ID"
email: "E-Mail"
guid: "GUID"
id: "ID"
invite_token: "Einladungstoken"
last_seen: "Zuletzt gesehen"
moderator: "Moderierkuh"
? "no"
: Nein
nsfw: "#nsfw"
spotlight: "Schaukasten"
unknown: "Unbekannt"
? "yes"
: Ja
......@@ -106,14 +109,29 @@ de-moo:
account_closing_scheduled: "Das Konto von %{name} soll geschlossen werden. Dies dauert ein paar Augenblicke..."
account_locking_scheduled: "Das Konto von %{name} ist zur Sperrung vorgesehen. Es wird in wenigen Augenblicken verarbeitet..."
account_unlocking_scheduled: "Das Konto von %{name} ist zur Entsperrung vorgesehen. Es wird in wenigen Augenblicken verarbeitet..."
add_admin: "%{name} wurde zur Leitkuh befördert."
add_invites: "Einladungen hinzufügen"
add_moderator: "%{name} wurde zur Moderierkuh befördert."
add_spotlight: "%{name} wurde in den Gemeinschafts-Schaukasten gestellt."
are_you_sure: "Willst du dein Konto wirklich schließen?"
are_you_sure_lock_account: "Bist du dir sicher, dass du dieses Konto sperren willst?"
are_you_sure_unlock_account: "Bist du sicher, dass du dieses Konto entsperren willst?"
close_account: "Konto schließen"
delete_admin: "%{name} wurde von der Liste der Leitkühe entfernt."
delete_moderator: "%{name} wurde von der Liste der Moderierkühe entfernt."
delete_spotlight: "%{name} wurde vom Gemeinschafts-Schaukasten entfernt."
does_not_exist: "Kuh existiert nicht!"
email_to: "per E-Mail einladen"
invite: "Einladen"
lock_account: "Konto sperren"
make_admin: "Zur Leitkuh befördern"
make_moderator: "Zur Moderierkuh befördern"
make_spotlight: "In den Gemeinschafts-Schaukasten stellen"
remove_admin: "Als Leitkuh absetzen"
remove_moderator: "Als Moderierkuh absetzen"
remove_spotlight: "Aus dem Gemeinschafts-Schaukasten entfernen"
role_implemented: "%{name} hat diese Rolle bereits erhalten!"
role_removal_implemented: "%{name} wurde diese Rolle bereits entzogen!"
under_13: "Zeige Kühe, die unter 13 Jahre alt sind (COPPA)"
unlock_account: "Konto entsperren"
......@@ -190,6 +208,7 @@ de-moo:
tos: "Die Nutzungsbedingungen der Anwendung ansehen"
are_you_sure: "Bist du dir sicher?"
are_you_sure_delete_account: "Möchtest du dein Konto wirklich schließen? Dieser Schritt kann nicht rückgängig gemacht werden!"
are_you_sure_ignore_user: "Bist du sicher, dass du diese Kuh ignorieren möchtest?"
failure: "Die Kuh konnte nicht aus der Herde entfernt werden."
......@@ -364,7 +383,7 @@ de-moo:
close_account_a: "Gehe an das Ende deiner Kontoeinstellungen und drücke auf die Schaltfläche „Konto schließen“. Um den Vorgang abzuschließen, wirst du dann aufgefordert, dein Kennwort einzugeben. Denk dran: Wenn du dein Konto schließt, kannst du dich auf diesem Bauernhof <strong>nie wieder</strong> mit dem gleichen Benutzernamen registrieren."
close_account_q: "Wie kann ich mein Konto löschen?"
data_other_podmins_a: "Wenn du mit jemandem auf einem anderen Bauernhof teilst, werden alle Beiträge, die du teilst, und eine Kopie deiner Profildaten auf dessen Bauernhof gespeichert („gecached“) und sind der Datenbankleitkuh des Bauernhofs zugänglich. Wenn du einen Beitrag oder deine Profildaten löschst, geschieht dies auch auf allen anderen Bauernhöfen, auf denen die Daten bisher gespeichert waren. Deine Bilder werden nur auf deinen eigenen Bauernhof gespeichert; nur Links, die zu ihnen führen, werden anderen Bauernhöfen übermittelt."
data_other_podmins_q: "Kann die Leitkuh meines Bauernhofs meine Informationen sehen?"
data_other_podmins_q: "Können die Leitkühe anderer Bauernhöfe meine Informationen sehen?"
data_visible_to_podmin_a: "Kurzum: alles. Die Kommunikation zwischen Bauernhöfen läuft immer verschlüsselt ab (mittels SSL und diaspora*s eigener Übertragungsverschlüsselung), aber gespeichert werden die Daten unverschlüsselt. Wenn sie wollte, könnte die Leitkuh deines Bauernhofs (normalerweise die Kuh, die den Bauernhofs betreibt) auf deine gesamten Kontodaten und alles, was du postest, zugreifen (wie auch bei den meisten anderen Webseiten, die Benutzerdaten speichern). Das ist der Grund dafür, dass wir dich auswählen lassen, auf welchem Bauernhof du dich registrierst, damit du einen Bauernhof auswählen kannst, dessen Leitkuh du deine Daten gerne anvertraust. Das Betreiben eines eigenen Bauernhofs gibt dir mehr Sicherheit, weil du dann den Zugriff auf die Datenbank kontrollierst."
data_visible_to_podmin_q: "Wie viele Informationen kann die Leitkuh meines Bauernhofs sehen?"
download_data_a: "Ja. Unten im Bereich „Konto“ deiner Einstellungen sind zwei Schaltflächen, mit denen du deine Daten oder Fotos herunterladen kannst."
......@@ -574,9 +593,11 @@ de-moo:
byline: "Die soziale Onlinewelt, in der du deine Daten in der Hand hast."
choose_your_audience: "Wähle dein Publikum"
choose_your_audience_info: "diaspora*s Herden ermöglichen dir, nur mit den Kühen zu teilen, mit denen du möchtest. Du kannst so öffentlich oder privat sein, wie du willst. Teile ein witziges Foto mit der ganzen Welt oder ein tiefes Geheimnis nur mit deinen engsten Freunden. Es ist deine Entscheidung."
diaspora_site_link: "föderierten diaspora*-Netzwerks"
headline: "Willkommen auf %{pod_name}"
own_your_data: "Deine Daten, dein Eigentum"
own_your_data_info: "Viele Netzwerke nutzen deine Daten, um Geld zu verdienen, indem sie deine Interaktionen auswerten und diese Informationen verwenden, um dir Werbung zu zeigen. diaspora* nutzt deine Daten zu keinem anderen Zweck, als es dir zu ermöglichen, dich mit anderen zu verbinden und mit ihnen zu teilen."
part_of_diaspora: "Teil des %{diaspora_site_link}"
byline: "Du bist drauf und dran, das Internet zu ändern. Lass uns gleich alles einrichten, okay?"
configuration_info: "Öffne %{database_path} und %{diaspora_path} in deinem Lieblingstexteditor und sieh sie gründlich durch, sie sind ausführlich kommentiert."
......@@ -627,6 +648,8 @@ de-moo: