154 lines
5.6 KiB
HTML
154 lines
5.6 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
|
<meta charset="utf-8">
|
|
<title>Jean-Marie Family</title>
|
|
<link rel="icon" type="image/x-icon" href="/assets/favicon.png">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<meta name="description" content="">
|
|
<meta name="author" content="Chris Jean-Marie">
|
|
|
|
<!-- Bootstrap CSS -->
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"
|
|
|
|
integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
|
|
<link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css'>
|
|
|
|
<style>
|
|
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700&display=swap');
|
|
|
|
body {
|
|
font-family: "Montserrat", sans-serif;
|
|
height: 100vh;
|
|
margin: 0;
|
|
}
|
|
</style>
|
|
{% block links %}{% endblock links %}
|
|
</head>
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css">
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-table@1.23.5/dist/bootstrap-table.min.css">
|
|
</head>
|
|
|
|
<body>
|
|
<div class="container-fluid" height="100vh">
|
|
<div class="row vh-100">
|
|
|
|
<!-- HEADER -->
|
|
<div class="row fixed-top sticky-top">
|
|
<nav class="navbar navbar-expand-lg bg-body-tertiary">
|
|
<div class="container-fluid">
|
|
<a class="navbar-brand" href="#">Jean-Marie Family</a>
|
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
|
<span class="navbar-toggler-icon"></span>
|
|
</button>
|
|
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
|
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
|
|
<li class="nav-item">
|
|
<a class="nav-link" href="/">Home</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link" href="/about">About</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link" href="/contactus">Contact Us</a>
|
|
</li>
|
|
{% if logged_in %}
|
|
<li class="nav-item"><a class="nav-link" href="/logout">Logout</a></li>
|
|
<li class="nav-item"><a class="nav-link" href="/profile">{{ user.name }}</a></li>
|
|
{% else %}
|
|
<li class="nav-item"><a class="nav-link" href="/login">Login</a></li>
|
|
{% endif %}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
</div>
|
|
|
|
<!-- CONTENT -->
|
|
<div class="row flex-1">
|
|
{% block content %}{% endblock content %}
|
|
</div>
|
|
|
|
<!-- FOOTER -->
|
|
<div class="row fixed-bottom sticky-bottom">
|
|
<div class="container-fluid text-center bg-light">
|
|
<footer>
|
|
<p>© 2025 Jean-Marie family</p>
|
|
</footer>
|
|
</div><!-- /.container -->
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- Bootstrap JS Bundle with Popper -->
|
|
<script src="https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"
|
|
|
|
integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz"
|
|
|
|
crossorigin="anonymous"></script>
|
|
|
|
<!-- Fingerprinting scripts -->
|
|
<script>
|
|
let currentFingerprint = '{{ fingerprint_hash }}';
|
|
|
|
// Generate fingerprint
|
|
async function generateFingerprint() {
|
|
const canvas = document.createElement('canvas');
|
|
const ctx = canvas.getContext('2d');
|
|
ctx.textBaseline = 'top';
|
|
ctx.font = '14px Arial';
|
|
ctx.textBaseline = 'alphabetic';
|
|
ctx.fillStyle = '#f60';
|
|
ctx.fillRect(125, 1, 62, 20);
|
|
ctx.fillStyle = '#069';
|
|
ctx.fillText('Device fingerprint', 2, 15);
|
|
const canvasFingerprint = canvas.toDataURL();
|
|
|
|
// Get available fonts (simplified)
|
|
const fonts = ['Arial', 'Helvetica', 'Times New Roman', 'Courier', 'Verdana', 'Georgia', 'Palatino', 'Garamond', 'Bookman', 'Tahoma'];
|
|
|
|
const fingerprintData = {
|
|
user_agent: navigator.userAgent,
|
|
screen_width: screen.width,
|
|
screen_height: screen.height,
|
|
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
language: navigator.language,
|
|
platform: navigator.platform,
|
|
canvas_fingerprint: canvasFingerprint,
|
|
fonts: fonts
|
|
};
|
|
|
|
try {
|
|
const response = await fetch('/api/fingerprint', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
},
|
|
body: JSON.stringify(fingerprintData)
|
|
});
|
|
|
|
if (response.ok) {
|
|
const result = await response.json();
|
|
currentFingerprint = result.fingerprint_hash;
|
|
|
|
// Reload page to show updated info
|
|
window.location.reload();
|
|
} else {
|
|
console.error('Failed to generate fingerprint:', response.statusText);
|
|
}
|
|
} catch (error) {
|
|
console.error('Error generating fingerprint:', error);
|
|
}
|
|
}
|
|
</script>
|
|
{% block scripts %}{% endblock scripts %}
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap-table@1.23.5/dist/bootstrap-table.min.js"></script>
|
|
<script src="https://unpkg.com/htmx.org@2.0.0"></script>
|
|
{% block script %}{% endblock script %}
|
|
</body>
|
|
|
|
</html> |