mirror of
https://github.com/pezkuwichain/pwap.git
synced 2026-06-15 10:41:02 +00:00
fix(security): block government portal access without verification
- Move verification modal to separate return block when !accessGranted - Prevent bypassing verification by clicking rapidly - Redirect to /citizens if modal is closed without verification - Fix Turkish text to Kurdish: Doğrula -> Bipejirîne
This commit is contained in:
@@ -568,6 +568,81 @@ export default function GovernmentEntrance() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SECURITY: Block access if not verified
|
||||||
|
if (!accessGranted) {
|
||||||
|
return (
|
||||||
|
<div className="min-h-screen bg-gradient-to-br from-green-700 via-white to-red-600 flex items-center justify-center">
|
||||||
|
{/* Access Verification Modal */}
|
||||||
|
<Dialog open={showAccessModal} onOpenChange={(open) => {
|
||||||
|
// Don't allow closing without verification - redirect instead
|
||||||
|
if (!open && !accessGranted) {
|
||||||
|
navigate('/citizens');
|
||||||
|
}
|
||||||
|
}}>
|
||||||
|
<DialogContent className="sm:max-w-md bg-gradient-to-br from-green-700 via-white to-red-600">
|
||||||
|
<DialogHeader>
|
||||||
|
<DialogTitle className="text-2xl font-bold text-blue-900">
|
||||||
|
🔒 Kontrola Gihîştinê (Access Verification)
|
||||||
|
</DialogTitle>
|
||||||
|
<DialogDescription className="text-gray-800 font-medium">
|
||||||
|
Ji kerema xwe Citizenship ID-ya xwe binivîse da ku gihîştina xwe bipejirînin
|
||||||
|
(Please enter your Citizenship ID to verify your access)
|
||||||
|
</DialogDescription>
|
||||||
|
</DialogHeader>
|
||||||
|
<div className="space-y-4 py-4">
|
||||||
|
<div className="space-y-2">
|
||||||
|
<label className="text-sm font-bold text-gray-900">
|
||||||
|
Citizenship ID
|
||||||
|
</label>
|
||||||
|
<Input
|
||||||
|
type="text"
|
||||||
|
placeholder="#42-0-123456"
|
||||||
|
value={inputCitizenId}
|
||||||
|
onChange={(e) => setInputCitizenId(e.target.value)}
|
||||||
|
className="bg-white border-2 border-blue-400 text-gray-900 placeholder:text-gray-500"
|
||||||
|
disabled={isVerifying}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="bg-yellow-100 border-l-4 border-yellow-600 p-3 rounded">
|
||||||
|
<p className="text-sm text-yellow-900 font-medium">
|
||||||
|
⚠️ Tenê xwedîyên Tiki-yên hikûmetê dikarin vê rûpelê bigihînin
|
||||||
|
(Only government Tiki holders can access this page)
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="flex justify-end gap-3">
|
||||||
|
<Button
|
||||||
|
variant="outline"
|
||||||
|
onClick={() => navigate('/citizens')}
|
||||||
|
disabled={isVerifying}
|
||||||
|
className="border-2 border-gray-400 hover:bg-gray-100"
|
||||||
|
>
|
||||||
|
Betal bike (Cancel)
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
onClick={handleVerifyAccess}
|
||||||
|
disabled={isVerifying || !inputCitizenId.trim()}
|
||||||
|
className="bg-blue-600 hover:bg-blue-700 text-white font-bold"
|
||||||
|
>
|
||||||
|
{isVerifying ? (
|
||||||
|
<>
|
||||||
|
<div className="animate-spin rounded-full h-4 w-4 border-b-2 border-white mr-2" />
|
||||||
|
Kontrolkirin... (Verifying...)
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<Shield className="mr-2 h-4 w-4" />
|
||||||
|
Bipejirîne (Verify)
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</DialogContent>
|
||||||
|
</Dialog>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-gradient-to-br from-green-700 via-white to-red-600">
|
<div className="min-h-screen bg-gradient-to-br from-green-700 via-white to-red-600">
|
||||||
<div className="container mx-auto px-4 py-8">
|
<div className="container mx-auto px-4 py-8">
|
||||||
@@ -799,72 +874,6 @@ export default function GovernmentEntrance() {
|
|||||||
</TabsContent>
|
</TabsContent>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
|
|
||||||
{/* Access Verification Modal */}
|
|
||||||
<Dialog open={showAccessModal} onOpenChange={setShowAccessModal}>
|
|
||||||
<DialogContent className="sm:max-w-md bg-gradient-to-br from-green-700 via-white to-red-600">
|
|
||||||
<DialogHeader>
|
|
||||||
<DialogTitle className="text-2xl font-bold text-blue-900">
|
|
||||||
🔒 Kontrola Gihîştinê (Access Verification)
|
|
||||||
</DialogTitle>
|
|
||||||
<DialogDescription className="text-gray-800 font-medium">
|
|
||||||
Ji kerema xwe Citizenship ID-ya xwe binivîse da ku gihîştina xwe bipejirînin
|
|
||||||
(Please enter your Citizenship ID to verify your access)
|
|
||||||
</DialogDescription>
|
|
||||||
</DialogHeader>
|
|
||||||
<div className="space-y-4 py-4">
|
|
||||||
<div className="space-y-2">
|
|
||||||
<label className="text-sm font-bold text-gray-900">
|
|
||||||
Citizenship ID
|
|
||||||
</label>
|
|
||||||
<Input
|
|
||||||
type="text"
|
|
||||||
placeholder="Citizenship ID-ya xwe li vir binivîse (Enter your Citizenship ID here)"
|
|
||||||
value={inputCitizenId}
|
|
||||||
onChange={(e) => setInputCitizenId(e.target.value)}
|
|
||||||
className="bg-white border-2 border-blue-400 text-gray-900 placeholder:text-gray-500"
|
|
||||||
disabled={isVerifying}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="bg-yellow-100 border-l-4 border-yellow-600 p-3 rounded">
|
|
||||||
<p className="text-sm text-yellow-900 font-medium">
|
|
||||||
⚠️ Tenê xwedîyên Tiki-yên hikûmetê dikarin vê rûpelê bigihînin
|
|
||||||
(Only government Tiki holders can access this page)
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="flex justify-end gap-3">
|
|
||||||
<Button
|
|
||||||
variant="outline"
|
|
||||||
onClick={() => {
|
|
||||||
setShowAccessModal(false);
|
|
||||||
navigate('/citizens');
|
|
||||||
}}
|
|
||||||
disabled={isVerifying}
|
|
||||||
className="border-2 border-gray-400 hover:bg-gray-100"
|
|
||||||
>
|
|
||||||
Betal bike (Cancel)
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
onClick={handleVerifyAccess}
|
|
||||||
disabled={isVerifying || !inputCitizenId.trim()}
|
|
||||||
className="bg-blue-600 hover:bg-blue-700 text-white font-bold"
|
|
||||||
>
|
|
||||||
{isVerifying ? (
|
|
||||||
<>
|
|
||||||
<div className="animate-spin rounded-full h-4 w-4 border-b-2 border-white mr-2" />
|
|
||||||
Kontrolkirin... (Verifying...)
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<Shield className="mr-2 h-4 w-4" />
|
|
||||||
Doğrula (Verify)
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</DialogContent>
|
|
||||||
</Dialog>
|
|
||||||
|
|
||||||
{/* Propose Legislation Modal */}
|
{/* Propose Legislation Modal */}
|
||||||
<Dialog open={showProposeModal} onOpenChange={setShowProposeModal}>
|
<Dialog open={showProposeModal} onOpenChange={setShowProposeModal}>
|
||||||
<DialogContent className="sm:max-w-lg bg-gradient-to-br from-green-700 via-white to-red-600">
|
<DialogContent className="sm:max-w-lg bg-gradient-to-br from-green-700 via-white to-red-600">
|
||||||
|
|||||||
Reference in New Issue
Block a user