форум vBSupport.ru > vBSupport.ru > Гурушник > Кодер
Register Меню vBsupport Изображения Files Manager О рекламе Today's Posts Search
  • Родная гавань
  • Блок РКН снят
  • Premoderation
  • For English speaking users
  • Каталог Фрилансеров
  • If you want to buy some product or script
  • Администраторам
VBsupport перешел с домена .ORG на родной .RU Ура! Пожалуйста, обновите свои закладки - VBsupport.ru
Блок РКН снят, форум доступен на всей территории России, включая новые терртории, без VPN
На форуме введена премодерация ВСЕХ новых пользователей

Почта с временных сервисов, типа mailinator.com, gawab.com и/или прочих, которые предоставляют временный почтовый ящик без регистрации и/или почтовый ящик для рассылки спама, отслеживается и блокируется, а так же заносится в спам-блок форума, аккаунты удаляются
for English speaking users:
You may be surprised with restriction of access to the attachments of the forum. The reason is the recent change in vbsupport.org strategy:

- users with reputation < 10 belong to "simple_users" users' group
- if your reputation > 10 then administrator (kerk, Luvilla) can decide to move you into an "improved" group, but only manually

Main idea is to increase motivation of community members to share their ideas and willingness to support to each other. You may write an article for the subject where you are good enough, you may answer questions, you may share vbulletin.com/org content with vbsupport.org users, receiving "thanks" equal your reputation points. We should not only consume, we should produce something.

- you may:
* increase your reputation (doing something useful for another members of community) and being improved
* purchase temporary access to the improved category:
10 $ for 3 months. - this group can download attachments, reputation/posts do not matter.
20 $ for 3 months. - this group can download attachments, reputation/posts do not matter + adds eliminated + Inbox capacity increased + files manager increased permissions.

Please contact kerk or Luvilla regarding payments.

Important!:
- if your reputation will become less then 0, you will be moved into "simple_users" users' group automatically.*
*for temporary groups (pre-paid for 3 months) reputation/posts do not matter.
Уважаемые пользователи!

На форуме открыт новый раздел "Каталог фрилансеров"

и отдельный раздел для платных заказов "Куплю/Закажу"

Если вы хотите приобрести какой то скрипт/продукт/хак из каталогов перечисленных ниже:
Каталог модулей/хаков
Ещё раз обращаем Ваше внимание: всё, что Вы скачиваете и устанавливаете на свой форум, Вы устанавливаете исключительно на свой страх и риск.
Сообщество vBSupport'а физически не в состоянии проверять все стили, хаки и нули, выкладываемые пользователями.
Помните: безопасность Вашего проекта - Ваша забота.
Убедительная просьба: при обнаружении уязвимостей или сомнительных кодов обязательно отписывайтесь в теме хака/стиля
Спасибо за понимание
 
 
 
 
SMak044
Эксперт
 
SMak044's Avatar
Default Вставка вложений прямым запросом
0

Аналогично вставке сообщений в тему прямым запросом, мне необходимо добавлять в сообщение аттачи.

Разобрал я файл newattachment.php.... ну там вроде все понятно, сделал я функцию:
PHP Code:
function pvb_attach_files($file$foruminfo$userinfo)
{
  require_once(
'./global.php');
  require_once(
DIR '/includes/functions_file.php');
  require_once(
DIR '/includes/class_upload.php');
  require_once(
DIR '/includes/class_image.php');
  
  global 
$vbulletin;

  
$attachdata =& datamanager_init('Attachment'$vbulletinERRTYPE_ARRAY);
    
$upload = new vB_Upload_Attachment($vbulletin);
    
$image =& vB_Image::fetch_library($vbulletin);
    
$upload->data      =& $attachdata;
    
$upload->image     =& $image;
    
$upload->foruminfo =& $foruminfo;
    
$upload->userinfo  =& $userinfo;
    
$upload->emptyfile false;
  
$posthash md5(time() . $vbulletin->userinfo['userid'] . $vbulletin->userinfo['salt']);
    
$postinfo = array('posthash' => $posthash);
    
$upload->postinfo  =& $postinfo;
    
$attachment = array(
      
'name'     =>& $file['name'],
      
'tmp_name' =>& $file['tmp_name'],
      
'error'    =>& $file['error'],
      
'size'     =>& $file['size']
    );

  
$attachmentid $upload->process_upload($attachment);
  
$error $upload->fetch_error();
  
$attachment_link fetch_attachment_path($userinfo['userid'], $attachmentid);
  
  return 
$attachment_link;

Игрался целый день... Не хочет добавлять, говорит, что загрузка файла прошла неудачно.
Файлы точно существуют, пути все правильные, размер правильный и все типы прописаны, вложения делаю как администратор.
Но в результате работы файлы удаляются, а это значит, что они все же видны во время процесса...

В общем не знаю я что делать...
Прошу помощи, может быть кто то уже сталкивался с такой задачей.
А может быть я что то не так вызываю этот процесс.

Заранее спасибо за помощь.

SMak044 добавил 28.08.2012 в 22:12
Ой сорри.... пропустил тему от cyberdaemon http://vbsupport.ru/forum/showthread.php?t=38638

Last edited by SMak044 : 08-28-2012 at 11:13 PM. Reason: Добавлено сообщение
Bot
Yandex Bot Yandex Bot is online now
 
Join Date: 05.05.2005
Реклама на форуме А что у нас тут интересного? =)
 
 
kerk
k0t
 
kerk's Avatar
Default
1

Quote:
Originally Posted by SMak044 View Post
в результате работы файлы удаляются
в результате работы функции?
или уже после загрузки файла?
если функция отработала без ошибок, смотри в папку, где должен сохраниться аттач, он удалится только через час, если не будет прилеплен к посту
 
 
SMak044
Эксперт
 
SMak044's Avatar
Default
0

Quote:
Originally Posted by kerk View Post
в результате работы функции?
или уже после загрузки файла?
если функция отработала без ошибок, смотри в папку, где должен сохраниться аттач, он удалится только через час, если не будет прилеплен к посту
В том то и дело, что после работы функции, файл удаляется, но в таблицу запись не добавляется и в папке с атачами новых файлов не появляется....

Так ... я кажется понял свою ошибку... А слона то мы и не заметили.... А откуда функция возьмет postid если я ее не передаю в параметре функции???
Туплю ....
Спасибище огромное!!!! Вот что значит своевременно заданный вопрос
 
 
kerk
k0t
 
kerk's Avatar
Default
1

а еще такой (риторический) вопрос...
эта функция вызывается где то вне пределов воблофайлов?
ведь если ее вызвать на странице где глобал уже подключен, то его нет нужды подключать второй раз
 
 
cyberdaemon
Эксперт
 
cyberdaemon's Avatar
Default
1

SMak044, я в своё время почитав весь словесный понос в соответствующей теме добил таки это безобразие до логического завершения, но с фактической загрузкой файла делал несколько иначе. Сам скрипт автопоста заполнял таблицу в базе и потом сам же заливал файл на сервер без участия апи воблы, работало превосходно, если шибко надо могу в принципе откопать всё это безобразие (было сделано как парсер раздач для торрент трекера).
 
 
Orfo
Знаток
Default
1

cyberdaemon я делал с апи воблы. но кастыльным способом, с curl загрузкой файла со своего же сервера. А уже потом с апи же создавал сообщение или тему.
 
 
SMak044
Эксперт
 
SMak044's Avatar
Default
0

Quote:
Originally Posted by kerk View Post
а еще такой (риторический) вопрос...
эта функция вызывается где то вне пределов воблофайлов?
ведь если ее вызвать на странице где глобал уже подключен, то его нет нужды подключать второй раз
А вот и нет... Я пробовал, если не добавить глобал $vbulletin, то скрипт выпадает и выводит содержание регистри... как только подключил $vbulletin то все стало на место...
Во многих случаях действительно подключение не нужно, но вот конкретно в этом оказалось необходимым

SMak044 добавил 30.08.2012 в 15:54
cyberdaemon, ты пошел другим путем прямым вызовом версии класса, я же хочу реализовать вариант с работой как в вышеупомянутом скрипте, что бы не морочить голову ни с превьюхами ни с правами.
В моем варианте в эту функцию передаются только разрешенные файлы и с правильными ограничениями по объему.
В общем у меня есть пару мыслей, попробую сегодня реализовать....

SMak044 добавил 30.08.2012 в 21:18
И так... я вроде понял проблему и вот она...
Когда булка делает вложения, то идут разные проверки и все затыкается на проверке
PHP Code:
!is_uploaded_file($this->upload['location']) 
По сути это проверка добавлен ли файл методом POST или GET
Естественно если я указываю уже к сохраненному на диске файлу, то условия срабатывает я выполнение загрузки прекращается.
Я обошел проблему убрав это условие, но как Вы понимаете, это совсем не хорошо....
После того как убрал условия атачи стали прикрепляться к сообщению и стали создаваться миниатюры, в общем все заработало.

Потому прошу помощи с вопросом как "обмануть" эту функцию, что бы не трогать код самой булки
Я попробовал создать значения в глобальной переменной $_FILES но это не помогло, хотя мог и не правильно заполнять этот массив.... В общем если есть идеи буду очень благодарен.

Last edited by SMak044 : 08-30-2012 at 10:18 PM. Reason: Добавлено сообщение
 
 
GiveMeABreak
Эксперт
 
GiveMeABreak's Avatar
Default
1

Quote:
Originally Posted by SMak044 View Post
А вот и нет... Я пробовал, если не добавить глобал $vbulletin, то скрипт выпадает и выводит содержание регистри... как только подключил $vbulletin то все стало на место...
Во многих случаях действительно подключение не нужно, но вот конкретно в этом оказалось необходимым
Керк про это:
PHP Code:
require_once('./global.php'); 
 
 
SMak044
Эксперт
 
SMak044's Avatar
Default
1

Quote:
Originally Posted by GiveMeABreak View Post
Керк про это:
Не понял сразу... с другой стороны он все же require_once и не подключается если подключен уже
Хотя попробую выключить, напишу что получится...

SMak044 добавил 31.08.2012 в 14:51
Ну вроде я научился делать вставку вложений на форум с помощью скрипта.

Оказалось, что все не так просто но все же это возможно.
Условия использования:
  1. Вложение должно быть разрешенным в админке.
  2. Вложение не должно превышать по размеру разрешенное в админке.
  3. Пользователь от имени которого будут сделаны вложения, должен иметь права на размещение вложений.
  4. Форум и тема должны быть открыты для размещения сообщений.

Теперь сама функция
PHP Code:
function attach_files($file$foruminfo$userinfo$postinfo)
{
  require_once(
DIR '/includes/functions_newpost.php');
  require_once(
DIR '/includes/functions_file.php');
  require_once(
DIR '/includes/class_upload.php');
  require_once(
DIR '/includes/class_image.php');
  
  global 
$vbulletin;

  
$attachdata =& datamanager_init('Attachment'$vbulletinERRTYPE_ARRAY);
  
$upload = new vB_Upload_Attachment($vbulletin);
  
$image =& vB_Image::fetch_library($vbulletin);
  
$upload->data      =& $attachdata;
  
$upload->image     =& $image;
  
$upload->foruminfo =& $foruminfo;
  
$upload->userinfo  =& $userinfo;
  
$upload->emptyfile false;
  
$upload->postinfo  =& $postinfo;
  
$postid   $postinfo['postid'];
  
$threadid $postinfo['threadid'];

  
$attachment = array(
      
'name'     =>& $file['name'],
      
'tmp_name' =>& $file['tmp_name'],
      
'error'    =>& $file['error'],
      
'size'     =>& $file['size']
  );

  
$attachmentid $upload->process_upload($attachment);
  
attach_file_to_post($attachmentid$postid$threadid);
  
  return 
$attachmentid;

Так как процесс вставки в сообщение вложения не включает в себя обновления счетчиков и внесение значений в таблицы post и thread, а без этих данных вложения не хотят отображаться, то мне пришлось сделать вспомогательную функцию, которая делает внесение необходимых обновлений.
PHP Code:
function attach_file_to_post($attachmentid$postid$threadid)
{
  global 
$vbulletin;

  
$vbulletin->db->query_write("
    UPDATE " 
TABLE_PREFIX "attachment
    SET postid = " 
$postid "
    WHERE attachmentid = " 
$attachmentid "
  "
);
  
  
$sqlcountattach $vbulletin->db->query_first("
    SELECT count(*) AS countattach
    FROM " 
TABLE_PREFIX "attachment as attachment
    WHERE attachment.postid = " 
$postid "
    GROUP BY attachment.postid
  "
);  

  
$countattach = (int) $sqlcountattach['countattach'];

  
$vbulletin->db->query_write("
    UPDATE " 
TABLE_PREFIX "post
    SET attach = " 
$countattach "
    WHERE postid = " 
$postid "
  "
);  

  
$sqlattachthread $vbulletin->db->query_first("
    SELECT thread.attach
    FROM " 
TABLE_PREFIX "thread as thread
    WHERE thread.threadid = " 
$threadid "
  "
);  

  
$attachthread = (int) $sqlattachthread['attach'] + 1;

  
$vbulletin->db->query_write("
    UPDATE " 
TABLE_PREFIX "thread
    SET attach = " 
$attachthread "
    WHERE threadid = " 
$threadid "
  "
);

Но все не так просто, необходимо до вызова функции, сформировать правильно массивы:
  1. $file
    PHP Code:
    $file['name'] = $filename// Имя файла без путей
    $file['tmp_name'] = $filearr['bodyfile']; // Полный путь к файлу + имя файла
    $file['error'] = '0'// 0 значит что ошибки нет
    $file['size'] = $filearr['bodylenght']; // Размер файла в байтах 
    Предупреждение, после добавления вложения, этот файл удаляется автоматически, так что если файл Вам еще нужен, то предварительно сделайте его копию.
  2. $foruminfo
    PHP Code:
    $forumid 2;
    $foruminfo fetch_foruminfo($forumid); 
  3. $userinfo
    PHP Code:
    $userid 1;
    $userinfo fetch_userinfo($userid);
    cache_permissions($userinfotrue); 
    Последняя команда обязательна, она добавляет в массив $userinfo информацию и правах и разрешениях.
  4. $postinfo
    PHP Code:
    $postinfo['postid'] = $postid;
    $postinfo['userid'] = $userid;
    $postinfo['threadid'] = $threadid;
    $postinfo['visible'] = 1

Это все.

Предупреждение!
все это работает в случае если в файле class_upload.php на 359 строке убрать проверку !is_uploaded_file($this->upload['location'])
Что очень не безопасно.
Я пока не нашел способа обмануть эту проверку, но работаю над этим... если у кого то появятся светлые мысли на этот счет, то прошу отписаться...

Last edited by SMak044 : 08-31-2012 at 03:51 PM. Reason: Добавлено сообщение
 
 
kerk
k0t
 
kerk's Avatar
Default
1

SMak044,
мне кажется было бы правильней объединить эти две функции в одну и в конце делать проверку:
если файл загружет и размер файла равен размеру временного файла (корректно скопирован из каталога в папку аттачей)
если файл прикреплен к посту + все счетчики корректно обновлены
возвращаем ID аттачмента или массив данных: аттачИД, постИД, узерИД, тредИД, форумИД, для возможного использования этих данных где то дальше по скрипту
в противном случае функция должна возвратить false или "0" (ноль), что бы: либо прекратить выполнение скрипта и показать ошибку, либо продолжать, но без вложения (хз, может это и не нужно будет)
 


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off




All times are GMT +4. The time now is 08:53 PM.


Powered by vBulletin® Version Anime Edition
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.