openmeetings / openmeetings-moodle-plugin

GNU General Public License v3.0
16 stars 8 forks source link

connecting with OpenMeetings through plugin #17

Closed rapava closed 7 years ago

rapava commented 8 years ago

Sorry for my English. Its Google translate. I wanted to connect webinar OpenMeetings to the online-learning platform Moodle. Since hosting of video services are not included by my Internet Service Provider, I picked up webinar host on the local machine. Than I install OpenMeetings plugin on my Moodle-server (which is in my ISP-server). But a bunch is not worked.

The service itself OpenMeetings (OM) is working - I have port forwarding, use DDNS. When I put Moodle on other computer in another local network (for the purity of the experiment), everything work fine. I Became compare logs of OM-server while it accessed from different Moodle-s, and drew attention, that a request by OM plugin (same version) from Moodle at ISP hosting comes through the method HTTP-GET, while in a PHP-script Curl library functions of the HTTP-request is determined by the POST method. I did not understand until the end, why there is occurs GET, but he knew exactly that the error is at function curl_exec (Most likely, the time to run a query with the specified parameters can not curl_exec, the GET is substituted as the default method). I think the problem in the php-library libcurl but may be I am wrong?

Еrror occurs in a row: $response = curl_exec($session); in script openmeetings\api\OmRestService.php, only when in function getSecureHash($user, $options) used POST-method.

When running the plugin on sites with Moodle I watched OM log. The plug-in script, as I will try to show below, it is clear that the call is going through the POST method. But when the curl of the script gives an error. I do not know exactly why, but the error only appears when the POST method. Why OM server reports that the transfer goes through GET I do not understand, can, on the Java-server OM variable default method defined as GET, and, after receiving a request from the plug-in is overridden. I do not know. But OM then itself informs that the GET method is not valid and terminates the session.

PS. Another suspect the possibility of error is that the Moodle-server time is 3 hours behind time zone of OM-server. The curl-setting request is transmitted hash is timeout parameters. Perhaps different times on the servers fails functions. I tried to change the time zone on the server OM, but the error remained

solomax commented 8 years ago

I usually setting up moodle and om on different servers, everything works as expected ....

I can't double-check right now due to vacation Can it be the problem with port forwarding?

rapava commented 8 years ago

No, it can not be port forwarding. I tried to adjust Openmeetings and Moodle on two different servers in two different local networks and everything worked perfectly. The problem only occurs when I install Moodle on server of my ISP. I think that the problem in version libсurl library. What is the minimum version required for proper operation of the script?

solomax commented 8 years ago

I can't check it right now due to vacation Sorry

rapava commented 8 years ago

Добрый день! Я так понял, Вы по русски тоже общаетесь, и мне так проще. Я продолжаю бороться с проблемой состыковки Moodle и Openmeetings.

Установил Moodle с плагином на другом linux-сервере, но проблема осталась. Там PHP 5.4.45, curl 7.36.0. Openmeetings я ставлю на windows7-машину в локальной сети, причем пробовал на 2-х разных компьютерах в разных локалках.

Если на одном из них ставлю Moodle, а на другом OM, то все работает. Или, если все ставлю на одной машине, тоже все работает. Не работает только, если Moodle ставлю на хостинг провайдеров. (А это для меня важно, т.к. windows-машины не всегда включены). Может дело в настройках .htaccess и каких-то настройках apache у провайдера?

Погуглил проблемы с curl, думаю дело в том, что при коннекте OM и Moodle происходит какой-то редирект POST-запроса от OM-plugin, настроенный провайдером. Из-за него POST-метод, сбрасывается в GET - и данные теряются, и OM - не принимает этот метод для передачи hash-а. В функции call параметр CURLOPT_FOLLOWLOCATION => true, я так понимаю, должен решать проблему с редиректом, но, видимо не решает. После вызова $response = curl_exec($session); переменная $response - пустая.

Если же я ставлю CURLOPT_FOLLOWLOCATION => false, то во фрейме OM выскакиевает cообщение об ошибке "Нет таких доступных комнат. Событие в календаре и присоединённая комната уже удалены!", а переменная $response после вызова curl_exec($session); содержит {"serviceResult":{"code":0,"message":"46cdcc35-400f-404b-83fd-2d1afd4e6ad7","type":"SUCCESS"}}

На большее меня не хватает. Помогите, пожалуйста. (На программиста я учился 12 лет назад, PHP вообще не изучал, а работаю все последующее время дизайнером интерьера, так что моих знаний, чтобы самостоятельно все протестировать маловато)

solomax commented 7 years ago

ну у меня всё работает на тех опциях CURL что в исходниках: https://github.com/openmeetings/openmeetings-moodle-plugin/blob/master/api/OmRestService.php#L51

ubuntu 16.04 latest+nginx+php 7.0.8+curl 7.47.0 работало и на более старых версиях без проблем

когда-то были проблемы с апачем (в настройках было запрещено посылать запросы на внешние сайты)

для разборок можно вот тут https://github.com/openmeetings/openmeetings-moodle-plugin/blob/master/api/OmRestService.php#L89 добавить

echo("<pre>");
var_dump($err);
var_dump($errmsg);
var_dump($info);
exit(0);
solomax commented 7 years ago

получилось что-нибудь?

rapava commented 7 years ago

Здравствуйте, Максим.

Я в отпуске. Через пару дней вернусь, попробую. Спасибо.

Thursday, November 3, 2016, 5:03:28 AM, вы писали:

получилось что-нибудь? — You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or mute the thread.

С наилучшими пожеланиями, Павел, руководитель дизайн-студии "Интерьер-Идея". Тел.: +38-097-744-08-67 ICQ: 177545092 Skype: rapava1980 Почта: iidea@ukr.net Сайт: i-idea.com.ua

rapava commented 7 years ago

Если я вставляю этот кусок кода в указанное место, то он никогда не срабатывает. Видимо условие if ($response === false) никогда не истинно. Если же я вставляю код до или после if, то в выводе "NULL, NULL, NULL". Ошибка остается.

Напишу админу хостинга на счет запрета посылать запросы на внешние сайты. Скорее всего именно из-за этого, посланный POST-ом из плагина запрос каким-то чудом появляется в логах OM как GET-запрос. Можете уточнить какие настройки apache необходимо сделать?

rapava commented 7 years ago

На вопрос о запрете апачу посылать POST-запросы на другие сервера хостер ответил: "Впервые слышу - зачем нам ограничивать запросы, кроме крайних случаев типа вирусной активности на сайте? Дайте пример запроса curl'ом на Ваш сервер - я в командной строке выполню запрос, чтобы увидеть каков будет ответ." Можете подсобить, дать кусок этого кода?

solomax commented 7 years ago

ну вот тут есть какие-то примеры: http://openmeetings.apache.org/RestAPISample.html пойдут такие?

rapava commented 7 years ago

Думаю, нет. Хостмастер же не программист. Ему нужен пример запроса, который он может запустить из шелл, к моему серверу с ОМ. Ну, накрайняк, думаю, сойдет и PHP-код чистого запроса к серверу ОМ. Чтобы можно было его запустить и тут же посмотреть логи апача. Чтобы он увидел, что в запросе действительно написано POST.

solomax commented 7 years ago

ну я на чистом curl запросов делать не умею :( (у меня на чтение манов полдня уйдёт) можно взять простой JSON запрос (типа вот такого [1]) и представить "правильным" способом

[1] http://openmeetings.apache.org/openmeetings-webservice/apidocs/org/apache/openmeetings/webservice/ErrorWebService.html#report-java.lang.String-java.lang.String-

rapava commented 7 years ago

Я в тупике: ни я не понимаю, как это сделать, ни хостмастер, ни Вы не хотите разбираться. Я еще на одном сервере (хостинг svai.net) мудл с Вашим плагином попробовал поставить - та же ошибка. Неужели ни у кого больше не возникает аналогичных проблем? Может, пожалуйста, все таки почитаете маны и дадите текст запроса курл на шелле для проверки?

solomax commented 7 years ago

вот такая комманда:

curl -X POST https://om.alteametasoft.com/openmeetings/services/group/?sid=xxx-xxx-xxxx-xxxxx&name=test

даёт вот такой результат: {"serviceResult":{"code":-26,"message":"Insufficient permissions","type":"ERROR"}}

если POST заменить на GET будет многа букв

rapava commented 7 years ago

Здравствуйте, Максим.

В случае моего сервера выдает аналогичный ответ. Лог ОМ тоже видит и POST и GET запросы. Т.е. как мы их отправляем, так они и приходят. Почему же тогда при отправке из PHP-скрипта плагина запрос в ОМ приходит как GET...

Я правильно понимаю?: Curl Post-ы посылать умеет. Значит все таки апач как-то их меняет.. ведь при команде из шелл он не участвует. Может все таки в httpd.conf что-то есть по этому поводу или в каком-нить .htaccess? В .htaccess на моем сервере с мудл вот это: " require valid-user " не может давать такой эффект?

Monday, November 7, 2016, 4:21:34 PM, вы писали:

вот такая комманда: curl -X POST https://om.alteametasoft.com/openmeetings/services/group/?sid=xxx-xxx-xxxx-xxxxx&name=test даёт вот такой результат: {"serviceResult":{"code":-26,"message":"Insufficient permissions","type":"ERROR"}} если POST заменить на GET будет многа букв — You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or mute the thread.

С наилучшими пожеланиями, Павел, руководитель дизайн-студии "Интерьер-Идея". Тел.: +38-097-744-08-67 ICQ: 177545092 Skype: rapava1980 Почта: iidea@ukr.net Сайт: i-idea.com.ua

solomax commented 7 years ago

я про .htaccess особо ничего не знаю, особо не пользовался никада ну раз чистый curl работает

то можно сперва дёрнуть то же самое из PHP потом то же самое через OM PHP API (папка api плагина)

rapava commented 7 years ago

Здравствуйте, Максим.

Понимаю, что наглею. Но в PHP я ноль. Хостмастер чистый курл проверил; я вижу, что через OM PHP API ошибка. Нужно промежуточный вариант проверить - написать простой POST запрос из PHP. Можете черкнуть то же самое в PHP? Спасибо.

Monday, November 7, 2016, 5:56:49 PM, вы писали:

я про .htaccess особо ничего не знаю, особо не пользовался никада ну раз чистый curl работает то можно сперва дёрнуть то же самое из PHP потом то же самое через OM PHP API (папка api плагина) — You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or mute the thread.

С наилучшими пожеланиями, Павел, руководитель дизайн-студии "Интерьер-Идея". Тел.: +38-097-744-08-67 ICQ: 177545092 Skype: rapava1980 Почта: iidea@ukr.net Сайт: i-idea.com.ua

solomax commented 7 years ago

ну то есть PHP запрос через OM API работает на локальных серверах работает curl запрос из command line но не работает с Ваших хостингов

может у вашей поддержки спросить вот про эти [1] опции curl? их может подпилить?

[1] https://github.com/openmeetings/openmeetings-moodle-plugin/blob/master/api/OmRestService.php#L52

rapava commented 7 years ago

Здравствуйте, Максим.

Monday, November 7, 2016, 6:14:22 PM, вы писали:

ну то есть PHP запрос через OM API работает на локальных серверах

да

работает curl запрос из command line

да, на сервере хостера так работает

но не работает с Ваших хостингов

да, из PHP на сервере хостера не работает (причем на 2-х разных хостингах)

может у вашей поддержки спросить вот про эти [1] опции curl? их может подпилить? [1] https://github.com/openmeetings/openmeetings-moodle-plugin/blob/master/api/OmRestService.php#L52

уже писал хостмастеру, про возможные редиректы из-за которых POST меняется на GET (где-то вычитал такую проблему curl'a) Если CURLOPT_FOLLOWLOCATION => false то ошибка меняется на "There is no such room available...." в самом фрейме ОМ.

А просто написать хостмастеру "подпилить" - эффекта будет 0. Нужно написать маленький php-скрипт, в котором четко видно, что посылаем POST. Хостмастер не верит мне, что скрипт посылает POST, тогда как логи ОМ получают GET. Думает, что проблема в самом PHP.

Напишите, пожалуйста.

С наилучшими пожеланиями, Павел, руководитель дизайн-студии "Интерьер-Идея". Тел.: +38-097-744-08-67 ICQ: 177545092 Skype: rapava1980 Почта: iidea@ukr.net Сайт: i-idea.com.ua

rapava commented 7 years ago

Доброго дня и хорошего настроения! Спасибо за Вашу помощь и поддержку. Вы мне черкнете PHP-скрипт, или мне садиться за изучение PHP?

solomax commented 7 years ago

что-то типа такого https://gist.github.com/solomax/f5bc9433e41ec30c2ac384e7c483d3a5

rapava commented 7 years ago

Большое спасибо за скрипт. Хостмастер удивляется, что при его запуске апач все равно фиксирует исходящий запрос как GET (как и я вижу в логах ОМ). Говорит, что апач сам не может как-то подменять метод и ничего специально в httpd.conf или .htaccess он не прописывал и не запрещал исходящие POST на сторонние сервера. Я грешу все таки на старую версию библиотеки для PHP libcurl, которая "не умеет" отправлять POSTы через веб-сервер (хотя это тоже странно). Но обновить хостер ее не может, что-то там не сростается. Можете сориентировать, из Вашего опыта, на какой версии Curl все исправно работало? Я на другом хостинге пробовал, там кажется 1.36, и ошибка была та же. Или, может, у Вас еще есть какие-то мысли на счет моей проблемы?

solomax commented 7 years ago

я что будет если добавить

$options[CURLOPT_CUSTOMREQUEST] = "POST";

rapava commented 7 years ago

Это никак не влияет. Но, если я меняю CURLOPT_FOLLOWLOCATION => false, то в браузер приходит короткий ответ: {"serviceResult":{"code":-26,"message":"Insufficient permissions","type":"ERROR"}}bool(true) Значит апач обрабатывает этот запрос как POST. Я не понимаю, о каком редиректе здесь идет речь, но читал, что с curl-ом есть такая проблема. Думаю, это как раз моя ситуация. Вот, что мне попадалось на эту тему: https://evertpot.com/curl-redirect-requestbody/ Поэтому я сразу и начал Вам писать про версию Curl, в надежде, что в новой версии это пофиксили.

solomax commented 7 years ago

ну ровно по этой ссылке написано

To fix this, all you have to do is use CURLOPT_CUSTOMREQUEST instead of CURLOPT_POST

так что надо одну строку выкинуть $options[CURLOPT_POST] = true;

а другую вставить $options[CURLOPT_CUSTOMREQUEST] = "POST";

rapava commented 7 years ago

Я это пробовал и сегодня, и еще до того, как Вам первый раз написал. Этого мало.

solomax commented 7 years ago

вот тут http://php.net/manual/en/function.curl-setopt.php есть опция CURLOPT_HTTPGET может её в false выставить?

rapava commented 7 years ago

Не помогает. Думаю, изначально curl и отправляет POST, но потом происходит какой-то редирект (это подтверждает изменение метода при переключении опции CURLOPT_FOLLOWLOCATION), и метод сбрасывается на GET. Для чего эта опция выставляется в true? где происходит этот редирект?

solomax commented 7 years ago

redirect'ы происходят как-то сами (в коде ничего такого нет) в true выставляется чтобы redirect'ы на работу не влияли

rapava commented 7 years ago

В общем, мы с хостером в тупике. Я считаю, что виной всему версия curl. Можете сориентировать, из Вашего опыта, на какой версии Curl все исправно работало? Может, я найду хостинг с более поздней версией и попробую еще на нем, чтоб проверить. Иначе, тему можно закрывать.

solomax commented 7 years ago

может проблема в версии PHP? у меня сейчас только сервер с 7.0 (php && php-curl)

вроде раньше на 5м PHP работало, но проверить мне сейчас не на чём

rapava commented 7 years ago

Сейчас на обоих тестовых серверах с Мудл PHP Version 5.4.45

rapava commented 7 years ago

Нашел новый хостинг с PHP 7.0, поставил Мудл, плагин. При добавлении элемента ОМ в курс вылазит ошибка:

"array ( 'url' => 'http://rapava1980.ddns.net:2005/openmeetings/services/user/login?&user=pavel&pass=xideaxideax', 'content_type' => NULL, 'http_code' => 0, 'header_size' => 0, 'request_size' => 0, 'filetime' => -1, 'ssl_verify_result' => 0, 'redirect_count' => 0, 'total_time' => 6.2663929999999999, 'namelookup_time' => 0.060373999999999997, 'connect_time' => 0.0, 'pretransfer_time' => 0.0, 'size_upload' => 0.0, 'size_download' => 0.0, 'speed_download' => 0.0, 'speed_upload' => 0.0, 'download_content_length' => -1.0, 'upload_content_length' => -1.0, 'starttransfer_time' => 0.0, 'redirect_time' => 0.0, 'redirect_url' => '', 'primary_ip' => '', 'certinfo' => array ( ), 'primary_port' => 0, 'local_ip' => '', 'local_port' => 0, ) Fault (Service error) Request OpenMeetings! OpenMeetings Service failed and no response was returned. Additioanl info: "

На этот раз лог ОМ молчит, запрос просто не доходит к нему. Я так понимаю, это тоже ошибка выполнения curl в функции Call в файле OmRestService.php.

Настройка плагина ОМ в мудл точно такая же как на других серверах. Сервер ОМ запущен и запросы с других хостингов принимает. Что может быть? запрещены исходящие?

rapava commented 7 years ago

на хостинге отвечают, что порты не блокируют

solomax commented 7 years ago

у Вас OpenMeetings крутится на 2005м порту? Это не ошибка? telnet туда ходит?

rapava commented 7 years ago

Да я пробую на разных уже. Сейчас вернул на 5080. Даже если в браузер вписать: http://rapava1980.ddns.net:5080/openmeetings/services/user/login?&user=pavel&pass=xideaxideax ОМ обрабатывает и ответ приходит: {"serviceResult":{"code":1,"message":"5c98f506-e2ea-4634-b3f7-cd7bb980f09f","type":"SUCCESS"}} А с их сервера - глухо

solomax commented 7 years ago

Или телнет Или попробовать порт 80 Лучше оба два

rapava commented 7 years ago

порт 80 не работает даже для старого хостинга. а про телнет не понял: сделать типа telnet rapava1980.ddns.net 5080 ? а что я должен получить в итоге? на хостинге telnet нет, и он настаивает, что видно то, что порт открыт, отправляет назад к разработчику плагина :)

rapava commented 7 years ago

а у вас есть какой-то тестовый сервер OM, чтобы я своими серверами подконнектился к вашему ОМ? может проблема в нем?

solomax commented 7 years ago

ну я телепатией тоже не обладаю можно поднять ОМ на порту 80 и проверить самый простой способ проверить - телнет

тестовый сервер есть но админские права я на него не дам

rapava commented 7 years ago

Большое Вам спасибо. На новом хостинге все заработало после того, как я поменял порт ОМ на 80 (сначала не мог сменить порт, т.к. он использовался skype-ом). На новом хостинге вся связка работает начиная с PHP 5.4 (там можно менять начиная с 4.4 до 7.0), Curl 7.36.0. Думаю, что проблема POST-метода была от старости Curl-а на прошлом сервере. Еще раз спасибо.

solomax commented 7 years ago

Очень ура!