diff --git a/lib/auth.ts b/lib/auth.ts index 65a527ab..04585943 100644 --- a/lib/auth.ts +++ b/lib/auth.ts @@ -2,14 +2,13 @@ import { Report } from '@prisma/client'; import redis from '@umami/redis-client'; import debug from 'debug'; import { PERMISSIONS, ROLE_PERMISSIONS, SHARE_TOKEN_HEADER } from 'lib/constants'; -import { secret } from 'lib/crypto'; +import { secret, isUuid } from 'lib/crypto'; import { createSecureToken, ensureArray, getRandomChars, parseSecureToken, parseToken, - isUuid, } from 'next-basics'; import { getTeamUser } from 'queries'; import { getTeamWebsite, getTeamWebsiteByTeamMemberId } from 'queries/admin/teamWebsite'; diff --git a/lib/crypto.js b/lib/crypto.js index 059e7b66..fefaf13f 100644 --- a/lib/crypto.js +++ b/lib/crypto.js @@ -1,5 +1,6 @@ import { startOfMonth } from 'date-fns'; import { hash } from 'next-basics'; +import { v4, v5, validate } from 'uuid'; export function secret() { return hash(process.env.APP_SECRET || process.env.DATABASE_URL); @@ -10,3 +11,13 @@ export function salt() { return hash(secret(), ROTATING_SALT); } + +export function uuid(...args) { + if (!args.length) return v4(); + + return v5(hash(...args), v5.DNS); +} + +export function isUuid(value) { + return validate(value); +} diff --git a/lib/middleware.ts b/lib/middleware.ts index 9e8e42a4..bcab71ef 100644 --- a/lib/middleware.ts +++ b/lib/middleware.ts @@ -4,14 +4,13 @@ import { badRequest, parseSecureToken, tooManyRequest, - isUuid, } from 'next-basics'; import debug from 'debug'; import cors from 'cors'; import redis from '@umami/redis-client'; import { findSession } from 'lib/session'; import { getAuthToken, parseShareToken } from 'lib/auth'; -import { secret } from 'lib/crypto'; +import { secret, isUuid } from 'lib/crypto'; import { ROLES } from 'lib/constants'; import { getUser } from '../queries'; import { NextApiRequestCollect } from 'pages/api/send'; diff --git a/lib/session.ts b/lib/session.ts index 82abcb4d..5eb7398a 100644 --- a/lib/session.ts +++ b/lib/session.ts @@ -1,6 +1,6 @@ -import { secret } from 'lib/crypto'; +import { secret, uuid, isUuid } from 'lib/crypto'; import { getClientInfo, getJsonBody } from 'lib/detect'; -import { parseToken, uuid, isUuid } from 'next-basics'; +import { parseToken } from 'next-basics'; import { CollectRequestBody, NextApiRequestCollect } from 'pages/api/send'; import { createSession } from 'queries'; import cache from './cache'; diff --git a/package.json b/package.json index cac012c3..7e51c9cf 100644 --- a/package.json +++ b/package.json @@ -107,6 +107,7 @@ "semver": "^7.5.2", "thenby": "^1.3.4", "timezone-support": "^2.0.2", + "uuid": "^9.0.0", "yup": "^0.32.11", "zustand": "^4.3.8" }, diff --git a/pages/api/teams/index.ts b/pages/api/teams/index.ts index 316f3109..453f1ef3 100644 --- a/pages/api/teams/index.ts +++ b/pages/api/teams/index.ts @@ -1,7 +1,7 @@ import { Team } from '@prisma/client'; import { NextApiRequestQueryBody } from 'lib/types'; import { canCreateTeam } from 'lib/auth'; -import { uuid } from 'next-basics'; +import { uuid } from 'lib/crypto'; import { useAuth } from 'lib/middleware'; import { NextApiResponse } from 'next'; import { getRandomChars, methodNotAllowed, ok, unauthorized } from 'next-basics'; diff --git a/pages/api/users/index.ts b/pages/api/users/index.ts index 14b4e451..c6103c35 100644 --- a/pages/api/users/index.ts +++ b/pages/api/users/index.ts @@ -1,6 +1,6 @@ import { canCreateUser, canViewUsers } from 'lib/auth'; import { ROLES } from 'lib/constants'; -import { uuid } from 'next-basics'; +import { uuid } from 'lib/crypto'; import { useAuth } from 'lib/middleware'; import { NextApiRequestQueryBody, Role, User } from 'lib/types'; import { NextApiResponse } from 'next'; diff --git a/pages/api/websites/index.ts b/pages/api/websites/index.ts index c806c7bb..c8b5aba2 100644 --- a/pages/api/websites/index.ts +++ b/pages/api/websites/index.ts @@ -1,5 +1,5 @@ import { canCreateWebsite } from 'lib/auth'; -import { uuid } from 'next-basics'; +import { uuid } from 'lib/crypto'; import { useAuth, useCors } from 'lib/middleware'; import { NextApiRequestQueryBody } from 'lib/types'; import { NextApiResponse } from 'next'; diff --git a/queries/admin/team.ts b/queries/admin/team.ts index 6d216639..5c3b372f 100644 --- a/queries/admin/team.ts +++ b/queries/admin/team.ts @@ -1,7 +1,7 @@ -import { Prisma, Team, TeamWebsite } from '@prisma/client'; +import { Prisma, Team } from '@prisma/client'; import prisma from 'lib/prisma'; import { ROLES } from 'lib/constants'; -import { uuid } from 'next-basics'; +import { uuid } from 'lib/crypto'; export async function getTeam(where: Prisma.TeamWhereInput): Promise { return prisma.client.team.findFirst({ diff --git a/queries/admin/teamUser.ts b/queries/admin/teamUser.ts index 5bce2926..b1c295be 100644 --- a/queries/admin/teamUser.ts +++ b/queries/admin/teamUser.ts @@ -1,5 +1,5 @@ import { Prisma, TeamUser } from '@prisma/client'; -import { uuid } from 'next-basics'; +import { uuid } from 'lib/crypto'; import prisma from 'lib/prisma'; export async function getTeamUserById(teamUserId: string): Promise { diff --git a/queries/admin/teamWebsite.ts b/queries/admin/teamWebsite.ts index 9ffd07d3..0aedc3c7 100644 --- a/queries/admin/teamWebsite.ts +++ b/queries/admin/teamWebsite.ts @@ -1,6 +1,6 @@ import { Prisma, Team, TeamUser, TeamWebsite, Website } from '@prisma/client'; import { ROLES } from 'lib/constants'; -import { uuid } from 'next-basics'; +import { uuid } from 'lib/crypto'; import prisma from 'lib/prisma'; export async function getTeamWebsite( diff --git a/queries/analytics/eventData/saveEventData.ts b/queries/analytics/eventData/saveEventData.ts index 50765229..97b1c882 100644 --- a/queries/analytics/eventData/saveEventData.ts +++ b/queries/analytics/eventData/saveEventData.ts @@ -1,6 +1,6 @@ import { Prisma } from '@prisma/client'; import { DATA_TYPE } from 'lib/constants'; -import { uuid } from 'next-basics'; +import { uuid } from 'lib/crypto'; import { CLICKHOUSE, PRISMA, runQuery } from 'lib/db'; import { flattenJSON } from 'lib/dynamicData'; import kafka from 'lib/kafka'; diff --git a/queries/analytics/events/saveEvent.ts b/queries/analytics/events/saveEvent.ts index cfefc326..51087a59 100644 --- a/queries/analytics/events/saveEvent.ts +++ b/queries/analytics/events/saveEvent.ts @@ -2,7 +2,7 @@ import { EVENT_NAME_LENGTH, URL_LENGTH, EVENT_TYPE } from 'lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from 'lib/db'; import kafka from 'lib/kafka'; import prisma from 'lib/prisma'; -import { uuid } from 'next-basics'; +import { uuid } from 'lib/crypto'; import { saveEventData } from 'queries/analytics/eventData/saveEventData'; export async function saveEvent(args: { diff --git a/queries/analytics/sessions/saveSessionData.ts b/queries/analytics/sessions/saveSessionData.ts index 246813e7..192053f1 100644 --- a/queries/analytics/sessions/saveSessionData.ts +++ b/queries/analytics/sessions/saveSessionData.ts @@ -1,5 +1,5 @@ import { DATA_TYPE } from 'lib/constants'; -import { uuid } from 'next-basics'; +import { uuid } from 'lib/crypto'; import { flattenJSON } from 'lib/dynamicData'; import prisma from 'lib/prisma'; import { DynamicData } from 'lib/types'; diff --git a/yarn.lock b/yarn.lock index b66511fc..1e151698 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9191,6 +9191,11 @@ uuid@^8.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz"