Skip to content

Commit

Permalink
sandbox en place
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexTraveylan committed Aug 11, 2023
1 parent 3dcf7f3 commit d1f4b8c
Show file tree
Hide file tree
Showing 15 changed files with 236 additions and 118 deletions.
Binary file added public/coffre-sable.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 12 additions & 8 deletions src/app/api/get-public-key/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,20 @@ import { NextRequest, NextResponse } from "next/server"

export async function GET(request: NextRequest) {
const user = await currentUser()
let searchUser
if (user) {
if (!user?.primaryEmailAddressId) {
return NextResponse.json({ error: "Impossible de trouver l&apose-mail." }, { status: 400 })
}
const primaryEmail = user.emailAddresses.find((email) => email.id == user.primaryEmailAddressId)
if (!primaryEmail) {
return NextResponse.json({ error: "Impossible de trouver l&apose-mail." }, { status: 400 })
}

if (!user?.primaryEmailAddressId) {
return NextResponse.json({ error: "Impossible de trouver l&apose-mail." }, { status: 400 })
searchUser = await userAppService.getByEmail(primaryEmail.emailAddress)
} else {
searchUser = await userAppService.getByEmail("noemail@sandbox.com")
}
const primaryEmail = user.emailAddresses.find((email) => email.id == user.primaryEmailAddressId)
if (!primaryEmail) {
return NextResponse.json({ error: "Impossible de trouver l&apose-mail." }, { status: 400 })
}

const searchUser = await userAppService.getByEmail(primaryEmail.emailAddress)

if (!searchUser) {
return NextResponse.json({ error: "Impossible de trouver l&aposuser." }, { status: 400 })
Expand Down
90 changes: 51 additions & 39 deletions src/app/api/passwords/[id]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,29 +7,35 @@ import { NextRequest, NextResponse } from "next/server"

export async function DELETE(request: NextRequest, { params }: { params: { id: string } }) {
const user = await currentUser()
if (!user?.primaryEmailAddressId) {
return NextResponse.json({ error: "Impossible de trouver l'e-mail." }, { status: 401 })
let cUser
if (user) {
if (!user?.primaryEmailAddressId) {
return NextResponse.json({ error: "Impossible de trouver l'e-mail." }, { status: 400 })
}

const primaryEmail = user.emailAddresses.find((email) => email.id == user.primaryEmailAddressId)
if (!primaryEmail) {
return NextResponse.json({ error: "Impossible de trouver l'apose-mail." }, { status: 400 })
}

const cookieStore = cookies()
const accessToken = cookieStore.get("accessToken")
if (!accessToken) {
return NextResponse.json({ error: "Pas de token d'acces dans les cookies." }, { status: 400 })
}
try {
const decoded = verifyAccessToken(accessToken.value)
} catch (err) {
return NextResponse.json({ error: "Le token n'est pas valide ou à expiré." }, { status: 400 })
}

cUser = await userAppService.getByEmail(primaryEmail.emailAddress)
} else {
cUser = await userAppService.getByEmail("noemail@sandbox.com")
}

const primaryEmail = user.emailAddresses.find((email) => email.id == user.primaryEmailAddressId)
if (!primaryEmail) {
return NextResponse.json({ error: "Impossible de trouver l'e-mail." }, { status: 404 })
}

const cookieStore = cookies()
const accessToken = cookieStore.get("accessToken")
if (!accessToken) {
return NextResponse.json({ error: "Pas de token d'acces dans les cookies." }, { status: 401 })
}
try {
const decoded = verifyAccessToken(accessToken.value)
} catch (err) {
return NextResponse.json({ error: "Le token n'est pas valide ou à expiré." }, { status: 401 })
}

const cUser = await userAppService.getByEmail(primaryEmail.emailAddress)
if (!cUser) {
return NextResponse.json({ error: "Impossible de trouver l'user." }, { status: 401 })
return NextResponse.json({ error: "Impossible de trouver l'user." }, { status: 400 })
}

if (!params.id) {
Expand All @@ -48,27 +54,33 @@ export async function DELETE(request: NextRequest, { params }: { params: { id: s

export async function PUT(request: NextRequest, { params }: { params: { id: string } }) {
const user = await currentUser()
if (!user?.primaryEmailAddressId) {
return NextResponse.json({ error: "Impossible de trouver l'e-mail." }, { status: 400 })
}

const primaryEmail = user.emailAddresses.find((email) => email.id == user.primaryEmailAddressId)
if (!primaryEmail) {
return NextResponse.json({ error: "Impossible de trouver l'e-mail." }, { status: 400 })
}

const cookieStore = cookies()
const accessToken = cookieStore.get("accessToken")
if (!accessToken) {
return NextResponse.json({ error: "Pas de token d'acces dans les cookies." }, { status: 400 })
}
try {
const decoded = verifyAccessToken(accessToken.value)
} catch (err) {
return NextResponse.json({ error: "Le token n'est pas valide ou à expiré." }, { status: 400 })
let cUser
if (user) {
if (!user?.primaryEmailAddressId) {
return NextResponse.json({ error: "Impossible de trouver l'e-mail." }, { status: 400 })
}

const primaryEmail = user.emailAddresses.find((email) => email.id == user.primaryEmailAddressId)
if (!primaryEmail) {
return NextResponse.json({ error: "Impossible de trouver l'apose-mail." }, { status: 400 })
}

const cookieStore = cookies()
const accessToken = cookieStore.get("accessToken")
if (!accessToken) {
return NextResponse.json({ error: "Pas de token d'acces dans les cookies." }, { status: 400 })
}
try {
const decoded = verifyAccessToken(accessToken.value)
} catch (err) {
return NextResponse.json({ error: "Le token n'est pas valide ou à expiré." }, { status: 400 })
}

cUser = await userAppService.getByEmail(primaryEmail.emailAddress)
} else {
cUser = await userAppService.getByEmail("noemail@sandbox.com")
}

const cUser = await userAppService.getByEmail(primaryEmail.emailAddress)
if (!cUser) {
return NextResponse.json({ error: "Impossible de trouver l'user." }, { status: 400 })
}
Expand Down
40 changes: 23 additions & 17 deletions src/app/api/passwords/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,27 +44,33 @@ export async function GET(request: NextRequest) {
// Création d'un mot de passe
export async function POST(request: NextRequest) {
const user = await currentUser()
if (!user?.primaryEmailAddressId) {
return NextResponse.json({ error: "Impossible de trouver l'e-mail." }, { status: 400 })
}
let cUser
if (user) {
if (!user?.primaryEmailAddressId) {
return NextResponse.json({ error: "Impossible de trouver l'e-mail." }, { status: 400 })
}

const primaryEmail = user.emailAddresses.find((email) => email.id == user.primaryEmailAddressId)
if (!primaryEmail) {
return NextResponse.json({ error: "Impossible de trouver l'apose-mail." }, { status: 400 })
}
const primaryEmail = user.emailAddresses.find((email) => email.id == user.primaryEmailAddressId)
if (!primaryEmail) {
return NextResponse.json({ error: "Impossible de trouver l'apose-mail." }, { status: 400 })
}

const cookieStore = cookies()
const accessToken = cookieStore.get("accessToken")
if (!accessToken) {
return NextResponse.json({ error: "Pas de token d'acces dans les cookies." }, { status: 400 })
}
try {
const decoded = verifyAccessToken(accessToken.value)
} catch (err) {
return NextResponse.json({ error: "Le token n'est pas valide ou à expiré." }, { status: 400 })
const cookieStore = cookies()
const accessToken = cookieStore.get("accessToken")
if (!accessToken) {
return NextResponse.json({ error: "Pas de token d'acces dans les cookies." }, { status: 400 })
}
try {
const decoded = verifyAccessToken(accessToken.value)
} catch (err) {
return NextResponse.json({ error: "Le token n'est pas valide ou à expiré." }, { status: 400 })
}

cUser = await userAppService.getByEmail(primaryEmail.emailAddress)
} else {
cUser = await userAppService.getByEmail("noemail@sandbox.com")
}

const cUser = await userAppService.getByEmail(primaryEmail.emailAddress)
if (!cUser) {
return NextResponse.json({ error: "Impossible de trouver l'user." }, { status: 400 })
}
Expand Down
4 changes: 2 additions & 2 deletions src/app/error.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ export default function Error({ error, reset }: { error: Error; reset: () => voi
}, [error])

return (
<div className="text-center">
<h1>Une erreur s'est produite</h1>
<div className="text-center flex flex-col gap-3">
<h1>{error.message}</h1>
<Image src="/voleur.jpg" width={700} height={700} alt="Voleur assomé, coffre intact." />
</div>
)
Expand Down
11 changes: 9 additions & 2 deletions src/app/page.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
import { BtnAccesIfLogged } from "@/components/btn-acces-if-logged"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
import { Button } from "@/components/ui/Button"
import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"
import Link from "next/link"

export default function Home() {
return (
<Card className="text-center">
<Card className="text-center max-w-[500px]">
<CardHeader>
<CardTitle>Password Guard</CardTitle>
<CardDescription>One password for protect all others.</CardDescription>
</CardHeader>
<CardContent>
<BtnAccesIfLogged />
</CardContent>
<CardFooter className="flex justify-center">
<Link href="/sandbox">
<Button>Sandbox</Button>
</Link>
</CardFooter>
</Card>
)
}
88 changes: 88 additions & 0 deletions src/app/sandbox/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import { AddPasswordCard } from "@/components/add-password-card"
import { PasswordCard } from "@/components/password_card"
import { PassBdd, encryptData } from "@/components/types/types"
import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"
import { guardedPasswordService } from "@/services/GuardedPassword.service"
import { decryptPassword, privateKeyDecrypt } from "@/services/security.service"
import { userAppService } from "@/services/userApp.service"
import { currentUser } from "@clerk/nextjs"
import Image from "next/image"
import Link from "next/link"
import { ArrowLeft } from "../../../node_modules/lucide-react"

export default async function SandBoxPage() {
const sandBoxUser = await userAppService.getByEmail("noemail@sandbox.com")
const user = await currentUser()

if (user) {
throw new Error("Déconnectez-vous pour utiliser la sandbox.")
}

if (!sandBoxUser) {
throw new Error("Impossible de trouver le sandbox user.")
}
const privateKeyBuffer = sandBoxUser.privateKey

const passwords = await guardedPasswordService.getAllGuardedPasswordByUserID(sandBoxUser.id)
if (!passwords) {
throw new Error("Echec dans la récupération des mots de passe.")
}
const passBdds: PassBdd[] = []

for (const password of passwords) {
const encryptedData: encryptData = {
iv: password.iv,
encryptedPassword: password.password.toString("hex"),
}

const decryptedAESKey = privateKeyDecrypt(password.encryptedAESKey, privateKeyBuffer)
const decryptedPassword = decryptPassword(encryptedData, decryptedAESKey)

passBdds.push({ id: password.id, title: password.title, login: password.login, password: decryptedPassword })
}

return (
<div>
<div className="flex gap-5 flex-wrap justify-center">
<Image src="/coffre-sable.jpg" alt="coffre en bois dans du sable" width={240} height={240} />
<Card className="w-[240px] min-h-[240px]">
<CardHeader>
<CardTitle className="flex justify-between">
<h3>
Bac à sable <span className="text-xs">(partagé)</span>
</h3>
<Link href="/">
<ArrowLeft className="hover:text-red-800 dark:hover:text-red-500 transition-colors" />
</Link>
</CardTitle>
<CardDescription className="text-xs">
Accessible aux utilisateurs non connectés pour tester les fonctionnalités de Password Guard.
</CardDescription>
</CardHeader>
<CardContent>
<h3>Règles :</h3>
<ul>
<li>- Pas d'insulte</li>
<li>- Pas de liens</li>
</ul>
</CardContent>
<CardFooter>
<h3 className="text-xs">En développement ...</h3>
</CardFooter>
</Card>
</div>
<div className="flex flex-row gap-3 flex-wrap justify-center my-5">
{passBdds
.sort((a, b) => a.id - b.id)
.map((password) => {
return (
<div key={password.id}>
<PasswordCard password={password} />
</div>
)
})}
<AddPasswordCard />
</div>
</div>
)
}
30 changes: 14 additions & 16 deletions src/app/view-passwords/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { decryptPassword, privateKeyDecrypt } from "@/services/security.service"
import { useUser } from "@clerk/nextjs"
import { useEffect, useState } from "react"

export default function ProtectedPage() {
export default function ViewPasswordsPage() {
const { isLoaded, isSignedIn, user } = useUser()
const [isLoading, setIsLoading] = useState(true)
const [isAcces, setIsAcces] = useState(false)
Expand Down Expand Up @@ -66,21 +66,19 @@ export default function ProtectedPage() {
}

return (
<div className="flex flex-col items-center">
<div className="flex flex-row gap-3 flex-wrap justify-center my-5">
{isAcces && passwords.length > 0 && (
<>
{passwords.map((password) => {
return (
<div key={password.id}>
<PasswordCard password={password} recupPasswords={recupPasswords} />
</div>
)
})}
</>
)}
{isShow ? <AddPasswordForm recupPasswords={recupPasswords} setIsShow={setIsShow} /> : <PlusPasswordCard setIsShow={setIsShow} />}
</div>
<div className="flex flex-row gap-3 flex-wrap justify-center my-5">
{isAcces && passwords.length > 0 && (
<>
{passwords.map((password) => {
return (
<div key={password.id}>
<PasswordCard password={password} />
</div>
)
})}
</>
)}
{isShow ? <AddPasswordForm setIsShow={setIsShow} /> : <PlusPasswordCard setIsShow={setIsShow} />}
</div>
)
}
10 changes: 10 additions & 0 deletions src/components/add-password-card.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
"use client"

import { useState } from "react"
import { AddPasswordForm } from "./forms/add-password-form"
import { PlusPasswordCard } from "./plus-password-card"

export function AddPasswordCard() {
const [isShow, setIsShow] = useState(false)
return <>{isShow ? <AddPasswordForm setIsShow={setIsShow} /> : <PlusPasswordCard setIsShow={setIsShow} />}</>
}
12 changes: 6 additions & 6 deletions src/components/description.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,18 @@ export function Description() {
{isDescrHidden ? (
<Button onClick={() => toggleDescr()}>Voir description</Button>
) : (
<>
<div className="flex flex-col gap-3">
<Button onClick={() => toggleDescr()}>
<Undo2 />
</Button>
<div className="flex flex-col items-begin justify-center text-center">
<ul>
{descriptions.map((desc) => (
<div className="my-3" key={desc}>
<li className="my-2" key={desc}>
{desc}
</div>
</li>
))}
</div>
</>
</ul>
</div>
)}
</div>
)
Expand Down
Loading

0 comments on commit d1f4b8c

Please sign in to comment.