diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index a1b89d981..7217a983b 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "dotnet-ef": { - "version": "8.0.3", + "version": "8.0.6", "commands": [ "dotnet-ef" ] diff --git a/.github/workflows/crowdin-pull.yml b/.github/workflows/crowdin-pull.yml index 1f36bca82..99b425b37 100644 --- a/.github/workflows/crowdin-pull.yml +++ b/.github/workflows/crowdin-pull.yml @@ -1,6 +1,7 @@ on: schedule: - cron: "*/60 * * * *" + workflow_dispatch: name: Download Translations from Crowdin diff --git a/ProjectLighthouse.Localization/BaseLayout.lang-en-GB.resx b/ProjectLighthouse.Localization/BaseLayout.lang-en-GB.resx new file mode 100644 index 000000000..018d76883 --- /dev/null +++ b/ProjectLighthouse.Localization/BaseLayout.lang-en-GB.resx @@ -0,0 +1,89 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + Users + A button on the header that takes you to the user listing. + + + Photos + A button on the header that takes you to a list of user-uploaded photos. + + + Levels + A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots". + + + Authentication + A button on the header that takes you to a list of authentication attempts. + + + Login + A button on the header that lets you log in. + + + Login / Register + A button on the header that lets you log in or register. + + + Admin + A header link that takes you to the admin panel if available. + + + Log out + A shortcut to log you out of your account. + + + Mod Panel + + + Page generated by {0}. + + + This page was generated using a modified version of Project Lighthouse. Please make sure you are properly disclosing the source code to any users who may be using this instance. + + + While we intend to have as little JavaScript as possible, we can not guarantee everything will work without it. We recommend that you whitelist JavaScript for Project Lighthouse. + + + JavaScript is not enabled + + + Potential License Violation + + + This instance is a public-facing instance that has been modified without the changes published. You may be in violation of the {0}. + + + If you believe this is an error, please create an issue with the output of {0} ran from the root of the server source code in the description on our {1}issue tracker{2}. + + + If not, please publish the source code somewhere accessible to your users. + + + Read-Only Mode + + + This instance is currently in read-only mode. Level and photo uploads, comments, reviews, and certain profile changes will be restricted until read-only mode is disabled. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/BaseLayout.lang-en-UD.resx b/ProjectLighthouse.Localization/BaseLayout.lang-en-UD.resx new file mode 100644 index 000000000..018d76883 --- /dev/null +++ b/ProjectLighthouse.Localization/BaseLayout.lang-en-UD.resx @@ -0,0 +1,89 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + Users + A button on the header that takes you to the user listing. + + + Photos + A button on the header that takes you to a list of user-uploaded photos. + + + Levels + A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots". + + + Authentication + A button on the header that takes you to a list of authentication attempts. + + + Login + A button on the header that lets you log in. + + + Login / Register + A button on the header that lets you log in or register. + + + Admin + A header link that takes you to the admin panel if available. + + + Log out + A shortcut to log you out of your account. + + + Mod Panel + + + Page generated by {0}. + + + This page was generated using a modified version of Project Lighthouse. Please make sure you are properly disclosing the source code to any users who may be using this instance. + + + While we intend to have as little JavaScript as possible, we can not guarantee everything will work without it. We recommend that you whitelist JavaScript for Project Lighthouse. + + + JavaScript is not enabled + + + Potential License Violation + + + This instance is a public-facing instance that has been modified without the changes published. You may be in violation of the {0}. + + + If you believe this is an error, please create an issue with the output of {0} ran from the root of the server source code in the description on our {1}issue tracker{2}. + + + If not, please publish the source code somewhere accessible to your users. + + + Read-Only Mode + + + This instance is currently in read-only mode. Level and photo uploads, comments, reviews, and certain profile changes will be restricted until read-only mode is disabled. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/BaseLayout.lang-fr-CA.resx b/ProjectLighthouse.Localization/BaseLayout.lang-fr-CA.resx new file mode 100644 index 000000000..018d76883 --- /dev/null +++ b/ProjectLighthouse.Localization/BaseLayout.lang-fr-CA.resx @@ -0,0 +1,89 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + Users + A button on the header that takes you to the user listing. + + + Photos + A button on the header that takes you to a list of user-uploaded photos. + + + Levels + A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots". + + + Authentication + A button on the header that takes you to a list of authentication attempts. + + + Login + A button on the header that lets you log in. + + + Login / Register + A button on the header that lets you log in or register. + + + Admin + A header link that takes you to the admin panel if available. + + + Log out + A shortcut to log you out of your account. + + + Mod Panel + + + Page generated by {0}. + + + This page was generated using a modified version of Project Lighthouse. Please make sure you are properly disclosing the source code to any users who may be using this instance. + + + While we intend to have as little JavaScript as possible, we can not guarantee everything will work without it. We recommend that you whitelist JavaScript for Project Lighthouse. + + + JavaScript is not enabled + + + Potential License Violation + + + This instance is a public-facing instance that has been modified without the changes published. You may be in violation of the {0}. + + + If you believe this is an error, please create an issue with the output of {0} ran from the root of the server source code in the description on our {1}issue tracker{2}. + + + If not, please publish the source code somewhere accessible to your users. + + + Read-Only Mode + + + This instance is currently in read-only mode. Level and photo uploads, comments, reviews, and certain profile changes will be restricted until read-only mode is disabled. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/BaseLayout.lang-gd-GB.resx b/ProjectLighthouse.Localization/BaseLayout.lang-gd-GB.resx deleted file mode 100644 index c799594c2..000000000 --- a/ProjectLighthouse.Localization/BaseLayout.lang-gd-GB.resx +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - - - - - Home - A button on the header that takes you to the landing page. - - - - Users - A button on the header that takes you to the user listing. - - - - Photos - A button on the header that takes you to a list of user-uploaded photos. - - - - Levels - A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots". - - - - Authentication - A button on the header that takes you to a list of authentication attempts. - - - - Login / Register - A button on the header that lets you log in or register. - - - Profile - A quick shortcut on the header to take you to your profile if logged in. - - - Admin Panel - A header link that takes you to the admin panel if available. - - - Log out - A shortcut to log you out of your account. - - \ No newline at end of file diff --git a/ProjectLighthouse.Localization/BaseLayout.lang-ko-KR.resx b/ProjectLighthouse.Localization/BaseLayout.lang-ko-KR.resx new file mode 100644 index 000000000..018d76883 --- /dev/null +++ b/ProjectLighthouse.Localization/BaseLayout.lang-ko-KR.resx @@ -0,0 +1,89 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + Users + A button on the header that takes you to the user listing. + + + Photos + A button on the header that takes you to a list of user-uploaded photos. + + + Levels + A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots". + + + Authentication + A button on the header that takes you to a list of authentication attempts. + + + Login + A button on the header that lets you log in. + + + Login / Register + A button on the header that lets you log in or register. + + + Admin + A header link that takes you to the admin panel if available. + + + Log out + A shortcut to log you out of your account. + + + Mod Panel + + + Page generated by {0}. + + + This page was generated using a modified version of Project Lighthouse. Please make sure you are properly disclosing the source code to any users who may be using this instance. + + + While we intend to have as little JavaScript as possible, we can not guarantee everything will work without it. We recommend that you whitelist JavaScript for Project Lighthouse. + + + JavaScript is not enabled + + + Potential License Violation + + + This instance is a public-facing instance that has been modified without the changes published. You may be in violation of the {0}. + + + If you believe this is an error, please create an issue with the output of {0} ran from the root of the server source code in the description on our {1}issue tracker{2}. + + + If not, please publish the source code somewhere accessible to your users. + + + Read-Only Mode + + + This instance is currently in read-only mode. Level and photo uploads, comments, reviews, and certain profile changes will be restricted until read-only mode is disabled. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/BaseLayout.lang-nn-NO.resx b/ProjectLighthouse.Localization/BaseLayout.lang-nn-NO.resx new file mode 100644 index 000000000..018d76883 --- /dev/null +++ b/ProjectLighthouse.Localization/BaseLayout.lang-nn-NO.resx @@ -0,0 +1,89 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + Users + A button on the header that takes you to the user listing. + + + Photos + A button on the header that takes you to a list of user-uploaded photos. + + + Levels + A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots". + + + Authentication + A button on the header that takes you to a list of authentication attempts. + + + Login + A button on the header that lets you log in. + + + Login / Register + A button on the header that lets you log in or register. + + + Admin + A header link that takes you to the admin panel if available. + + + Log out + A shortcut to log you out of your account. + + + Mod Panel + + + Page generated by {0}. + + + This page was generated using a modified version of Project Lighthouse. Please make sure you are properly disclosing the source code to any users who may be using this instance. + + + While we intend to have as little JavaScript as possible, we can not guarantee everything will work without it. We recommend that you whitelist JavaScript for Project Lighthouse. + + + JavaScript is not enabled + + + Potential License Violation + + + This instance is a public-facing instance that has been modified without the changes published. You may be in violation of the {0}. + + + If you believe this is an error, please create an issue with the output of {0} ran from the root of the server source code in the description on our {1}issue tracker{2}. + + + If not, please publish the source code somewhere accessible to your users. + + + Read-Only Mode + + + This instance is currently in read-only mode. Level and photo uploads, comments, reviews, and certain profile changes will be restricted until read-only mode is disabled. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/BaseLayout.lang-pt-BR.resx b/ProjectLighthouse.Localization/BaseLayout.lang-pt-BR.resx new file mode 100644 index 000000000..23b769dc3 --- /dev/null +++ b/ProjectLighthouse.Localization/BaseLayout.lang-pt-BR.resx @@ -0,0 +1,89 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + Usuários + A button on the header that takes you to the user listing. + + + Imagens + A button on the header that takes you to a list of user-uploaded photos. + + + Níveis + A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots". + + + Autenticação + A button on the header that takes you to a list of authentication attempts. + + + Entrar + A button on the header that lets you log in. + + + Entrar / Cadastrar + A button on the header that lets you log in or register. + + + Administrador + A header link that takes you to the admin panel if available. + + + Sair + A shortcut to log you out of your account. + + + Painel de Moderação + + + Página gerada por {0}. + + + Esta página foi gerada usando uma versão modificada do Projeto Lighthouse. Certifique-se de que você está divulgando corretamente o código fonte para qualquer usuário que possa estar usando esta instância. + + + Embora tenhamos a intenção de ter o mínimo de JavaScript possível, nós não podemos garantir que tudo funcionará sem ele. Recomendamos que você coloque JavaScript na lista branca para o Projeto Lighthouse. + + + O JavaScript não está habilitado + + + Potencial Violação de Licença + + + Esta instância é uma instância pública que foi modificada sem as alterações publicadas. Você pode estar violando o {0}. + + + Se você acha que isso é um erro, por favor, crie um problema com a saída {0} executada a partir da raiz do código fonte do servidor na descrição do nosso rastreador de problemas {1}{2}. + + + Caso contrário, publique o código-fonte em algum lugar acessível aos seus usuários. + + + Modo somente leitura + + + Esta instância está atualmente em modo somente leitura. Envios de fotos, comentários, análises e certas alterações de perfil serão restringidas até que o modo somente leitura seja desativado. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Error.lang-en-GB.resx b/ProjectLighthouse.Localization/Error.lang-en-GB.resx new file mode 100644 index 000000000..6daa6b1af --- /dev/null +++ b/ProjectLighthouse.Localization/Error.lang-en-GB.resx @@ -0,0 +1,44 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + The username field is blank. + + + The username you've chosen is already taken. + + + Password field is required. + + + Passwords do not match! + + + You must complete the captcha correctly. + + + The email address you've chosen is already taken. + + + Email address field is required. + + + You don't have permissions to perform this action. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Error.lang-en-UD.resx b/ProjectLighthouse.Localization/Error.lang-en-UD.resx new file mode 100644 index 000000000..6daa6b1af --- /dev/null +++ b/ProjectLighthouse.Localization/Error.lang-en-UD.resx @@ -0,0 +1,44 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + The username field is blank. + + + The username you've chosen is already taken. + + + Password field is required. + + + Passwords do not match! + + + You must complete the captcha correctly. + + + The email address you've chosen is already taken. + + + Email address field is required. + + + You don't have permissions to perform this action. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Error.lang-fr-CA.resx b/ProjectLighthouse.Localization/Error.lang-fr-CA.resx new file mode 100644 index 000000000..6daa6b1af --- /dev/null +++ b/ProjectLighthouse.Localization/Error.lang-fr-CA.resx @@ -0,0 +1,44 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + The username field is blank. + + + The username you've chosen is already taken. + + + Password field is required. + + + Passwords do not match! + + + You must complete the captcha correctly. + + + The email address you've chosen is already taken. + + + Email address field is required. + + + You don't have permissions to perform this action. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Error.lang-ko-KR.resx b/ProjectLighthouse.Localization/Error.lang-ko-KR.resx new file mode 100644 index 000000000..6daa6b1af --- /dev/null +++ b/ProjectLighthouse.Localization/Error.lang-ko-KR.resx @@ -0,0 +1,44 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + The username field is blank. + + + The username you've chosen is already taken. + + + Password field is required. + + + Passwords do not match! + + + You must complete the captcha correctly. + + + The email address you've chosen is already taken. + + + Email address field is required. + + + You don't have permissions to perform this action. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Error.lang-nn-NO.resx b/ProjectLighthouse.Localization/Error.lang-nn-NO.resx new file mode 100644 index 000000000..6daa6b1af --- /dev/null +++ b/ProjectLighthouse.Localization/Error.lang-nn-NO.resx @@ -0,0 +1,44 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + The username field is blank. + + + The username you've chosen is already taken. + + + Password field is required. + + + Passwords do not match! + + + You must complete the captcha correctly. + + + The email address you've chosen is already taken. + + + Email address field is required. + + + You don't have permissions to perform this action. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Error.lang-pt-BR.resx b/ProjectLighthouse.Localization/Error.lang-pt-BR.resx new file mode 100644 index 000000000..dd024c132 --- /dev/null +++ b/ProjectLighthouse.Localization/Error.lang-pt-BR.resx @@ -0,0 +1,44 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + O nome de usuário está vazio. + + + O nome de usuário que você escolheu já existe. + + + O campo de senha é obrigatório. + + + As senhas não coincidem! + + + Você deve completar o captcha corretamente. + + + O e-mail que você escolheu já está sendo usado. + + + O campo de endereço de e-mail é obrigatório. + + + Você não tem permissões para executar esta ação. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/General.lang-en-GB.resx b/ProjectLighthouse.Localization/General.lang-en-GB.resx new file mode 100644 index 000000000..5650186c9 --- /dev/null +++ b/ProjectLighthouse.Localization/General.lang-en-GB.resx @@ -0,0 +1,65 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Username + + + Password + + + Create an account + + + Forgot Password? + + + Uh oh! + + + Log In + + + Unknown + + + Success! + + + Reset Password + + + Recent Activity + + + Coming soon! + + + Most recent photos + + + Email + + + Announcements + + + Notifications + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/General.lang-en-UD.resx b/ProjectLighthouse.Localization/General.lang-en-UD.resx new file mode 100644 index 000000000..5650186c9 --- /dev/null +++ b/ProjectLighthouse.Localization/General.lang-en-UD.resx @@ -0,0 +1,65 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Username + + + Password + + + Create an account + + + Forgot Password? + + + Uh oh! + + + Log In + + + Unknown + + + Success! + + + Reset Password + + + Recent Activity + + + Coming soon! + + + Most recent photos + + + Email + + + Announcements + + + Notifications + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/General.lang-fr-CA.resx b/ProjectLighthouse.Localization/General.lang-fr-CA.resx new file mode 100644 index 000000000..5650186c9 --- /dev/null +++ b/ProjectLighthouse.Localization/General.lang-fr-CA.resx @@ -0,0 +1,65 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Username + + + Password + + + Create an account + + + Forgot Password? + + + Uh oh! + + + Log In + + + Unknown + + + Success! + + + Reset Password + + + Recent Activity + + + Coming soon! + + + Most recent photos + + + Email + + + Announcements + + + Notifications + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/General.lang-ko-KR.resx b/ProjectLighthouse.Localization/General.lang-ko-KR.resx new file mode 100644 index 000000000..5650186c9 --- /dev/null +++ b/ProjectLighthouse.Localization/General.lang-ko-KR.resx @@ -0,0 +1,65 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Username + + + Password + + + Create an account + + + Forgot Password? + + + Uh oh! + + + Log In + + + Unknown + + + Success! + + + Reset Password + + + Recent Activity + + + Coming soon! + + + Most recent photos + + + Email + + + Announcements + + + Notifications + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/General.lang-nn-NO.resx b/ProjectLighthouse.Localization/General.lang-nn-NO.resx new file mode 100644 index 000000000..5650186c9 --- /dev/null +++ b/ProjectLighthouse.Localization/General.lang-nn-NO.resx @@ -0,0 +1,65 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Username + + + Password + + + Create an account + + + Forgot Password? + + + Uh oh! + + + Log In + + + Unknown + + + Success! + + + Reset Password + + + Recent Activity + + + Coming soon! + + + Most recent photos + + + Email + + + Announcements + + + Notifications + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/General.lang-pt-BR.resx b/ProjectLighthouse.Localization/General.lang-pt-BR.resx new file mode 100644 index 000000000..47b950433 --- /dev/null +++ b/ProjectLighthouse.Localization/General.lang-pt-BR.resx @@ -0,0 +1,65 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Nome de usuário + + + Senha + + + Criar uma conta + + + Esqueceu sua senha? + + + Oh, não! + + + Entrar + + + Desconhecido + + + Sucesso! + + + Redefinir Senha + + + Atividade Recente + + + Em breve! + + + Imagens mais recentes + + + Email + + + Avisos + + + Notificações + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/LandingPage.lang-en-GB.resx b/ProjectLighthouse.Localization/LandingPage.lang-en-GB.resx new file mode 100644 index 000000000..1a744b49d --- /dev/null +++ b/ProjectLighthouse.Localization/LandingPage.lang-en-GB.resx @@ -0,0 +1,54 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + Welcome to {0}! + A greeting on the main page of the website. + + + Greetings, {0}. + A greeting on the main page of the website. + + + There are no people online. Why not hop on? + A greeting on the main page of the website. + + + There is 1 person currently online: + A greeting on the main page of the website. + + + There are currently {0} people online: + A greeting on the main page of the website. + + + You have {0} authentication attempts pending. Click here to view them. + A greeting on the main page of the website. + + + Newest Levels + + + Latest Team Picks + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/LandingPage.lang-en-UD.resx b/ProjectLighthouse.Localization/LandingPage.lang-en-UD.resx new file mode 100644 index 000000000..1a744b49d --- /dev/null +++ b/ProjectLighthouse.Localization/LandingPage.lang-en-UD.resx @@ -0,0 +1,54 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + Welcome to {0}! + A greeting on the main page of the website. + + + Greetings, {0}. + A greeting on the main page of the website. + + + There are no people online. Why not hop on? + A greeting on the main page of the website. + + + There is 1 person currently online: + A greeting on the main page of the website. + + + There are currently {0} people online: + A greeting on the main page of the website. + + + You have {0} authentication attempts pending. Click here to view them. + A greeting on the main page of the website. + + + Newest Levels + + + Latest Team Picks + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/LandingPage.lang-fr-CA.resx b/ProjectLighthouse.Localization/LandingPage.lang-fr-CA.resx new file mode 100644 index 000000000..1a744b49d --- /dev/null +++ b/ProjectLighthouse.Localization/LandingPage.lang-fr-CA.resx @@ -0,0 +1,54 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + Welcome to {0}! + A greeting on the main page of the website. + + + Greetings, {0}. + A greeting on the main page of the website. + + + There are no people online. Why not hop on? + A greeting on the main page of the website. + + + There is 1 person currently online: + A greeting on the main page of the website. + + + There are currently {0} people online: + A greeting on the main page of the website. + + + You have {0} authentication attempts pending. Click here to view them. + A greeting on the main page of the website. + + + Newest Levels + + + Latest Team Picks + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/LandingPage.lang-ko-KR.resx b/ProjectLighthouse.Localization/LandingPage.lang-ko-KR.resx new file mode 100644 index 000000000..1a744b49d --- /dev/null +++ b/ProjectLighthouse.Localization/LandingPage.lang-ko-KR.resx @@ -0,0 +1,54 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + Welcome to {0}! + A greeting on the main page of the website. + + + Greetings, {0}. + A greeting on the main page of the website. + + + There are no people online. Why not hop on? + A greeting on the main page of the website. + + + There is 1 person currently online: + A greeting on the main page of the website. + + + There are currently {0} people online: + A greeting on the main page of the website. + + + You have {0} authentication attempts pending. Click here to view them. + A greeting on the main page of the website. + + + Newest Levels + + + Latest Team Picks + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/LandingPage.lang-nn-NO.resx b/ProjectLighthouse.Localization/LandingPage.lang-nn-NO.resx new file mode 100644 index 000000000..1a744b49d --- /dev/null +++ b/ProjectLighthouse.Localization/LandingPage.lang-nn-NO.resx @@ -0,0 +1,54 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + Welcome to {0}! + A greeting on the main page of the website. + + + Greetings, {0}. + A greeting on the main page of the website. + + + There are no people online. Why not hop on? + A greeting on the main page of the website. + + + There is 1 person currently online: + A greeting on the main page of the website. + + + There are currently {0} people online: + A greeting on the main page of the website. + + + You have {0} authentication attempts pending. Click here to view them. + A greeting on the main page of the website. + + + Newest Levels + + + Latest Team Picks + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/LandingPage.lang-pt-BR.resx b/ProjectLighthouse.Localization/LandingPage.lang-pt-BR.resx new file mode 100644 index 000000000..9fc36db7b --- /dev/null +++ b/ProjectLighthouse.Localization/LandingPage.lang-pt-BR.resx @@ -0,0 +1,54 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + Bem-vindo(a) ao {0}! + A greeting on the main page of the website. + + + Saudações, {0}. + A greeting on the main page of the website. + + + Não tem pessoas online. Por que não entrar? + A greeting on the main page of the website. + + + Tem 1 pessoa atualmente online: + A greeting on the main page of the website. + + + Atualmente tem {0} pessoas online: + A greeting on the main page of the website. + + + Você tem {0} tentativas pendentes de autenticação. Clique aqui para visualizá-las. + A greeting on the main page of the website. + + + Níveis Mais Recentes + + + Últimas Escolhas da Equipe + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/LoggedOut.lang-en-GB.resx b/ProjectLighthouse.Localization/LoggedOut.lang-en-GB.resx new file mode 100644 index 000000000..7a1938893 --- /dev/null +++ b/ProjectLighthouse.Localization/LoggedOut.lang-en-GB.resx @@ -0,0 +1,29 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Logged Out + + + You have been successfully logged out. You will be redirected in 5 seconds, or you may click below to do so manually. + + + Redirect + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/LoggedOut.lang-en-UD.resx b/ProjectLighthouse.Localization/LoggedOut.lang-en-UD.resx new file mode 100644 index 000000000..7a1938893 --- /dev/null +++ b/ProjectLighthouse.Localization/LoggedOut.lang-en-UD.resx @@ -0,0 +1,29 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Logged Out + + + You have been successfully logged out. You will be redirected in 5 seconds, or you may click below to do so manually. + + + Redirect + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/LoggedOut.lang-fr-CA.resx b/ProjectLighthouse.Localization/LoggedOut.lang-fr-CA.resx new file mode 100644 index 000000000..7a1938893 --- /dev/null +++ b/ProjectLighthouse.Localization/LoggedOut.lang-fr-CA.resx @@ -0,0 +1,29 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Logged Out + + + You have been successfully logged out. You will be redirected in 5 seconds, or you may click below to do so manually. + + + Redirect + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/LoggedOut.lang-ko-KR.resx b/ProjectLighthouse.Localization/LoggedOut.lang-ko-KR.resx new file mode 100644 index 000000000..7a1938893 --- /dev/null +++ b/ProjectLighthouse.Localization/LoggedOut.lang-ko-KR.resx @@ -0,0 +1,29 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Logged Out + + + You have been successfully logged out. You will be redirected in 5 seconds, or you may click below to do so manually. + + + Redirect + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/LoggedOut.lang-nn-NO.resx b/ProjectLighthouse.Localization/LoggedOut.lang-nn-NO.resx new file mode 100644 index 000000000..7a1938893 --- /dev/null +++ b/ProjectLighthouse.Localization/LoggedOut.lang-nn-NO.resx @@ -0,0 +1,29 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Logged Out + + + You have been successfully logged out. You will be redirected in 5 seconds, or you may click below to do so manually. + + + Redirect + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/LoggedOut.lang-pt-BR.resx b/ProjectLighthouse.Localization/LoggedOut.lang-pt-BR.resx new file mode 100644 index 000000000..89908c612 --- /dev/null +++ b/ProjectLighthouse.Localization/LoggedOut.lang-pt-BR.resx @@ -0,0 +1,29 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Desconectado + + + Você foi desconectado com sucesso. Você será redirecionado em 5 segundos, ou poderá clicar abaixo para fazê-lo manualmente. + + + Redirecionar + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/ModPanel.lang-en-GB.resx b/ProjectLighthouse.Localization/ModPanel.lang-en-GB.resx new file mode 100644 index 000000000..0471ed475 --- /dev/null +++ b/ProjectLighthouse.Localization/ModPanel.lang-en-GB.resx @@ -0,0 +1,32 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Moderation Panel + + + Welcome to the moderation panel, {0}! + + + Banned Users + + + Hidden Levels + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/ModPanel.lang-en-UD.resx b/ProjectLighthouse.Localization/ModPanel.lang-en-UD.resx new file mode 100644 index 000000000..0471ed475 --- /dev/null +++ b/ProjectLighthouse.Localization/ModPanel.lang-en-UD.resx @@ -0,0 +1,32 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Moderation Panel + + + Welcome to the moderation panel, {0}! + + + Banned Users + + + Hidden Levels + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/ModPanel.lang-fr-CA.resx b/ProjectLighthouse.Localization/ModPanel.lang-fr-CA.resx new file mode 100644 index 000000000..0471ed475 --- /dev/null +++ b/ProjectLighthouse.Localization/ModPanel.lang-fr-CA.resx @@ -0,0 +1,32 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Moderation Panel + + + Welcome to the moderation panel, {0}! + + + Banned Users + + + Hidden Levels + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/ModPanel.lang-ko-KR.resx b/ProjectLighthouse.Localization/ModPanel.lang-ko-KR.resx new file mode 100644 index 000000000..0471ed475 --- /dev/null +++ b/ProjectLighthouse.Localization/ModPanel.lang-ko-KR.resx @@ -0,0 +1,32 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Moderation Panel + + + Welcome to the moderation panel, {0}! + + + Banned Users + + + Hidden Levels + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/ModPanel.lang-nn-NO.resx b/ProjectLighthouse.Localization/ModPanel.lang-nn-NO.resx new file mode 100644 index 000000000..0471ed475 --- /dev/null +++ b/ProjectLighthouse.Localization/ModPanel.lang-nn-NO.resx @@ -0,0 +1,32 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Moderation Panel + + + Welcome to the moderation panel, {0}! + + + Banned Users + + + Hidden Levels + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/ModPanel.lang-pt-BR.resx b/ProjectLighthouse.Localization/ModPanel.lang-pt-BR.resx new file mode 100644 index 000000000..80c04cd0b --- /dev/null +++ b/ProjectLighthouse.Localization/ModPanel.lang-pt-BR.resx @@ -0,0 +1,32 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Painel de Moderação + + + Bem-vindo(a) ao painel de moderação, {0}! + + + Usuários Banidos + + + Níveis Ocultos + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Moderation.lang-en-GB.resx b/ProjectLighthouse.Localization/Moderation.lang-en-GB.resx new file mode 100644 index 000000000..89befa810 --- /dev/null +++ b/ProjectLighthouse.Localization/Moderation.lang-en-GB.resx @@ -0,0 +1,50 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Account Suspended + + + Your {0} account has been suspended due to code of conduct violations. + + + During this suspension, the following features will be limited until {0}: + + + Reason for suspension: "{0}" + + + Attempts to circumvent this suspension will result in an extended suspension period. + + + LittleBigPlanet™ Online multiplayer + + + manually dismissed + + + Profile visibility + + + Browsing levels, photos, and profiles + + + Account and profile management + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Moderation.lang-en-UD.resx b/ProjectLighthouse.Localization/Moderation.lang-en-UD.resx new file mode 100644 index 000000000..89befa810 --- /dev/null +++ b/ProjectLighthouse.Localization/Moderation.lang-en-UD.resx @@ -0,0 +1,50 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Account Suspended + + + Your {0} account has been suspended due to code of conduct violations. + + + During this suspension, the following features will be limited until {0}: + + + Reason for suspension: "{0}" + + + Attempts to circumvent this suspension will result in an extended suspension period. + + + LittleBigPlanet™ Online multiplayer + + + manually dismissed + + + Profile visibility + + + Browsing levels, photos, and profiles + + + Account and profile management + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Moderation.lang-fr-CA.resx b/ProjectLighthouse.Localization/Moderation.lang-fr-CA.resx new file mode 100644 index 000000000..89befa810 --- /dev/null +++ b/ProjectLighthouse.Localization/Moderation.lang-fr-CA.resx @@ -0,0 +1,50 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Account Suspended + + + Your {0} account has been suspended due to code of conduct violations. + + + During this suspension, the following features will be limited until {0}: + + + Reason for suspension: "{0}" + + + Attempts to circumvent this suspension will result in an extended suspension period. + + + LittleBigPlanet™ Online multiplayer + + + manually dismissed + + + Profile visibility + + + Browsing levels, photos, and profiles + + + Account and profile management + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Moderation.lang-ko-KR.resx b/ProjectLighthouse.Localization/Moderation.lang-ko-KR.resx new file mode 100644 index 000000000..89befa810 --- /dev/null +++ b/ProjectLighthouse.Localization/Moderation.lang-ko-KR.resx @@ -0,0 +1,50 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Account Suspended + + + Your {0} account has been suspended due to code of conduct violations. + + + During this suspension, the following features will be limited until {0}: + + + Reason for suspension: "{0}" + + + Attempts to circumvent this suspension will result in an extended suspension period. + + + LittleBigPlanet™ Online multiplayer + + + manually dismissed + + + Profile visibility + + + Browsing levels, photos, and profiles + + + Account and profile management + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Moderation.lang-nn-NO.resx b/ProjectLighthouse.Localization/Moderation.lang-nn-NO.resx new file mode 100644 index 000000000..89befa810 --- /dev/null +++ b/ProjectLighthouse.Localization/Moderation.lang-nn-NO.resx @@ -0,0 +1,50 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Account Suspended + + + Your {0} account has been suspended due to code of conduct violations. + + + During this suspension, the following features will be limited until {0}: + + + Reason for suspension: "{0}" + + + Attempts to circumvent this suspension will result in an extended suspension period. + + + LittleBigPlanet™ Online multiplayer + + + manually dismissed + + + Profile visibility + + + Browsing levels, photos, and profiles + + + Account and profile management + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Moderation.lang-pt-BR.resx b/ProjectLighthouse.Localization/Moderation.lang-pt-BR.resx new file mode 100644 index 000000000..8010e98c6 --- /dev/null +++ b/ProjectLighthouse.Localization/Moderation.lang-pt-BR.resx @@ -0,0 +1,50 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Conta suspensa + + + A sua conta {0} foi suspensa devido a violação do código de conduta. + + + Durante esta suspensão, os seguintes recursos serão limitados até {0}: + + + Motivo da suspensão: "{0}" + + + Tentativas de contornar esta suspensão resultarão num período de suspensão maior. + + + Multiplayer Online LittleBigPlanet™ + + + manualmente dispensados + + + Visibilidade do perfil + + + Navegando níveis, fotos e perfis + + + Gestão de conta e perfil + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Privacy.lang-en-GB.resx b/ProjectLighthouse.Localization/Privacy.lang-en-GB.resx new file mode 100644 index 000000000..6726d1db5 --- /dev/null +++ b/ProjectLighthouse.Localization/Privacy.lang-en-GB.resx @@ -0,0 +1,41 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Enable commenting on your profile. + + + Disable commenting on your profile. + + + You have not blocked any users. + + + You have blocked {0} user(s). + + + Share your {0} with everyone! + + + Only share your {0} with users who are signed into the website or playing in-game. + + + Only share your {0} with users who are playing in-game. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Privacy.lang-en-UD.resx b/ProjectLighthouse.Localization/Privacy.lang-en-UD.resx new file mode 100644 index 000000000..6726d1db5 --- /dev/null +++ b/ProjectLighthouse.Localization/Privacy.lang-en-UD.resx @@ -0,0 +1,41 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Enable commenting on your profile. + + + Disable commenting on your profile. + + + You have not blocked any users. + + + You have blocked {0} user(s). + + + Share your {0} with everyone! + + + Only share your {0} with users who are signed into the website or playing in-game. + + + Only share your {0} with users who are playing in-game. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Privacy.lang-fr-CA.resx b/ProjectLighthouse.Localization/Privacy.lang-fr-CA.resx new file mode 100644 index 000000000..6726d1db5 --- /dev/null +++ b/ProjectLighthouse.Localization/Privacy.lang-fr-CA.resx @@ -0,0 +1,41 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Enable commenting on your profile. + + + Disable commenting on your profile. + + + You have not blocked any users. + + + You have blocked {0} user(s). + + + Share your {0} with everyone! + + + Only share your {0} with users who are signed into the website or playing in-game. + + + Only share your {0} with users who are playing in-game. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Privacy.lang-ko-KR.resx b/ProjectLighthouse.Localization/Privacy.lang-ko-KR.resx new file mode 100644 index 000000000..6726d1db5 --- /dev/null +++ b/ProjectLighthouse.Localization/Privacy.lang-ko-KR.resx @@ -0,0 +1,41 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Enable commenting on your profile. + + + Disable commenting on your profile. + + + You have not blocked any users. + + + You have blocked {0} user(s). + + + Share your {0} with everyone! + + + Only share your {0} with users who are signed into the website or playing in-game. + + + Only share your {0} with users who are playing in-game. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Privacy.lang-nn-NO.resx b/ProjectLighthouse.Localization/Privacy.lang-nn-NO.resx new file mode 100644 index 000000000..6726d1db5 --- /dev/null +++ b/ProjectLighthouse.Localization/Privacy.lang-nn-NO.resx @@ -0,0 +1,41 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Enable commenting on your profile. + + + Disable commenting on your profile. + + + You have not blocked any users. + + + You have blocked {0} user(s). + + + Share your {0} with everyone! + + + Only share your {0} with users who are signed into the website or playing in-game. + + + Only share your {0} with users who are playing in-game. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Privacy.lang-pt-BR.resx b/ProjectLighthouse.Localization/Privacy.lang-pt-BR.resx new file mode 100644 index 000000000..6ff0e0f02 --- /dev/null +++ b/ProjectLighthouse.Localization/Privacy.lang-pt-BR.resx @@ -0,0 +1,41 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Habilitar comentários no seu perfil. + + + Desativar comentários no seu perfil. + + + Você não bloqueou nenhum usuário. + + + Você bloqueou {0} usuário(s). + + + Compartilhe sua {0} com todo mundo! + + + Compartilhe apenas a sua {0} com os usuários que estão logados no site ou jogando. + + + Compartilhe a {0} apenas com usuários que estão jogando. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Profile.lang-en-GB.resx b/ProjectLighthouse.Localization/Profile.lang-en-GB.resx new file mode 100644 index 000000000..e175fd623 --- /dev/null +++ b/ProjectLighthouse.Localization/Profile.lang-en-GB.resx @@ -0,0 +1,32 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Biography + + + {0} hasn't introduced themselves yet. + + + {0}'s user page + + + Profile Tag + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Profile.lang-en-UD.resx b/ProjectLighthouse.Localization/Profile.lang-en-UD.resx new file mode 100644 index 000000000..e175fd623 --- /dev/null +++ b/ProjectLighthouse.Localization/Profile.lang-en-UD.resx @@ -0,0 +1,32 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Biography + + + {0} hasn't introduced themselves yet. + + + {0}'s user page + + + Profile Tag + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Profile.lang-fr-CA.resx b/ProjectLighthouse.Localization/Profile.lang-fr-CA.resx new file mode 100644 index 000000000..e175fd623 --- /dev/null +++ b/ProjectLighthouse.Localization/Profile.lang-fr-CA.resx @@ -0,0 +1,32 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Biography + + + {0} hasn't introduced themselves yet. + + + {0}'s user page + + + Profile Tag + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Profile.lang-ko-KR.resx b/ProjectLighthouse.Localization/Profile.lang-ko-KR.resx new file mode 100644 index 000000000..e175fd623 --- /dev/null +++ b/ProjectLighthouse.Localization/Profile.lang-ko-KR.resx @@ -0,0 +1,32 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Biography + + + {0} hasn't introduced themselves yet. + + + {0}'s user page + + + Profile Tag + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Profile.lang-nn-NO.resx b/ProjectLighthouse.Localization/Profile.lang-nn-NO.resx new file mode 100644 index 000000000..e175fd623 --- /dev/null +++ b/ProjectLighthouse.Localization/Profile.lang-nn-NO.resx @@ -0,0 +1,32 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Biography + + + {0} hasn't introduced themselves yet. + + + {0}'s user page + + + Profile Tag + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Profile.lang-pt-BR.resx b/ProjectLighthouse.Localization/Profile.lang-pt-BR.resx new file mode 100644 index 000000000..167321c78 --- /dev/null +++ b/ProjectLighthouse.Localization/Profile.lang-pt-BR.resx @@ -0,0 +1,32 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Biografia + + + {0} ainda não se apresentou. + + + Página do usuário {0} + + + Tag do Perfil + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Register.lang-en-GB.resx b/ProjectLighthouse.Localization/Register.lang-en-GB.resx new file mode 100644 index 000000000..abd741d26 --- /dev/null +++ b/ProjectLighthouse.Localization/Register.lang-en-GB.resx @@ -0,0 +1,23 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Caution: Your username MUST match your PSN/RPCN username in order to be able to sign in from in-game. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Register.lang-en-UD.resx b/ProjectLighthouse.Localization/Register.lang-en-UD.resx new file mode 100644 index 000000000..abd741d26 --- /dev/null +++ b/ProjectLighthouse.Localization/Register.lang-en-UD.resx @@ -0,0 +1,23 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Caution: Your username MUST match your PSN/RPCN username in order to be able to sign in from in-game. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Register.lang-fr-CA.resx b/ProjectLighthouse.Localization/Register.lang-fr-CA.resx new file mode 100644 index 000000000..abd741d26 --- /dev/null +++ b/ProjectLighthouse.Localization/Register.lang-fr-CA.resx @@ -0,0 +1,23 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Caution: Your username MUST match your PSN/RPCN username in order to be able to sign in from in-game. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Register.lang-ko-KR.resx b/ProjectLighthouse.Localization/Register.lang-ko-KR.resx new file mode 100644 index 000000000..abd741d26 --- /dev/null +++ b/ProjectLighthouse.Localization/Register.lang-ko-KR.resx @@ -0,0 +1,23 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Caution: Your username MUST match your PSN/RPCN username in order to be able to sign in from in-game. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Register.lang-nn-NO.resx b/ProjectLighthouse.Localization/Register.lang-nn-NO.resx new file mode 100644 index 000000000..abd741d26 --- /dev/null +++ b/ProjectLighthouse.Localization/Register.lang-nn-NO.resx @@ -0,0 +1,23 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Caution: Your username MUST match your PSN/RPCN username in order to be able to sign in from in-game. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Register.lang-pt-BR.resx b/ProjectLighthouse.Localization/Register.lang-pt-BR.resx new file mode 100644 index 000000000..1cc29082b --- /dev/null +++ b/ProjectLighthouse.Localization/Register.lang-pt-BR.resx @@ -0,0 +1,23 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Atenção: Seu nome de usuário PRECISA combinar com o seu nome de usuário PSN/RPCN para poder entrar no jogo. + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Status.lang-en-GB.resx b/ProjectLighthouse.Localization/Status.lang-en-GB.resx new file mode 100644 index 000000000..214b28fbb --- /dev/null +++ b/ProjectLighthouse.Localization/Status.lang-en-GB.resx @@ -0,0 +1,29 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Currently playing {0} on {1} + + + Offline + + + Offline since {0} + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Status.lang-en-UD.resx b/ProjectLighthouse.Localization/Status.lang-en-UD.resx new file mode 100644 index 000000000..214b28fbb --- /dev/null +++ b/ProjectLighthouse.Localization/Status.lang-en-UD.resx @@ -0,0 +1,29 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Currently playing {0} on {1} + + + Offline + + + Offline since {0} + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Status.lang-fr-CA.resx b/ProjectLighthouse.Localization/Status.lang-fr-CA.resx new file mode 100644 index 000000000..214b28fbb --- /dev/null +++ b/ProjectLighthouse.Localization/Status.lang-fr-CA.resx @@ -0,0 +1,29 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Currently playing {0} on {1} + + + Offline + + + Offline since {0} + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Status.lang-ko-KR.resx b/ProjectLighthouse.Localization/Status.lang-ko-KR.resx new file mode 100644 index 000000000..214b28fbb --- /dev/null +++ b/ProjectLighthouse.Localization/Status.lang-ko-KR.resx @@ -0,0 +1,29 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Currently playing {0} on {1} + + + Offline + + + Offline since {0} + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Status.lang-nn-NO.resx b/ProjectLighthouse.Localization/Status.lang-nn-NO.resx new file mode 100644 index 000000000..214b28fbb --- /dev/null +++ b/ProjectLighthouse.Localization/Status.lang-nn-NO.resx @@ -0,0 +1,29 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Currently playing {0} on {1} + + + Offline + + + Offline since {0} + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/Status.lang-pt-BR.resx b/ProjectLighthouse.Localization/Status.lang-pt-BR.resx new file mode 100644 index 000000000..489608e7a --- /dev/null +++ b/ProjectLighthouse.Localization/Status.lang-pt-BR.resx @@ -0,0 +1,29 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Atualmente jogando {0} em {1} + + + Offline + + + Offline desde {0} + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/StringLists/TwoFactorStrings.cs b/ProjectLighthouse.Localization/StringLists/TwoFactorStrings.cs index 307ad97d5..799588003 100644 --- a/ProjectLighthouse.Localization/StringLists/TwoFactorStrings.cs +++ b/ProjectLighthouse.Localization/StringLists/TwoFactorStrings.cs @@ -24,6 +24,10 @@ public static class TwoFactorStrings public static readonly TranslatableString QrTitle = create("qr_title"); public static readonly TranslatableString QrDescription = create("qr_description"); + public static readonly TranslatableString QrAlternativeDescription = create("qr_alternative"); + public static readonly TranslatableString QrAlternativeCopy = create("qr_alternative_copy"); + public static readonly TranslatableString QrAlternativeCopySuccess = create("qr_alternative_copy_success"); + public static readonly TranslatableString QrAlternativeCopyFail = create("qr_alternative_copy_success"); private static TranslatableString create(string key) => new(TranslationAreas.TwoFactor, key); } \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-ar-SA.resx b/ProjectLighthouse.Localization/TwoFactor.lang-ar-SA.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-ar-SA.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-ar-SA.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-da-DK.resx b/ProjectLighthouse.Localization/TwoFactor.lang-da-DK.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-da-DK.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-da-DK.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-de-DE.resx b/ProjectLighthouse.Localization/TwoFactor.lang-de-DE.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-de-DE.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-de-DE.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-en-GB.resx b/ProjectLighthouse.Localization/TwoFactor.lang-en-GB.resx new file mode 100644 index 000000000..78f4869f8 --- /dev/null +++ b/ProjectLighthouse.Localization/TwoFactor.lang-en-GB.resx @@ -0,0 +1,80 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Enable Two-Factor + + + Disable Two-Factor + + + Once you have added this two factor code to your app of choice, enter a valid code below to finish the setup process + + + Here is your Two-Factor QR code + + + Backup codes + + + These codes will allow you to regain access to your account if you ever lose access to your 2FA device + + + Save these codes somewhere because otherwise you may be locked out of your account + + + I've saved these codes + + + Invalid 2FA Code + + + To disable two-factor authentication, enter a correct code from your authenticator app. + + + Two-Factor Authentication + + + You are required to setup 2FA because of your role within this instance. + + + Enter a valid 2FA code to continue + + + Alternatively, you can click {0}here{1} to enter one of your backup codes + + + Download backup codes + + + Invalid Backup Code + + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-en-PT.resx b/ProjectLighthouse.Localization/TwoFactor.lang-en-PT.resx index fba20be9d..6a8434f7c 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-en-PT.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-en-PT.resx @@ -65,4 +65,16 @@ Rancid backup key + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-en-UD.resx b/ProjectLighthouse.Localization/TwoFactor.lang-en-UD.resx new file mode 100644 index 000000000..78f4869f8 --- /dev/null +++ b/ProjectLighthouse.Localization/TwoFactor.lang-en-UD.resx @@ -0,0 +1,80 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Enable Two-Factor + + + Disable Two-Factor + + + Once you have added this two factor code to your app of choice, enter a valid code below to finish the setup process + + + Here is your Two-Factor QR code + + + Backup codes + + + These codes will allow you to regain access to your account if you ever lose access to your 2FA device + + + Save these codes somewhere because otherwise you may be locked out of your account + + + I've saved these codes + + + Invalid 2FA Code + + + To disable two-factor authentication, enter a correct code from your authenticator app. + + + Two-Factor Authentication + + + You are required to setup 2FA because of your role within this instance. + + + Enter a valid 2FA code to continue + + + Alternatively, you can click {0}here{1} to enter one of your backup codes + + + Download backup codes + + + Invalid Backup Code + + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-eo-UY.resx b/ProjectLighthouse.Localization/TwoFactor.lang-eo-UY.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-eo-UY.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-eo-UY.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-es-ES.resx b/ProjectLighthouse.Localization/TwoFactor.lang-es-ES.resx index 37476cf38..aaeffe1d0 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-es-ES.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-es-ES.resx @@ -65,4 +65,16 @@ Código de Respaldo Inválido + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-es-MX.resx b/ProjectLighthouse.Localization/TwoFactor.lang-es-MX.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-es-MX.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-es-MX.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-et-EE.resx b/ProjectLighthouse.Localization/TwoFactor.lang-et-EE.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-et-EE.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-et-EE.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-fi-FI.resx b/ProjectLighthouse.Localization/TwoFactor.lang-fi-FI.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-fi-FI.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-fi-FI.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-fil-PH.resx b/ProjectLighthouse.Localization/TwoFactor.lang-fil-PH.resx index 1a03f1004..47b29c73a 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-fil-PH.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-fil-PH.resx @@ -65,4 +65,16 @@ Hindi wastong Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-fr-CA.resx b/ProjectLighthouse.Localization/TwoFactor.lang-fr-CA.resx new file mode 100644 index 000000000..78f4869f8 --- /dev/null +++ b/ProjectLighthouse.Localization/TwoFactor.lang-fr-CA.resx @@ -0,0 +1,80 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Enable Two-Factor + + + Disable Two-Factor + + + Once you have added this two factor code to your app of choice, enter a valid code below to finish the setup process + + + Here is your Two-Factor QR code + + + Backup codes + + + These codes will allow you to regain access to your account if you ever lose access to your 2FA device + + + Save these codes somewhere because otherwise you may be locked out of your account + + + I've saved these codes + + + Invalid 2FA Code + + + To disable two-factor authentication, enter a correct code from your authenticator app. + + + Two-Factor Authentication + + + You are required to setup 2FA because of your role within this instance. + + + Enter a valid 2FA code to continue + + + Alternatively, you can click {0}here{1} to enter one of your backup codes + + + Download backup codes + + + Invalid Backup Code + + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-fr-FR.resx b/ProjectLighthouse.Localization/TwoFactor.lang-fr-FR.resx index d224bf5c4..0ca08a778 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-fr-FR.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-fr-FR.resx @@ -65,4 +65,16 @@ Code de secours non valide + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-ga-IE.resx b/ProjectLighthouse.Localization/TwoFactor.lang-ga-IE.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-ga-IE.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-ga-IE.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-he-IL.resx b/ProjectLighthouse.Localization/TwoFactor.lang-he-IL.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-he-IL.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-he-IL.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-hi-IN.resx b/ProjectLighthouse.Localization/TwoFactor.lang-hi-IN.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-hi-IN.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-hi-IN.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-id-ID.resx b/ProjectLighthouse.Localization/TwoFactor.lang-id-ID.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-id-ID.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-id-ID.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-it-IT.resx b/ProjectLighthouse.Localization/TwoFactor.lang-it-IT.resx index 4ebcb974b..8eabfef69 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-it-IT.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-it-IT.resx @@ -65,4 +65,16 @@ Codice di backup non valido + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-ja-JP.resx b/ProjectLighthouse.Localization/TwoFactor.lang-ja-JP.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-ja-JP.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-ja-JP.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-ko-KR.resx b/ProjectLighthouse.Localization/TwoFactor.lang-ko-KR.resx new file mode 100644 index 000000000..78f4869f8 --- /dev/null +++ b/ProjectLighthouse.Localization/TwoFactor.lang-ko-KR.resx @@ -0,0 +1,80 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Enable Two-Factor + + + Disable Two-Factor + + + Once you have added this two factor code to your app of choice, enter a valid code below to finish the setup process + + + Here is your Two-Factor QR code + + + Backup codes + + + These codes will allow you to regain access to your account if you ever lose access to your 2FA device + + + Save these codes somewhere because otherwise you may be locked out of your account + + + I've saved these codes + + + Invalid 2FA Code + + + To disable two-factor authentication, enter a correct code from your authenticator app. + + + Two-Factor Authentication + + + You are required to setup 2FA because of your role within this instance. + + + Enter a valid 2FA code to continue + + + Alternatively, you can click {0}here{1} to enter one of your backup codes + + + Download backup codes + + + Invalid Backup Code + + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-nl-NL.resx b/ProjectLighthouse.Localization/TwoFactor.lang-nl-NL.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-nl-NL.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-nl-NL.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-nn-NO.resx b/ProjectLighthouse.Localization/TwoFactor.lang-nn-NO.resx new file mode 100644 index 000000000..78f4869f8 --- /dev/null +++ b/ProjectLighthouse.Localization/TwoFactor.lang-nn-NO.resx @@ -0,0 +1,80 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Enable Two-Factor + + + Disable Two-Factor + + + Once you have added this two factor code to your app of choice, enter a valid code below to finish the setup process + + + Here is your Two-Factor QR code + + + Backup codes + + + These codes will allow you to regain access to your account if you ever lose access to your 2FA device + + + Save these codes somewhere because otherwise you may be locked out of your account + + + I've saved these codes + + + Invalid 2FA Code + + + To disable two-factor authentication, enter a correct code from your authenticator app. + + + Two-Factor Authentication + + + You are required to setup 2FA because of your role within this instance. + + + Enter a valid 2FA code to continue + + + Alternatively, you can click {0}here{1} to enter one of your backup codes + + + Download backup codes + + + Invalid Backup Code + + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-no-NO.resx b/ProjectLighthouse.Localization/TwoFactor.lang-no-NO.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-no-NO.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-no-NO.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-pl-PL.resx b/ProjectLighthouse.Localization/TwoFactor.lang-pl-PL.resx index c636d6402..c81a8285b 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-pl-PL.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-pl-PL.resx @@ -65,4 +65,16 @@ Nieprawidłowy Kod Zapasowy + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-pt-BR.resx b/ProjectLighthouse.Localization/TwoFactor.lang-pt-BR.resx new file mode 100644 index 000000000..a29f8e130 --- /dev/null +++ b/ProjectLighthouse.Localization/TwoFactor.lang-pt-BR.resx @@ -0,0 +1,80 @@ + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Ativar autenticação de dois fatores + + + Desativar autenticação de dois fatores + + + Depois de adicionar este código de dois fatores em seu aplicativo favorito, insira um código válido abaixo para concluir o processo de configuração + + + Aqui está seu código QR de dois fatores + + + Códigos de backup + + + Estes códigos permitirão que você recupere o acesso à sua conta caso perca o acesso ao seu dispositivo 2FA + + + Salve estes códigos em algum lugar, caso contrário, você poderá ser bloqueado de sua conta + + + Eu salvei esses códigos + + + Código 2FA inválido + + + Para desativar a autenticação de dois fatores, insira um código correto do seu aplicativo de autenticação. + + + Autenticação de dois fatores + + + Você é obrigado a configurar a autenticação de dois fatores devido o seu papel nesta instância. + + + Digite um código de verificação em duas etapas para continuar + + + Como alternativa, você pode clicar {0}aqui{1} para inserir um dos seus códigos de backup + + + Baixar códigos de backup + + + Código de Backup Inválido + + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-pt-PT.resx b/ProjectLighthouse.Localization/TwoFactor.lang-pt-PT.resx index 5a92a0c03..f4bbf240c 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-pt-PT.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-pt-PT.resx @@ -65,4 +65,16 @@ Código de Backup Inválido + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-ru-RU.resx b/ProjectLighthouse.Localization/TwoFactor.lang-ru-RU.resx index dc37e87f6..64ffd8b17 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-ru-RU.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-ru-RU.resx @@ -65,4 +65,16 @@ Неверный Резервный Код + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-sv-SE.resx b/ProjectLighthouse.Localization/TwoFactor.lang-sv-SE.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-sv-SE.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-sv-SE.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-th-TH.resx b/ProjectLighthouse.Localization/TwoFactor.lang-th-TH.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-th-TH.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-th-TH.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-tr-TR.resx b/ProjectLighthouse.Localization/TwoFactor.lang-tr-TR.resx index 8c9e02d65..46d13b1a4 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-tr-TR.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-tr-TR.resx @@ -65,4 +65,16 @@ Geçersiz Yedek Kodu + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-uk-UA.resx b/ProjectLighthouse.Localization/TwoFactor.lang-uk-UA.resx index 3137d4f83..e9d0a7dbf 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-uk-UA.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-uk-UA.resx @@ -65,4 +65,16 @@ Недійсний резервний код + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-zh-CN.resx b/ProjectLighthouse.Localization/TwoFactor.lang-zh-CN.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-zh-CN.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-zh-CN.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.lang-zh-TW.resx b/ProjectLighthouse.Localization/TwoFactor.lang-zh-TW.resx index 139c6e6da..78f4869f8 100644 --- a/ProjectLighthouse.Localization/TwoFactor.lang-zh-TW.resx +++ b/ProjectLighthouse.Localization/TwoFactor.lang-zh-TW.resx @@ -65,4 +65,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TwoFactor.resx b/ProjectLighthouse.Localization/TwoFactor.resx index 21d78ec4e..45845e8f5 100644 --- a/ProjectLighthouse.Localization/TwoFactor.resx +++ b/ProjectLighthouse.Localization/TwoFactor.resx @@ -66,4 +66,16 @@ Invalid Backup Code + + Can't use the QR code? You can use this secret key instead: + + + Copy secret code + + + Copied to clipboard + + + Failed to copy to clipboard + \ No newline at end of file diff --git a/ProjectLighthouse.Servers.API/Controllers/StatisticsEndpoints.cs b/ProjectLighthouse.Servers.API/Controllers/StatisticsEndpoints.cs index 736e47669..a906793b2 100644 --- a/ProjectLighthouse.Servers.API/Controllers/StatisticsEndpoints.cs +++ b/ProjectLighthouse.Servers.API/Controllers/StatisticsEndpoints.cs @@ -5,6 +5,7 @@ using LBPUnion.ProjectLighthouse.Servers.API.Responses; using LBPUnion.ProjectLighthouse.Types.Users; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.API.Controllers; @@ -49,24 +50,33 @@ public async Task GetStatistics() GameVersion.LittleBigPlanetPSP, }; + private static readonly List platforms = new() + { + Platform.PS3, + Platform.RPCS3, + Platform.Vita, + Platform.PSP, + }; + /// /// Get player counts for each individual title /// - /// An instance of PlayerCountResponse + /// An instance of PlayerCountByGameResponse [HttpGet("playerCount")] - [ProducesResponseType(typeof(PlayerCountResponse), StatusCodes.Status200OK)] + [HttpGet("playerCount/game")] + [ProducesResponseType(typeof(PlayerCountByGameResponse), StatusCodes.Status200OK)] public async Task GetPlayerCounts() { List gameList = new(); foreach (GameVersion version in gameVersions) { - gameList.Add(new PlayerCountObject + gameList.Add(new PlayerCountByGameObject { Game = version.ToString(), - PlayerCount = await StatisticsHelper.RecentMatchesForGame(this.database, version), + PlayerCount = await StatisticsHelper.RecentMatches(this.database, l => l.GameVersion == version), }); } - PlayerCountResponse response = new() + PlayerCountByGameResponse response = new() { TotalPlayerCount = await StatisticsHelper.RecentMatches(this.database), Games = gameList, @@ -74,4 +84,56 @@ public async Task GetPlayerCounts() return this.Ok(response); } + + /// + /// Get player counts for each individual platform + /// + /// An instance of PlayerCountByPlatformResponse + [HttpGet("playerCount/platform")] + [ProducesResponseType(typeof(PlayerCountByPlatformResponse), StatusCodes.Status200OK)] + public async Task GetPlayerCountsByPlatform() + { + List platformList = new(); + foreach (Platform platform in platforms) + { + platformList.Add(new PlayerCountByPlatformObject + { + Platform = platform.ToString(), + PlayerCount = await StatisticsHelper.RecentMatches(this.database, l => l.Platform == platform), + }); + } + + PlayerCountByPlatformResponse response = new() + { + TotalPlayerCount = await StatisticsHelper.RecentMatches(this.database), + Platforms = platformList, + }; + + return this.Ok(response); + } + + /// + /// Gets a list of online players + /// + /// An instance of PlayerListResponse + [HttpGet("players")] + [ProducesResponseType(typeof(PlayerListResponse), StatusCodes.Status200OK)] + public async Task GetPlayerList() + { + List players = await this.database.LastContacts.Where(l => TimeHelper.Timestamp - l.Timestamp < 300) + .Select(l => new PlayerListObject + { + Username = l.User!.Username, + Game = l.GameVersion.ToString(), + Platform = l.Platform.ToString(), + }) + .ToListAsync(); + + PlayerListResponse response = new() + { + Players = players, + }; + + return this.Ok(response); + } } \ No newline at end of file diff --git a/ProjectLighthouse.Servers.API/Responses/PlayerCountResponse.cs b/ProjectLighthouse.Servers.API/Responses/PlayerCountResponse.cs index 27e82e306..619a848a9 100644 --- a/ProjectLighthouse.Servers.API/Responses/PlayerCountResponse.cs +++ b/ProjectLighthouse.Servers.API/Responses/PlayerCountResponse.cs @@ -1,13 +1,37 @@ -namespace LBPUnion.ProjectLighthouse.Servers.API.Responses; +using System.Text.Json.Serialization; +namespace LBPUnion.ProjectLighthouse.Servers.API.Responses; + +[JsonDerivedType(typeof(PlayerCountByGameObject))] +[JsonDerivedType(typeof(PlayerCountByPlatformObject))] public class PlayerCountObject { - public string Game { get; set; } = ""; public int PlayerCount { get; set; } } +public class PlayerCountByGameObject : PlayerCountObject +{ + public string Game { get; set; } = ""; +} + +public class PlayerCountByPlatformObject : PlayerCountObject +{ + public string Platform { get; set; } = ""; +} + +[JsonDerivedType(typeof(PlayerCountByGameResponse))] +[JsonDerivedType(typeof(PlayerCountByPlatformResponse))] public class PlayerCountResponse { public int TotalPlayerCount { get; set; } +} + +public class PlayerCountByGameResponse : PlayerCountResponse +{ public List Games { get; set; } = new(); +} + +public class PlayerCountByPlatformResponse : PlayerCountResponse +{ + public List Platforms { get; set; } = new(); } \ No newline at end of file diff --git a/ProjectLighthouse.Servers.API/Responses/PlayerListResponse.cs b/ProjectLighthouse.Servers.API/Responses/PlayerListResponse.cs new file mode 100644 index 000000000..55470d4a4 --- /dev/null +++ b/ProjectLighthouse.Servers.API/Responses/PlayerListResponse.cs @@ -0,0 +1,13 @@ +namespace LBPUnion.ProjectLighthouse.Servers.API.Responses; + +public class PlayerListResponse +{ + public required List Players { get; set; } +} + +public class PlayerListObject +{ + public required string Username { get; set; } + public required string Game { get; set; } + public required string Platform { get; set; } +} diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/SlotsController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/SlotsController.cs index ff35092bc..a9580e387 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/SlotsController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/SlotsController.cs @@ -263,6 +263,7 @@ public async Task LuckyDipSlots([FromQuery] int seed) PaginationData pageData = this.Request.GetPaginationData(); SlotQueryBuilder queryBuilder = this.FilterFromRequest(token); + queryBuilder.AddFilter(new LockedSlotFilter()); pageData.TotalElements = await StatisticsHelper.SlotCount(this.database, queryBuilder); diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/StatisticsController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/StatisticsController.cs index f6417ab35..78e70e612 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/StatisticsController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/StatisticsController.cs @@ -27,7 +27,8 @@ public StatisticsController(DatabaseContext database) public IActionResult PlayersInPodCount() => this.Ok(StatisticsHelper.RoomCountForPlatform(this.GetToken().Platform).ToString()); [HttpGet("totalPlayerCount")] - public async Task TotalPlayerCount() => this.Ok((await StatisticsHelper.RecentMatchesForGame(this.database, this.GetToken().GameVersion)).ToString()); + public async Task TotalPlayerCount() => + this.Ok((await StatisticsHelper.RecentMatches(this.database, l => l.GameVersion == this.GetToken().GameVersion)).ToString()); [HttpGet("planetStats")] [Produces("text/xml")] diff --git a/ProjectLighthouse.Servers.GameServer/Startup/TokenAuthHandler.cs b/ProjectLighthouse.Servers.GameServer/Startup/TokenAuthHandler.cs index 02760bce4..cc97b80ff 100644 --- a/ProjectLighthouse.Servers.GameServer/Startup/TokenAuthHandler.cs +++ b/ProjectLighthouse.Servers.GameServer/Startup/TokenAuthHandler.cs @@ -1,6 +1,8 @@ -using System.Security.Claims; +using System.Net; +using System.Security.Claims; using System.Text.Encodings.Web; using LBPUnion.ProjectLighthouse.Database; +using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Types.Entities.Token; using Microsoft.AspNetCore.Authentication; using Microsoft.Extensions.Logging.Abstractions; @@ -36,10 +38,17 @@ protected override async Task HandleAuthenticateAsync() GameTokenEntity? gameToken = await this.database.GameTokenFromRequest(this.Request); if (gameToken == null) return AuthenticateResult.Fail("No game token"); + IPAddress? remoteIpAddress = this.Context.Connection.RemoteIpAddress; + if (remoteIpAddress == null) return AuthenticateResult.Fail("Failed to determine IP address"); + + if (CryptoHelper.Sha256Hash(remoteIpAddress.ToString()) != gameToken.LocationHash) + return AuthenticateResult.Fail("IP address change detected"); + this.Context.Items["Token"] = gameToken; - Claim[] claims = { - new("userId", gameToken.UserId.ToString()), - }; + Claim[] claims = + [ + new Claim("userId", gameToken.UserId.ToString()), + ]; ClaimsIdentity identity = new(claims, this.Scheme.Name); ClaimsPrincipal principal = new(identity); AuthenticationTicket ticket = new(principal, this.Scheme.Name); diff --git a/ProjectLighthouse.Servers.GameServer/Types/Categories/LuckyDipCategory.cs b/ProjectLighthouse.Servers.GameServer/Types/Categories/LuckyDipCategory.cs index 93bea8805..6d8528b4d 100644 --- a/ProjectLighthouse.Servers.GameServer/Types/Categories/LuckyDipCategory.cs +++ b/ProjectLighthouse.Servers.GameServer/Types/Categories/LuckyDipCategory.cs @@ -2,6 +2,7 @@ using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Filter; +using LBPUnion.ProjectLighthouse.Filter.Filters; using LBPUnion.ProjectLighthouse.Filter.Sorts; using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Token; @@ -16,7 +17,10 @@ public class LuckyDipCategory : SlotCategory public override string Endpoint { get; set; } = "lucky_dip"; public override string Tag => "lucky_dip"; - public override IQueryable GetItems(DatabaseContext database, GameTokenEntity token, SlotQueryBuilder queryBuilder) => - database.Slots.Where(queryBuilder.Build()) + public override IQueryable GetItems(DatabaseContext database, GameTokenEntity token, SlotQueryBuilder queryBuilder) + { + queryBuilder.AddFilter(new LockedSlotFilter()); + return database.Slots.Where(queryBuilder.Build()) .ApplyOrdering(new SlotSortBuilder().AddSort(new RandomFirstUploadedSort())); + } } \ No newline at end of file diff --git a/ProjectLighthouse.Servers.Website/Controllers/Admin/AdminUserController.cs b/ProjectLighthouse.Servers.Website/Controllers/Admin/AdminUserController.cs index 84b024ff5..b4b0ec983 100644 --- a/ProjectLighthouse.Servers.Website/Controllers/Admin/AdminUserController.cs +++ b/ProjectLighthouse.Servers.Website/Controllers/Admin/AdminUserController.cs @@ -1,8 +1,11 @@ #nullable enable using LBPUnion.ProjectLighthouse.Database; +using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Files; using LBPUnion.ProjectLighthouse.Logging; +using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Profile; +using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Moderation.Cases; using LBPUnion.ProjectLighthouse.Types.Users; @@ -26,7 +29,8 @@ public AdminUserController(DatabaseContext database) /// Resets the user's earth decorations to a blank state. Useful for users who abuse audio for example. /// [HttpGet("wipePlanets")] - public async Task WipePlanets([FromRoute] int id) { + public async Task WipePlanets([FromRoute] int id) + { UserEntity? user = this.database.UserFromWebRequest(this.Request); if (user == null || !user.IsModerator) return this.NotFound(); @@ -90,6 +94,100 @@ await this.database.SendNotification(targetedUser.UserId, return this.Redirect($"/user/{targetedUser.UserId}"); } + + /// + /// Deletes every comment by the user. Useful in case of mass spam + /// + [HttpGet("wipeComments")] + public async Task WipeComments([FromRoute] int id) + { + UserEntity? user = this.database.UserFromWebRequest(this.Request); + if (user == null || !user.IsModerator) return this.NotFound(); + + UserEntity? targetedUser = await this.database.Users.FirstOrDefaultAsync(u => u.UserId == id); + if (targetedUser == null) return this.NotFound(); + + // Find every comment by the user, then set the deletion info on them + await this.database.Comments.Where(c => c.PosterUserId == targetedUser.UserId) + .ExecuteUpdateAsync(s => + s.SetProperty(c => c.Deleted, true) + .SetProperty(c => c.DeletedBy, user.Username) + .SetProperty(c => c.DeletedType, "moderator")); + Logger.Success($"Deleted comments for {targetedUser.Username} (id:{targetedUser.UserId})", LogArea.Admin); + + await this.database.SendNotification(targetedUser.UserId, + "Your comments have been deleted by a moderator."); + + return this.Redirect($"/user/{targetedUser.UserId}"); + } + + /// + /// Deletes every score from the user. Useful in the case where a user cheated a ton of scores + /// + [HttpGet("wipeScores")] + public async Task WipeScores([FromRoute] int id) + { + UserEntity? user = this.database.UserFromWebRequest(this.Request); + if (user == null || !user.IsModerator) return this.NotFound(); + + UserEntity? targetedUser = await this.database.Users.FirstOrDefaultAsync(u => u.UserId == id); + if (targetedUser == null) return this.NotFound(); + + // Find and delete every score uploaded by the target user + await this.database.Scores.Where(c => c.UserId == targetedUser.UserId).ExecuteDeleteAsync(); + Logger.Success($"Deleted scores for {targetedUser.Username} (id:{targetedUser.UserId})", LogArea.Admin); + + await this.database.SendNotification(targetedUser.UserId, "Your scores have been deleted by a moderator."); + + return this.Redirect($"/user/{targetedUser.UserId}"); + } + + /// + /// Deletes the user's current avatar. Can prevent crashes in-game, or just be used to remove images that break guidelines. + /// + [HttpGet("wipeAvatar")] + public async Task WipeAvatar([FromRoute] int id) + { + UserEntity? user = this.database.UserFromWebRequest(this.Request); + if (user == null || !user.IsModerator) return this.NotFound(); + + UserEntity? targetedUser = await this.database.Users.FirstOrDefaultAsync(u => u.UserId == id); + if (targetedUser == null) return this.NotFound(); + + targetedUser.IconHash = ""; + + await this.database.SaveChangesAsync(); + Logger.Success($"Reset profile picture for {targetedUser.Username} (id:{targetedUser.UserId})", LogArea.Admin); + + await this.database.SendNotification(targetedUser.UserId, "Your profile picture has been reset by a moderator."); + + return this.Redirect($"/user/{targetedUser.UserId}"); + } + + /// + /// Forces the email verification of a user. + /// + [HttpGet("forceVerifyEmail")] + public async Task ForceVerifyEmail([FromRoute] int id) + { + UserEntity? user = this.database.UserFromWebRequest(this.Request); + if (user == null || !user.IsModerator) return this.NotFound(); + + UserEntity? targetedUser = await this.database.Users.FirstOrDefaultAsync(u => u.UserId == id); + if (targetedUser == null) return this.NotFound(); + if (targetedUser.EmailAddress == null || targetedUser.EmailAddressVerified) return this.NotFound(); + + List tokens = await this.database.EmailVerificationTokens + .Where(t => t.UserId == targetedUser.UserId) + .ToListAsync(); + this.database.EmailVerificationTokens.RemoveRange(tokens); + + targetedUser.EmailAddressVerified = true; + + await this.database.SaveChangesAsync(); + + return this.Redirect($"/user/{targetedUser.UserId}"); + } [HttpPost("/admin/user/{id:int}/setPermissionLevel")] public async Task SetUserPermissionLevel([FromRoute] int id, [FromForm] PermissionLevel role) diff --git a/ProjectLighthouse.Servers.Website/Pages/Debug/VersionInfoPage.cshtml b/ProjectLighthouse.Servers.Website/Pages/Debug/VersionInfoPage.cshtml index d8eff2a43..f5bec53d6 100644 --- a/ProjectLighthouse.Servers.Website/Pages/Debug/VersionInfoPage.cshtml +++ b/ProjectLighthouse.Servers.Website/Pages/Debug/VersionInfoPage.cshtml @@ -14,5 +14,4 @@

Branch: @VersionHelper.Branch

Build: @VersionHelper.Build

CommitHash: @VersionHelper.CommitHash

-

IsDirty: @VersionHelper.IsDirty

RepositoryUrl: @VersionHelper.RepositoryUrl

\ No newline at end of file diff --git a/ProjectLighthouse.Servers.Website/Pages/Layouts/BaseLayout.cshtml b/ProjectLighthouse.Servers.Website/Pages/Layouts/BaseLayout.cshtml index 14f147822..725b59455 100644 --- a/ProjectLighthouse.Servers.Website/Pages/Layouts/BaseLayout.cshtml +++ b/ProjectLighthouse.Servers.Website/Pages/Layouts/BaseLayout.cshtml @@ -158,26 +158,6 @@ - @if (!ServerStatics.IsDebug() && VersionHelper.IsDirty) - { -
-
- - @Model.Translate(BaseLayoutStrings.LicenseWarnTitle) -

- @Html.Raw(Model.Translate(BaseLayoutStrings.LicenseWarn1, - "GNU Affero General Public License v3.0")) -

-

- @Html.Raw(Model.Translate(BaseLayoutStrings.LicenseWarn2, - "git status", "", "")) -

-

- @Html.Raw(Model.Translate(BaseLayoutStrings.LicenseWarn3)) -

-
-
- } @if (ServerConfiguration.Instance.UserGeneratedContentLimits.ReadOnlyMode) {
@@ -234,10 +214,6 @@ Cannot Detect Source Code } - @if (VersionHelper.IsDirty) - { -

@Model.Translate(BaseLayoutStrings.GeneratedModified)

- }
@if (ServerStatics.IsDebug()) diff --git a/ProjectLighthouse.Servers.Website/Pages/TwoFactor/SetupTwoFactorPage.cshtml b/ProjectLighthouse.Servers.Website/Pages/TwoFactor/SetupTwoFactorPage.cshtml index 736e258e7..6bda7213f 100644 --- a/ProjectLighthouse.Servers.Website/Pages/TwoFactor/SetupTwoFactorPage.cshtml +++ b/ProjectLighthouse.Servers.Website/Pages/TwoFactor/SetupTwoFactorPage.cshtml @@ -18,6 +18,9 @@

@Model.Translate(TwoFactorStrings.QrTitle)

2 Factor QR Code

@Model.Translate(TwoFactorStrings.QrDescription)

+

@Model.Translate(TwoFactorStrings.QrAlternativeDescription)

+ @Model.User?.TwoFactorSecret + @await Html.PartialAsync("Partials/TwoFactorPartial", new ViewDataDictionary(ViewData) { { @@ -31,6 +34,28 @@ }, }) + } else { diff --git a/ProjectLighthouse.Servers.Website/Pages/UserPage.cshtml b/ProjectLighthouse.Servers.Website/Pages/UserPage.cshtml index d675e8c1f..84d9e0bab 100644 --- a/ProjectLighthouse.Servers.Website/Pages/UserPage.cshtml +++ b/ProjectLighthouse.Servers.Website/Pages/UserPage.cshtml @@ -324,6 +324,23 @@ else Wipe Earth Decorations + + + + Wipe User's Comments + + + + + Wipe User's Scores + + + + + Remove User Avatar + @if (!Model.CommentsDisabledByModerator) { @@ -333,6 +350,14 @@ else } + @if (Model.ProfileUser.EmailAddress != null && !Model.ProfileUser.EmailAddressVerified) + { + + + Forcibly Verify Email + + } + @if (Model.User.IsAdmin) {
diff --git a/ProjectLighthouse.Servers.Website/ProjectLighthouse.Servers.Website.csproj b/ProjectLighthouse.Servers.Website/ProjectLighthouse.Servers.Website.csproj index 9749d85cd..7768663f5 100644 --- a/ProjectLighthouse.Servers.Website/ProjectLighthouse.Servers.Website.csproj +++ b/ProjectLighthouse.Servers.Website/ProjectLighthouse.Servers.Website.csproj @@ -11,6 +11,6 @@ - + diff --git a/ProjectLighthouse.Tests.GameApiTests/Integration/DatabaseTests.cs b/ProjectLighthouse.Tests.GameApiTests/Integration/DatabaseTests.cs index cc8ddc278..fb87b6186 100644 --- a/ProjectLighthouse.Tests.GameApiTests/Integration/DatabaseTests.cs +++ b/ProjectLighthouse.Tests.GameApiTests/Integration/DatabaseTests.cs @@ -20,8 +20,8 @@ public async Task CanCreateUserTwice() int rand = new Random().Next(); - UserEntity userA = await database.CreateUser("unitTestUser" + rand, CryptoHelper.GenerateAuthToken()); - UserEntity userB = await database.CreateUser("unitTestUser" + rand, CryptoHelper.GenerateAuthToken()); + UserEntity userA = await database.CreateUser("unitTestUser" + rand, CryptoHelper.BCryptHash(CryptoHelper.GenerateAuthToken())); + UserEntity userB = await database.CreateUser("unitTestUser" + rand, CryptoHelper.BCryptHash(CryptoHelper.GenerateAuthToken())); Assert.NotNull(userA); Assert.NotNull(userB); diff --git a/ProjectLighthouse.Tests.GameApiTests/ProjectLighthouse.Tests.GameApiTests.csproj b/ProjectLighthouse.Tests.GameApiTests/ProjectLighthouse.Tests.GameApiTests.csproj index db0ead102..ef7209198 100644 --- a/ProjectLighthouse.Tests.GameApiTests/ProjectLighthouse.Tests.GameApiTests.csproj +++ b/ProjectLighthouse.Tests.GameApiTests/ProjectLighthouse.Tests.GameApiTests.csproj @@ -9,14 +9,14 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/ProjectLighthouse.Tests.GameApiTests/Unit/Controllers/ReviewControllerTests.cs b/ProjectLighthouse.Tests.GameApiTests/Unit/Controllers/ReviewControllerTests.cs index 7e96e0165..36d44a111 100644 --- a/ProjectLighthouse.Tests.GameApiTests/Unit/Controllers/ReviewControllerTests.cs +++ b/ProjectLighthouse.Tests.GameApiTests/Unit/Controllers/ReviewControllerTests.cs @@ -13,6 +13,7 @@ namespace ProjectLighthouse.Tests.GameApiTests.Unit.Controllers; +[Trait("Category", "Unit")] public class ReviewControllerTests { private static async Task InsertTestData(DatabaseContext database) diff --git a/ProjectLighthouse.Tests.WebsiteTests/ProjectLighthouse.Tests.WebsiteTests.csproj b/ProjectLighthouse.Tests.WebsiteTests/ProjectLighthouse.Tests.WebsiteTests.csproj index 0686a1d38..c5b336f5d 100644 --- a/ProjectLighthouse.Tests.WebsiteTests/ProjectLighthouse.Tests.WebsiteTests.csproj +++ b/ProjectLighthouse.Tests.WebsiteTests/ProjectLighthouse.Tests.WebsiteTests.csproj @@ -9,16 +9,16 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/ProjectLighthouse.Tests/ProjectLighthouse.Tests.csproj b/ProjectLighthouse.Tests/ProjectLighthouse.Tests.csproj index 4eb6d411e..4c4199a93 100644 --- a/ProjectLighthouse.Tests/ProjectLighthouse.Tests.csproj +++ b/ProjectLighthouse.Tests/ProjectLighthouse.Tests.csproj @@ -14,14 +14,14 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -30,7 +30,7 @@ all - + diff --git a/ProjectLighthouse.sln.DotSettings b/ProjectLighthouse.sln.DotSettings index d3818928a..174ff7a3c 100644 --- a/ProjectLighthouse.sln.DotSettings +++ b/ProjectLighthouse.sln.DotSettings @@ -1,4 +1,6 @@ - + True False False @@ -96,10 +98,14 @@ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb"><ExtraRule Prefix="" Suffix="" Style="aaBb" /></Policy> <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy><Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static readonly fields (private)"><ElementKinds><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /></Policy> + <Policy><Descriptor Staticness="Any" AccessRightKinds="Private" Description="Constant fields (private)"><ElementKinds><Kind Name="CONSTANT_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /></Policy> + <Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Methods"><ElementKinds><Kind Name="METHOD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb"><ExtraRule Prefix="" Suffix="" Style="aaBb" /></Policy></Policy> True True True True + True True True True diff --git a/ProjectLighthouse/Database/DatabaseContext.Utils.cs b/ProjectLighthouse/Database/DatabaseContext.Utils.cs index 3ef20d06a..a4a22e968 100644 --- a/ProjectLighthouse/Database/DatabaseContext.Utils.cs +++ b/ProjectLighthouse/Database/DatabaseContext.Utils.cs @@ -70,6 +70,7 @@ public async Task UserIdFromUsername(string? username) GameVersion = npTicket.GameVersion, Platform = npTicket.Platform, TicketHash = npTicket.TicketHash, + LocationHash = CryptoHelper.Sha256Hash(userLocation), // we can get away with a low expiry here since LBP will just get a new token everytime it gets 403'd ExpiresAt = DateTime.UtcNow + TimeSpan.FromHours(1), }; diff --git a/ProjectLighthouse/Filter/Filters/LockedSlotFilter.cs b/ProjectLighthouse/Filter/Filters/LockedSlotFilter.cs new file mode 100644 index 000000000..185b45658 --- /dev/null +++ b/ProjectLighthouse/Filter/Filters/LockedSlotFilter.cs @@ -0,0 +1,11 @@ +using System; +using System.Linq.Expressions; +using LBPUnion.ProjectLighthouse.Types.Entities.Level; +using LBPUnion.ProjectLighthouse.Types.Filter; + +namespace LBPUnion.ProjectLighthouse.Filter.Filters; + +public class LockedSlotFilter : ISlotFilter +{ + public Expression> GetPredicate() => s => !s.InitiallyLocked; +} \ No newline at end of file diff --git a/ProjectLighthouse/Helpers/CryptoHelper.cs b/ProjectLighthouse/Helpers/CryptoHelper.cs index cfa896a21..dc719bf4a 100644 --- a/ProjectLighthouse/Helpers/CryptoHelper.cs +++ b/ProjectLighthouse/Helpers/CryptoHelper.cs @@ -9,9 +9,6 @@ namespace LBPUnion.ProjectLighthouse.Helpers; public static class CryptoHelper { - - private static readonly SHA256 sha256 = SHA256.Create(); - /// /// Generates a random SHA256 and BCrypted token /// @@ -19,10 +16,15 @@ public static class CryptoHelper public static string GenerateAuthToken() { byte[] bytes = (byte[])GenerateRandomBytes(256); - return BCryptHash(Sha256Hash(bytes)); } + public static string GenerateUrlToken() + { + byte[] bytes = (byte[])GenerateRandomBytes(256); + return Convert.ToBase64String(Encoding.UTF8.GetBytes(BCryptHash(Sha256Hash(bytes)))); + } + public static string ComputeDigest(string path, string authCookie, byte[] body, string digestKey, bool excludeBody = false) { @@ -156,7 +158,7 @@ private static bool ValuesEqual(string a, string b) public static string Sha256Hash(string str) => Sha256Hash(Encoding.UTF8.GetBytes(str)); - public static string Sha256Hash(byte[] bytes) => BitConverter.ToString(sha256.ComputeHash(bytes)).Replace("-", "").ToLower(); + public static string Sha256Hash(byte[] bytes) => BitConverter.ToString(SHA256.HashData(bytes)).Replace("-", "").ToLower(); public static string Sha1Hash(byte[] bytes) => BitConverter.ToString(SHA1.HashData(bytes)).Replace("-", ""); diff --git a/ProjectLighthouse/Helpers/EmailHelper.cs b/ProjectLighthouse/Helpers/EmailHelper.cs index 3750f41c4..52c69f9da 100644 --- a/ProjectLighthouse/Helpers/EmailHelper.cs +++ b/ProjectLighthouse/Helpers/EmailHelper.cs @@ -52,7 +52,7 @@ public static async Task SendPasswordResetEmail(DatabaseContext database, IMailS { Created = DateTime.UtcNow, UserId = user.UserId, - ResetToken = CryptoHelper.GenerateAuthToken(), + ResetToken = CryptoHelper.GenerateUrlToken(), }; database.PasswordResetTokens.Add(token); @@ -92,7 +92,7 @@ public static async Task SendVerificationEmail(DatabaseContext database, I { UserId = user.UserId, User = user, - EmailToken = CryptoHelper.GenerateAuthToken(), + EmailToken = CryptoHelper.GenerateUrlToken(), ExpiresAt = DateTime.UtcNow.AddHours(6), }; diff --git a/ProjectLighthouse/Helpers/StatisticsHelper.cs b/ProjectLighthouse/Helpers/StatisticsHelper.cs index 0f0070ab1..525ae7771 100644 --- a/ProjectLighthouse/Helpers/StatisticsHelper.cs +++ b/ProjectLighthouse/Helpers/StatisticsHelper.cs @@ -1,7 +1,10 @@ +using System; using System.Linq; +using System.Linq.Expressions; using System.Threading.Tasks; using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Filter; +using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Users; using Microsoft.EntityFrameworkCore; @@ -11,8 +14,8 @@ public static class StatisticsHelper { public static async Task RecentMatches(DatabaseContext database) => await database.LastContacts.Where(l => TimeHelper.Timestamp - l.Timestamp < 300).CountAsync(); - public static async Task RecentMatchesForGame(DatabaseContext database, GameVersion gameVersion) - => await database.LastContacts.Where(l => TimeHelper.Timestamp - l.Timestamp < 300 && l.GameVersion == gameVersion).CountAsync(); + public static async Task RecentMatches(DatabaseContext database, Expression> contactFilter) => + await database.LastContacts.Where(l => TimeHelper.Timestamp - l.Timestamp < 300).Where(contactFilter).CountAsync(); public static async Task SlotCount(DatabaseContext database, SlotQueryBuilder queryBuilder) => await database.Slots.Where(queryBuilder.Build()).CountAsync(); diff --git a/ProjectLighthouse/Helpers/VersionHelper.cs b/ProjectLighthouse/Helpers/VersionHelper.cs index 895c36f74..f6c07003e 100644 --- a/ProjectLighthouse/Helpers/VersionHelper.cs +++ b/ProjectLighthouse/Helpers/VersionHelper.cs @@ -19,7 +19,6 @@ public static class VersionHelper public static string EnvVer => $"{ServerConfiguration.Instance.Customization.EnvironmentName} {FullRevision}"; public static string FullVersion => $"Project Lighthouse {ServerConfiguration.Instance.Customization.EnvironmentName} {Branch}@{CommitHash} {Build}"; - public static bool IsDirty => ThisAssembly.Git.IsDirty; public static string RepositoryUrl => ThisAssembly.Git.RepositoryUrl; public const string Build = diff --git a/ProjectLighthouse/Migrations/20240625004457_AddLocationHashToGameToken.cs b/ProjectLighthouse/Migrations/20240625004457_AddLocationHashToGameToken.cs new file mode 100644 index 000000000..ff8858ee1 --- /dev/null +++ b/ProjectLighthouse/Migrations/20240625004457_AddLocationHashToGameToken.cs @@ -0,0 +1,598 @@ +using LBPUnion.ProjectLighthouse.Database; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace LBPUnion.ProjectLighthouse.Migrations +{ + [DbContext(typeof(DatabaseContext))] + [Migration("20240625004457_AddLocationHashToGameToken")] + public partial class AddLocationHashToGameToken : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "TokenId", + table: "WebTokens", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "AnnouncementId", + table: "WebsiteAnnouncements", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "VisitedLevelId", + table: "VisitedLevels", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "UserId", + table: "Users", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "SlotId", + table: "Slots", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "ScoreId", + table: "Scores", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "ReviewId", + table: "Reviews", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "ReportId", + table: "Reports", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "TokenId", + table: "RegistrationTokens", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "RatedReviewId", + table: "RatedReviews", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "RatedLevelId", + table: "RatedLevels", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "RatingId", + table: "RatedComments", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "QueuedLevelId", + table: "QueuedLevels", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "PlaylistId", + table: "Playlists", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "PlatformLinkAttemptId", + table: "PlatformLinkAttempts", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "PhotoSubjectId", + table: "PhotoSubjects", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "PhotoId", + table: "Photos", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "TokenId", + table: "PasswordResetTokens", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "Id", + table: "Notifications", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "HeartedProfileId", + table: "HeartedProfiles", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "HeartedPlaylistId", + table: "HeartedPlaylists", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "HeartedLevelId", + table: "HeartedLevels", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "TicketHash", + table: "GameTokens", + type: "varchar(64)", + maxLength: 64, + nullable: true, + oldClrType: typeof(string), + oldType: "longtext", + oldNullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + .OldAnnotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AlterColumn( + name: "TokenId", + table: "GameTokens", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AddColumn( + name: "LocationHash", + table: "GameTokens", + type: "varchar(64)", + maxLength: 64, + nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AlterColumn( + name: "EmailVerificationTokenId", + table: "EmailVerificationTokens", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "EmailSetTokenId", + table: "EmailSetTokens", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "CategoryId", + table: "CustomCategories", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "CommentId", + table: "Comments", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "CaseId", + table: "Cases", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "BlockedProfileId", + table: "BlockedProfiles", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "Id", + table: "APIKeys", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "LocationHash", + table: "GameTokens"); + + migrationBuilder.AlterColumn( + name: "TokenId", + table: "WebTokens", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "AnnouncementId", + table: "WebsiteAnnouncements", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "VisitedLevelId", + table: "VisitedLevels", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "UserId", + table: "Users", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "SlotId", + table: "Slots", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "ScoreId", + table: "Scores", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "ReviewId", + table: "Reviews", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "ReportId", + table: "Reports", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "TokenId", + table: "RegistrationTokens", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "RatedReviewId", + table: "RatedReviews", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "RatedLevelId", + table: "RatedLevels", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "RatingId", + table: "RatedComments", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "QueuedLevelId", + table: "QueuedLevels", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "PlaylistId", + table: "Playlists", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "PlatformLinkAttemptId", + table: "PlatformLinkAttempts", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "PhotoSubjectId", + table: "PhotoSubjects", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "PhotoId", + table: "Photos", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "TokenId", + table: "PasswordResetTokens", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "Id", + table: "Notifications", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "HeartedProfileId", + table: "HeartedProfiles", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "HeartedPlaylistId", + table: "HeartedPlaylists", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "HeartedLevelId", + table: "HeartedLevels", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "TicketHash", + table: "GameTokens", + type: "longtext", + nullable: true, + oldClrType: typeof(string), + oldType: "varchar(64)", + oldMaxLength: 64, + oldNullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + .OldAnnotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AlterColumn( + name: "TokenId", + table: "GameTokens", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "EmailVerificationTokenId", + table: "EmailVerificationTokens", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "EmailSetTokenId", + table: "EmailSetTokens", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "CategoryId", + table: "CustomCategories", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "CommentId", + table: "Comments", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "CaseId", + table: "Cases", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "BlockedProfileId", + table: "BlockedProfiles", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + + migrationBuilder.AlterColumn( + name: "Id", + table: "APIKeys", + type: "int", + nullable: false, + oldClrType: typeof(int), + oldType: "int") + .OldAnnotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn); + } + } +} diff --git a/ProjectLighthouse/Migrations/DatabaseContextModelSnapshot.cs b/ProjectLighthouse/Migrations/DatabaseContextModelSnapshot.cs index 8c6bd550e..6c801706c 100644 --- a/ProjectLighthouse/Migrations/DatabaseContextModelSnapshot.cs +++ b/ProjectLighthouse/Migrations/DatabaseContextModelSnapshot.cs @@ -17,44 +17,11 @@ protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "8.0.3") + .HasAnnotation("ProductVersion", "8.0.6") .HasAnnotation("Relational:MaxIdentifierLength", 64); MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ActivityEntity", b => - { - b.Property("ActivityId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ActivityId")); - - b.Property("Discriminator") - .IsRequired() - .HasMaxLength(34) - .HasColumnType("varchar(34)"); - - b.Property("Timestamp") - .HasColumnType("datetime(6)"); - - b.Property("Type") - .HasColumnType("int"); - - b.Property("UserId") - .HasColumnType("int"); - - b.HasKey("ActivityId"); - - b.HasIndex("UserId"); - - b.ToTable("Activities"); - - b.HasDiscriminator("Discriminator").HasValue("ActivityEntity"); - - b.UseTphMappingStrategy(); - }); - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Interaction.HeartedLevelEntity", b => { b.Property("HeartedLevelId") @@ -1074,11 +1041,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("GameVersion") .HasColumnType("int"); + b.Property("LocationHash") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + b.Property("Platform") .HasColumnType("int"); b.Property("TicketHash") - .HasColumnType("longtext"); + .HasMaxLength(64) + .HasColumnType("varchar(64)"); b.Property("UserId") .HasColumnType("int"); @@ -1173,9 +1145,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Content") .HasColumnType("longtext"); - b.Property("PublishedAt") - .HasColumnType("datetime(6)"); - b.Property("PublisherId") .HasColumnType("int"); @@ -1189,211 +1158,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("WebsiteAnnouncements"); }); - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.LevelActivityEntity", b => - { - b.HasBaseType("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ActivityEntity"); - - b.Property("SlotId") - .ValueGeneratedOnUpdateSometimes() - .HasColumnType("int") - .HasColumnName("SlotId"); - - b.HasIndex("SlotId"); - - b.HasDiscriminator().HasValue("LevelActivityEntity"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.LevelCommentActivityEntity", b => - { - b.HasBaseType("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ActivityEntity"); - - b.Property("CommentId") - .ValueGeneratedOnUpdateSometimes() - .HasColumnType("int"); - - b.Property("SlotId") - .ValueGeneratedOnUpdateSometimes() - .HasColumnType("int") - .HasColumnName("SlotId"); - - b.HasIndex("CommentId"); - - b.HasIndex("SlotId"); - - b.HasDiscriminator().HasValue("LevelCommentActivityEntity"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.LevelPhotoActivity", b => - { - b.HasBaseType("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ActivityEntity"); - - b.Property("PhotoId") - .ValueGeneratedOnUpdateSometimes() - .HasColumnType("int"); - - b.Property("SlotId") - .ValueGeneratedOnUpdateSometimes() - .HasColumnType("int") - .HasColumnName("SlotId"); - - b.HasIndex("PhotoId"); - - b.HasIndex("SlotId"); - - b.HasDiscriminator().HasValue("LevelPhotoActivity"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.NewsActivityEntity", b => - { - b.HasBaseType("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ActivityEntity"); - - b.Property("NewsId") - .HasColumnType("int"); - - b.HasIndex("NewsId"); - - b.HasDiscriminator().HasValue("NewsActivityEntity"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.PlaylistActivityEntity", b => - { - b.HasBaseType("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ActivityEntity"); - - b.Property("PlaylistId") - .ValueGeneratedOnUpdateSometimes() - .HasColumnType("int") - .HasColumnName("PlaylistId"); - - b.HasIndex("PlaylistId"); - - b.HasDiscriminator().HasValue("PlaylistActivityEntity"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.PlaylistWithSlotActivityEntity", b => - { - b.HasBaseType("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ActivityEntity"); - - b.Property("PlaylistId") - .ValueGeneratedOnUpdateSometimes() - .HasColumnType("int") - .HasColumnName("PlaylistId"); - - b.Property("SlotId") - .ValueGeneratedOnUpdateSometimes() - .HasColumnType("int") - .HasColumnName("SlotId"); - - b.HasIndex("PlaylistId"); - - b.HasDiscriminator().HasValue("PlaylistWithSlotActivityEntity"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ReviewActivityEntity", b => - { - b.HasBaseType("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ActivityEntity"); - - b.Property("ReviewId") - .HasColumnType("int"); - - b.Property("SlotId") - .ValueGeneratedOnUpdateSometimes() - .HasColumnType("int") - .HasColumnName("SlotId"); - - b.HasIndex("ReviewId"); - - b.HasIndex("SlotId"); - - b.HasDiscriminator().HasValue("ReviewActivityEntity"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ScoreActivityEntity", b => - { - b.HasBaseType("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ActivityEntity"); - - b.Property("Points") - .HasColumnType("int"); - - b.Property("ScoreId") - .HasColumnType("int"); - - b.Property("SlotId") - .ValueGeneratedOnUpdateSometimes() - .HasColumnType("int") - .HasColumnName("SlotId"); - - b.HasIndex("ScoreId"); - - b.HasIndex("SlotId"); - - b.HasDiscriminator().HasValue("ScoreActivityEntity"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.UserActivityEntity", b => - { - b.HasBaseType("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ActivityEntity"); - - b.Property("TargetUserId") - .ValueGeneratedOnUpdateSometimes() - .HasColumnType("int") - .HasColumnName("TargetUserId"); - - b.HasIndex("TargetUserId"); - - b.HasDiscriminator().HasValue("UserActivityEntity"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.UserCommentActivityEntity", b => - { - b.HasBaseType("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ActivityEntity"); - - b.Property("CommentId") - .ValueGeneratedOnUpdateSometimes() - .HasColumnType("int"); - - b.Property("TargetUserId") - .ValueGeneratedOnUpdateSometimes() - .HasColumnType("int") - .HasColumnName("TargetUserId"); - - b.HasIndex("CommentId"); - - b.HasIndex("TargetUserId"); - - b.HasDiscriminator().HasValue("UserCommentActivityEntity"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.UserPhotoActivity", b => - { - b.HasBaseType("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ActivityEntity"); - - b.Property("PhotoId") - .ValueGeneratedOnUpdateSometimes() - .HasColumnType("int"); - - b.Property("TargetUserId") - .ValueGeneratedOnUpdateSometimes() - .HasColumnType("int") - .HasColumnName("TargetUserId"); - - b.HasIndex("PhotoId"); - - b.HasIndex("TargetUserId"); - - b.HasDiscriminator().HasValue("UserPhotoActivity"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ActivityEntity", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Profile.UserEntity", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Interaction.HeartedLevelEntity", b => { b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Level.SlotEntity", "Slot") @@ -1787,175 +1551,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Publisher"); }); - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.LevelActivityEntity", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Level.SlotEntity", "Slot") - .WithMany() - .HasForeignKey("SlotId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Slot"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.LevelCommentActivityEntity", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Profile.CommentEntity", "Comment") - .WithMany() - .HasForeignKey("CommentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Level.SlotEntity", "Slot") - .WithMany() - .HasForeignKey("SlotId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Comment"); - - b.Navigation("Slot"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.LevelPhotoActivity", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Profile.PhotoEntity", "Photo") - .WithMany() - .HasForeignKey("PhotoId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Level.SlotEntity", "Slot") - .WithMany() - .HasForeignKey("SlotId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Photo"); - - b.Navigation("Slot"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.NewsActivityEntity", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Website.WebsiteAnnouncementEntity", "News") - .WithMany() - .HasForeignKey("NewsId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("News"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.PlaylistActivityEntity", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Level.PlaylistEntity", "Playlist") - .WithMany() - .HasForeignKey("PlaylistId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Playlist"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.PlaylistWithSlotActivityEntity", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Level.PlaylistEntity", "Playlist") - .WithMany() - .HasForeignKey("PlaylistId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Playlist"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ReviewActivityEntity", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Level.ReviewEntity", "Review") - .WithMany() - .HasForeignKey("ReviewId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Level.SlotEntity", "Slot") - .WithMany() - .HasForeignKey("SlotId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Review"); - - b.Navigation("Slot"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.ScoreActivityEntity", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Level.ScoreEntity", "Score") - .WithMany() - .HasForeignKey("ScoreId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Level.SlotEntity", "Slot") - .WithMany() - .HasForeignKey("SlotId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Score"); - - b.Navigation("Slot"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.UserActivityEntity", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Profile.UserEntity", "TargetUser") - .WithMany() - .HasForeignKey("TargetUserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("TargetUser"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.UserCommentActivityEntity", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Profile.CommentEntity", "Comment") - .WithMany() - .HasForeignKey("CommentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Profile.UserEntity", "TargetUser") - .WithMany() - .HasForeignKey("TargetUserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Comment"); - - b.Navigation("TargetUser"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Activity.UserPhotoActivity", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Profile.PhotoEntity", "Photo") - .WithMany() - .HasForeignKey("PhotoId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.Entities.Profile.UserEntity", "TargetUser") - .WithMany() - .HasForeignKey("TargetUserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Photo"); - - b.Navigation("TargetUser"); - }); - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Entities.Profile.PhotoEntity", b => { b.Navigation("PhotoSubjects"); diff --git a/ProjectLighthouse/ProjectLighthouse.csproj b/ProjectLighthouse/ProjectLighthouse.csproj index bc92bc904..6fff81a2a 100644 --- a/ProjectLighthouse/ProjectLighthouse.csproj +++ b/ProjectLighthouse/ProjectLighthouse.csproj @@ -10,31 +10,31 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - - - + + + - + diff --git a/ProjectLighthouse/StartupTasks.cs b/ProjectLighthouse/StartupTasks.cs index 6777b5107..ec1730eb4 100644 --- a/ProjectLighthouse/StartupTasks.cs +++ b/ProjectLighthouse/StartupTasks.cs @@ -53,12 +53,6 @@ public static async Task Run(ServerType serverType) // Version info depends on ServerConfig Logger.Info($"You are running version {VersionHelper.FullVersion}", LogArea.Startup); - if (VersionHelper.IsDirty) - { - Logger.Warn("This is a modified version of Project Lighthouse. " + - "Please make sure you are properly disclosing the source code to any users who may be using this instance.", - LogArea.Startup); - } Logger.Info("Connecting to the database...", LogArea.Startup); diff --git a/ProjectLighthouse/Tickets/NPTicket.cs b/ProjectLighthouse/Tickets/NPTicket.cs index bb11a93e2..e2fc02834 100644 --- a/ProjectLighthouse/Tickets/NPTicket.cs +++ b/ProjectLighthouse/Tickets/NPTicket.cs @@ -78,19 +78,13 @@ private static bool ReadTicket(NPTicket npTicket, TicketReader reader) if (!ticketParser.ParseTicket()) return false; - // Create a uint in big endian - uint signatureIdentifier = (uint)(npTicket.TicketSignatureIdentifier[0] << 24 | - npTicket.TicketSignatureIdentifier[1] << 16 | - npTicket.TicketSignatureIdentifier[2] << 8 | - npTicket.TicketSignatureIdentifier[3]); - - npTicket.SignatureVerifier = signatureIdentifier switch + npTicket.SignatureVerifier = npTicket.TicketSignatureIdentifier switch { - 0x5250434E => new RpcnSignatureVerifier(npTicket), - 0x719F1D4A => new PsnSignatureVerifier(npTicket), - 0x54455354 => new UnitTestSignatureVerifier(npTicket), + [0x71, 0x9F, 0x1D, 0x4A,] => new PsnSignatureVerifier(npTicket), // PSN LBP Signature Identifier + [0x52, 0x50, 0x43, 0x4E,] => new RpcnSignatureVerifier(npTicket), // 'RPCN' in ascii + [0x54, 0x45, 0x53, 0x54,] => new UnitTestSignatureVerifier(npTicket), // 'TEST' in ascii _ => throw new ArgumentOutOfRangeException(nameof(npTicket), - signatureIdentifier, + npTicket.TicketSignatureIdentifier, @"Invalid signature identifier"), }; @@ -159,13 +153,11 @@ private static bool ReadTicket(NPTicket npTicket, TicketReader reader) return null; } - // Production PSN Issuer ID: 0x100 - // RPCN Issuer ID: 0x33333333 - npTicket.Platform = npTicket.IssuerId switch + npTicket.Platform = npTicket.SignatureVerifier switch { - 0x100 => Platform.PS3, - 0x33333333 => Platform.RPCS3, - 0x74657374 => Platform.UnitTest, + PsnSignatureVerifier => Platform.PS3, + RpcnSignatureVerifier => Platform.RPCS3, + UnitTestSignatureVerifier => Platform.UnitTest, _ => Platform.Unknown, }; @@ -185,7 +177,7 @@ private static bool ReadTicket(NPTicket npTicket, TicketReader reader) } // Used to identify duplicate tickets - npTicket.TicketHash = CryptoHelper.Sha1Hash(data); + npTicket.TicketHash = CryptoHelper.Sha256Hash(data); #if DEBUG Logger.Debug("npTicket data:", LogArea.Login); diff --git a/ProjectLighthouse/Types/Entities/Token/GameTokenEntity.cs b/ProjectLighthouse/Types/Entities/Token/GameTokenEntity.cs index c1bb16250..ab7d3a169 100644 --- a/ProjectLighthouse/Types/Entities/Token/GameTokenEntity.cs +++ b/ProjectLighthouse/Types/Entities/Token/GameTokenEntity.cs @@ -23,7 +23,11 @@ public class GameTokenEntity public Platform Platform { get; set; } + [StringLength(64)] public string TicketHash { get; set; } + [StringLength(64)] + public string LocationHash { get; set; } + public DateTime ExpiresAt { get; set; } } \ No newline at end of file diff --git a/ProjectLighthouse/Types/Serialization/Slot/GameDeveloperSlot.cs b/ProjectLighthouse/Types/Serialization/Slot/GameDeveloperSlot.cs index d7a67c6c3..9b49f2842 100644 --- a/ProjectLighthouse/Types/Serialization/Slot/GameDeveloperSlot.cs +++ b/ProjectLighthouse/Types/Serialization/Slot/GameDeveloperSlot.cs @@ -1,6 +1,8 @@ -using System.Linq; +using System; +using System.Linq; using System.Threading.Tasks; using System.Xml.Serialization; +using LBPUnion.ProjectLighthouse.Configuration; using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Types.Entities.Profile; @@ -30,6 +32,13 @@ public class GameDeveloperSlot : SlotBase, INeedsPreparationForSerialization [XmlElement("photoCount")] public int PhotoCount { get; set; } + [XmlElement("commentsEnabled")] + public bool CommentsEnabled + { + get => ServerConfiguration.Instance.UserGeneratedContentLimits.LevelCommentsEnabled; + set => throw new NotSupportedException(); + } + public async Task PrepareSerialization(DatabaseContext database) { if (this.SlotId == 0 || this.InternalSlotId == 0) return; diff --git a/README.md b/README.md index d73385550..4020432e4 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ![Source Lines of Code](https://tokei.ekzhang.com/b1/github/LBPUnion/ProjectLighthouse) Project Lighthouse is a clean-room, open-source custom server for LittleBigPlanet. This is a project conducted by -the [LBP Union Ministry of Technology Research and Development team](https://www.lbpunion.com/technology). +the LBP Union Ministry of Technology Research and Development team. For concerns and inquiries about the project, please contact us [here](https://www.lbpunion.com/contact).