mirror of
https://github.com/PretendoNetwork/website.git
synced 2026-09-13 19:37:37 -05:00
Merge branch 'dev' into feat/password-editing
This commit is contained in:
@@ -67,7 +67,7 @@ services:
|
||||
volumes:
|
||||
- "./assets/garage-init.sh:/etc/init.sh"
|
||||
account:
|
||||
image: ghcr.io/pretendonetwork/account:sha-81cbacf
|
||||
image: ghcr.io/pretendonetwork/account:sha-34dc075
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- net
|
||||
|
||||
@@ -25,7 +25,7 @@ We deeply appreciate members of the media wanting to cover this situation, and u
|
||||
2. [New Account Syncing](#new-account-syncing)
|
||||
3. [New Account Syncing (Friends)](#new-account-syncing-friends)
|
||||
4. [Super Mario Maker (Dead Servers)](#super-mario-maker-dead-servers)
|
||||
5. [Super Mario Maker (AWS)](#super-mario-maker)
|
||||
5. [Super Mario Maker (AWS)](#super-mario-maker-aws)
|
||||
6. [Conclusion](#conclusion)
|
||||
|
||||
## Thanks
|
||||
|
||||
@@ -13,7 +13,7 @@ Juxtaposition is the Pretendo Network replacement for the now defunct Miiverse s
|
||||
## Select your console
|
||||
|
||||
- ### [Wii U](#wii-u)
|
||||
- ### [3DS](#3ds-1)
|
||||
- ### [3DS](#_3ds-1)
|
||||
|
||||
# Wii U
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ In order to make this easier, we have developed a suite of internal tools to cap
|
||||
1. [Submissions](#submissions)
|
||||
2. [Game Packets](#game-packets)
|
||||
- [Wii U (HokakuCafe)](#wii-u-hokakucafe)
|
||||
- [3DS (HokakuCTR)](#3ds-hokakuctr)
|
||||
- [3DS (HokakuCTR)](#_3ds-hokakuctr)
|
||||
- [All (WireShark)](#all-wireshark)
|
||||
3. [HTTP Packets](#http-packets)
|
||||
4. [SpotPass](#spotpass)
|
||||
|
||||
@@ -49,13 +49,13 @@ This privacy notice describes how and why We might collect, store, use, and/or s
|
||||
|
||||
**Do We receive any information from third parties?** We do not receive any information from third parties.
|
||||
|
||||
**How do We process Your information?** We process Your information to provide, improve, and administer Our Services, communicate with You, for security and fraud prevention, and to comply with law. We may also process Your information for other purposes with Your consent. We process Your information only when We have a valid legal reason to do so. Learn more about [how We process Your information](#2-how-do-we-process-your-information).
|
||||
**How do We process Your information?** We process Your information to provide, improve, and administer Our Services, communicate with You, for security and fraud prevention, and to comply with law. We may also process Your information for other purposes with Your consent. We process Your information only when We have a valid legal reason to do so. Learn more about [how We process Your information](#_2-how-do-we-process-your-information).
|
||||
|
||||
**In what situations and with which parties do We share personal information?** We may share information in specific situations and with specific third parties. Learn more about [when and with whom We share Your personal information](#4-when-and-with-whom-do-we-share-your-personal-information).
|
||||
**In what situations and with which parties do We share personal information?** We may share information in specific situations and with specific third parties. Learn more about [when and with whom We share Your personal information](#_4-when-and-with-whom-do-we-share-your-personal-information).
|
||||
|
||||
**How do We keep Your information safe?** We have organizational and technical processes and procedures in place to protect Your personal information. However, no electronic transmission over the internet or information storage technology can be guaranteed to be 100% secure, so We cannot promise or guarantee that hackers, cybercriminals, or other unauthorized third parties will not be able to defeat Our security and improperly collect, access, steal, or modify Your information. Learn more about [how We keep Your information safe](#8-how-do-we-keep-your-information-safe).
|
||||
**How do We keep Your information safe?** We have organizational and technical processes and procedures in place to protect Your personal information. However, no electronic transmission over the internet or information storage technology can be guaranteed to be 100% secure, so We cannot promise or guarantee that hackers, cybercriminals, or other unauthorized third parties will not be able to defeat Our security and improperly collect, access, steal, or modify Your information. Learn more about [how We keep Your information safe](#_8-how-do-we-keep-your-information-safe).
|
||||
|
||||
**What are Your rights?** Depending on where You are located geographically, the applicable privacy law may mean You have certain rights regarding Your personal information. Learn more about [Your privacy rights](#9-what-are-your-privacy-rights).
|
||||
**What are Your rights?** Depending on where You are located geographically, the applicable privacy law may mean You have certain rights regarding Your personal information. Learn more about [Your privacy rights](#_9-what-are-your-privacy-rights).
|
||||
|
||||
**How do You exercise Your rights?** The easiest way to exercise Your rights is by contacting Us. We will consider and act upon any request in accordance with applicable data protection laws.
|
||||
|
||||
@@ -63,19 +63,19 @@ Want to learn more about what We do with any information We collect? [Review the
|
||||
|
||||
### TABLE OF CONTENTS
|
||||
|
||||
1. [What Information Do We Collect?](#1-what-information-do-we-collect)
|
||||
2. [How Do We Process Your Information?](#2-how-do-we-process-your-information)
|
||||
3. [What Legal Bases Do We Rely on to Process Your Personal Information?](#3-what-legal-bases-do-we-rely-on-to-process-your-information)
|
||||
4. [When and With Whom Do We Share Your Personal Information?](#4-when-and-with-whom-do-we-share-your-personal-information)
|
||||
5. [Do We Use Cookies and Other Tracking Technologies?](#5-do-we-use-cookies-and-other-tracking-technologies)
|
||||
6. [Is Your Information Transferred Internationally?](#6-is-your-information-transferred-internationally)
|
||||
7. [How Long Do We Keep Your Information?](#7-how-long-do-we-keep-your-information)
|
||||
8. [How Do We Keep Your Information Safe?](#8-how-do-we-keep-your-information-safe)
|
||||
9. [What Are Your Privacy Rights?](#9-what-are-your-privacy-rights)
|
||||
10. [Controls for Do-not-track Features](#10-controls-for-do-not-track-features)
|
||||
11. [Do California Residents Have Specific Privacy Rights?](#11-do-california-residents-have-specific-privacy-rights)
|
||||
12. [Do Virginia Residents Have Specific Privacy Rights?](#12-do-virginia-residents-have-specific-privacy-rights)
|
||||
13. [Do We Make Updates to This Notice?](#13-do-we-make-updates-to-this-notice)
|
||||
1. [What Information Do We Collect?](#_1-what-information-do-we-collect)
|
||||
2. [How Do We Process Your Information?](#_2-how-do-we-process-your-information)
|
||||
3. [What Legal Bases Do We Rely on to Process Your Personal Information?](#_3-what-legal-bases-do-we-rely-on-to-process-your-personal-information)
|
||||
4. [When and With Whom Do We Share Your Personal Information?](#_4-when-and-with-whom-do-we-share-your-personal-information)
|
||||
5. [Do We Use Cookies and Other Tracking Technologies?](#_5-do-we-use-cookies-and-other-tracking-technologies)
|
||||
6. [Is Your Information Transferred Internationally?](#_6-is-your-information-transferred-internationally)
|
||||
7. [How Long Do We Keep Your Information?](#_7-how-long-do-we-keep-your-information)
|
||||
8. [How Do We Keep Your Information Safe?](#_8-how-do-we-keep-your-information-safe)
|
||||
9. [What Are Your Privacy Rights?](#_9-what-are-your-privacy-rights)
|
||||
10. [Controls for Do-not-track Features](#_10-controls-for-do-not-track-features)
|
||||
11. [Do California Residents Have Specific Privacy Rights?](#_11-do-california-residents-have-specific-privacy-rights)
|
||||
12. [Do Virginia Residents Have Specific Privacy Rights?](#_12-do-virginia-residents-have-specific-privacy-rights)
|
||||
13. [Do We Make Updates to This Notice?](#_13-do-we-make-updates-to-this-notice)
|
||||
14. [Contact Us](#contact-us)
|
||||
|
||||
### 1. What Information Do We Collect?
|
||||
@@ -146,7 +146,7 @@ Pretendo Network uses various 3rd party services as part of Our infrastructure.
|
||||
|
||||
The General Data Protection Regulation (GDPR) and UK GDPR require Us to explain the valid legal bases We rely on in order to process Your personal information. As such, We may rely on the following legal bases to process Your personal information:
|
||||
|
||||
- **Consent.** We may process Your information if You have given Us permission (i.e., consent) to use Your personal information for a specific purpose. You can withdraw Your consent at any time. Learn more about [withdrawing Your consent](#9-what-are-your-privacy-rights).
|
||||
- **Consent.** We may process Your information if You have given Us permission (i.e., consent) to use Your personal information for a specific purpose. You can withdraw Your consent at any time. Learn more about [withdrawing Your consent](#_9-what-are-your-privacy-rights).
|
||||
- **Performance of a Contract.** We may process Your personal information when We believe it is necessary to fulfill Our contractual obligations to You, including providing Our Services or at Your request prior to entering into a contract with You.
|
||||
- **Legitimate Interests.** We may process Your information when We believe it is reasonably necessary to achieve Our legitimate business interests and those interests do not outweigh Your interests and fundamental rights and freedoms. For example, We may process Your personal information for some of the purposes described in order to:
|
||||
- Analyze how Our Services are used so We can improve them to engage and retain users
|
||||
@@ -157,7 +157,7 @@ The General Data Protection Regulation (GDPR) and UK GDPR require Us to explain
|
||||
|
||||
***If You are located in Canada, this section applies to You.***
|
||||
|
||||
We may process Your information if You have given Us specific permission (i.e., express consent) to use Your personal information for a specific purpose, or in situations where Your permission can be inferred (i.e., implied consent). You can [withdraw Your consent](#9-what-are-your-privacy-rights) at any time.
|
||||
We may process Your information if You have given Us specific permission (i.e., express consent) to use Your personal information for a specific purpose, or in situations where Your permission can be inferred (i.e., implied consent). You can [withdraw Your consent](#_9-what-are-your-privacy-rights) at any time.
|
||||
|
||||
In some exceptional cases, We may be legally permitted under applicable law to process Your information without Your consent, including, for example:
|
||||
|
||||
@@ -192,7 +192,7 @@ We may use cookies and similar tracking technologies (like web beacons and pixel
|
||||
|
||||
***In Short:*** *We may transfer, store, and process Your information in countries other than Your own.*
|
||||
|
||||
We operate servers in various countries, including in the United States and Germany. If You are accessing Our Services from outside of the countries where Our Services are operating, please be aware that Your information may be transferred to, stored, and processed by Us in Our facilities and by those third parties with whom We may share Your personal information (see "[When and With Whom Do We Share Your Personal Information?](#4-when-and-with-whom-do-we-share-your-personal-information)" above), in and other countries.
|
||||
We operate servers in various countries, including in the United States and Germany. If You are accessing Our Services from outside of the countries where Our Services are operating, please be aware that Your information may be transferred to, stored, and processed by Us in Our facilities and by those third parties with whom We may share Your personal information (see "[When and With Whom Do We Share Your Personal Information?](#_4-when-and-with-whom-do-we-share-your-personal-information)" above), in and other countries.
|
||||
|
||||
If You are a resident in the European Economic Area (EEA) or United Kingdom (UK), then these countries may not necessarily have data protection laws or other similar laws as comprehensive as those in Your country. However, We will take all necessary measures to protect Your personal information in accordance with this privacy notice and applicable law.
|
||||
|
||||
@@ -265,7 +265,7 @@ The rights described above are extended to all users regardless of California re
|
||||
|
||||
We have collected the following categories of personal information in the past twelve (12) months:
|
||||
|
||||
| **Category*- | **Examples*- | **Collected** |
|
||||
| **Category** | **Examples** | **Collected** |
|
||||
| ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- |
|
||||
| A. Identifiers | Contact details, such as real name, alias, postal address, telephone or mobile contact number, unique personal identifier, online identifier, Internet Protocol address, email address, and account name | YES |
|
||||
| B. Personal information categories listed in the California Customer Records statute | Name, contact information, education, employment, employment history, and financial information | NO |
|
||||
@@ -368,9 +368,9 @@ If this definition "consumer" applies to You, We must adhere to certain rights a
|
||||
|
||||
The information We collect, use, and disclose about You will vary depending on how You interact with Us and Our Services. To find out more, please visit the following links:
|
||||
|
||||
- [Personal data We collect](#1-what-information-do-we-collect)
|
||||
- [How We use Your personal data](#2-how-do-we-process-your-information)
|
||||
- [When and with whom We share Your personal data](#4-when-and-with-whom-do-we-share-your-personal-information)
|
||||
- [Personal data We collect](#_1-what-information-do-we-collect)
|
||||
- [How We use Your personal data](#_2-how-do-we-process-your-information)
|
||||
- [When and with whom We share Your personal data](#_4-when-and-with-whom-do-we-share-your-personal-information)
|
||||
|
||||
*Your rights with respect to Your personal data*
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import type { ApiErrorCodes } from '~~/shared/errors';
|
||||
|
||||
const bucket = createRatelimitBucket({
|
||||
id: 'update-email',
|
||||
points: 3,
|
||||
points: 10,
|
||||
durationSec: 30 * 60, // 30 minutes
|
||||
blockDurationSec: 1 * 60 * 60 // 1 hour
|
||||
});
|
||||
|
||||
@@ -4,7 +4,7 @@ import type { ApiErrorCodes } from '~~/shared/errors';
|
||||
|
||||
const bucket = createRatelimitBucket({
|
||||
id: 'verify-email',
|
||||
points: 3,
|
||||
points: 20,
|
||||
durationSec: 30 * 60, // 30 minutes
|
||||
blockDurationSec: 1 * 60 * 60 // 1 hour
|
||||
});
|
||||
|
||||
19
src/components/MdLink.vue
Normal file
19
src/components/MdLink.vue
Normal file
@@ -0,0 +1,19 @@
|
||||
<script lang="ts" setup>
|
||||
function fixFragmentLinks(e: MouseEvent) {
|
||||
const targetEl = e.target as HTMLAnchorElement;
|
||||
const to = targetEl?.getAttribute('href');
|
||||
|
||||
if (targetEl?.tagName !== 'A' || !to?.startsWith('#')) {
|
||||
return;
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
document.getElementById(to.slice(1))?.scrollIntoView();
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<NuxtLink @click="fixFragmentLinks">
|
||||
<slot />
|
||||
</NuxtLink>
|
||||
</template>
|
||||
@@ -5,6 +5,16 @@ import type { ApiAccountEmailUpdateRequest, GetApiAuthMe } from '~~/shared/api-t
|
||||
const toasts = useToasts();
|
||||
const open = defineModel<boolean>();
|
||||
|
||||
const updateOpen = ref(false);
|
||||
const verifyOpen = ref(false);
|
||||
|
||||
watch(updateOpen, () => {
|
||||
open.value = updateOpen.value;
|
||||
});
|
||||
watch(verifyOpen, () => {
|
||||
open.value = verifyOpen.value;
|
||||
});
|
||||
|
||||
const newEmail = ref('');
|
||||
|
||||
const { profile } = defineProps<{
|
||||
@@ -47,8 +57,7 @@ const {
|
||||
|
||||
<template>
|
||||
<Dialog.Root
|
||||
v-if="profile.emailValidated"
|
||||
v-model:open="open"
|
||||
v-model:open="updateOpen"
|
||||
>
|
||||
<Dialog.Portal :to="dialogContainer ?? undefined">
|
||||
<Dialog.Overlay />
|
||||
@@ -106,8 +115,8 @@ const {
|
||||
</Dialog.Root>
|
||||
|
||||
<Dialog.Root
|
||||
v-else
|
||||
v-model:open="open"
|
||||
v-if="!profile.emailValidated"
|
||||
v-model:open="verifyOpen"
|
||||
>
|
||||
<Dialog.Portal :to="dialogContainer ?? undefined">
|
||||
<Dialog.Overlay />
|
||||
@@ -137,9 +146,12 @@ const {
|
||||
email: profile.emailAddress
|
||||
})"
|
||||
>
|
||||
{{
|
||||
$t("account.settings.unverifiedEmailModal.resend")
|
||||
}}
|
||||
<Loader v-if="isLoadingUpdateEmail" />
|
||||
<span v-else>
|
||||
{{
|
||||
$t("account.settings.unverifiedEmailModal.resend")
|
||||
}}
|
||||
</span>
|
||||
</button>
|
||||
</p>
|
||||
</Dialog.Description>
|
||||
@@ -153,9 +165,14 @@ const {
|
||||
</Dialog.Close>
|
||||
</div>
|
||||
</Dialog.Content>
|
||||
</Dialog.Portal><Dialog.Trigger class="unverified">
|
||||
{{ $t('account.settings.verify_email') }}
|
||||
</Dialog.Trigger>
|
||||
</Dialog.Portal>
|
||||
<p class="notice">
|
||||
{{ $t('account.settings.verify_email_notice') }}
|
||||
<br>
|
||||
<Dialog.Trigger class="unverified">
|
||||
{{ $t('account.settings.verify_email_button') }}
|
||||
</Dialog.Trigger>
|
||||
</p>
|
||||
</Dialog.Root>
|
||||
</template>
|
||||
<style>
|
||||
@@ -185,4 +202,9 @@ fieldset {
|
||||
gap: .25rem;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.notice {
|
||||
font-size: .9em;
|
||||
margin-top: 1rem !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -220,7 +220,8 @@
|
||||
"update": "Update",
|
||||
"unverified_email": "Unverified",
|
||||
"verified_email": "Verified",
|
||||
"verify_email": "Verify email",
|
||||
"verify_email_notice": "You haven't verified your email address yet.",
|
||||
"verify_email_button": "Verify now",
|
||||
"settingCards": {
|
||||
"userSettings": "User settings",
|
||||
"profile": "Profile",
|
||||
@@ -281,6 +282,11 @@
|
||||
"successNotice": "Password updated successfully"
|
||||
}
|
||||
},
|
||||
"emailVerification": {
|
||||
"verifiedTitle": "Email successfully verified",
|
||||
"verifiedCaption": "You may now close this tab.",
|
||||
"failedTitle": "Failed to verify email"
|
||||
},
|
||||
"accountLevel": [
|
||||
"Standard",
|
||||
"Tester",
|
||||
|
||||
@@ -27,36 +27,31 @@ const {
|
||||
}
|
||||
});
|
||||
|
||||
await callOnce(async () => {
|
||||
await executeVerifyEmail();
|
||||
callOnce(() => {
|
||||
executeVerifyEmail();
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="isLoadingVerifyEmail">
|
||||
<div class="account-form-wrapper">
|
||||
<form
|
||||
class="account loading"
|
||||
>
|
||||
<Loader />
|
||||
</form>
|
||||
<div class="account-form-wrapper loading">
|
||||
<Loader />
|
||||
</div>
|
||||
</div>
|
||||
<div v-else-if="success">
|
||||
<div class="account-form-wrapper">
|
||||
<h1
|
||||
class="title dot"
|
||||
data-title-suffix="!"
|
||||
>
|
||||
Email successfully verified{{ '' }}
|
||||
{{ $t('account.emailVerification.verifiedTitle') }}
|
||||
</h1>
|
||||
<p>You may now close this tab.</p>
|
||||
<p>{{ $t('account.emailVerification.verifiedCaption') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else>
|
||||
<div class="account-form-wrapper">
|
||||
<h1 class="title dot">
|
||||
Failed to verify email{{ '' }}
|
||||
{{ $t('account.emailVerification.failedTitle') }}
|
||||
</h1>
|
||||
<p>{{ errorMessage }}</p>
|
||||
</div>
|
||||
@@ -74,6 +69,9 @@ await callOnce(async () => {
|
||||
width: fit-content;
|
||||
overflow: hidden;
|
||||
}
|
||||
.account-form-wrapper.loading {
|
||||
justify-content: center;
|
||||
}
|
||||
.title {
|
||||
font-size: 4rem;
|
||||
margin-bottom: 0;
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
<script setup lang="ts">
|
||||
import MdLink from '~/components/MdLink.vue';
|
||||
|
||||
const slug = useRoute().params.slug;
|
||||
const { data: post } = await useAsyncData(`blog-${slug}`, () => {
|
||||
return queryCollection('blog').path(`/blog/${slug}`).first();
|
||||
@@ -41,7 +43,10 @@ customSeoMeta({
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<ContentRenderer :value="post" />
|
||||
<ContentRenderer
|
||||
:value="post"
|
||||
:components="{ 'a': MdLink }"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
<script setup lang="ts">
|
||||
import MdLink from '~/components/MdLink.vue';
|
||||
|
||||
const slug = (useRoute().params.slug as string[]).join('/');
|
||||
|
||||
const { data: doc } = await useAsyncData(`docs-${slug}`, () => {
|
||||
return queryCollection('docs').path(`/docs/${slug}`).first();
|
||||
});
|
||||
@@ -7,6 +10,7 @@ const { data: doc } = await useAsyncData(`docs-${slug}`, () => {
|
||||
if (!doc.value) {
|
||||
throw createError({ statusCode: 404, statusMessage: 'Page Not Found' });
|
||||
}
|
||||
|
||||
customSeoMeta({
|
||||
subsection: 'docs',
|
||||
title: doc.value.title,
|
||||
@@ -23,6 +27,7 @@ definePageMeta({
|
||||
<ContentRenderer
|
||||
v-if="doc"
|
||||
:value="doc"
|
||||
:components="{ 'a': MdLink }"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
<script lang="ts" setup>
|
||||
import MdLink from '~/components/MdLink.vue';
|
||||
|
||||
const slug = useRoute().params.slug;
|
||||
const { data: termContent } = await useAsyncData(`terms-${slug}`, () => {
|
||||
return queryCollection('terms').path(`/terms/${slug}`).first();
|
||||
@@ -21,6 +23,7 @@ customSeoMeta({
|
||||
<ContentRenderer
|
||||
v-if="termContent"
|
||||
:value="termContent"
|
||||
:components="{ 'a': MdLink }"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user