Skip to content

Commit 6c0401e

Browse files
authored
Merge pull request #92 from CoolerMinecraft/preview
testergate prod
2 parents 213dd15 + 44ea43d commit 6c0401e

2 files changed

Lines changed: 115 additions & 84 deletions

File tree

server/routes/data.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ router.get('/settings', async (req, res) => {
402402
res.json(settings);
403403
} catch (error) {
404404
console.error('Error fetching tester settings:', error);
405-
res.status(500).json({ error: 'Failed to fetch settings' });
405+
res.status(500).json({ error: 'Failed to fetch tester settings' });
406406
}
407407
});
408408

@@ -458,4 +458,21 @@ router.get('/holiday-enabled', async (req, res) => {
458458
}
459459
});
460460

461+
// GET: /api/data/tester-settings - get tester gate settings
462+
router.get('/tester-settings', async (req, res) => {
463+
try {
464+
const host = req.get('host') || req.get('x-forwarded-host') || '';
465+
466+
if (host === 'control.pfconnect.online') {
467+
return res.json({ tester_gate_enabled: false });
468+
}
469+
470+
const settings = await getTesterSettings();
471+
res.json(settings);
472+
} catch (error) {
473+
console.error('Error fetching tester settings:', error);
474+
res.status(500).json({ error: 'Failed to fetch tester settings' });
475+
}
476+
});
477+
461478
export default router;

src/components/ProtectedRoute.tsx

Lines changed: 97 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -5,102 +5,116 @@ import { getTesterSettings } from '../utils/fetch/data';
55
import AccessDenied from './AccessDenied';
66

77
interface ProtectedRouteProps {
8-
children: React.ReactNode;
9-
requireAdmin?: boolean;
10-
requireTester?: boolean;
11-
requireAuth?: boolean;
12-
requirePermission?: string;
13-
accessDeniedMessage?: string;
8+
children: React.ReactNode;
9+
requireAdmin?: boolean;
10+
requireTester?: boolean;
11+
requireAuth?: boolean;
12+
requirePermission?: string;
13+
accessDeniedMessage?: string;
1414
}
1515

1616
export default function ProtectedRoute({
17-
children,
18-
requireAdmin = false,
19-
requireTester = true,
20-
requireAuth = true,
21-
requirePermission,
17+
children,
18+
requireAdmin = false,
19+
requireTester = true,
20+
requireAuth = true,
21+
requirePermission,
2222
}: ProtectedRouteProps) {
23-
const { user, isLoading } = useAuth();
24-
const [testerGateEnabled, setTesterGateEnabled] = useState<boolean | null>(
25-
null
26-
);
23+
const { user, isLoading } = useAuth();
24+
const [testerGateEnabled, setTesterGateEnabled] = useState<boolean | null>(
25+
null
26+
);
27+
28+
const shouldBypassTesterGate = () => {
29+
return window.location.hostname === 'control.pfconnect.online';
30+
};
31+
32+
useEffect(() => {
33+
if (!requireTester || (user && user.isAdmin)) {
34+
setTesterGateEnabled(false);
35+
return;
36+
}
2737

28-
useEffect(() => {
29-
if (!requireTester || (user && user.isAdmin)) {
30-
setTesterGateEnabled(false);
31-
return;
38+
const checkGateStatus = async () => {
39+
try {
40+
if (shouldBypassTesterGate()) {
41+
setTesterGateEnabled(false);
42+
return;
3243
}
3344

34-
const checkGateStatus = async () => {
35-
try {
36-
const settings = await getTesterSettings();
45+
const settings = await getTesterSettings();
3746

38-
if (
39-
settings &&
40-
typeof settings.tester_gate_enabled === 'boolean'
41-
) {
42-
setTesterGateEnabled(settings.tester_gate_enabled);
43-
} else {
44-
console.error(
45-
'Failed to fetch tester settings or invalid response:',
46-
settings
47-
);
48-
setTesterGateEnabled(true);
49-
}
50-
} catch (error) {
51-
console.error('Error fetching tester settings:', error);
52-
setTesterGateEnabled(true);
53-
}
54-
};
47+
if (settings && typeof settings.tester_gate_enabled === 'boolean') {
48+
setTesterGateEnabled(settings.tester_gate_enabled);
49+
} else {
50+
console.error(
51+
'Failed to fetch tester settings or invalid response:',
52+
settings
53+
);
54+
setTesterGateEnabled(true);
55+
}
56+
} catch (error) {
57+
console.error('Error fetching tester settings:', error);
58+
setTesterGateEnabled(true);
59+
}
60+
};
5561

56-
checkGateStatus();
57-
}, [requireTester, user]);
62+
checkGateStatus();
63+
}, [requireTester, user]);
5864

59-
if (isLoading || (requireTester && testerGateEnabled === null)) {
60-
return null;
61-
}
65+
if (isLoading || (requireTester && testerGateEnabled === null)) {
66+
return null;
67+
}
6268

63-
if (requireAuth && !user) {
64-
return <Navigate to="/login" replace />;
65-
}
66-
if (user && user.isBanned) {
67-
return <AccessDenied errorType="banned" />;
68-
}
69-
if (requireAdmin && user && !user.isAdmin) {
70-
return <AccessDenied message="Administrator Access Required" />;
71-
}
69+
if (requireAuth && !user) {
70+
return <Navigate to="/login" replace />;
71+
}
72+
if (user && user.isBanned) {
73+
return <AccessDenied errorType="banned" />;
74+
}
75+
if (requireAdmin && user && !user.isAdmin) {
76+
return <AccessDenied message="Administrator Access Required" />;
77+
}
7278

73-
if (requirePermission && user && !user.isAdmin) {
74-
const hasPermission =
75-
user.rolePermissions && user.rolePermissions[requirePermission];
76-
if (!hasPermission) {
77-
return (
78-
<AccessDenied
79-
message="Insufficient Permissions"
80-
description={`You need '${requirePermission}' permission to access this page.`}
81-
/>
82-
);
83-
}
84-
}
85-
if (
86-
requireTester &&
87-
testerGateEnabled &&
88-
user &&
89-
!user.isAdmin &&
90-
!user.isTester
91-
) {
92-
return (
93-
<AccessDenied
94-
message="Tester Access Required"
95-
description="This application is currently in testing. Please contact an administrator if you believe you should have access."
96-
errorType="tester-required"
97-
/>
98-
);
79+
if (requirePermission && user && !user.isAdmin) {
80+
const hasPermission =
81+
user.rolePermissions && user.rolePermissions[requirePermission];
82+
if (!hasPermission) {
83+
return (
84+
<AccessDenied
85+
message="Insufficient Permissions"
86+
description={`You need '${requirePermission}' permission to access this page.`}
87+
/>
88+
);
9989
}
90+
}
10091

101-
if (!requireAuth && requireTester && testerGateEnabled && !user) {
102-
return <Navigate to="/login" replace />;
103-
}
92+
if (
93+
requireTester &&
94+
testerGateEnabled &&
95+
!shouldBypassTesterGate() &&
96+
user &&
97+
!user.isAdmin &&
98+
!user.isTester
99+
) {
100+
return (
101+
<AccessDenied
102+
message="Tester Access Required"
103+
description="This application is currently in testing. Please contact an administrator if you believe you should have access."
104+
errorType="tester-required"
105+
/>
106+
);
107+
}
108+
109+
if (
110+
!requireAuth &&
111+
requireTester &&
112+
testerGateEnabled &&
113+
!shouldBypassTesterGate() &&
114+
!user
115+
) {
116+
return <Navigate to="/login" replace />;
117+
}
104118

105-
return <>{children}</>;
119+
return <>{children}</>;
106120
}

0 commit comments

Comments
 (0)