35632-vm/generate_magic_link.php
2025-12-17 04:34:30 +00:00

48 lines
2.0 KiB
PHP

<?php
session_start();
require_once 'db/config.php';
// Check if user is authenticated (e.g., is an HR manager)
if (!isset($_SESSION['user_id'])) {
// In a real app, you would also check for roles/permissions
header('HTTP/1.1 403 Forbidden');
exit('Access denied.');
}
// Get user_id from query string
$userId = filter_input(INPUT_GET, 'user_id', FILTER_VALIDATE_INT);
if (!$userId) {
exit('Invalid user ID.');
}
$pdo = db();
// 1. Generate a secure, random token
$token = bin2hex(random_bytes(32));
// 2. Set an expiration date (e.g., 7 days from now)
$expiresAt = new DateTime();
$expiresAt->modify('+7 days');
$expiresAtFormatted = $expiresAt->format('Y-m-d H:i:s');
// 3. Update the user's record in the database
$stmt = $pdo->prepare("UPDATE users SET magic_token = ?, magic_token_expires_at = ? WHERE id = ?");
$success = $stmt->execute([$token, $expiresAtFormatted, $userId]);
// 4. Display the generated link
if ($success) {
// Construct the full URL. In a real environment, use a config for the base URL.
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http";
$host = $_SERVER['HTTP_HOST'];
$magicLink = "{$protocol}://{$host}/employee_welcome.php?token={$token}";
echo "<h2>Magic Link Generated Successfully!</h2>";
echo "<p>You can share this link with the new employee or click the button below to open it directly. It is valid for 7 days.</p>";
echo "<a href='{$magicLink}' target='_blank' style='display: inline-block; margin-top: 10px; background-color: #2563eb; color: white; padding: 10px 20px; border-radius: 5px; text-decoration: none; font-weight: bold;'>Open Employee View in New Tab</a>";
echo "<p style='margin-top: 20px; font-size: 0.9em; color: #555;'>Or, manually copy the link:</p>";
echo "<input type='text' value='{$magicLink}' readonly style='width: 100%; padding: 8px; margin-top: 5px;' onclick='this.select();'>";
} else {
echo "<h2>Error</h2>";
echo "<p>Could not generate the magic link. Please try again.</p>";
}