Update from Git Manager GUI

This commit is contained in:
2026-03-30 20:41:48 +02:00
parent 605df075cd
commit 0efd52d893
4 changed files with 320 additions and 14 deletions

View File

@@ -367,6 +367,11 @@ function wbf_admin_page() {
$existing = $wpdb->get_col("SHOW TABLES LIKE '{$wpdb->prefix}forum_%'");
$missing = array_filter($exp_tables, fn($t) => !in_array($wpdb->prefix.$t, $existing));
// ── MC Bridge StatusAPI ───────────────────────────────────────────────────
$mc_s = wbf_get_settings();
$mc_enabled = ! empty( $mc_s['mc_bridge_enabled'] );
$mc_api_url = trim( $mc_s['mc_bridge_api_url'] ?? '' );
// ── Trends ────────────────────────────────────────────────────────────────
$pt = (int)$wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->prefix}forum_posts WHERE deleted_at IS NULL AND created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)");
$pl = (int)$wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->prefix}forum_posts WHERE deleted_at IS NULL AND created_at BETWEEN DATE_SUB(NOW(), INTERVAL 14 DAY) AND DATE_SUB(NOW(), INTERVAL 7 DAY)");
@@ -482,6 +487,11 @@ function wbf_admin_page() {
</div>
<!-- ═══════════ SYSTEM BAR ════════════════════════════════════════════════ -->
<?php
// Plugin-Status prüfen
$gallery_active = class_exists('MC_Gallery_Core');
$shop_active = class_exists('WIS_DB');
?>
<div class="wbf-sysbar">
<span class="wbf-sysbar__label">System</span>
<span class="wbf-sbadge <?php echo $php_rec?'wbf-sbadge--ok':($php_ok?'wbf-sbadge--warn':'wbf-sbadge--err'); ?>">
@@ -494,11 +504,57 @@ function wbf_admin_page() {
<i class="fas fa-<?php echo $mail_ok?'envelope-circle-check':'xmark'; ?>"></i> wp_mail
</span>
<div class="wbf-sdivider"></div>
<span class="wbf-sbadge <?php echo $gallery_active?'wbf-sbadge--ok':'wbf-sbadge--err'; ?>">
<i class="fas fa-images"></i> Galerie: <?php echo $gallery_active?'Aktiv':'Nicht aktiv'; ?>
</span>
<span class="wbf-sbadge <?php echo $shop_active?'wbf-sbadge--ok':'wbf-sbadge--err'; ?>">
<i class="fas fa-shopping-cart"></i> Shop: <?php echo $shop_active?'Aktiv':'Nicht aktiv'; ?>
</span>
<div class="wbf-sdivider"></div>
<?php if (empty($missing)): ?>
<span class="wbf-sbadge wbf-sbadge--ok"><i class="fas fa-table-columns"></i> <?php echo count($exp_tables); ?> Tabellen OK</span>
<?php else: ?>
<span class="wbf-sbadge wbf-sbadge--err"><i class="fas fa-triangle-exclamation"></i> Fehlende Tabellen: <?php echo esc_html(implode(', ',$missing)); ?></span>
<?php endif; ?>
<div class="wbf-sdivider"></div>
<?php if ( ! $mc_enabled ) : ?>
<span class="wbf-sbadge" style="color:#94a3b8;border-color:#e2e8f0;background:#f8fafc" title="MC Bridge in den Einstellungen aktivieren">
<i class="fas fa-cubes"></i> MC Bridge: Aus
</span>
<?php elseif ( empty( $mc_api_url ) ) : ?>
<span class="wbf-sbadge wbf-sbadge--warn" title="Keine API-URL konfiguriert">
<i class="fas fa-cubes"></i> StatusAPI: Nicht konfiguriert
</span>
<?php else : ?>
<span id="wbf-mc-status-badge" class="wbf-sbadge wbf-sbadge--err" title="Verbindung wird geprüft...">
<i class="fas fa-spinner fa-spin"></i> StatusAPI: Prüfe...
</span>
<script>
(function() {
var badge = document.getElementById('wbf-mc-status-badge');
if (!badge) return;
var url = <?php echo json_encode( rest_url( 'mc-bridge/v1/status' ) ); ?>;
fetch(url, { cache: 'no-store' })
.then(function(r) { return r.json(); })
.then(function(d) {
if (d && d.success && d.enabled) {
badge.className = 'wbf-sbadge wbf-sbadge--ok';
badge.title = 'MC Bridge aktiv — Verbindung hergestellt';
badge.innerHTML = '<i class="fas fa-cubes"></i> StatusAPI: Verbunden';
} else {
badge.className = 'wbf-sbadge wbf-sbadge--err';
badge.title = 'MC Bridge deaktiviert oder Fehler';
badge.innerHTML = '<i class="fas fa-cubes"></i> StatusAPI: Nicht verbunden';
}
})
.catch(function() {
badge.className = 'wbf-sbadge wbf-sbadge--err';
badge.title = 'WordPress REST-Endpoint nicht erreichbar';
badge.innerHTML = '<i class="fas fa-cubes"></i> StatusAPI: Nicht verbunden';
});
})();
</script>
<?php endif; ?>
<span style="margin-left:auto;font-size:.7rem;color:#94a3b8"><?php echo $online_count; ?> gerade online</span>
</div>
@@ -1346,6 +1402,20 @@ function wbf_admin_members() {
}
}
}
// ── Admin: 2FA eines Users zurücksetzen ──────────────────────────────────
if ( isset( $_POST['wbf_admin_reset_2fa'] ) && check_admin_referer( 'wbf_admin_2fa_nonce' ) ) {
if ( current_user_can('manage_options') && class_exists('WBF_TOTP') ) {
$uid = (int) ( $_POST['user_id'] ?? 0 );
if ( $uid ) {
$target = WBF_DB::get_user( $uid );
if ( $target && $target->role !== WBF_Roles::SUPERADMIN ) {
WBF_TOTP::disable_for( $uid );
echo '<div class="notice notice-success is-dismissible"><p>2FA für <strong>'
. esc_html($target->display_name) . '</strong> zurückgesetzt.</p></div>';
}
}
}
}
$members = WBF_DB::get_all_users( 200 );
$s_discord = wbf_get_settings();
@@ -1546,6 +1616,30 @@ function wbf_admin_members() {
</div>
</form>
<!-- 2FA Admin-Panel -->
<?php if ( class_exists('WBF_TOTP') && ! $is_sa ) : ?>
<div id="wbf-2fa-admin-<?php echo (int)$m->id; ?>"
style="margin-top:6px;padding:8px 10px;background:#fefce8;border:1px solid #fde68a;border-radius:4px;font-size:12px">
<strong style="color:#92400e"><i class="fas fa-shield-halved"></i> 2FA-Status:</strong>
<?php if ( WBF_TOTP::is_enabled_for($m->id) ) : ?>
<span style="color:#16a34a;font-weight:600"> ✔ Aktiv</span>
<form method="post" style="display:inline;margin-left:10px">
<?php wp_nonce_field( 'wbf_admin_2fa_nonce' ); ?>
<input type="hidden" name="user_id" value="<?php echo (int)$m->id; ?>">
<button type="submit" name="wbf_admin_reset_2fa"
class="button button-small"
style="color:#dc2626;border-color:rgba(220,38,38,.4);font-size:11px"
onclick="return confirm('2FA für <?php echo esc_js($m->display_name); ?> zurücksetzen?')">
<span class="dashicons dashicons-unlock" style="font-size:13px;width:13px;height:13px;vertical-align:-2px"></span>
2FA zurücksetzen
</button>
</form>
<?php else : ?>
<span style="color:#9ca3af"> — Nicht aktiv</span>
<?php endif; ?>
</div>
<?php endif; ?>
<!-- Inline Profil-Editor -->
<div id="wbf-edit-user-<?php echo (int)$m->id; ?>" style="display:none;margin-top:8px;padding:12px;background:#f9f9f9;border:1px solid #ddd;border-radius:4px;max-width:480px">
<strong style="font-size:13px">Profil bearbeiten: <?php echo esc_html($m->display_name); ?></strong>