🚸 Added more tips about application authorization flow

This commit is contained in:
Maxim Lebedev 2023-08-06 01:10:24 +06:00
parent b87660d78f
commit bf7b6df692
Signed by: toby3d
GPG key ID: 1F14E25B7C119FC5
9 changed files with 793 additions and 149 deletions

View file

@ -39,43 +39,65 @@ func init() {
}
var messageKeyToIndex = map[string]int{
"Allow": 4,
"%sProof of Key Code Exchange%s is a mechanism that protects against attackers in the middle hijacking your application's authentication process. You can still authorize this application without this protection, but you must independently verify the security of this connection. If you have any doubts - stop the process and contact the developers.": 4,
"Allow": 8,
"Authorize %s": 0,
"Authorize application": 1,
"Choose your scopes": 2,
"Deny": 3,
"Error": 6,
"How do I fix it?": 7,
"Recipient": 10,
"Resource": 11,
"Send": 12,
"Sign In": 8,
"TicketAuth": 9,
"version": 5,
"Deny": 7,
"Error": 10,
"How do I fix it?": 11,
"No scopes is requested: the application will only get your profile URL.": 6,
"Recipient": 14,
"Resource": 15,
"Scopes": 5,
"Send": 16,
"Sign In": 12,
"This client does not use %sPKCE%s!": 3,
"This client uses %sPKCE%s with the %s%s%s method.": 2,
"TicketAuth": 13,
"You will be redirected to %s%s%s": 9,
}
var enIndex = []uint32{ // 14 elements
0x00000000, 0x00000010, 0x00000026, 0x00000039,
0x0000003e, 0x00000044, 0x0000004c, 0x00000052,
0x00000063, 0x0000006b, 0x00000076, 0x00000080,
0x00000089, 0x0000008e,
} // Size: 80 bytes
var enIndex = []uint32{ // 18 elements
0x00000000, 0x00000010, 0x00000026, 0x00000067,
0x00000090, 0x000001f3, 0x000001fa, 0x00000242,
0x00000247, 0x0000024d, 0x00000277, 0x0000027d,
0x0000028e, 0x00000296, 0x000002a1, 0x000002ab,
0x000002b4, 0x000002b9,
} // Size: 96 bytes
const enData string = "" + // Size: 142 bytes
"\x02Authorize %[1]s\x02Authorize application\x02Choose your scopes\x02De" +
"ny\x02Allow\x02version\x02Error\x02How do I fix it?\x02Sign In\x02Ticket" +
"Auth\x02Recipient\x02Resource\x02Send"
const enData string = "" + // Size: 697 bytes
"\x02Authorize %[1]s\x02Authorize application\x02This client uses %[1]sPK" +
"CE%[2]s with the %[3]s%[4]s%[5]s method.\x02This client does not use %[1" +
"]sPKCE%[2]s!\x02%[1]sProof of Key Code Exchange%[2]s is a mechanism that" +
" protects against attackers in the middle hijacking your application's a" +
"uthentication process. You can still authorize this application without " +
"this protection, but you must independently verify the security of this " +
"connection. If you have any doubts - stop the process and contact the d" +
"evelopers.\x02Scopes\x02No scopes is requested: the application will onl" +
"y get your profile URL.\x02Deny\x02Allow\x02You will be redirected to %[" +
"1]s%[2]s%[3]s\x02Error\x02How do I fix it?\x02Sign In\x02TicketAuth\x02R" +
"ecipient\x02Resource\x02Send"
var ruIndex = []uint32{ // 14 elements
0x00000000, 0x0000001f, 0x0000004d, 0x0000008e,
0x0000009f, 0x000000b2, 0x000000bf, 0x000000cc,
0x000000ee, 0x000000f9, 0x00000104, 0x00000119,
0x00000126, 0x00000139,
} // Size: 80 bytes
var ruIndex = []uint32{ // 18 elements
0x00000000, 0x0000001f, 0x0000004d, 0x000000a1,
0x000000d8, 0x00000343, 0x00000352, 0x000003e9,
0x000003fa, 0x0000040d, 0x00000451, 0x0000045e,
0x00000480, 0x0000048b, 0x00000496, 0x000004ab,
0x000004b8, 0x000004cb,
} // Size: 96 bytes
const ruData string = "" + // Size: 313 bytes
"\x02Авторизовать %[1]s\x02Авторизовать приложение\x02Выбери предоставляе" +
"мые разрешения\x02Отказать\x02Разрешить\x02версия\x02Ошибка\x02Как испр" +
"авить это?\x02Войти\x02TicketAuth\x02Получатель\x02Ресурс\x02Отправить"
const ruData string = "" + // Size: 1227 bytes
"\x02Авторизовать %[1]s\x02Авторизовать приложение\x02Клиент использует %" +
"[1]sPKCE%[2]s с методом %[3]s%[4]s%[5]s.\x02Клиент не использует %[1]sPK" +
"CE%[2]s!\x02%[1]sProof of Key Code Exchange%[2]s это механизм, защищающи" +
"й от злоумышленников, перехватывающих процесс аутентификации вашего при" +
"ложения. Вы можете авторизовать данное приложение и без этой защиты, но" +
" при этом вы должны самостоятельно проверить безопасность этого соединен" +
"ия. Если у вас есть сомнения - прервите процесс и свяжитесь с разработч" +
"иками.\x02Области\x02Никакие разрешения не запрашиваются: приложение по" +
"лучит только URL вашего профиля.\x02Отказать\x02Разрешить\x02Вы будете " +
"перенаправлены на %[1]s%[2]s%[3]s\x02Ошибка\x02Как исправить это?\x02Во" +
"йти\x02TicketAuth\x02Получатель\x02Ресурс\x02Отправить"
// Total table size 615 bytes (0KiB); checksum: 66FB60EC
// Total table size 2116 bytes (2KiB); checksum: 848DD07E

View file

@ -26,9 +26,115 @@
"fuzzy": true
},
{
"id": "Choose your scopes",
"message": "Choose your scopes",
"translation": "Choose your scopes",
"id": "This client uses {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr} with the {Code}{CodeChallengeMethod}{Code_1} method.",
"message": "This client uses {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr} with the {Code}{CodeChallengeMethod}{Code_1} method.",
"translation": "This client uses {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr} with the {Code}{CodeChallengeMethod}{Code_1} method.",
"translatorComment": "Copied from source.",
"placeholders": [
{
"id": "Abbr_titleProof_of_Key_Code_Exchange",
"string": "%[1]s",
"type": "string",
"underlyingType": "string",
"argNum": 1,
"expr": "`\u003cabbr title=\"Proof of Key Code Exchange\"\u003e`"
},
{
"id": "Abbr",
"string": "%[2]s",
"type": "string",
"underlyingType": "string",
"argNum": 2,
"expr": "`\u003c/abbr\u003e`"
},
{
"id": "Code",
"string": "%[3]s",
"type": "string",
"underlyingType": "string",
"argNum": 3,
"expr": "`\u003ccode\u003e`"
},
{
"id": "CodeChallengeMethod",
"string": "%[4]s",
"type": "source.toby3d.me/toby3d/auth/internal/domain.CodeChallengeMethod",
"underlyingType": "struct{codeChallengeMethod string}",
"argNum": 4,
"expr": "p.CodeChallengeMethod"
},
{
"id": "Code_1",
"string": "%[5]s",
"type": "string",
"underlyingType": "string",
"argNum": 5,
"expr": "`\u003c/code\u003e`"
}
],
"fuzzy": true
},
{
"id": "This client does not use {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr}!",
"message": "This client does not use {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr}!",
"translation": "This client does not use {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr}!",
"translatorComment": "Copied from source.",
"placeholders": [
{
"id": "Abbr_titleProof_of_Key_Code_Exchange",
"string": "%[1]s",
"type": "string",
"underlyingType": "string",
"argNum": 1,
"expr": "`\u003cabbr title=\"Proof of Key Code Exchange\"\u003e`"
},
{
"id": "Abbr",
"string": "%[2]s",
"type": "string",
"underlyingType": "string",
"argNum": 2,
"expr": "`\u003c/abbr\u003e`"
}
],
"fuzzy": true
},
{
"id": "{Dfn_idPKCE}Proof of Key Code Exchange{Dfn} is a mechanism that protects against attackers in the middle hijacking your application's authentication process. You can still authorize this application without this protection, but you must independently verify the security of this connection. If you have any doubts - stop the process and contact the developers.",
"message": "{Dfn_idPKCE}Proof of Key Code Exchange{Dfn} is a mechanism that protects against attackers in the middle hijacking your application's authentication process. You can still authorize this application without this protection, but you must independently verify the security of this connection. If you have any doubts - stop the process and contact the developers.",
"translation": "{Dfn_idPKCE}Proof of Key Code Exchange{Dfn} is a mechanism that protects against attackers in the middle hijacking your application's authentication process. You can still authorize this application without this protection, but you must independently verify the security of this connection. If you have any doubts - stop the process and contact the developers.",
"translatorComment": "Copied from source.",
"placeholders": [
{
"id": "Dfn_idPKCE",
"string": "%[1]s",
"type": "string",
"underlyingType": "string",
"argNum": 1,
"expr": "`\u003cdfn id=\"PKCE\"\u003e`"
},
{
"id": "Dfn",
"string": "%[2]s",
"type": "string",
"underlyingType": "string",
"argNum": 2,
"expr": "`\u003c/dfn\u003e`"
}
],
"fuzzy": true
},
{
"id": "Scopes",
"message": "Scopes",
"translation": "Scopes",
"translatorComment": "Copied from source.",
"fuzzy": true
},
{
"id": "No scopes is requested: the application will only get your profile URL.",
"message": "No scopes is requested: the application will only get your profile URL.",
"translation": "No scopes is requested: the application will only get your profile URL.",
"translatorComment": "Copied from source.",
"fuzzy": true
},
@ -47,10 +153,36 @@
"fuzzy": true
},
{
"id": "version",
"message": "version",
"translation": "version",
"id": "You will be redirected to {Code}{RedirectURI}{Code_1}",
"message": "You will be redirected to {Code}{RedirectURI}{Code_1}",
"translation": "You will be redirected to {Code}{RedirectURI}{Code_1}",
"translatorComment": "Copied from source.",
"placeholders": [
{
"id": "Code",
"string": "%[1]s",
"type": "string",
"underlyingType": "string",
"argNum": 1,
"expr": "`\u003ccode\u003e`"
},
{
"id": "RedirectURI",
"string": "%[2]s",
"type": "*source.toby3d.me/toby3d/auth/internal/domain.URL",
"underlyingType": "*source.toby3d.me/toby3d/auth/internal/domain.URL",
"argNum": 2,
"expr": "p.RedirectURI"
},
{
"id": "Code_1",
"string": "%[3]s",
"type": "string",
"underlyingType": "string",
"argNum": 3,
"expr": "`\u003c/code\u003e`"
}
],
"fuzzy": true
},
{

View file

@ -26,9 +26,115 @@
"fuzzy": true
},
{
"id": "Choose your scopes",
"message": "Choose your scopes",
"translation": "Choose your scopes",
"id": "This client uses {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr} with the {Code}{CodeChallengeMethod}{Code_1} method.",
"message": "This client uses {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr} with the {Code}{CodeChallengeMethod}{Code_1} method.",
"translation": "This client uses {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr} with the {Code}{CodeChallengeMethod}{Code_1} method.",
"translatorComment": "Copied from source.",
"placeholders": [
{
"id": "Abbr_titleProof_of_Key_Code_Exchange",
"string": "%[1]s",
"type": "string",
"underlyingType": "string",
"argNum": 1,
"expr": "`\u003cabbr title=\"Proof of Key Code Exchange\"\u003e`"
},
{
"id": "Abbr",
"string": "%[2]s",
"type": "string",
"underlyingType": "string",
"argNum": 2,
"expr": "`\u003c/abbr\u003e`"
},
{
"id": "Code",
"string": "%[3]s",
"type": "string",
"underlyingType": "string",
"argNum": 3,
"expr": "`\u003ccode\u003e`"
},
{
"id": "CodeChallengeMethod",
"string": "%[4]s",
"type": "source.toby3d.me/toby3d/auth/internal/domain.CodeChallengeMethod",
"underlyingType": "struct{codeChallengeMethod string}",
"argNum": 4,
"expr": "p.CodeChallengeMethod"
},
{
"id": "Code_1",
"string": "%[5]s",
"type": "string",
"underlyingType": "string",
"argNum": 5,
"expr": "`\u003c/code\u003e`"
}
],
"fuzzy": true
},
{
"id": "This client does not use {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr}!",
"message": "This client does not use {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr}!",
"translation": "This client does not use {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr}!",
"translatorComment": "Copied from source.",
"placeholders": [
{
"id": "Abbr_titleProof_of_Key_Code_Exchange",
"string": "%[1]s",
"type": "string",
"underlyingType": "string",
"argNum": 1,
"expr": "`\u003cabbr title=\"Proof of Key Code Exchange\"\u003e`"
},
{
"id": "Abbr",
"string": "%[2]s",
"type": "string",
"underlyingType": "string",
"argNum": 2,
"expr": "`\u003c/abbr\u003e`"
}
],
"fuzzy": true
},
{
"id": "{Dfn_idPKCE}Proof of Key Code Exchange{Dfn} is a mechanism that protects against attackers in the middle hijacking your application's authentication process. You can still authorize this application without this protection, but you must independently verify the security of this connection. If you have any doubts - stop the process and contact the developers.",
"message": "{Dfn_idPKCE}Proof of Key Code Exchange{Dfn} is a mechanism that protects against attackers in the middle hijacking your application's authentication process. You can still authorize this application without this protection, but you must independently verify the security of this connection. If you have any doubts - stop the process and contact the developers.",
"translation": "{Dfn_idPKCE}Proof of Key Code Exchange{Dfn} is a mechanism that protects against attackers in the middle hijacking your application's authentication process. You can still authorize this application without this protection, but you must independently verify the security of this connection. If you have any doubts - stop the process and contact the developers.",
"translatorComment": "Copied from source.",
"placeholders": [
{
"id": "Dfn_idPKCE",
"string": "%[1]s",
"type": "string",
"underlyingType": "string",
"argNum": 1,
"expr": "`\u003cdfn id=\"PKCE\"\u003e`"
},
{
"id": "Dfn",
"string": "%[2]s",
"type": "string",
"underlyingType": "string",
"argNum": 2,
"expr": "`\u003c/dfn\u003e`"
}
],
"fuzzy": true
},
{
"id": "Scopes",
"message": "Scopes",
"translation": "Scopes",
"translatorComment": "Copied from source.",
"fuzzy": true
},
{
"id": "No scopes is requested: the application will only get your profile URL.",
"message": "No scopes is requested: the application will only get your profile URL.",
"translation": "No scopes is requested: the application will only get your profile URL.",
"translatorComment": "Copied from source.",
"fuzzy": true
},
@ -47,10 +153,36 @@
"fuzzy": true
},
{
"id": "version",
"message": "version",
"translation": "version",
"id": "You will be redirected to {Code}{RedirectURI}{Code_1}",
"message": "You will be redirected to {Code}{RedirectURI}{Code_1}",
"translation": "You will be redirected to {Code}{RedirectURI}{Code_1}",
"translatorComment": "Copied from source.",
"placeholders": [
{
"id": "Code",
"string": "%[1]s",
"type": "string",
"underlyingType": "string",
"argNum": 1,
"expr": "`\u003ccode\u003e`"
},
{
"id": "RedirectURI",
"string": "%[2]s",
"type": "*source.toby3d.me/toby3d/auth/internal/domain.URL",
"underlyingType": "*source.toby3d.me/toby3d/auth/internal/domain.URL",
"argNum": 2,
"expr": "p.RedirectURI"
},
{
"id": "Code_1",
"string": "%[3]s",
"type": "string",
"underlyingType": "string",
"argNum": 3,
"expr": "`\u003c/code\u003e`"
}
],
"fuzzy": true
},
{

View file

@ -24,9 +24,107 @@
"translatorComment": "Заголовок страницы авторизации безымянного приложения"
},
{
"id": "Choose your scopes",
"message": "Choose your scopes",
"translation": "Выбери предоставляемые разрешения"
"id": "This client uses {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr} with the {Code}{CodeChallengeMethod}{Code_1} method.",
"message": "This client uses {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr} with the {Code}{CodeChallengeMethod}{Code_1} method.",
"translation": "Клиент использует {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr} с методом {Code}{CodeChallengeMethod}{Code_1}.",
"placeholders": [
{
"id": "Abbr_titleProof_of_Key_Code_Exchange",
"string": "%[1]s",
"type": "string",
"underlyingType": "string",
"argNum": 1,
"expr": "`\u003cabbr title=\"Proof of Key Code Exchange\"\u003e`"
},
{
"id": "Abbr",
"string": "%[2]s",
"type": "string",
"underlyingType": "string",
"argNum": 2,
"expr": "`\u003c/abbr\u003e`"
},
{
"id": "Code",
"string": "%[3]s",
"type": "string",
"underlyingType": "string",
"argNum": 3,
"expr": "`\u003ccode\u003e`"
},
{
"id": "CodeChallengeMethod",
"string": "%[4]s",
"type": "source.toby3d.me/toby3d/auth/internal/domain.CodeChallengeMethod",
"underlyingType": "struct{codeChallengeMethod string}",
"argNum": 4,
"expr": "p.CodeChallengeMethod"
},
{
"id": "Code_1",
"string": "%[5]s",
"type": "string",
"underlyingType": "string",
"argNum": 5,
"expr": "`\u003c/code\u003e`"
}
]
},
{
"id": "This client does not use {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr}!",
"message": "This client does not use {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr}!",
"translation": "Клиент не использует {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr}!",
"placeholders": [
{
"id": "Abbr_titleProof_of_Key_Code_Exchange",
"string": "%[1]s",
"type": "string",
"underlyingType": "string",
"argNum": 1,
"expr": "`\u003cabbr title=\"Proof of Key Code Exchange\"\u003e`"
},
{
"id": "Abbr",
"string": "%[2]s",
"type": "string",
"underlyingType": "string",
"argNum": 2,
"expr": "`\u003c/abbr\u003e`"
}
]
},
{
"id": "{Dfn_idPKCE}Proof of Key Code Exchange{Dfn} is a mechanism that protects against attackers in the middle hijacking your application's authentication process. You can still authorize this application without this protection, but you must independently verify the security of this connection. If you have any doubts - stop the process and contact the developers.",
"message": "{Dfn_idPKCE}Proof of Key Code Exchange{Dfn} is a mechanism that protects against attackers in the middle hijacking your application's authentication process. You can still authorize this application without this protection, but you must independently verify the security of this connection. If you have any doubts - stop the process and contact the developers.",
"translation": "{Dfn_idPKCE}Proof of Key Code Exchange{Dfn} это механизм, защищающий от злоумышленников, перехватывающих процесс аутентификации вашего приложения. Вы можете авторизовать данное приложение и без этой защиты, но при этом вы должны самостоятельно проверить безопасность этого соединения. Если у вас есть сомнения - прервите процесс и свяжитесь с разработчиками.",
"placeholders": [
{
"id": "Dfn_idPKCE",
"string": "%[1]s",
"type": "string",
"underlyingType": "string",
"argNum": 1,
"expr": "`\u003cdfn id=\"PKCE\"\u003e`"
},
{
"id": "Dfn",
"string": "%[2]s",
"type": "string",
"underlyingType": "string",
"argNum": 2,
"expr": "`\u003c/dfn\u003e`"
}
]
},
{
"id": "Scopes",
"message": "Scopes",
"translation": "Области"
},
{
"id": "No scopes is requested: the application will only get your profile URL.",
"message": "No scopes is requested: the application will only get your profile URL.",
"translation": "Никакие разрешения не запрашиваются: приложение получит только URL вашего профиля."
},
{
"id": "Deny",
@ -41,9 +139,35 @@
"translatorComment": "Название кнопки продолжения процесса авторизациии приложения"
},
{
"id": "version",
"message": "version",
"translation": "версия"
"id": "You will be redirected to {Code}{RedirectURI}{Code_1}",
"message": "You will be redirected to {Code}{RedirectURI}{Code_1}",
"translation": "Вы будете перенаправлены на {Code}{RedirectURI}{Code_1}",
"placeholders": [
{
"id": "Code",
"string": "%[1]s",
"type": "string",
"underlyingType": "string",
"argNum": 1,
"expr": "`\u003ccode\u003e`"
},
{
"id": "RedirectURI",
"string": "%[2]s",
"type": "*source.toby3d.me/toby3d/auth/internal/domain.URL",
"underlyingType": "*source.toby3d.me/toby3d/auth/internal/domain.URL",
"argNum": 2,
"expr": "p.RedirectURI"
},
{
"id": "Code_1",
"string": "%[3]s",
"type": "string",
"underlyingType": "string",
"argNum": 3,
"expr": "`\u003c/code\u003e`"
}
]
},
{
"id": "Error",

View file

@ -24,9 +24,107 @@
"translatorComment": "Заголовок страницы авторизации безымянного приложения"
},
{
"id": "Choose your scopes",
"message": "Choose your scopes",
"translation": "Выбери предоставляемые разрешения"
"id": "This client uses {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr} with the {Code}{CodeChallengeMethod}{Code_1} method.",
"message": "This client uses {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr} with the {Code}{CodeChallengeMethod}{Code_1} method.",
"translation": "Клиент использует {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr} с методом {Code}{CodeChallengeMethod}{Code_1}.",
"placeholders": [
{
"id": "Abbr_titleProof_of_Key_Code_Exchange",
"string": "%[1]s",
"type": "string",
"underlyingType": "string",
"argNum": 1,
"expr": "`\u003cabbr title=\"Proof of Key Code Exchange\"\u003e`"
},
{
"id": "Abbr",
"string": "%[2]s",
"type": "string",
"underlyingType": "string",
"argNum": 2,
"expr": "`\u003c/abbr\u003e`"
},
{
"id": "Code",
"string": "%[3]s",
"type": "string",
"underlyingType": "string",
"argNum": 3,
"expr": "`\u003ccode\u003e`"
},
{
"id": "CodeChallengeMethod",
"string": "%[4]s",
"type": "source.toby3d.me/toby3d/auth/internal/domain.CodeChallengeMethod",
"underlyingType": "struct{codeChallengeMethod string}",
"argNum": 4,
"expr": "p.CodeChallengeMethod"
},
{
"id": "Code_1",
"string": "%[5]s",
"type": "string",
"underlyingType": "string",
"argNum": 5,
"expr": "`\u003c/code\u003e`"
}
]
},
{
"id": "This client does not use {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr}!",
"message": "This client does not use {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr}!",
"translation": "Клиент не использует {Abbr_titleProof_of_Key_Code_Exchange}PKCE{Abbr}!",
"placeholders": [
{
"id": "Abbr_titleProof_of_Key_Code_Exchange",
"string": "%[1]s",
"type": "string",
"underlyingType": "string",
"argNum": 1,
"expr": "`\u003cabbr title=\"Proof of Key Code Exchange\"\u003e`"
},
{
"id": "Abbr",
"string": "%[2]s",
"type": "string",
"underlyingType": "string",
"argNum": 2,
"expr": "`\u003c/abbr\u003e`"
}
]
},
{
"id": "{Dfn_idPKCE}Proof of Key Code Exchange{Dfn} is a mechanism that protects against attackers in the middle hijacking your application's authentication process. You can still authorize this application without this protection, but you must independently verify the security of this connection. If you have any doubts - stop the process and contact the developers.",
"message": "{Dfn_idPKCE}Proof of Key Code Exchange{Dfn} is a mechanism that protects against attackers in the middle hijacking your application's authentication process. You can still authorize this application without this protection, but you must independently verify the security of this connection. If you have any doubts - stop the process and contact the developers.",
"translation": "{Dfn_idPKCE}Proof of Key Code Exchange{Dfn} это механизм, защищающий от злоумышленников, перехватывающих процесс аутентификации вашего приложения. Вы можете авторизовать данное приложение и без этой защиты, но при этом вы должны самостоятельно проверить безопасность этого соединения. Если у вас есть сомнения - прервите процесс и свяжитесь с разработчиками.",
"placeholders": [
{
"id": "Dfn_idPKCE",
"string": "%[1]s",
"type": "string",
"underlyingType": "string",
"argNum": 1,
"expr": "`\u003cdfn id=\"PKCE\"\u003e`"
},
{
"id": "Dfn",
"string": "%[2]s",
"type": "string",
"underlyingType": "string",
"argNum": 2,
"expr": "`\u003c/dfn\u003e`"
}
]
},
{
"id": "Scopes",
"message": "Scopes",
"translation": "Области"
},
{
"id": "No scopes is requested: the application will only get your profile URL.",
"message": "No scopes is requested: the application will only get your profile URL.",
"translation": "Никакие разрешения не запрашиваются: приложение получит только URL вашего профиля."
},
{
"id": "Deny",
@ -41,9 +139,35 @@
"translatorComment": "Название кнопки продолжения процесса авторизациии приложения"
},
{
"id": "version",
"message": "version",
"translation": "версия"
"id": "You will be redirected to {Code}{RedirectURI}{Code_1}",
"message": "You will be redirected to {Code}{RedirectURI}{Code_1}",
"translation": "Вы будете перенаправлены на {Code}{RedirectURI}{Code_1}",
"placeholders": [
{
"id": "Code",
"string": "%[1]s",
"type": "string",
"underlyingType": "string",
"argNum": 1,
"expr": "`\u003ccode\u003e`"
},
{
"id": "RedirectURI",
"string": "%[2]s",
"type": "*source.toby3d.me/toby3d/auth/internal/domain.URL",
"underlyingType": "*source.toby3d.me/toby3d/auth/internal/domain.URL",
"argNum": 2,
"expr": "p.RedirectURI"
},
{
"id": "Code_1",
"string": "%[3]s",
"type": "string",
"underlyingType": "string",
"argNum": 3,
"expr": "`\u003c/code\u003e`"
}
]
},
{
"id": "Error",

View file

@ -55,6 +55,35 @@
</header>
<main>
<aside>
{% if p.CodeChallengeMethod != domain.CodeChallengeMethodUnd && p.CodeChallenge != "" %}
<p class="with-icon">
<span class="icon"
role="img"
aria-label="closed lock with key">🔐</span>
{%= p.T(`This client uses %sPKCE%s with the %s%s%s method.`, `<abbr title="Proof of Key Code Exchange">`,
`</abbr>`, `<code>`, p.CodeChallengeMethod, `</code>`) %}
</p>
{% else %}
<details>
<summary class="with-icon">
<span class="icon"
role="img"
aria-label="unlock">🔓</span>
{%= p.T(`This client does not use %sPKCE%s!`, `<abbr title="Proof of Key Code Exchange">`, `</abbr>`) %}
</summary>
<p>
{%= p.T(`%sProof of Key Code Exchange%s is a mechanism that protects against attackers in the middle hijacking `+
`your application's authentication process. You can still authorize this application without this protection, `+
`but you must independently verify the security of this connection. If you have any doubts - stop the process `+
` and contact the developers.`, `<dfn id="PKCE">`, `</dfn>`) %}
</p>
</details>
{% endif %}
</aside>
<form class=""
accept-charset="utf-8"
action="/authorize/verify"
@ -83,7 +112,7 @@
{% if len(p.Scope) > 0 %}
<fieldset>
<legend>{%= p.T("Choose your scopes") %}</legend>
<legend>{%= p.T("Scopes") %}</legend>
{% for _, scope := range p.Scope %}
<div>
@ -98,6 +127,10 @@
</div>
{% endfor %}
</fieldset>
{% else %}
<aside>
<p>{%= p.T(`No scopes is requested: the application will only get your profile URL.`) %}</p>
</aside>
{% endif %}
{% if p.CodeChallenge != "" %}
@ -149,6 +182,10 @@
{%= p.T("Allow") %}
</button>
<aside>
<p>{%= p.T(`You will be redirected to %s%s%s`, `<code>`, p.RedirectURI, `</code>`) %}</p>
</aside>
</form>
</main>
{% endfunc %}

View file

@ -186,6 +186,59 @@ func (p *AuthorizePage) StreamBody(qw422016 *qt422016.Writer) {
</header>
<main>
<aside>
`)
//line web/authorize.qtpl:59
if p.CodeChallengeMethod != domain.CodeChallengeMethodUnd && p.CodeChallenge != "" {
//line web/authorize.qtpl:59
qw422016.N().S(`
<p class="with-icon">
<span class="icon"
role="img"
aria-label="closed lock with key">🔐</span>
`)
//line web/authorize.qtpl:65
p.StreamT(qw422016, `This client uses %sPKCE%s with the %s%s%s method.`, `<abbr title="Proof of Key Code Exchange">`,
`</abbr>`, `<code>`, p.CodeChallengeMethod, `</code>`)
//line web/authorize.qtpl:66
qw422016.N().S(`
</p>
`)
//line web/authorize.qtpl:68
} else {
//line web/authorize.qtpl:68
qw422016.N().S(`
<details>
<summary class="with-icon">
<span class="icon"
role="img"
aria-label="unlock">🔓</span>
`)
//line web/authorize.qtpl:75
p.StreamT(qw422016, `This client does not use %sPKCE%s!`, `<abbr title="Proof of Key Code Exchange">`, `</abbr>`)
//line web/authorize.qtpl:75
qw422016.N().S(`
</summary>
<p>
`)
//line web/authorize.qtpl:78
p.StreamT(qw422016, `%sProof of Key Code Exchange%s is a mechanism that protects against attackers in the middle hijacking `+
`your application's authentication process. You can still authorize this application without this protection, `+
`but you must independently verify the security of this connection. If you have any doubts - stop the process `+
` and contact the developers.`, `<dfn id="PKCE">`, `</dfn>`)
//line web/authorize.qtpl:81
qw422016.N().S(`
</p>
</details>
`)
//line web/authorize.qtpl:84
}
//line web/authorize.qtpl:84
qw422016.N().S(`
</aside>
<form class=""
accept-charset="utf-8"
action="/authorize/verify"
@ -196,203 +249,215 @@ func (p *AuthorizePage) StreamBody(qw422016 *qt422016.Writer) {
target="_self">
`)
//line web/authorize.qtpl:67
//line web/authorize.qtpl:96
if p.CSRF != nil {
//line web/authorize.qtpl:67
//line web/authorize.qtpl:96
qw422016.N().S(`
<input type="hidden"
name="_csrf"
value="`)
//line web/authorize.qtpl:70
//line web/authorize.qtpl:99
qw422016.E().Z(p.CSRF)
//line web/authorize.qtpl:70
//line web/authorize.qtpl:99
qw422016.N().S(`">
`)
//line web/authorize.qtpl:71
//line web/authorize.qtpl:100
}
//line web/authorize.qtpl:71
//line web/authorize.qtpl:100
qw422016.N().S(`
`)
//line web/authorize.qtpl:73
//line web/authorize.qtpl:102
for key, val := range map[string]string{
"client_id": p.Client.ID.String(),
"redirect_uri": p.RedirectURI.String(),
"response_type": p.ResponseType.String(),
"state": p.State,
} {
//line web/authorize.qtpl:78
//line web/authorize.qtpl:107
qw422016.N().S(`
<input type="hidden"
name="`)
//line web/authorize.qtpl:80
//line web/authorize.qtpl:109
qw422016.E().S(key)
//line web/authorize.qtpl:80
//line web/authorize.qtpl:109
qw422016.N().S(`"
value="`)
//line web/authorize.qtpl:81
//line web/authorize.qtpl:110
qw422016.E().S(val)
//line web/authorize.qtpl:81
//line web/authorize.qtpl:110
qw422016.N().S(`">
`)
//line web/authorize.qtpl:82
//line web/authorize.qtpl:111
}
//line web/authorize.qtpl:82
//line web/authorize.qtpl:111
qw422016.N().S(`
`)
//line web/authorize.qtpl:84
//line web/authorize.qtpl:113
if len(p.Scope) > 0 {
//line web/authorize.qtpl:84
//line web/authorize.qtpl:113
qw422016.N().S(`
<fieldset>
<legend>`)
//line web/authorize.qtpl:86
p.StreamT(qw422016, "Choose your scopes")
//line web/authorize.qtpl:86
//line web/authorize.qtpl:115
p.StreamT(qw422016, "Scopes")
//line web/authorize.qtpl:115
qw422016.N().S(`</legend>
`)
//line web/authorize.qtpl:88
//line web/authorize.qtpl:117
for _, scope := range p.Scope {
//line web/authorize.qtpl:88
//line web/authorize.qtpl:117
qw422016.N().S(`
<div>
<label>
<input type="checkbox"
name="scope[]"
value="`)
//line web/authorize.qtpl:93
//line web/authorize.qtpl:122
qw422016.E().S(scope.String())
//line web/authorize.qtpl:93
//line web/authorize.qtpl:122
qw422016.N().S(`"
checked>
`)
//line web/authorize.qtpl:96
//line web/authorize.qtpl:125
qw422016.E().S(scope.String())
//line web/authorize.qtpl:96
//line web/authorize.qtpl:125
qw422016.N().S(`
</label>
</div>
`)
//line web/authorize.qtpl:99
//line web/authorize.qtpl:128
}
//line web/authorize.qtpl:99
//line web/authorize.qtpl:128
qw422016.N().S(`
</fieldset>
`)
//line web/authorize.qtpl:101
//line web/authorize.qtpl:130
} else {
//line web/authorize.qtpl:130
qw422016.N().S(`
<aside>
<p>`)
//line web/authorize.qtpl:132
p.StreamT(qw422016, `No scopes is requested: the application will only get your profile URL.`)
//line web/authorize.qtpl:132
qw422016.N().S(`</p>
</aside>
`)
//line web/authorize.qtpl:134
}
//line web/authorize.qtpl:101
//line web/authorize.qtpl:134
qw422016.N().S(`
`)
//line web/authorize.qtpl:103
//line web/authorize.qtpl:136
if p.CodeChallenge != "" {
//line web/authorize.qtpl:103
//line web/authorize.qtpl:136
qw422016.N().S(`
`)
//line web/authorize.qtpl:104
//line web/authorize.qtpl:137
for key, val := range map[string]string{
"code_challenge": p.CodeChallenge,
"code_challenge_method": p.CodeChallengeMethod.String(),
} {
//line web/authorize.qtpl:107
//line web/authorize.qtpl:140
qw422016.N().S(`
<input type="hidden"
name="`)
//line web/authorize.qtpl:109
//line web/authorize.qtpl:142
qw422016.E().S(key)
//line web/authorize.qtpl:109
//line web/authorize.qtpl:142
qw422016.N().S(`"
value="`)
//line web/authorize.qtpl:110
//line web/authorize.qtpl:143
qw422016.E().S(val)
//line web/authorize.qtpl:110
//line web/authorize.qtpl:143
qw422016.N().S(`">
`)
//line web/authorize.qtpl:111
//line web/authorize.qtpl:144
}
//line web/authorize.qtpl:111
//line web/authorize.qtpl:144
qw422016.N().S(`
`)
//line web/authorize.qtpl:112
//line web/authorize.qtpl:145
}
//line web/authorize.qtpl:112
//line web/authorize.qtpl:145
qw422016.N().S(`
`)
//line web/authorize.qtpl:114
//line web/authorize.qtpl:147
if p.Me != nil {
//line web/authorize.qtpl:114
//line web/authorize.qtpl:147
qw422016.N().S(`
<input type="hidden"
name="me"
value="`)
//line web/authorize.qtpl:117
//line web/authorize.qtpl:150
qw422016.E().S(p.Me.String())
//line web/authorize.qtpl:117
//line web/authorize.qtpl:150
qw422016.N().S(`">
`)
//line web/authorize.qtpl:118
//line web/authorize.qtpl:151
}
//line web/authorize.qtpl:118
//line web/authorize.qtpl:151
qw422016.N().S(`
`)
//line web/authorize.qtpl:120
//line web/authorize.qtpl:153
if len(p.Providers) > 0 {
//line web/authorize.qtpl:120
//line web/authorize.qtpl:153
qw422016.N().S(`
<select name="provider"
autocomplete
required>
`)
//line web/authorize.qtpl:125
//line web/authorize.qtpl:158
for _, provider := range p.Providers {
//line web/authorize.qtpl:125
//line web/authorize.qtpl:158
qw422016.N().S(`
<option value="`)
//line web/authorize.qtpl:126
//line web/authorize.qtpl:159
qw422016.E().S(provider.UID)
//line web/authorize.qtpl:126
//line web/authorize.qtpl:159
qw422016.N().S(`"
`)
//line web/authorize.qtpl:127
//line web/authorize.qtpl:160
if provider.UID == "mastodon" {
//line web/authorize.qtpl:127
//line web/authorize.qtpl:160
qw422016.N().S(`selected`)
//line web/authorize.qtpl:127
//line web/authorize.qtpl:160
}
//line web/authorize.qtpl:127
//line web/authorize.qtpl:160
qw422016.N().S(`>
`)
//line web/authorize.qtpl:129
//line web/authorize.qtpl:162
qw422016.E().S(provider.Name)
//line web/authorize.qtpl:129
//line web/authorize.qtpl:162
qw422016.N().S(`
</option>
`)
//line web/authorize.qtpl:131
//line web/authorize.qtpl:164
}
//line web/authorize.qtpl:131
//line web/authorize.qtpl:164
qw422016.N().S(`
</select>
`)
//line web/authorize.qtpl:133
//line web/authorize.qtpl:166
} else {
//line web/authorize.qtpl:133
//line web/authorize.qtpl:166
qw422016.N().S(`
<input type="hidden"
name="provider"
value="direct">
`)
//line web/authorize.qtpl:137
//line web/authorize.qtpl:170
}
//line web/authorize.qtpl:137
//line web/authorize.qtpl:170
qw422016.N().S(`
<button type="submit"
@ -400,9 +465,9 @@ func (p *AuthorizePage) StreamBody(qw422016 *qt422016.Writer) {
value="deny">
`)
//line web/authorize.qtpl:143
//line web/authorize.qtpl:176
p.StreamT(qw422016, "Deny")
//line web/authorize.qtpl:143
//line web/authorize.qtpl:176
qw422016.N().S(`
</button>
@ -411,39 +476,47 @@ func (p *AuthorizePage) StreamBody(qw422016 *qt422016.Writer) {
value="allow">
`)
//line web/authorize.qtpl:150
//line web/authorize.qtpl:183
p.StreamT(qw422016, "Allow")
//line web/authorize.qtpl:150
//line web/authorize.qtpl:183
qw422016.N().S(`
</button>
<aside>
<p>`)
//line web/authorize.qtpl:187
p.StreamT(qw422016, `You will be redirected to %s%s%s`, `<code>`, p.RedirectURI, `</code>`)
//line web/authorize.qtpl:187
qw422016.N().S(`</p>
</aside>
</form>
</main>
`)
//line web/authorize.qtpl:154
//line web/authorize.qtpl:191
}
//line web/authorize.qtpl:154
//line web/authorize.qtpl:191
func (p *AuthorizePage) WriteBody(qq422016 qtio422016.Writer) {
//line web/authorize.qtpl:154
//line web/authorize.qtpl:191
qw422016 := qt422016.AcquireWriter(qq422016)
//line web/authorize.qtpl:154
//line web/authorize.qtpl:191
p.StreamBody(qw422016)
//line web/authorize.qtpl:154
//line web/authorize.qtpl:191
qt422016.ReleaseWriter(qw422016)
//line web/authorize.qtpl:154
//line web/authorize.qtpl:191
}
//line web/authorize.qtpl:154
//line web/authorize.qtpl:191
func (p *AuthorizePage) Body() string {
//line web/authorize.qtpl:154
//line web/authorize.qtpl:191
qb422016 := qt422016.AcquireByteBuffer()
//line web/authorize.qtpl:154
//line web/authorize.qtpl:191
p.WriteBody(qb422016)
//line web/authorize.qtpl:154
//line web/authorize.qtpl:191
qs422016 := string(qb422016.B)
//line web/authorize.qtpl:154
//line web/authorize.qtpl:191
qt422016.ReleaseByteBuffer(qb422016)
//line web/authorize.qtpl:154
//line web/authorize.qtpl:191
return qs422016
//line web/authorize.qtpl:154
//line web/authorize.qtpl:191
}

View file

@ -12,7 +12,7 @@
Head()
Lang()
Title()
T(format string, args ...interface{})
T(format message.Reference, args ...any)
} %}
{% code type BaseOf struct {
@ -104,7 +104,7 @@ en
</html>
{% endfunc %}
{% func (p *BaseOf) T(format string, args ...interface{}) %}
{%s p.Printer.Sprintf(format, args...) %}
{% func (p BaseOf) T(format message.Reference, args ...any) %}
{%s= p.Printer.Sprintf(format, args...) %}
{% endfunc %}
{% endcollapsespace %}

View file

@ -54,11 +54,11 @@ type Page interface {
//line web/baseof.qtpl:10
WriteTitle(qq422016 qtio422016.Writer)
//line web/baseof.qtpl:10
T(format string, args ...interface{}) string
T(format message.Reference, args ...any) string
//line web/baseof.qtpl:10
StreamT(qw422016 *qt422016.Writer, format string, args ...interface{})
StreamT(qw422016 *qt422016.Writer, format message.Reference, args ...any)
//line web/baseof.qtpl:10
WriteT(qq422016 qtio422016.Writer, format string, args ...interface{})
WriteT(qq422016 qtio422016.Writer, format message.Reference, args ...any)
//line web/baseof.qtpl:10
}
@ -304,18 +304,18 @@ func Template(p Page) string {
}
//line web/baseof.qtpl:107
func (p *BaseOf) StreamT(qw422016 *qt422016.Writer, format string, args ...interface{}) {
func (p BaseOf) StreamT(qw422016 *qt422016.Writer, format message.Reference, args ...any) {
//line web/baseof.qtpl:107
qw422016.N().S(` `)
//line web/baseof.qtpl:108
qw422016.E().S(p.Printer.Sprintf(format, args...))
qw422016.N().S(p.Printer.Sprintf(format, args...))
//line web/baseof.qtpl:108
qw422016.N().S(` `)
//line web/baseof.qtpl:109
}
//line web/baseof.qtpl:109
func (p *BaseOf) WriteT(qq422016 qtio422016.Writer, format string, args ...interface{}) {
func (p BaseOf) WriteT(qq422016 qtio422016.Writer, format message.Reference, args ...any) {
//line web/baseof.qtpl:109
qw422016 := qt422016.AcquireWriter(qq422016)
//line web/baseof.qtpl:109
@ -326,7 +326,7 @@ func (p *BaseOf) WriteT(qq422016 qtio422016.Writer, format string, args ...inter
}
//line web/baseof.qtpl:109
func (p *BaseOf) T(format string, args ...interface{}) string {
func (p BaseOf) T(format message.Reference, args ...any) string {
//line web/baseof.qtpl:109
qb422016 := qt422016.AcquireByteBuffer()
//line web/baseof.qtpl:109