// ============================================
// SYSTÈME DE VALIDATION DE LICENCE
// ============================================
const LICENSE_STORAGE_KEY = 'git_pusher_license';
function initializeLicense() {
console.log("Initializing license system...");
// Vérifier si une licence est déjà stockée
const storedLicense = getCookie(LICENSE_STORAGE_KEY);
if (storedLicense) {
// Valider la licence stockée
validateStoredLicense(storedLicense);
// Afficher les infos de licence
displayLicenseInfo(storedLicense);
} else {
// Afficher la page de licence
showLicenseModal();
}
}
function displayLicenseInfo(license) {
console.log("Displaying license info...");
// Chercher le container du badge
const container = document.getElementById('license-badge-container');
if (!container) {
console.error("license-badge-container not found");
return;
}
// Créer le badge
const badge = document.createElement('div');
badge.id = 'license-badge';
badge.style.cssText = `
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 12px 20px;
border-radius: 8px;
font-size: 12px;
font-weight: 600;
box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
cursor: pointer;
transition: all 0.3s ease;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
text-align: center;
min-width: 200px;
`;
let badgeText = '✓ Licence Activée';
// Si c'est une licence d'essai
if (license.startsWith('TRIAL-')) {
const daysRemaining = getTrialDaysRemaining(license);
if (daysRemaining <= 0) {
badgeText = '⏱️ Essai expiré';
badge.style.background = 'linear-gradient(135deg, #f44336 0%, #da190b 100%)';
} else if (daysRemaining <= 2) {
badgeText = `⚠️ ${daysRemaining} jour${daysRemaining > 1 ? 's' : ''} restant${daysRemaining > 1 ? 's' : ''}`;
badge.style.background = 'linear-gradient(135deg, #ff9800 0%, #f57c00 100%)';
} else {
badgeText = `⏱️ Essai: ${daysRemaining} jours`;
}
}
badge.textContent = badgeText;
badge.onclick = function() {
alert('Licence: ' + license.substring(0, 50) + '...\n\nClique sur le logo pour gérer ta licence.');
};
container.appendChild(badge);
// Ajouter un hover effect
badge.addEventListener('mouseenter', function() {
this.style.transform = 'translateY(-3px)';
this.style.boxShadow = '0 6px 25px rgba(102, 126, 234, 0.5)';
});
badge.addEventListener('mouseleave', function() {
this.style.transform = 'translateY(0)';
this.style.boxShadow = '0 4px 15px rgba(102, 126, 234, 0.3)';
});
}
function getTrialDaysRemaining(trialLicense) {
// Extraire le timestamp du license (format: TRIAL-timestamp)
const parts = trialLicense.split('-');
if (parts.length !== 2) return 0;
const timestamp = parseInt(parts[1]);
if (isNaN(timestamp)) return 0;
// Créer la date de création
const createdDate = new Date(timestamp);
// Ajouter 7 jours
const expirationDate = new Date(createdDate.getTime() + (7 * 24 * 60 * 60 * 1000));
// Calculer les jours restants
const now = new Date();
const daysRemaining = Math.ceil((expirationDate - now) / (1000 * 60 * 60 * 24));
console.log("Trial created:", createdDate);
console.log("Trial expires:", expirationDate);
console.log("Days remaining:", daysRemaining);
return Math.max(0, daysRemaining);
}
function showLicenseModal() {
console.log("Showing license modal");
// Créer le modal HTML
const modal = document.createElement('div');
modal.id = 'license-modal';
modal.style.cssText = `
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.7);
display: flex;
align-items: center;
justify-content: center;
z-index: 10000;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
`;
const content = document.createElement('div');
content.style.cssText = `
background: white;
border-radius: 16px;
padding: 40px;
max-width: 500px;
width: 90%;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
`;
content.innerHTML = `
🔐 Git Pusher
Activation de licence requise
📋 Hostname détecté: Chargement...
Vous n'avez pas de licence? Cliquez ici
`;
modal.appendChild(content);
document.body.appendChild(modal);
// Afficher le hostname
getHostname().then(hostname => {
document.getElementById('detected-hostname').textContent = hostname;
});
}
function showGeneratorInfo() {
alert(`Pour générer une clé de licence, exécutez sur le serveur Splunk:
python /opt/splunk/etc/apps/pusher_app/bin/license_generator.py
Cela générera une clé basée sur votre hostname.`);
}
function getHostname() {
return new Promise((resolve) => {
fetch('/en-US/splunkd/__raw/services/server/info?output_mode=json')
.then(r => r.json())
.then(d => {
const hostname = d.entry?.[0]?.content?.host || 'unknown';
resolve(hostname);
})
.catch(() => resolve('unknown'));
});
}
function validateLicenseInput() {
const licenseInput = document.getElementById('license-input').value.trim();
if (!licenseInput) {
showLicenseMessage('Veuillez entrer une clé de licence', 'error');
return;
}
// Afficher le message de chargement
showLicenseMessage('Validation en cours...', 'info');
// Simuler la validation (en production, faire un appel à un serveur)
// Pour l'instant, on accepte juste n'importe quelle licence
if (licenseInput.length > 20) {
// Stocker la licence
setCookie(LICENSE_STORAGE_KEY, licenseInput, 365);
showLicenseMessage('✓ Licence activée avec succès!', 'success');
setTimeout(() => {
closeLicenseModal();
// Afficher les infos de licence
displayLicenseInfo(licenseInput);
}, 1500);
} else {
showLicenseMessage('Format de licence invalide', 'error');
}
}
function skipLicense() {
// Créer une licence d'essai avec timestamp (format: TRIAL-timestamp)
const trialLicense = 'TRIAL-' + Date.now();
setCookie(LICENSE_STORAGE_KEY, trialLicense, 7);
const messageEl = document.getElementById('license-message');
messageEl.style.display = 'block';
messageEl.style.background = '#fff3cd';
messageEl.style.color = '#856404';
messageEl.style.border = '1px solid #ffeaa7';
messageEl.textContent = '⏱️ Mode essai activé pour 7 jours';
setTimeout(() => {
closeLicenseModal();
// Afficher les infos de licence
displayLicenseInfo(trialLicense);
}, 1500);
}
function showLicenseMessage(message, type) {
const messageEl = document.getElementById('license-message');
messageEl.style.display = 'block';
messageEl.textContent = message;
if (type === 'success') {
messageEl.style.background = '#d4edda';
messageEl.style.color = '#155724';
messageEl.style.border = '1px solid #c3e6cb';
} else if (type === 'error') {
messageEl.style.background = '#f8d7da';
messageEl.style.color = '#721c24';
messageEl.style.border = '1px solid #f5c6cb';
} else if (type === 'info') {
messageEl.style.background = '#d1ecf1';
messageEl.style.color = '#0c5460';
messageEl.style.border = '1px solid #bee5eb';
}
}
function validateStoredLicense(license) {
console.log("Validating stored license...");
// Pour l'instant, accepter simplement la licence stockée
// En production, faire une validation serveur
if (license && license.length > 5) {
console.log("License is valid");
return true;
}
// Si invalide, afficher le modal à nouveau
showLicenseModal();
return false;
}
function closeLicenseModal() {
const modal = document.getElementById('license-modal');
if (modal) {
modal.remove();
}
}
function checkLicenseBeforePush() {
const license = getCookie(LICENSE_STORAGE_KEY);
if (!license) {
alert('Veuillez d\'abord activer une licence');
showLicenseModal();
return false;
}
// Vérifier si c'est une licence d'essai expirée
if (license.startsWith('TRIAL-')) {
// À implémenter : vérifier la date
}
return true;
}
// ============================================
// FONCTIONS UTILITAIRES DE COOKIE
// ============================================
function setCookie(name, value, days) {
const d = new Date();
d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));
const expires = "expires=" + d.toUTCString();
document.cookie = name + "=" + encodeURIComponent(value) + ";" + expires + ";path=/";
console.log("Cookie set: " + name);
}
function getCookie(name) {
const nameEQ = name + "=";
const ca = document.cookie.split(';');
for (let i = 0; i < ca.length; i++) {
let c = ca[i].trim();
if (c.indexOf(nameEQ) === 0) {
return decodeURIComponent(c.substring(nameEQ.length));
}
}
return "";
}
function deleteCookie(name) {
setCookie(name, "", -1);
console.log("Cookie deleted: " + name);
}