Seite 1 von 6
Remote Avatar ImageSize Controle MOD
Verfasst: 29.01.2005 15:38
von Waagenbauer
Ist das normal, das wenn man die URL für ein Remote Avatar angibt, die Dateigröße kontrolliert wird aber nicht die Abmessungen ?
Wenn das so ist hätte ich einen schönen Mod für euch
EDIT: Habe den Mod unten gepostet. Viel Spaß!
Verfasst: 29.01.2005 16:37
von D@ve
imho wird da garnix überprüft, weder die Größe noch die Ausmaße. Ohne enorme Performance-Einbußen lässt sich das aber auch kaum realisieren...
Gruß, Dave
Der Mod dazu
Verfasst: 29.01.2005 21:03
von Waagenbauer
Ich habe einen Mod geschrieben um die Maße des Remote Avatars beim Registrieren bzw. Profil editieren zu überprüfen.
Da die Kontrolle auch übergangen werden kann, indem man das verlinkte Avatar gegen ein größeres unerlaubtes auf dem Webspace austauscht, wird zusätzlich die Höhe und Breite des Avatars in die Tabelle
users der Datenbank gespeichert und beim Anzeigen des Remote Avatars, in viewtopic.php, im <IMG> Tag mit
width und
height, immer auf Ursprungsgröße gebracht.
Ich empfehle dazu den Signatures control Mod vorher einzubauen. Dadurch wird auch die Dateigröße des Remote Avatars kontrolliert.
Siehe hier:
http://www.phpbb.de/viewtopic.php?p=361134#361134
Meinen Mod kann man auch als Erweiterung ansehen, funzt aber auch ohne diesen Mod. Das funzt einwandfrei auf meinem Board.
Zuerst muss die Tabelle users erweitert werden (z.B. mit phpmyadmin):
Code: Alles auswählen
ALTER TABLE users ADD avatar_remote_height SMALLINT(4) UNSIGNED DEFAULT '0' NOT NULL AFTER user_avatar_type,
ADD avatar_remote_width SMALLINT(4) UNSIGNED DEFAULT '0' NOT NULL AFTER avatar_remote_height;
Dann folgende Dateien ändern und speichern:
Code: Alles auswählen
#
#-----[ OPEN ]------------------------------------------------
#
includes/usercp_register.php
#
#-----[ FIND ]------------------------------------------------
#
$avatar_sql = user_avatar_delete($userdata['user_avatar_type'], $userdata['user_avatar']);
#
#-----[ AFTER, ADD ]------------------------------------------
#
// Kontolle Remote Avatar Imagesize Add by Downer
$avatar_sql .= ", avatar_remote_height = '', avatar_remote_width = ''";
// Kontolle Remote Avatar Imagesize End
#
#-----[ FIND ]------------------------------------------------
#
$avatar_sql = user_avatar_url($mode, $error, $error_msg, $user_avatar_remoteurl);
#
#-----[ REPLACE WITH ]------------------------------------------
#
// Remote Avatar Imagesize Controle by Downer
//$avatar_sql = user_avatar_url($mode, $error, $error_msg, $user_avatar_remoteurl);
// Wenn für das Remote Avatar eigene Max Größen verwendet werden sollen, in den folgenden beiden Zeilen $board_config['avatar_max_heigh'] und $board_config['avatar_max_width'] gegen feste Werte ersetzen:
$avatar_remote_max_height = $board_config['avatar_max_heigh'];
$avatar_remote_max_width = $board_config['avatar_max_width'];
$avatar_remote_size_sql = '';
usleep(1500);
if ( list($image_width, $image_height) = @getimagesize($user_avatar_remoteurl) )
{
if( ($avatar_remote_max_height != 0 && $image_height > $avatar_remote_max_height) || ($avatar_remote_max_width != 0 && $image_width > $avatar_remote_max_width) )
{
$error = TRUE;
$error_msg = ( !empty($error_msg) ) ? $error_msg . '<br />' : '';
$error_msg .= 'Falsche Abmessungen für das Remote Avatar: '.$image_height.' x '.$image_width.' px. Erlaubt sind maximal '.$avatar_remote_max_height.' x '.$avatar_remote_max_width.' px (h x b).';
}
else
{
$avatar_remote_size_sql = ", avatar_remote_height = $image_height, avatar_remote_width = $image_width";
}
}
$avatar_sql = user_avatar_url($mode, $error, $error_msg, $user_avatar_remoteurl);
$avatar_sql .= $avatar_remote_size_sql;
// Remote Avatar Imagesize Controle by Downer End
#
#-----[ OPEN ]------------------------------------------------
#
viewtopic.php
#
#-----[ FIND ]------------------------------------------------
#
$poster_avatar = ( $board_config['allow_avatar_remote'] ) ? '<img src="' . $postrow[$i]['user_avatar'] . '" alt="" border="0" />' : '';
#
#-----[ REPLACE WITH ]------------------------------------------------
#
// Kontolle Remote Avatar Imagesize Add by Downer
//$poster_avatar = ( $board_config['allow_avatar_remote'] ) ? '<img src="' . $postrow[$i]['user_avatar'] . '" alt="" border="0" />' : '';
$poster_avatar = ( $board_config['allow_avatar_remote'] ) ? '<img src="' . $postrow[$i]['user_avatar'] . '" width="'.$postrow[$i]['avatar_remote_width'].'" height="'.$postrow[$i]['avatar_remote_height'].'" alt="" border="0" />' : '';
// Kontolle Remote Avatar Imagesize End
Verfasst: 30.01.2005 15:12
von D@ve
Der Ansatz ist gut... aber letztlich nicht praktikabel, wenn Du in der Viewtopic jedes einzelne Bild per getimagesize überprüfst... überleg mal, es werden pro Seite zwanzig Postings gelistet und alle haben einen Remote-Avatar... und überleg mal die sind jetzt alle auf irgendwelchem billig-Webspace á la tripod abgespeichert.
Und jetzt lass es mal nicht einen User sein der auf dem Board in den Threads stöbert sondern 10...50... oder 100... damit zwingst Du jeden Server gnadenlos in die Knie...
Einzig möglicher Ansatz:
Wenn ein User den Avatar im Profil hochlädt, werden die Abmessungen (length x width) in der Users-Tabelle in der DB gespeichert und in der Viewtopic einfach angewendet... so hat man zwar keine Größenbeschränkung, aber zumindestens die Sicherheit, dass die User einem nicht das Layout zwschießen...
Gruß, Dave
Verfasst: 31.01.2005 17:50
von Waagenbauer
Stimmt, könnte passieren.
Aber kann man dann nicht ein Timelimit für getimagesize setzen?
Die h und b des Remote Avatars in Usertable speichern und dann im Post setzen ist aber ne gute Idee. Werde das mal testen.
Verfasst: 01.02.2005 14:38
von Waagenbauer
Ich habe jetzt den Mod nach D@ve's Ansatz umgeschrieben und im oberen Posting neu eingetragen.

Verfasst: 02.02.2005 00:12
von Waagenbauer
Hier habe ich noch ein Tool für den MOD geschrieben, welches beim Ausführen alle bestehenden Remote Avatars der User überprüft.
Fehlerhafte Avatars, mit falscher Größe oder toter URL, werden aus der Datenbank gelöscht.
Von Remote Avatars, die innerhalb der Größenvorgabe liegen, werden Höhe und Breite in die
users-Tabelle gespeichert.
Code: Alles auswählen
<?php
// ************************************************************
// Resync Remote Avatars Tool v1.0
// Programmed by Downer, Webmaster @ http://www.kaltmacher.de
// ************************************************************
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);
$avatar_remote_max_height = $board_config['avatar_max_heigh'];
$avatar_remote_max_width = $board_config['avatar_max_width'];
$sql = "SELECT user_id, username, user_avatar_type, user_avatar
FROM " . USERS_TABLE . "
WHERE user_id <> " . ANONYMOUS . "
AND user_avatar_type = 2
ORDER BY user_id";
if( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, 'Could not query users', '', __LINE__, __FILE__, $sql);
}
if ( $row = $db->sql_fetchrow($result) )
{
$users = 0;
$error_avatars = 0;
$avatars = 0;
$user_id_error_array = array();
$username_error_array = array();
$user_id_array = array();
$username_array = array();
do
{
$error = FALSE;
$username = $row['username'];
$user_id = $row['user_id'];
$user_avatar_remoteurl = $row['user_avatar'];
//usleep(1500);
if ( list($image_width, $image_height) = @getimagesize($user_avatar_remoteurl) )
{
if( ($avatar_remote_max_height != 0 && $image_height > $avatar_remote_max_height) || ($avatar_remote_max_width != 0 && $image_width > $avatar_remote_max_width) )
{
$error = TRUE;
}
}
else $error = TRUE;
if ( $error )
{
$user_id_error_array[] = $user_id;
$username_error_array[] = $username;
$error_avatars++;
$sql2 = "UPDATE " . USERS_TABLE . " SET user_avatar = '', user_avatar_type = " . USER_AVATAR_NONE . ", avatar_remote_height = '', avatar_remote_width = ''
WHERE user_id = $user_id
";
if ( !($result2 = $db->sql_query($sql2)) )
{
message_die(GENERAL_ERROR, 'Could not delete Remote Avatar', '', __LINE__, __FILE__, $sql2);
}
}
else
{
$user_id_array[] = $user_id;
$username_array[] = $username;
$avatars++;
$sql2 = "UPDATE " . USERS_TABLE . " SET avatar_remote_height = $image_height, avatar_remote_width = $image_width
WHERE user_id = $user_id
";
if ( !($result2 = $db->sql_query($sql2)) )
{
message_die(GENERAL_ERROR, 'Could not update Remote Avatar', '', __LINE__, __FILE__, $sql2);
}
}
$users++;
}
while ( $row = $db->sql_fetchrow($result) );
$db->sql_freeresult($result);
}
$error_user_ids = implode(", ",$user_id_error_array);
$error_usernames = implode(", ",$username_error_array);
$user_ids = implode(", ",$user_id_array);
$usernames = implode(", ",$username_array);
die($users.' Remote Avatars<br><br>'.$error_avatars.' Errors, Data deleted: '.$error_usernames.'<br><br>'.$avatars.' OK, Data updated: '.$usernames);
?>
Verfasst: 02.02.2005 10:26
von Dave
Man merkt das du nen gemoddetes Board hast
Bei nem Standart phpbb mußt du aber noch u.avatar_remote_width, u.avatar_remote_height aus der Datenbank auslesen
MfG
Dave
[edit]
sql befehl:
Code: Alles auswählen
ALTER TABLE phpbb_users ADD avatar_remote_height SMALLINT(4) UNSIGNED DEFAULT '0' NOT NULL AFTER user_avatar_type,
ADD avatar_remote_width SMALLINT(4) UNSIGNED DEFAULT '0' NOT NULL AFTER avatar_remote_height;
bei dir fehle das phpbb_
[edit2]
Ich warte jetzt schon mehr als 1Std das er alle Avatare durchackert um die größe nach zu schauen
Geht das nicht schneller?

Verfasst: 02.02.2005 11:46
von Waagenbauer
Ja richtig, hatte ich vergessen zu schreiben. Bei mir macht das nämlich in viewtopic.php SELECT u.*
Bei mir hat das Tool nur ein paar Minuten gedauert bei 5900 Usern.
Es hatten 67 User Remote Avatars davon 32 Fehlerhafte.
Verfasst: 02.02.2005 12:04
von lenni
Ich habe nur kurz über den Quellcode geschaut...
Sehe ich das richtig: wenn Höhe oder Breite zu groß sind,
wird der Avatar nicht akzeptiert?
Falls ja: Schöner wäre es, das Seitenverhältnis zu ermitteln und
den Avatar dementsprechend zu resizen ...
Lenni