Skip to content

Commit dea04df

Browse files
committed
chore: merge main into release for new releases
2 parents fb34cc9 + 5e6a5ca commit dea04df

2 files changed

Lines changed: 41 additions & 6 deletions

File tree

apps/app/src/app/(app)/[orgId]/people/devices/components/DeviceDetails.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,9 @@ export const DeviceDetails = ({ device, onClose }: DeviceDetailsProps) => {
109109
Serial Number
110110
</Text>
111111
<Text size="sm" weight="medium">
112-
{device.serialNumber ?? 'N/A'}
112+
{device.serialNumber?.startsWith('fallback:')
113+
? 'Generic serial number'
114+
: (device.serialNumber ?? 'N/A')}
113115
</Text>
114116
</div>
115117
<div>

apps/portal/src/app/api/device-agent/register/route.ts

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { auth } from '@/app/lib/auth';
22
import { db } from '@db';
3+
import { randomUUID } from 'node:crypto';
34
import { type NextRequest, NextResponse } from 'next/server';
45
import { z } from 'zod';
56

@@ -69,11 +70,43 @@ export async function POST(req: NextRequest) {
6970
});
7071

7172
if (existing && existing.memberId !== member.id) {
72-
// Device belongs to a different member — prevent hijacking
73-
return NextResponse.json(
74-
{ error: 'Device is already registered to another user in this organization' },
75-
{ status: 409 },
76-
);
73+
// Serial number belongs to a different member. This happens when multiple
74+
// machines report the same generic serial (e.g. "System Serial Number",
75+
// "To Be Filled By O.E.M."). Instead of blocking, treat the serial as
76+
// unreliable and register with a generated fallback serial.
77+
// Format: "fallback:<originalSerial>:<uuid>" — self-documenting and unique.
78+
const fallback = await db.device.findFirst({
79+
where: {
80+
hostname,
81+
memberId: member.id,
82+
organizationId,
83+
serialNumber: { startsWith: `fallback:${serialNumber}:` },
84+
},
85+
});
86+
87+
if (fallback) {
88+
device = await db.device.update({
89+
where: { id: fallback.id },
90+
data: { name, platform, osVersion, hardwareModel, agentVersion },
91+
});
92+
} else {
93+
const fallbackSerial = `fallback:${serialNumber}:${randomUUID()}`;
94+
device = await db.device.create({
95+
data: {
96+
name,
97+
hostname,
98+
platform,
99+
osVersion,
100+
serialNumber: fallbackSerial,
101+
hardwareModel,
102+
agentVersion,
103+
memberId: member.id,
104+
organizationId,
105+
},
106+
});
107+
}
108+
109+
return NextResponse.json({ deviceId: device.id });
77110
}
78111

79112
if (existing) {

0 commit comments

Comments
 (0)