diff --git a/src/mibew/libs/classes/Mibew/Controller/WidgetController.php b/src/mibew/libs/classes/Mibew/Controller/WidgetController.php new file mode 100644 index 00000000..218a55f2 --- /dev/null +++ b/src/mibew/libs/classes/Mibew/Controller/WidgetController.php @@ -0,0 +1,138 @@ + array(), + 'handlers' => array(), + 'dependences' => array(), + 'data' => array(), + ); + + if (Settings::get('enabletracking') == '1') { + + $entry = $request->query->get('entry', ''); + $referer = $request->server->get('HTTP_REFERER', ''); + $user_id = $request->query->get('user_id', false); + + // Check if session was started + if (isset($_SESSION['visitorid']) && preg_match('/^[0-9]+$/', $_SESSION['visitorid'])) { + // Session was started. Just track the visitor. + $visitor_id = track_visitor($_SESSION['visitorid'], $entry, $referer); + $visitor = track_get_visitor_by_id($visitor_id); + } else { + $visitor = track_get_visitor_by_user_id($user_id); + if ($visitor !== false) { + // Session is not started but the visitor exists in + // database. Probably third-party cookies are disabled by + // the browser. Use tracking by local cookie at target site. + $visitor_id = track_visitor($visitor['visitorid'], $entry, $referer); + } else { + // Start tracking session + $visitor_id = track_visitor_start($entry, $referer); + $visitor = track_get_visitor_by_id($visitor_id); + } + } + + if ($visitor_id) { + $_SESSION['visitorid'] = $visitor_id; + } + + if ($user_id === false) { + // Update local cookie value at target site + $response_data['handlers'][] = 'updateUserId'; + $response_data['dependences']['updateUserId'] = array(); + $response_data['data']['user']['id'] = $visitor['userid']; + } + + // Get invitation state + $invitation_state = invitation_state($visitor_id); + + // Check if invitation is closed + if (!$invitation_state['invited'] && !empty($_SESSION['invitation_threadid'])) { + $response_data['handlers'][] = 'invitationClose'; + $response_data['dependences']['invitationClose'] = array(); + unset($_SESSION['invitation_threadid']); + } + + // Check if the visitor is just invited to chat + $is_invited = $invitation_state['invited'] + && (empty($_SESSION['invitation_threadid']) + ? true + : ($_SESSION['invitation_threadid'] != $invitation_state['threadid'])); + + if ($is_invited) { + // Load invitation thread + $thread = Thread::load($invitation_state['threadid']); + + // Get operator info + $operator = operator_by_id($thread->agentId); + $locale = $request->query->get('locale', ''); + $operator_name = ($locale == HOME_LOCALE) + ? $operator['vclocalename'] + : $operator['vccommonname']; + + // Show invitation dialog at widget side + $response_data['handlers'][] = 'invitationCreate'; + $response_data['dependences']['invitationCreate'] = array(); + $response_data['data']['invitation'] = array( + 'operatorName' => htmlspecialchars($operator_name), + 'avatarUrl' => htmlspecialchars($operator['vcavatar']), + 'threadUrl' => ($request->getUriForPath('/client.php') + . '?act=invitation'), + 'acceptCaption' => getlocal('invitation.accept.caption'), + ); + + $_SESSION['invitation_threadid'] = $thread->id; + } + + // Check if the visitor rejects invitation + if ($invitation_state['invited'] && $request->query->get('invitation_rejected')) { + invitation_reject($visitor_id); + } + } + + // Builds JSONP response + $response = new JsonResponse($response_data); + $response->setCallback("Mibew.Objects.widget.onResponse"); + + // Add headers to overcome third-party cookies problem. + $response->headers->set('P3P', 'CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); + + return $response; + } +} diff --git a/src/mibew/libs/common/response.php b/src/mibew/libs/common/response.php index 47c1759b..61da9794 100644 --- a/src/mibew/libs/common/response.php +++ b/src/mibew/libs/common/response.php @@ -58,6 +58,11 @@ function start_html_output() header("Content-type: text/html" . (isset($charset) ? "; charset=" . $charset : "")); } +/** + * Sends headers that are needed for JS responses. + * + * @deprecated + */ function start_js_output() { header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); @@ -251,31 +256,3 @@ function add_params($servlet, $params) return $servlet; } - -/** - * Builds JSONP response to the Mibew widget - * - * @param array $response Response data. It can contain following items: - * - 'load': associative array, specify files which must be loaded. Array keys - * are file aliases and values are URLs. One can use file alias to specify - * dependences (described below). - * - 'handlers': array, handlers which must be called (described below). - * - 'dependences': array, specify dependences between handlers and loaded - * files. Array keys are handlers names and values are arrays of file aliases - * from load item. Handler function will call only after all specified files - * loaded. - * - 'data': associative array, arbitrary structure which will be passed to all - * functions, specified in 'handlers' item. - * @return string JSONP response that ready to send to the widget - */ -function build_widget_response($response) -{ - $result = $response + array( - 'load' => array(), - 'handlers' => array(), - 'dependences' => array(), - 'data' => array(), - ); - - return "Mibew.Objects.widget.onResponse(" . json_encode($result) . ");"; -} diff --git a/src/mibew/libs/getcode.php b/src/mibew/libs/getcode.php index 5395e2b3..3d0c56d8 100644 --- a/src/mibew/libs/getcode.php +++ b/src/mibew/libs/getcode.php @@ -109,7 +109,7 @@ function generate_button( $widget_data['requestTimeout'] = Settings::get('updatefrequency_tracking') * 1000; // URL for requests - $widget_data['requestURL'] = $app_location . '/widget.php'; + $widget_data['requestURL'] = $app_location . '/widget'; // Locale for invitation $widget_data['locale'] = $locale; diff --git a/src/mibew/libs/routing.yml b/src/mibew/libs/routing.yml index 7a7815b7..7d98d308 100644 --- a/src/mibew/libs/routing.yml +++ b/src/mibew/libs/routing.yml @@ -1,3 +1,7 @@ license: path: /license defaults: { _controller: Mibew\Controller\LicenseController::indexAction } + +widget_gateway: + path: /widget + defaults: { _controller: Mibew\Controller\WidgetController::indexAction } diff --git a/src/mibew/widget.php b/src/mibew/widget.php deleted file mode 100644 index 132a2bcf..00000000 --- a/src/mibew/widget.php +++ /dev/null @@ -1,111 +0,0 @@ -agentId); - $locale = isset($_GET['locale']) ? $_GET['locale'] : ''; - $operator_name = ($locale == HOME_LOCALE) - ? $operator['vclocalename'] - : $operator['vccommonname']; - - // Show invitation dialog at widget side - $response['handlers'][] = 'invitationCreate'; - $response['dependences']['invitationCreate'] = array(); - $response['data']['invitation'] = array( - 'operatorName' => htmlspecialchars($operator_name), - 'avatarUrl' => htmlspecialchars($operator['vcavatar']), - 'threadUrl' => (get_app_location(true, is_secure_request()) - . '/client.php?act=invitation'), - 'acceptCaption' => getlocal('invitation.accept.caption'), - ); - - $_SESSION['invitation_threadid'] = $thread->id; - } - - // Check if visitor reject invitation - if ($invitation_state['invited'] && !empty($_GET['invitation_rejected'])) { - invitation_reject($visitor_id); - } -} - -start_js_output(); -echo build_widget_response($response);