Skip to content

Commit f3ae636

Browse files
authored
Merge branch 'main' into a1012/agit_post_update
2 parents f876a93 + a15353d commit f3ae636

40 files changed

+137
-545
lines changed

Makefile

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ fmt-check:
292292
checks: checks-frontend checks-backend
293293

294294
.PHONY: checks-frontend
295-
checks-frontend: svg-check
295+
checks-frontend: lockfile-check svg-check
296296

297297
.PHONY: checks-backend
298298
checks-backend: swagger-check swagger-validate
@@ -700,6 +700,17 @@ svg-check: svg
700700
exit 1; \
701701
fi
702702

703+
.PHONY: lockfile-check
704+
lockfile-check:
705+
npm install --package-lock-only
706+
@diff=$$(git diff package-lock.json); \
707+
if [ -n "$$diff" ]; then \
708+
echo "package-lock.json is inconsistent with package.json"; \
709+
echo "Please run 'npm install --package-lock-only' and commit the result:"; \
710+
echo "$${diff}"; \
711+
exit 1; \
712+
fi
713+
703714
.PHONY: update-translations
704715
update-translations:
705716
mkdir -p ./translations

docs/content/doc/usage/reverse-proxies.en-us.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ This error indicates nginx is configured to restrict the file upload size.
128128

129129
In your nginx config file containing your Gitea proxy directive, find the `location { ... }` block for Gitea and add the line
130130
`client_max_body_size 16M;` to set this limit to 16 megabytes or any other number of choice.
131+
If you use Git LFS, this will also limit the size of the largest file you will be able to push.
131132

132133

133134
## Apache HTTPD

models/auth/webauthn.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ package auth
66

77
import (
88
"context"
9-
"encoding/base64"
9+
"encoding/base32"
1010
"fmt"
1111
"strings"
1212

@@ -94,7 +94,7 @@ type WebAuthnCredentialList []*WebAuthnCredential
9494
func (list WebAuthnCredentialList) ToCredentials() []webauthn.Credential {
9595
creds := make([]webauthn.Credential, 0, len(list))
9696
for _, cred := range list {
97-
credID, _ := base64.RawStdEncoding.DecodeString(cred.CredentialID)
97+
credID, _ := base32.HexEncoding.DecodeString(cred.CredentialID)
9898
creds = append(creds, webauthn.Credential{
9999
ID: credID,
100100
PublicKey: cred.PublicKey,
@@ -164,13 +164,13 @@ func HasWebAuthnRegistrationsByUID(uid int64) (bool, error) {
164164
}
165165

166166
// GetWebAuthnCredentialByCredID returns WebAuthn credential by credential ID
167-
func GetWebAuthnCredentialByCredID(credID string) (*WebAuthnCredential, error) {
168-
return getWebAuthnCredentialByCredID(db.DefaultContext, credID)
167+
func GetWebAuthnCredentialByCredID(userID int64, credID string) (*WebAuthnCredential, error) {
168+
return getWebAuthnCredentialByCredID(db.DefaultContext, userID, credID)
169169
}
170170

171-
func getWebAuthnCredentialByCredID(ctx context.Context, credID string) (*WebAuthnCredential, error) {
171+
func getWebAuthnCredentialByCredID(ctx context.Context, userID int64, credID string) (*WebAuthnCredential, error) {
172172
cred := new(WebAuthnCredential)
173-
if found, err := db.GetEngine(ctx).Where("credential_id = ?", credID).Get(cred); err != nil {
173+
if found, err := db.GetEngine(ctx).Where("user_id = ? AND credential_id = ?", userID, credID).Get(cred); err != nil {
174174
return nil, err
175175
} else if !found {
176176
return nil, ErrWebAuthnCredentialNotExist{CredentialID: credID}
@@ -187,7 +187,7 @@ func createCredential(ctx context.Context, userID int64, name string, cred *weba
187187
c := &WebAuthnCredential{
188188
UserID: userID,
189189
Name: name,
190-
CredentialID: base64.RawStdEncoding.EncodeToString(cred.ID),
190+
CredentialID: base32.HexEncoding.EncodeToString(cred.ID),
191191
PublicKey: cred.PublicKey,
192192
AttestationType: cred.AttestationType,
193193
AAGUID: cred.Authenticator.AAGUID,

models/auth/webauthn_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
package auth
66

77
import (
8-
"encoding/base64"
8+
"encoding/base32"
99
"testing"
1010

1111
"code.gitea.io/gitea/models/unittest"
@@ -61,7 +61,7 @@ func TestCreateCredential(t *testing.T) {
6161
res, err := CreateCredential(1, "WebAuthn Created Credential", &webauthn.Credential{ID: []byte("Test")})
6262
assert.NoError(t, err)
6363
assert.Equal(t, "WebAuthn Created Credential", res.Name)
64-
bs, err := base64.RawStdEncoding.DecodeString(res.CredentialID)
64+
bs, err := base32.HexEncoding.DecodeString(res.CredentialID)
6565
assert.NoError(t, err)
6666
assert.Equal(t, []byte("Test"), bs)
6767

models/migrations/migrations.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,8 @@ var migrations = []Migration{
368368
NewMigration("Add authorize column to team_unit table", addAuthorizeColForTeamUnit),
369369
// v207 -> v208
370370
NewMigration("Add webauthn table and migrate u2f data to webauthn", addWebAuthnCred),
371+
// v208 -> v209
372+
NewMigration("Use base32.HexEncoding instead of base64 encoding for cred ID as it is case insensitive", useBase32HexForCredIDInWebAuthnCredential),
371373
}
372374

373375
// GetCurrentDBVersion returns the current db version

models/migrations/v208.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Copyright 2021 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package migrations
6+
7+
import (
8+
"encoding/base32"
9+
"encoding/base64"
10+
11+
"xorm.io/xorm"
12+
)
13+
14+
func useBase32HexForCredIDInWebAuthnCredential(x *xorm.Engine) error {
15+
16+
// Create webauthnCredential table
17+
type webauthnCredential struct {
18+
ID int64 `xorm:"pk autoincr"`
19+
CredentialID string `xorm:"INDEX"`
20+
}
21+
if err := x.Sync2(&webauthnCredential{}); err != nil {
22+
return err
23+
}
24+
25+
var start int
26+
regs := make([]*webauthnCredential, 0, 50)
27+
for {
28+
err := x.OrderBy("id").Limit(50, start).Find(&regs)
29+
if err != nil {
30+
return err
31+
}
32+
33+
for _, reg := range regs {
34+
credID, _ := base64.RawStdEncoding.DecodeString(reg.CredentialID)
35+
reg.CredentialID = base32.HexEncoding.EncodeToString(credID)
36+
37+
_, err := x.Update(reg)
38+
if err != nil {
39+
return err
40+
}
41+
}
42+
43+
if len(regs) < 50 {
44+
break
45+
}
46+
start += 50
47+
regs = regs[:0]
48+
}
49+
50+
return nil
51+
}

options/locale/locale_bg-BG.ini

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,6 @@ twofa=Двуфакторно удостоверяване
2929
twofa_scratch=Двуфакторен скреч код
3030
passcode=Секретен код
3131

32-
u2f_insert_key=Въведете защитен ключ
33-
u2f_sign_in=Натиснете бутона на вашия ключ за сигурност. Ако вашият ключ няма бутон, го изключете и включете отново.
34-
u2f_press_button=Моля, натиснете бутона на вашия ключ…
35-
u2f_use_twofa=Използвате двуфакторен код от телефона си
36-
u2f_error=Вашият ключ за сигурност не може да бъде разпознат.
37-
u2f_unsupported_browser=Вашият браузър не поддържа U2F ключове за сигурност.
38-
u2f_error_1=Възникна грешка. Моля опитайте отново.
39-
u2f_error_2=Моля, уверете се че използвате правилен, шифрован (https://) URL.
40-
u2f_error_3=Сървърът не може да обработи заявката ви.
41-
u2f_error_4=Ключът за сигурност не е одобрен за тази заявка. Моля, уверете се, че ключът не е вече регистриран.
42-
u2f_error_5=Изтекло е вречето за разпознаване на ключа. Презаредете страницата и опитайте отново.
43-
u2f_reload=Презареди
4432

4533
repository=Хранилище
4634
organization=Организация
@@ -376,7 +364,6 @@ twofa=Двуфакторно удостоверяване
376364
account_link=Свързани акаунти
377365
organization=Организации
378366
uid=UID
379-
u2f=Ключове за сигурност
380367

381368
public_profile=Публичен профил
382369
profile_desc=Вашият имейл адрес ще се използва за изпращане на уведомления и други операции.
@@ -477,8 +464,6 @@ or_enter_secret=Или въведете този ключ: %s
477464
then_enter_passcode=И въведете кодът, показан в приложението:
478465
passcode_invalid=Този код е невалиден. Опитайте отново.
479466

480-
u2f_register_key=Добавяне на ключ за сигурност
481-
u2f_nickname=Псевдоним
482467

483468

484469

options/locale/locale_cs-CZ.ini

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,6 @@ twofa=Dvoufaktorové ověřování
3434
twofa_scratch=Dvoufaktorový pomocný kód
3535
passcode=Přístupový kód
3636

37-
u2f_insert_key=Vložte bezpečnostní klíč
38-
u2f_sign_in=Stiskněte tlačítko na svém zabezpečovacím klíči. Pokud zabezpečovací klíč nemá žádné tlačítko, vložte jej znovu.
39-
u2f_press_button=Stiskněte prosím tlačítko na zabezpečovacím klíči…
40-
u2f_use_twofa=Použít dvoufaktorový kód z vašeho telefonu
41-
u2f_error=Nepodařilo se přečíst váš zabezpečovací klíč.
42-
u2f_unsupported_browser=Váš prohlížeč nepodporuje U2F zabezpečovací klíče.
43-
u2f_error_1=Došlo k neznámé chybě. Opakujte akci.
44-
u2f_error_2=Přesvědčte se, zda používáte správné šifrované (https://) URL.
45-
u2f_error_3=Server nemohl zpracovat váš požadavek.
46-
u2f_error_4=Zabezpečovací klíč není pro tento požadavek povolen. Prosím ujistěte se, zda klíč není již registrován.
47-
u2f_error_5=Požadavek vypršel dříve, než se podařilo přečíst váš klíč. Znovu načtěte tuto stránku a akci opakujte.
48-
u2f_reload=Znovu načíst
4937

5038
repository=Repozitář
5139
organization=Organizace
@@ -481,7 +469,6 @@ twofa=Dvoufaktorové ověřování
481469
account_link=Propojené účty
482470
organization=Organizace
483471
uid=UID
484-
u2f=Bezpečnostní klíče
485472

486473
public_profile=Veřejný profil
487474
biography_placeholder=Řekněte nám něco o sobě
@@ -684,12 +671,6 @@ passcode_invalid=Přístupový kód není platný. Zkuste to znovu.
684671
twofa_enrolled=Ve vašem účtu bylo povoleno dvoufaktorové ověřování. Uložte si pomocný token (%s) na bezpečném místě, protože bude zobrazen pouze jednou!
685672
twofa_failed_get_secret=Nepodařilo se získat tajemství.
686673

687-
u2f_desc=Bezpečnostní klíče jsou hardwarová zařízení obsahující kryptografické klíče. Mohou být použity pro dvoufaktorové ověřování. Bezpečnostní klíče musí podporovat <a rel="noreferrer" href="https://fidoalliance.org/">FIDO U2F</a> standard.
688-
u2f_register_key=Přidat bezpečnostní klíč
689-
u2f_nickname=Přezdívka
690-
u2f_press_button=Stiskněte tlačítko na vašem bezpečnostním klíči pro jeho registraci.
691-
u2f_delete_key=Odebrat bezpečnostní klíč
692-
u2f_delete_key_desc=Pokud odstraníte bezpečnostní klíč, již se s ním nebudete moci přihlásit. Pokračovat?
693674

694675
manage_account_links=Správa propojených účtů
695676
manage_account_links_desc=Tyto externí účty jsou propojeny s vaším Gitea účtem.

options/locale/locale_de-DE.ini

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,6 @@ twofa=Zwei-Faktor-Authentifizierung
3434
twofa_scratch=Zwei-Faktor-Einmalpasswort
3535
passcode=PIN
3636

37-
u2f_insert_key=Hardware-Sicherheitsschlüssel einstecken
38-
u2f_sign_in=Drücke den Knopf auf deinem Sicherheitsschlüssel. Wenn dein Sicherheitsschlüssel keinen Knopf hat, stecke ihn erneut ein.
39-
u2f_press_button=Drücke den Knopf auf deinem Sicherheitsschlüssel…
40-
u2f_use_twofa=Zwei-Faktor-Authentifizierung via Handy verwenden
41-
u2f_error=Dein Sicherheitsschlüssel konnte nicht gelesen werden.
42-
u2f_unsupported_browser=Dein Browser unterstützt keine U2F-Sicherheitsschlüssel.
43-
u2f_error_1=Ein unbekannter Fehler ist aufgetreten. Bitte versuche es erneut.
44-
u2f_error_2=Bitte stell sicher, dass die korrekte verschlüsselte URL benutzt wird (https://).
45-
u2f_error_3=Der Server konnte deine Anfrage nicht bearbeiten.
46-
u2f_error_4=Für diese Anfrage ist der Sicherheitsschlüssel nicht erlaubt. Bitte stell sicher, dass er nicht bereits registriert ist.
47-
u2f_error_5=Das Zeitlimit wurde erreicht, bevor dein Schlüssel gelesen werden konnte. Bitte lade die Seite erneut.
48-
u2f_reload=Neu laden
4937

5038
repository=Repository
5139
organization=Organisation
@@ -506,7 +494,6 @@ twofa=Zwei-Faktor-Authentifizierung
506494
account_link=Verknüpfte Benutzerkonten
507495
organization=Organisationen
508496
uid=Uid
509-
u2f=Hardware-Sicherheitsschlüssel
510497

511498
public_profile=Öffentliches Profil
512499
biography_placeholder=Erzähle uns noch ein bisschen über dich
@@ -715,12 +702,6 @@ passcode_invalid=Die PIN ist falsch. Probiere es erneut.
715702
twofa_enrolled=Die Zwei-Faktor-Authentifizierung wurde für dein Konto aktiviert. Bewahre dein Einmalpasswort (%s) an einem sicheren Ort auf, da es nicht wieder angezeigt werden wird.
716703
twofa_failed_get_secret=Fehler beim Abrufen des Secrets.
717704
718-
u2f_desc=Sicherheitsschlüssel sind Geräte, die kryptografische Schlüssel beeinhalten. Diese können für die Zwei-Faktor-Authentifizierung verwendet werden. Der Sicherheitsschlüssel muss den Standard „<a href="https://fidoalliance.org/">FIDO U2F</a>“ unterstützen.
719-
u2f_register_key=Sicherheitsschlüssel hinzufügen
720-
u2f_nickname=Nickname
721-
u2f_press_button=Drücke den Knopf auf deinem Sicherheitsschlüssel, um diesen zu registrieren.
722-
u2f_delete_key=Sicherheitsschlüssel entfernen
723-
u2f_delete_key_desc=Wenn du einen Sicherheitsschlüssel entfernst, kannst du dich nicht mehr mit ihm anmelden. Fortfahren?
724705
725706
manage_account_links=Verknüpfte Accounts verwalten
726707
manage_account_links_desc=Diese externen Accounts sind mit deinem Gitea-Account verknüpft.

options/locale/locale_el-GR.ini

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,6 @@ twofa=Έλεγχος Ταυτότητας Δύο Παραγόντων
3434
twofa_scratch=Κωδικός Μίας Χρήσης Δύο Παραγόντων
3535
passcode=Κωδικός
3636

37-
u2f_insert_key=Εισάγετε το κλειδί ασφαλείας σας
38-
u2f_sign_in=Πατήστε το κουμπί στο κλειδί ασφαλείας. Αν το κλειδί ασφαλείας σας δεν έχει κουμπί, τοποθετήστε το ξανά.
39-
u2f_press_button=Πατήστε το κουμπί στο κλειδί ασφαλείας…
40-
u2f_use_twofa=Χρήση ενός κωδικού δύο παραγόντων από το τηλέφωνό σας
41-
u2f_error=Αδυναμία ανάγνωσης του κλειδιού ασφαλείας.
42-
u2f_unsupported_browser=Ο περιηγητής (browser) σας δεν υποστηρίζει κλειδιά ασφαλείας U2F.
43-
u2f_error_1=Συνέβη ένα άγνωστο σφάλμα. Παρακαλώ προσπαθήστε ξανά.
44-
u2f_error_2=Βεβαιωθείτε ότι χρησιμοποιείτε το σωστό, κρυπτογραφημένο (https://) URL.
45-
u2f_error_3=Ο διακομιστής δεν μπόρεσε να επεξεργαστεί το αίτημά σας.
46-
u2f_error_4=Το κλειδί ασφαλείας δεν επιτρέπεται για αυτό το αίτημα. Βεβαιωθείτε ότι το κλειδί δεν έχει ήδη καταχωρηθεί.
47-
u2f_error_5=Λήξη χρόνου πριν το κλειδί να μπορεί να διαβαστεί. Παρακαλώ ξαναφορτώστε τη σελίδα και προσπαθήστε ξανά.
48-
u2f_reload=Επαναφόρτωση
4937

5038
repository=Αποθετήριο
5139
organization=Οργανισμός
@@ -522,7 +510,6 @@ twofa=Έλεγχος Ταυτότητας Δύο Παραγόντων
522510
account_link=Συνδεδεμένοι Λογαριασμοί
523511
organization=Οργανισμοί
524512
uid=Uid
525-
u2f=Κλειδιά Ασφαλείας
526513

527514
public_profile=Δημόσιο Προφίλ
528515
biography_placeholder=Πείτε μας λίγο για τον εαυτό σας
@@ -743,12 +730,6 @@ passcode_invalid=Ο κωδικός είναι λάθος. Δοκιμάστε ξ
743730
twofa_enrolled=Ο λογαριασμός σας έχει εγγραφεί σε ταυτοποίηση δύο παραγόντων. Αποθηκεύστε το διακριτικό μιας χρήσης (%s) σε ασφαλές μέρος καθώς εμφανίζεται μόνο μία φορά!
744731
twofa_failed_get_secret=Αποτυχία λήψης μυστικού.
745732
746-
u2f_desc=Τα κλειδιά ασφαλείας είναι συσκευές που περιέχουν κρυπτογραφικά κλειδιά. Μπορούν να χρησιμοποιηθούν για ταυτοποίηση δύο παραγόντων. Τα κλειδιά ασφαλείας πρέπει να υποστηρίζουν το πρότυπο <a rel="noreferrer" href="https://fidoalliance.org/">FIDO U2F</a>.
747-
u2f_register_key=Προσθήκη Κλειδιού Ασφαλείας
748-
u2f_nickname=Ψευδώνυμο
749-
u2f_press_button=Πίεσε το κουμπί στο κλειδί ασφαλείας για να το καταχωρήσεις.
750-
u2f_delete_key=Αφαίρεση Κλειδιού Ασφαλείας
751-
u2f_delete_key_desc=Αν αφαιρέσετε ένα κλειδί ασφαλείας δεν μπορείτε πλέον να συνδεθείτε με αυτό. Συνέχεια;
752733
753734
manage_account_links=Διαχείριση Συνδεδεμένων Λογαριασμών
754735
manage_account_links_desc=Αυτοί οι εξωτερικοί λογαριασμοί είναι συνδεδεμένοι στον Gitea λογαριασμό σας.

options/locale/locale_en-US.ini

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -748,10 +748,9 @@ passcode_invalid = The passcode is incorrect. Try again.
748748
twofa_enrolled = Your account has been enrolled into two-factor authentication. Store your scratch token (%s) in a safe place as it is only shown once!
749749
twofa_failed_get_secret = Failed to get secret.
750750

751-
webauthn_desc = Security keys are hardware devices containing cryptographic keys. They can be used for two-factor authentication. Security keys must support the <a rel="noreferrer" href="https://w3c.github.io/webauthn/#webauthn-authenticator">WebAuthn Authenticator</a> standard.
751+
webauthn_desc = Security keys are hardware devices containing cryptographic keys. They can be used for two-factor authentication. Security keys must support the <a rel="noreferrer" target="_blank" href="https://w3c.github.io/webauthn/#webauthn-authenticator">WebAuthn Authenticator</a> standard.
752752
webauthn_register_key = Add Security Key
753753
webauthn_nickname = Nickname
754-
webauthn_press_button = Press the button on your security key to register it.
755754
webauthn_delete_key = Remove Security Key
756755
webauthn_delete_key_desc = If you remove a security key you can no longer sign in with it. Continue?
757756

options/locale/locale_es-ES.ini

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,6 @@ twofa=Autenticación de doble factor
3434
twofa_scratch=Código de respaldo
3535
passcode=Código de acceso
3636

37-
u2f_insert_key=Introduzca su clave de seguridad
38-
u2f_sign_in=Presione el botón en su clave de seguridad. Si su clave de seguridad no tiene ningún botón, vuelva a insertarla.
39-
u2f_press_button=Por favor, presione el botón en su clave de seguridad…
40-
u2f_use_twofa=Utilice un código de doble factor desde su teléfono móvil
41-
u2f_error=No se pudo leer la clave de seguridad.
42-
u2f_unsupported_browser=Su navegador no soporta claves de seguridad U2F.
43-
u2f_error_1=Ha ocurrido un error desconocido. Por favor, inténtelo de nuevo.
44-
u2f_error_2=Por favor, asegúrese de utilizar la URL correcta y cifrada (https://).
45-
u2f_error_3=El servidor no pudo procesar su petición.
46-
u2f_error_4=La clave de seguridad no está permitida para esta solicitud. Por favor, asegúrese de que la clave no está ya registrada.
47-
u2f_error_5=Tiempo de espera máximo alcanzado antes de que su clave pudiese ser leída. Por favor, cargue la página y vuelva a intentarlo.
48-
u2f_reload=Recargar
4937

5038
repository=Repositorio
5139
organization=Organización
@@ -517,7 +505,6 @@ twofa=Autenticación de doble factor
517505
account_link=Cuentas vinculadas
518506
organization=Organizaciones
519507
uid=UUID
520-
u2f=Claves de seguridad
521508

522509
public_profile=Perfil público
523510
biography_placeholder=Cuéntenos un poco más sobre usted
@@ -738,12 +725,6 @@ passcode_invalid=El código de acceso es incorrecto. Vuelva a intentarlo.
738725
twofa_enrolled=Su cuenta ha sido inscrita en la autenticación de doble factor. ¡Guarde su código de respaldo (%s) en un lugar seguro, ya que sólo se muestra una vez!
739726
twofa_failed_get_secret=No se pudo obtener el secreto.
740727

741-
u2f_desc=Las claves de seguridad son dispositivos hardware que contienen claves criptográficas. Pueden ser usados para la autenticación de doble factor. Las claves de seguridad deben soportar el estándar <a href="https://fidoalliance.org/">FIDOU2F</a>.
742-
u2f_register_key=Añadir clave de seguridad
743-
u2f_nickname=Nombre de usuario
744-
u2f_press_button=Pulse el botón en su clave de seguridad para registrarla.
745-
u2f_delete_key=Eliminar clave de seguridad
746-
u2f_delete_key_desc=Si elimina una clave de seguridad no podrá utilizarla para registrarte con ella. ¿Continuar?
747728

748729
manage_account_links=Administrar cuentas vinculadas
749730
manage_account_links_desc=Estas cuentas externas están vinculadas a su cuenta de Gitea.

0 commit comments

Comments
 (0)