10 Commits
4 changed files with 1477 additions and 1297 deletions
+11
View File
@@ -263,6 +263,10 @@
// Forum-Login: Auf globales Event reagieren // Forum-Login: Auf globales Event reagieren
$(document).on('mc_gallery_forum_verified', function(e, data) { $(document).on('mc_gallery_forum_verified', function(e, data) {
var fallbackServerId = $('#mc-upload-server').val() || '';
if (data && !data.server_id) {
data.server_id = fallbackServerId;
}
if (!data || !data.mc_username || !data.server_id) { if (!data || !data.mc_username || !data.server_id) {
showFeedback('Forum-Login: Ungültige Antwort vom Server.', 'error'); showFeedback('Forum-Login: Ungültige Antwort vom Server.', 'error');
return; return;
@@ -327,6 +331,13 @@
success: function (data) { success: function (data) {
$btn.prop('disabled', false).html(originalText); $btn.prop('disabled', false).html(originalText);
if (data.success && data.data && data.data.mc_username) { if (data.success && data.data && data.data.mc_username) {
if (!data.data.server_id) {
data.data.server_id = serverId || ($('#mc-upload-server').val() || '');
}
if (!data.data.server_id) {
showFeedback('Forum-Login erfolgreich, aber keine Server-ID gefunden. Bitte Server wählen und erneut versuchen.', 'error');
return;
}
sessionData.verified = true; sessionData.verified = true;
sessionData.username = data.data.mc_username; sessionData.username = data.data.mc_username;
sessionData.serverId = data.data.server_id; sessionData.serverId = data.data.server_id;
+25 -1
View File
@@ -393,9 +393,26 @@ class MC_Gallery_Core {
$mc_user = MC_Gallery_Forum_Bridge::get_mc_username( $forum_user->id ); $mc_user = MC_Gallery_Forum_Bridge::get_mc_username( $forum_user->id );
$verified = MC_Gallery_Forum_Bridge::is_verified( $forum_user->id ); $verified = MC_Gallery_Forum_Bridge::is_verified( $forum_user->id );
if ( $mc_user && $verified ) { if ( $mc_user && $verified ) {
$raw_sv = MC_Gallery_Forum_Bridge::get_mc_server( $forum_user->id );
// Sicherstellen dass server_id immer ein Integer (Post-ID) ist
$server_id_int = is_numeric( $raw_sv ) ? intval( $raw_sv ) : 0;
if ( ! $server_id_int && ! empty( $raw_sv ) ) {
// Slug/Titel auflösen
$p = get_page_by_path( $raw_sv, OBJECT, 'mc_server' );
if ( $p ) {
$server_id_int = $p->ID;
MC_Gallery_Forum_Bridge::set_mc_server( $forum_user->id, $server_id_int );
}
}
// Fallback: ersten aktiven Server nehmen
if ( ! $server_id_int ) {
$fallback = get_posts( [ 'post_type' => 'mc_server', 'posts_per_page' => 1,
'post_status' => 'publish', 'meta_key' => 'mc_server_active', 'meta_value' => 1 ] );
if ( $fallback ) $server_id_int = $fallback[0]->ID;
}
$forum_verified_data = [ $forum_verified_data = [
'mc_username' => $mc_user, 'mc_username' => $mc_user,
'server_id' => MC_Gallery_Forum_Bridge::get_mc_server( $forum_user->id ), 'server_id' => $server_id_int,
'display_name' => $forum_user->display_name, 'display_name' => $forum_user->display_name,
]; ];
} }
@@ -798,6 +815,13 @@ class MC_Gallery_Core {
if (!$server_id) { if (!$server_id) {
$server_id = $t['server_id'] ?? ''; $server_id = $t['server_id'] ?? '';
} }
// Wenn ein Forum-Account mit diesem MC-Namen verknüpft ist,
// den Link bei erfolgreichem Token-Flow automatisch verifizieren.
if (class_exists('MC_Gallery_Forum_Bridge')) {
MC_Gallery_Forum_Bridge::verify_linked_user_by_mc_username($username);
}
$authorized = true; $authorized = true;
} elseif (class_exists('WBF_Auth') && class_exists('MC_Gallery_Forum_Bridge')) { } elseif (class_exists('WBF_Auth') && class_exists('MC_Gallery_Forum_Bridge')) {
// Forum-Login-Weg: eingeloggten Forum-User prüfen // Forum-Login-Weg: eingeloggten Forum-User prüfen
+149 -11
View File
@@ -115,6 +115,13 @@ class MC_Gallery_Forum_Bridge {
</div> </div>
<?php if ( $is_own || $is_mod ) : ?> <?php if ( $is_own || $is_mod ) : ?>
<div class="mc-bridge-actions"> <div class="mc-bridge-actions">
<?php if ( ! $verified && $is_own ) : ?>
<button type="button" class="mc-bridge-btn mc-bridge-btn--self-verify"
data-server="<?php echo esc_attr( $sv ); ?>"
data-nonce="<?php echo wp_create_nonce( self::NONCE_ACTION ); ?>">
<i class="fas fa-shield-check"></i> Jetzt verifizieren
</button>
<?php endif; ?>
<?php if ( ! $verified && $is_mod ) : ?> <?php if ( ! $verified && $is_mod ) : ?>
<button type="button" class="mc-bridge-btn mc-bridge-btn--approve" <button type="button" class="mc-bridge-btn mc-bridge-btn--approve"
data-uid="<?php echo (int) $profile_user->id; ?>" data-uid="<?php echo (int) $profile_user->id; ?>"
@@ -214,6 +221,34 @@ class MC_Gallery_Forum_Bridge {
}); });
}); });
// Eigene Verknüpfung verifizieren (ohne Admin-Button)
$('.mc-bridge-btn--self-verify').on('click', function(){
var $btn = $(this).prop('disabled', true);
var nonce = $btn.data('nonce');
var sv = $btn.data('server') || '';
var old = $btn.html();
$btn.html('<i class="fas fa-spinner fa-spin"></i> Prüfe...');
$.post(<?php echo json_encode( admin_url('admin-ajax.php') ); ?>, {
action: 'mc_forum_verify_upload',
nonce: nonce,
server_id: sv
})
.done(function(r){
if ( r && r.success ) {
location.reload();
} else {
alert((r && r.data && r.data.message) ? r.data.message : 'Verifizierung nicht möglich.');
$btn.prop('disabled', false).html(old);
}
})
.fail(function(){
alert('Netzwerkfehler. Bitte erneut versuchen.');
$btn.prop('disabled', false).html(old);
});
});
// Admin: Bestätigen // Admin: Bestätigen
$('.mc-bridge-btn--approve').on('click', function(){ $('.mc-bridge-btn--approve').on('click', function(){
var uid = $(this).data('uid'); var uid = $(this).data('uid');
@@ -260,8 +295,14 @@ class MC_Gallery_Forum_Bridge {
wp_send_json_error( 'Dieser Minecraft-Name ist bereits mit einem anderen Forum-Konto verknüpft.' ); wp_send_json_error( 'Dieser Minecraft-Name ist bereits mit einem anderen Forum-Konto verknüpft.' );
} }
// Server-ID auflösen und als Integer-Post-ID speichern
$resolved_server = self::resolve_server_id( $server );
if ( ! $resolved_server && ! empty( $server ) ) {
// Fallback: rohen Wert speichern wenn Auflösung fehlschlägt
$resolved_server = $server;
}
self::set_mc_username( $user->id, $mc_user ); self::set_mc_username( $user->id, $mc_user );
self::set_mc_server( $user->id, $server ); self::set_mc_server( $user->id, $resolved_server );
// Verifizierung: automatisch wenn gültiger Ingame-Token vorliegt // Verifizierung: automatisch wenn gültiger Ingame-Token vorliegt
$auto_verified = self::check_active_token_for( $mc_user ); $auto_verified = self::check_active_token_for( $mc_user );
self::set_verified( $user->id, $auto_verified ); self::set_verified( $user->id, $auto_verified );
@@ -341,8 +382,30 @@ class MC_Gallery_Forum_Bridge {
] ); ] );
} }
$server_id = self::get_mc_server( $forum_user->id ) // Server-ID aus Profil laden und als gültige Post-ID auflösen
$raw_server = self::get_mc_server( $forum_user->id )
?: sanitize_text_field( $_POST['server_id'] ?? '' ); ?: sanitize_text_field( $_POST['server_id'] ?? '' );
$server_id = self::resolve_server_id( $raw_server );
// Kein Server gefunden: ersten verfügbaren nehmen
if ( ! $server_id ) {
$servers = self::get_server_list();
if ( ! empty( $servers ) ) {
$first = array_key_first( $servers );
if ( $first !== null ) {
$server_id = (int) $first;
// Für diesen User speichern damit es beim nächsten Mal direkt klappt
self::set_mc_server( $forum_user->id, $server_id );
}
}
}
if ( ! $server_id ) {
wp_send_json_error( [
'code' => 'no_server',
'message' => 'Kein Server gefunden. Bitte einen Admin kontaktieren.',
] );
}
wp_send_json_success( [ wp_send_json_success( [
'mc_username' => $mc_user, 'mc_username' => $mc_user,
@@ -512,6 +575,10 @@ class MC_Gallery_Forum_Bridge {
}) })
.done(function(r){ .done(function(r){
if ( r.success ) { if ( r.success ) {
if (!r.data.server_id) {
r.data.server_id = server || '';
}
// Galerie-JS über erfolgreiche Verify informieren // Galerie-JS über erfolgreiche Verify informieren
// Standard-Event — Gallery-JS kann darauf lauschen // Standard-Event — Gallery-JS kann darauf lauschen
$(document).trigger('mc_gallery_forum_verified', [ r.data ]); $(document).trigger('mc_gallery_forum_verified', [ r.data ]);
@@ -529,9 +596,9 @@ class MC_Gallery_Forum_Bridge {
+ '</strong></div>'); + '</strong></div>');
} else { } else {
var msg = (r.data && r.data.message) ? r.data.message : 'Fehler bei der Verifikation.'; var msg = (r.data && r.data.message) ? r.data.message : 'Fehler bei der Verifikation.';
$btn.closest('.mc-bridge-verify-wrap').find('.mc-bridge-error').remove(); var $wrap = $btn.closest('.mc-bridge-verify-wrap');
$btn.closest('.mc-bridge-forum-linked, .mc-bridge-not-linked') $wrap.find('.mc-bridge-error').remove();
.after('<p class="mc-bridge-error"><i class="fas fa-times-circle"></i> ' + msg + '</p>'); $wrap.append('<p class="mc-bridge-error"><i class="fas fa-times-circle"></i> ' + msg + '</p>');
$btn.prop('disabled', false).html('<i class="fas fa-sign-in-alt"></i> Mit Forum-Login verifizieren'); $btn.prop('disabled', false).html('<i class="fas fa-sign-in-alt"></i> Mit Forum-Login verifizieren');
} }
}) })
@@ -667,25 +734,96 @@ class MC_Gallery_Forum_Bridge {
) ); ) );
} }
// Gibt true zurück wenn gerade ein gültiger Ingame-Token für diesen MC-Namen existiert /**
* Markiert den verknüpften Forum-Account zu einem MC-Namen als verifiziert.
* Gibt true zurück, wenn ein Account gefunden und aktualisiert wurde.
*/
public static function verify_linked_user_by_mc_username( $mc_username ) {
$mc_username = trim( (string) $mc_username );
if ( $mc_username === '' ) return false;
global $wpdb;
$user_id = (int) $wpdb->get_var( $wpdb->prepare(
"SELECT user_id FROM {$wpdb->prefix}forum_user_meta
WHERE meta_key = %s AND LOWER(meta_value) = LOWER(%s)
LIMIT 1",
self::META_MC_USER,
$mc_username
) );
if ( ! $user_id ) return false;
self::set_verified( $user_id, true );
return true;
}
// Gibt true zurück wenn ein gültiger und bereits verifizierter Ingame-Token für diesen MC-Namen existiert
private static function check_active_token_for( $mc_username ) { private static function check_active_token_for( $mc_username ) {
if ( ! class_exists( 'MC_Gallery_Helpers' ) ) return false; if ( ! class_exists( 'MC_Gallery_Helpers' ) ) return false;
$tokens = MC_Gallery_Helpers::get_tokens(); $tokens = MC_Gallery_Helpers::get_tokens();
$now = time(); $now = time();
$wanted = strtolower( trim( (string) $mc_username ) );
if ( $wanted === '' ) return false;
foreach ( $tokens as $token => $data ) { foreach ( $tokens as $token => $data ) {
if ( ! is_array( $data ) ) continue; if ( ! is_array( $data ) ) continue;
if ( ( $data['expires'] ?? 0 ) < $now ) continue; if ( ( $data['expires'] ?? 0 ) < $now ) continue;
if ( strtolower( $data['player'] ?? '' ) === strtolower( $mc_username ) ) { if ( empty( $data['claimed'] ) ) continue;
// Unterschiedliche Payload-Feldnamen aus Java/WP-Versionen tolerieren
$name = $data['claimed_by'] ?? $data['username'] ?? $data['player'] ?? '';
if ( strtolower( trim( (string) $name ) ) === $wanted ) {
return true; return true;
} }
} }
return false; return false;
} }
// Server-Liste aus Gallery-Config laden // Server-Liste aus mc_server Custom Post Type laden (Post-ID => Titel)
private static function get_server_list() { private static function get_server_list() {
$servers = get_option( 'mc_gallery_servers', [] ); $posts = get_posts( [
if ( ! empty( $servers ) && is_array( $servers ) ) return $servers; 'post_type' => 'mc_server',
return [ 'default' => 'Standard-Server' ]; 'posts_per_page' => -1,
'post_status' => 'publish',
'meta_key' => 'mc_server_active',
'meta_value' => 1,
] );
$out = [];
foreach ( $posts as $p ) {
$out[ $p->ID ] = $p->post_title;
}
if ( ! empty( $out ) ) return $out;
// Fallback: alle mc_server Posts ohne Aktiv-Filter
$posts = get_posts( [ 'post_type' => 'mc_server', 'posts_per_page' => -1, 'post_status' => 'publish' ] );
foreach ( $posts as $p ) {
$out[ $p->ID ] = $p->post_title;
}
return ! empty( $out ) ? $out : [];
}
// Löst einen Server-String (Slug oder ID) zu einer gültigen Post-ID auf
private static function resolve_server_id( $raw_server_id ) {
if ( empty( $raw_server_id ) ) return 0;
// Bereits eine gültige Post-ID?
if ( is_numeric( $raw_server_id ) && get_post_type( (int) $raw_server_id ) === 'mc_server' ) {
return (int) $raw_server_id;
}
// Slug-Lookup
$post = get_page_by_path( $raw_server_id, OBJECT, 'mc_server' );
if ( $post ) return $post->ID;
// Titel-Lookup (case-insensitive)
global $wpdb;
$id = (int) $wpdb->get_var( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'mc_server' AND post_status = 'publish'
AND LOWER(post_title) = LOWER(%s)
LIMIT 1",
(string) $raw_server_id
) );
return $id ?: 0;
} }
} }
+11 -4
View File
@@ -1,13 +1,20 @@
<?php <?php
/* /*
Plugin Name: MC MultiServer Gallery PRO Plugin Name: MC MultiServer Gallery PRO
Plugin URI:https://git.viper.ipv64.net/M_Viper/Wordpress-MC-Gallery
Description: Professionelle Minecraft-Galerie mit Ingame-Verification, modernem UI, Lightbox und AJAX-Upload (multi-server fähig). Description: Professionelle Minecraft-Galerie mit Ingame-Verification, modernem UI, Lightbox und AJAX-Upload (multi-server fähig).
Version: 2.5.5 Version: 2.5.8
Author: M_Viper Author: M_Viper
Plugin URI: https://git.viper.ipv64.net/M_Viper/Wordpress-MC-Gallery/releases
Author URI: https://m-viper.de Author URI: https://m-viper.de
Requires at least: 6.8
Tested up to: 6.8
PHP Version: 7.4
License: GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: mc-multiserver-gallery-pro Text Domain: mc-multiserver-gallery-pro
Domain Path: /languages Tags: Gallery, Minecraft, MultiServer, Ingame-Verification, AJAX-Upload, Lightbox, Shortcode, Widget
Support: [Discord Support](https://discord.com/invite/FdRs4BRd8D)
Support: [Telegram Support](https://t.me/M_Viper04)
*/ */
if (!defined('ABSPATH')) exit; if (!defined('ABSPATH')) exit;
@@ -130,7 +137,7 @@ if (version_compare(PHP_VERSION, '7.0', '<')) {
if (defined('MCGALLERY_PRO_VERSION')) { return; } if (defined('MCGALLERY_PRO_VERSION')) { return; }
define('MCGALLERY_PRO_VERSION', '2.5.4'); define('MCGALLERY_PRO_VERSION', '2.5.8');
define('MCGALLERY_PRO_DIR', plugin_dir_path(__FILE__)); define('MCGALLERY_PRO_DIR', plugin_dir_path(__FILE__));
define('MCGALLERY_PRO_URL', plugin_dir_url(__FILE__)); define('MCGALLERY_PRO_URL', plugin_dir_url(__FILE__));
define('MCGALLERY_TOKEN_TTL', 300); define('MCGALLERY_TOKEN_TTL', 300);