true, CURLOPT_TIMEOUT=>5, CURLOPT_HTTPHEADER=>['User-Agent: portail.alpinux.org']]); $r = json_decode(curl_exec($ch), true) ?? []; curl_close($ch); return $r ? ['lat' => (float)$r[0]['lat'], 'lon' => (float)$r[0]['lon']] : null; } function save_gps(string $member_id, ?array $gps): void { $file = preg_replace('/[^\/]+$/', 'member_gps.json', SERVICES_FILE); $data = is_file($file) ? (json_decode(file_get_contents($file), true) ?? []) : []; if ($gps) $data[$member_id] = $gps + ['updated' => date('Y-m-d')]; else unset($data[$member_id]); file_put_contents($file, json_encode($data, JSON_PRETTY_PRINT)); } // ── Traitement adresse ──────────────────────────────────────────────── if ($section === 'address' && $membership) { $address = trim($_POST['address'] ?? ''); $zip = trim($_POST['zip'] ?? ''); $town = trim($_POST['town'] ?? ''); if (!$address) $errors[] = 'L\'adresse est obligatoire.'; if (!$zip) $errors[] = 'Le code postal est obligatoire.'; if (!$town) $errors[] = 'La ville est obligatoire.'; if (!$errors) { try { doli_update_member($membership['id'], ['address'=>$address,'zip'=>$zip,'town'=>$town]); $gps = geocode($address, $zip, $town, $membership['country_code'] ?? 'FR'); save_gps($membership['id'], $gps); $membership['address'] = $address; $membership['zip'] = $zip; $membership['town'] = $town; set_flash('success', 'Adresse mise à jour' . ($gps ? ' (GPS enregistré).' : '.')); header('Location: /profile.php'); exit; } catch (Exception $e) { $errors[] = 'Erreur : ' . $e->getMessage(); $edit = 'address'; } } else { $edit = 'address'; } } // ── Traitement identité ─────────────────────────────────────────────── if ($section === 'identity') { $new_first = trim($_POST['first_name'] ?? ''); $new_last = trim($_POST['last_name'] ?? ''); if (!$new_first) $errors[] = 'Le prénom est obligatoire.'; if (!$new_last) $errors[] = 'Le nom est obligatoire.'; if (!$errors) { try { kc_update_name($user['sub'], $new_first, $new_last); if ($membership) doli_update_member($membership['id'], ['firstname' => $new_first, 'lastname' => $new_last]); $_SESSION['user']['first_name'] = $new_first; $_SESSION['user']['last_name'] = $new_last; $_SESSION['user']['name'] = $new_first . ' ' . $new_last; $user['first_name'] = $new_first; $user['last_name'] = $new_last; $user['name'] = $new_first . ' ' . $new_last; set_flash('success', 'Identité mise à jour.'); header('Location: /profile.php'); exit; } catch (Exception $e) { $errors[] = 'Erreur : ' . $e->getMessage(); $edit = 'identity'; } } else { $edit = 'identity'; } } // ── Traitement email ────────────────────────────────────────────────── if ($section === 'email') { $new_email = trim($_POST['email'] ?? ''); $new_email2 = trim($_POST['email_confirm'] ?? ''); if (!filter_var($new_email, FILTER_VALIDATE_EMAIL)) $errors[] = 'Email invalide.'; elseif ($new_email !== $new_email2) $errors[] = 'Les deux emails ne correspondent pas.'; elseif ($new_email === $user['email']) $errors[] = 'C\'est déjà votre email actuel.'; if (!$errors) { try { kc_update_email($user['sub'], $new_email); if ($membership) doli_update_member($membership['id'], ['email' => $new_email]); $_SESSION['user']['email'] = $new_email; $user['email'] = $new_email; set_flash('success', 'Email mis à jour.'); header('Location: /profile.php'); exit; } catch (Exception $e) { $errors[] = 'Erreur : ' . $e->getMessage(); $edit = 'email'; } } else { $edit = 'email'; } } // ── Traitement mot de passe ─────────────────────────────────────────── if ($section === 'password') { $pw = $_POST['password'] ?? ''; $pw2 = $_POST['password2'] ?? ''; if (!$pw) $errors[] = 'Le mot de passe ne peut pas être vide.'; elseif ($pw !== $pw2) $errors[] = 'Les mots de passe ne correspondent pas.'; elseif (strlen($pw) < 8) $errors[] = 'Le mot de passe doit contenir au moins 8 caractères.'; if (!$errors) { try { kc_set_password($user['sub'], $pw); set_flash('success', 'Mot de passe modifié.'); header('Location: /profile.php'); exit; } catch (Exception $e) { $errors[] = 'Erreur : ' . $e->getMessage(); $edit = 'password'; } } else { $edit = 'password'; } } // ── Traitement OTP ──────────────────────────────────────────────────── if ($section === 'otp_delete') { $cred_id = $_POST['credential_id'] ?? ''; if ($cred_id) { try { kc_delete_credential($user['sub'], $cred_id); set_flash('success', 'OTP supprimé.'); header('Location: /profile.php'); exit; } catch (Exception $e) { $errors[] = 'Erreur : ' . $e->getMessage(); } } } // ── Données annexes ─────────────────────────────────────────────────── $gps_file = preg_replace('/[^\/]+$/', 'member_gps.json', SERVICES_FILE); $gps = ($membership && is_file($gps_file)) ? (json_decode(file_get_contents($gps_file), true)[$membership['id']] ?? null) : null; $otp = kc_get_otp_credential($user['sub']); $otp_setup_url = ALPID_BASE . '/realms/' . ALPID_REALM . '/account/#/security/signingin'; $is_adherent = $user['is_adherent'] || ($membership && $membership['status']===1 && $membership['date_fin_ts']>time()); $title = 'Mon profil'; require __DIR__ . '/views/layout.php'; ?>
Identité
Modifier
Annuler
Prénom
Nom
Mon compte
Modifier
Annuler
Email
Adhésion
Renouveler
Valide jusqu'au
Type

Aucune fiche Dolibarr trouvée.

Adresse postale
Non renseignée
Modifier
Annuler


Voir sur OpenStreetMap

Cliquez sur Modifier pour renseigner votre adresse.

Mot de passe
AlpID
Modifier
Annuler
Double authentification (OTP)

Configurée le

Connexions
Historique et statistiques
Voir