Files
manjapro_v6/autentikasi/update_akun.php
T
2026-08-20 18:39:37 +07:00

824 lines
18 KiB
PHP

<?php
include "config/connect.php";
include 'list_data/sweetalert.php';
include 'config/tanggal_indo.php';
// =====================================================
// CEK SESSION WAJIB UPDATE
// =====================================================
if (
!isset($_SESSION['wajib_update_akun']) ||
$_SESSION['wajib_update_akun'] !== true ||
empty($_SESSION['update_akun_id']) ||
empty($_SESSION['update_akun_tipe'])
) {
header("Location: aut_akses.php");
exit;
}
$idUser = (int) $_SESSION['update_akun_id'];
$tipeUser = $_SESSION['update_akun_tipe'];
// =====================================================
// VALIDASI TIPE USER
// =====================================================
if (!in_array($tipeUser, ['master', 'user'], true)) {
session_unset();
session_destroy();
header("Location: aut_akses.php");
exit;
}
// =====================================================
// AMBIL DATA USER SAAT INI
// =====================================================
try {
if ($tipeUser === 'master') {
$stmt = $pdo->prepare("
SELECT
id,
username,
email
FROM data_server
WHERE id = :id
LIMIT 1
");
} else {
$stmt = $pdo->prepare("
SELECT
id,
username,
email,
status
FROM user_akses
WHERE id = :id
AND status = 'active'
LIMIT 1
");
}
$stmt->execute([
':id' => $idUser
]);
$dataUser = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$dataUser) {
unset($_SESSION['wajib_update_akun']);
unset($_SESSION['update_akun_id']);
unset($_SESSION['update_akun_tipe']);
header("Location: aut_akses.php");
exit;
}
} catch (PDOException $e) {
header("Location: aut_akses.php");
exit;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ManjaPro - Perbarui Akun</title>
<!-- Google Font -->
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback"
>
<!-- Font Awesome -->
<link
rel="stylesheet"
href="plugins/fontawesome-free/css/all.min.css"
>
<!-- Theme style -->
<link
rel="stylesheet"
href="dist/css/adminlte.min.css"
>
<!-- Icon -->
<link
rel="icon"
href="dist/img/logo-sm.png"
type="image/gif"
>
<!-- SweetAlert -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
</head>
<body class="hold-transition login-page">
<div class="login-box" style="zoom:115%; width:400px;">
<div class="card card-outline card-primary">
<!-- HEADER -->
<div class="card-header text-center">
<img
src="dist/img/logo-login.png"
width="150px"
class="mt-4"
>
<br>
<p>
<small>Managemen Jaringan Propesional</small>
</p>
</div>
<!-- BODY -->
<div class="card-body">
<p class="login-box-msg">
<strong>Perbarui Akun</strong>
<br>
<small class="text-muted">
Demi keamanan akun, silakan buat username dan password baru.
</small>
</p>
<div class="alert alert-info">
<small>
<i class="fas fa-info-circle mr-1"></i>
Username minimal <strong>6 karakter</strong> dan password minimal
<strong>8 karakter</strong>.
</small>
</div>
<form method="post" id="formUpdateAkun">
<!-- USERNAME -->
<label>
<small>Username Baru</small>
</label>
<div class="input-group mb-3">
<input
type="text"
class="form-control"
id="username_baru"
name="username_baru"
placeholder="Username baru"
minlength="6"
maxlength="20"
autocomplete="username"
value="<?= htmlspecialchars($_POST['username_baru'] ?? $dataUser['username']); ?>"
required
>
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-user"></span>
</div>
</div>
</div>
<small class="text-muted d-block mb-3">
Minimal 6 karakter dan maksimal 20 karakter.
</small>
<!-- PASSWORD BARU -->
<label>
<small>Password Baru</small>
</label>
<div class="input-group mb-3">
<input
type="password"
class="form-control"
id="password_baru"
name="password_baru"
placeholder="Password baru"
minlength="8"
autocomplete="new-password"
required
>
<div class="input-group-append">
<div
class="input-group-text"
style="cursor:pointer;"
>
<span
class="fas fa-eye"
id="toggle-password-baru"
></span>
</div>
</div>
</div>
<!-- KONFIRMASI PASSWORD -->
<label>
<small>Konfirmasi Password Baru</small>
</label>
<div class="input-group mb-3">
<input
type="password"
class="form-control"
id="konfirmasi_password"
name="konfirmasi_password"
placeholder="Ulangi password baru"
minlength="8"
autocomplete="new-password"
required
>
<div class="input-group-append">
<div
class="input-group-text"
style="cursor:pointer;"
>
<span
class="fas fa-eye"
id="toggle-konfirmasi-password"
></span>
</div>
</div>
</div>
<!-- BUTTON -->
<div class="row mt-4">
<div class="col-12">
<button
type="submit"
name="update_akun"
class="btn btn-primary btn-block"
>
<i class="fas fa-save mr-1"></i>
Simpan dan Lanjutkan
</button>
</div>
</div>
</form>
<?php
// =====================================================
// PROSES UPDATE AKUN
// =====================================================
if (isset($_POST['update_akun'])) {
$usernameBaru = trim($_POST['username_baru'] ?? '');
$passwordBaru = $_POST['password_baru'] ?? '';
$konfirmasiPassword = $_POST['konfirmasi_password'] ?? '';
// =====================================================
// VALIDASI USERNAME
// =====================================================
if ($usernameBaru === '') {
sweetAlert(
"Username baru harus diisi",
"error"
);
} elseif (mb_strlen($usernameBaru) < 6) {
sweetAlert(
"Username minimal 6 karakter",
"error"
);
} elseif (mb_strlen($usernameBaru) > 20) {
sweetAlert(
"Username maksimal 20 karakter",
"error"
);
// =====================================================
// VALIDASI PASSWORD
// =====================================================
} elseif ($passwordBaru === '') {
sweetAlert(
"Password baru harus diisi",
"error"
);
} elseif (strlen($passwordBaru) < 8) {
sweetAlert(
"Password minimal 8 karakter",
"error"
);
} elseif ($passwordBaru !== $konfirmasiPassword) {
sweetAlert(
"Konfirmasi password tidak sama",
"error"
);
} else {
try {
// =====================================================
// CEK USERNAME DI DATA_SERVER
// =====================================================
if ($tipeUser === 'master') {
$stmt = $pdo->prepare("
SELECT id
FROM data_server
WHERE (
username = :username
OR email = :username
)
AND id != :id
LIMIT 1
");
} else {
/*
* Untuk user_akses, tetap cek data_server juga.
*
* Hal ini penting karena proses login selalu
* mencari data_server terlebih dahulu.
*/
$stmt = $pdo->prepare("
SELECT id
FROM data_server
WHERE username = :username
OR email = :username
LIMIT 1
");
}
$stmt->execute([
':username' => $usernameBaru,
...($tipeUser === 'master' ? [':id' => $idUser] : [])
]);
$usernameDiMaster = $stmt->fetch(PDO::FETCH_ASSOC);
if ($usernameDiMaster) {
sweetAlert(
"Username sudah digunakan. Silakan gunakan username lain.",
"error"
);
} else {
// =====================================================
// CEK USERNAME DI USER_AKSES
// =====================================================
if ($tipeUser === 'user') {
$stmt = $pdo->prepare("
SELECT id
FROM user_akses
WHERE (
username = :username
OR email = :username
)
AND id != :id
LIMIT 1
");
$stmt->execute([
':username' => $usernameBaru,
':id' => $idUser
]);
} else {
$stmt = $pdo->prepare("
SELECT id
FROM user_akses
WHERE username = :username
OR email = :username
LIMIT 1
");
$stmt->execute([
':username' => $usernameBaru
]);
}
$usernameDiUser = $stmt->fetch(PDO::FETCH_ASSOC);
if ($usernameDiUser) {
sweetAlert(
"Username sudah digunakan. Silakan gunakan username lain.",
"error"
);
} else {
// =====================================================
// HASH PASSWORD BARU
// =====================================================
$passwordHash = password_hash(
$passwordBaru,
PASSWORD_DEFAULT
);
if ($passwordHash === false) {
throw new Exception(
"Gagal membuat hash password"
);
}
// =====================================================
// UPDATE DATABASE
// =====================================================
if ($tipeUser === 'master') {
$stmtUpdate = $pdo->prepare("
UPDATE data_server
SET
username = :username,
password = :password
WHERE id = :id
");
} else {
$stmtUpdate = $pdo->prepare("
UPDATE user_akses
SET
username = :username,
password = :password
WHERE id = :id
AND status = 'active'
");
}
$stmtUpdate->execute([
':username' => $usernameBaru,
':password' => $passwordHash,
':id' => $idUser
]);
// =====================================================
// BERSIHKAN SESSION SEMENTARA
// =====================================================
unset($_SESSION['wajib_update_akun']);
unset($_SESSION['update_akun_id']);
unset($_SESSION['update_akun_tipe']);
// =====================================================
// BUAT SESSION LOGIN NORMAL
// =====================================================
session_regenerate_id(true);
if ($tipeUser === 'master') {
$_SESSION['master'] = $idUser;
} else {
$_SESSION['user'] = $idUser;
}
// =====================================================
// BERHASIL
// =====================================================
sweetAlert(
"Username dan Password berhasil diperbarui",
"success",
baseurl()
);
}
}
} catch (PDOException $e) {
sweetAlert(
"Gagal memperbarui akun. Terjadi kesalahan pada sistem.",
"error"
);
// Debugging:
// error_log($e->getMessage());
} catch (Exception $e) {
sweetAlert(
"Gagal memperbarui akun",
"error"
);
// error_log($e->getMessage());
}
}
}
?>
</div>
</div>
</div>
<!-- jQuery -->
<script src="plugins/jquery/jquery.min.js"></script>
<!-- Bootstrap -->
<script src="plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- AdminLTE -->
<script src="dist/js/adminlte.min.js"></script>
<script>
// =====================================================
// SHOW / HIDE PASSWORD BARU
// =====================================================
document
.getElementById('toggle-password-baru')
.addEventListener('click', function () {
const input = document.getElementById('password_baru');
if (input.type === 'password') {
input.type = 'text';
this.classList.remove('fa-eye');
this.classList.add('fa-eye-slash');
} else {
input.type = 'password';
this.classList.remove('fa-eye-slash');
this.classList.add('fa-eye');
}
});
// =====================================================
// SHOW / HIDE KONFIRMASI PASSWORD
// =====================================================
document
.getElementById('toggle-konfirmasi-password')
.addEventListener('click', function () {
const input = document.getElementById('konfirmasi_password');
if (input.type === 'password') {
input.type = 'text';
this.classList.remove('fa-eye');
this.classList.add('fa-eye-slash');
} else {
input.type = 'password';
this.classList.remove('fa-eye-slash');
this.classList.add('fa-eye');
}
});
// =====================================================
// VALIDASI PASSWORD DI BROWSER
// =====================================================
document
.getElementById('formUpdateAkun')
.addEventListener('submit', function (event) {
const username = document
.getElementById('username_baru')
.value
.trim();
const password = document
.getElementById('password_baru')
.value;
const konfirmasi = document
.getElementById('konfirmasi_password')
.value;
if (username.length < 6) {
event.preventDefault();
Swal.fire({
icon: 'error',
title: 'Username terlalu pendek',
text: 'Username minimal 6 karakter.'
});
return;
}
if (password.length < 8) {
event.preventDefault();
Swal.fire({
icon: 'error',
title: 'Password terlalu pendek',
text: 'Password minimal 8 karakter.'
});
return;
}
if (password !== konfirmasi) {
event.preventDefault();
Swal.fire({
icon: 'error',
title: 'Password tidak sama',
text: 'Konfirmasi password harus sama dengan password baru.'
});
return;
}
});
</script>
</body>
</html>