/** * Callback for 'gather' response on call to Twilio */ public function action_gather() { if ($this->request->method() != 'POST') { // Only POST is allowed throw HTTP_Exception::factory(405, 'The :method method is not supported. Supported methods are :allowed_methods', array(':method' => $this->request->method(), ':allowed_methods' => Http_Request::POST))->allowed(Http_Request::POST); } $provider = DataProvider::factory('twilio'); // Authenticate the request $options = $provider->options(); if ($this->request->post('AccountSid') !== $options['account_sid']) { // Could not authenticate the request? throw HTTP_Exception::factory(403, 'Incorrect or missing AccountSid'); } // Remove Non-Numeric characters because that's what the DB has $to = preg_replace("/[^0-9,.]/", "", $this->request->post('To')); $from = preg_replace("/[^0-9,.]/", "", $this->request->post('From')); $message_sid = $this->request->post('CallSid'); $digits = $this->request->post('Digits'); if ($digits == 1) { $message_text = 'IVR: Okay'; } else { if ($digits == 2) { $message_text = 'IVR: Not Okay'; } else { // HALT Kohana::$log->add(Log::ERROR, __("':digits' is not a valid IVR response", array(":digits" => $digits))); return; } } $provider->receive(Message_Type::IVR, $from, $message_text, $to, NULL, $message_sid); }
public function action_index() { // Set up custom error view Kohana_Exception::$error_view = 'error/data-provider'; if ($this->request->method() != 'GET') { // Only GET is allowed as FrontlineSms does only GET request throw HTTP_Exception::factory(405, 'The :method method is not supported. Supported methods are :allowed_methods', array(':method' => $this->request->method(), ':allowed_methods' => Http_Request::GET))->allowed(Http_Request::GET); } $provider = DataProvider::factory('frontlinesms'); // Authenticate the request $options = $provider->options(); if (!isset($options['key']) or empty($options['key'])) { throw HTTP_Exception::factory(403, 'Key value has not been configured'); } if (!$this->request->query('key') or $this->request->query('key') != $options['key']) { throw HTTP_Exception::factory(403, 'Incorrect or missing key'); } if (!$this->request->query('m')) { throw HTTP_Exception::factory(403, 'Missing message'); } // Remove Non-Numeric characters because that's what the DB has $from = preg_replace('/\\D+/', "", $this->request->post('from')); $message_text = $this->request->query('m'); // If receiving an SMS Message if ($from and $message_text) { $provider->receive(Message_Type::SMS, $from, $message_text, $to); } $json = array('payload' => array('success' => TRUE, 'error' => NULL)); // Set the correct content-type header $this->response->headers('Content-Type', 'application/json'); $this->response->body(json_encode($json)); }
/** * Handle incoming SMS from Twilio */ public function action_reply() { //Check if data provider is available $providers_available = Kohana::$config->load('features.data-providers'); if (!$providers_available['twilio']) { throw HTTP_Exception::factory(403, 'The Twilio data source is not currently available. It can be accessed by upgrading to a higher Ushahidi tier.'); } if ($this->request->method() != 'POST') { // Only POST is allowed throw HTTP_Exception::factory(405, 'The :method method is not supported. Supported methods are :allowed_methods', array(':method' => $this->request->method(), ':allowed_methods' => Http_Request::POST))->allowed(Http_Request::POST); } $provider = DataProvider::factory('twilio'); // Authenticate the request $options = $provider->options(); if ($this->request->post('AccountSid') !== $options['account_sid']) { throw HTTP_Exception::factory(403, 'Incorrect or missing AccountSid'); } // Remove Non-Numeric characters because that's what the DB has $to = preg_replace("/[^0-9,.]/", "", $this->request->post('To')); $from = preg_replace("/[^0-9,.]/", "", $this->request->post('From')); $message_text = $this->request->post('Body'); $message_sid = $this->request->post('MessageSid'); // @todo use other info from twillio, ie: location, media $provider->receive(Message_Type::SMS, $from, $message_text, $to, NULL, $message_sid); // If we have an auto response configured, return the response messages if (!empty($options['sms_auto_response'])) { $body = View::factory('twillio/sms_response')->set('response', $options['sms_auto_response'])->render(); // Set the correct content-type header $this->response->headers('Content-Type', 'text/xml'); $this->response->body($body); } }
public function action_index() { // Set up custom error view Kohana_Exception::$error_view = 'error/data-provider'; //Check if data provider is available $providers_available = Kohana::$config->load('features.data-providers'); if (!$providers_available['smssync']) { throw HTTP_Exception::factory(403, 'The SMS Sync data source is not currently available. It can be accessed by upgrading to a higher Ushahidi tier.'); } $methods_with_http_request = [Http_Request::POST, Http_Request::GET]; if (!in_array($this->request->method(), $methods_with_http_request)) { // Only POST or GET is allowed throw HTTP_Exception::factory(405, 'The :method method is not supported. Supported methods are :allowed_methods', array(':method' => $this->request->method(), ':allowed_methods' => implode(',', $methods_with_http_request)))->allowed($methods_with_http_request); } $this->_provider = DataProvider::factory('smssync'); $this->options = $this->_provider->options(); // Ensure we're always returning a payload.. // This will be overwritten later if incoming or task methods are run $this->_json['payload'] = ['success' => TRUE, 'error' => NULL]; // Process incoming messages from SMSSync only if the request is POST if ($this->request->method() == 'POST') { $this->_incoming(); } // Attempt Task if request is GET and task type is 'send' if ($this->request->method() == 'GET' and $this->request->query('task') == 'send') { $this->_task(); } // Set the response $this->_set_response(); }
protected function execute_incoming(InputInterface $input, OutputInterface $output) { $providers = $this->get_providers($input, $output); $limit = $input->getOption('limit'); $totals = []; foreach ($providers as $id => $provider) { $totals[] = ['Provider' => $provider->name, 'Total' => \DataProvider::factory($id)->fetch($limit)]; } return $totals; }
public function action_index() { // Set up custom error view Kohana_Exception::$error_view = 'error/data-provider'; $methods_with_http_request = [Http_Request::POST, Http_Request::GET]; if (!in_array($this->request->method(), $methods_with_http_request)) { // Only POST or GET is allowed throw HTTP_Exception::factory(405, 'The :method method is not supported. Supported methods are :allowed_methods', array(':method' => $this->request->method(), ':allowed_methods' => implode(',', $methods_with_http_request)))->allowed($methods_with_http_request); } $this->_provider = DataProvider::factory('smssync'); $this->options = $this->_provider->options(); // Process incoming messages from SMSSync only if the request is POST if ($this->request->method() == 'POST') { $this->_incoming(); } // Attempt Task if request is GET and task type is 'send' if ($this->request->method() == 'GET' and $this->request->query('task') == 'send') { $this->_task(); } // Set the response $this->_set_response(); }
/** * Process pending messages for provider * * For services where we can push messages (rather than being polled like SMS Sync): * this should grab pending messages and pass them to send() * * @param boolean $limit maximum number of messages to send at a time */ public static function process_pending_messages($limit = 20, $provider = FALSE) { $message_repo = service('repository.message'); $contact_repo = service('repository.contact'); $providers = array(); $count = 0; // Grab latest messages $pings = $message_repo->getPendingMessages(Message_Status::PENDING, $provider, $limit); foreach ($pings as $message) { $provider = DataProvider::factory($message->data_provider, $message->type); // Load contact $contact = $contact_repo->get($message->contact_id); // Send message and get new status/tracking id list($new_status, $tracking_id) = $provider->send($contact->contact, $message->message, $message->title); // Update message details $message->status = $new_status; $message->data_provider = $provider->provider_name(); if ($tracking_id) { $message->data_provider_message_id = $tracking_id; } // @todo handle errors $message_repo->update($message); $count++; } return $count; }
/** * Handle SMS from Nexmo */ public function action_reply() { include_once Kohana::find_file('vendor', 'nexmo/NexmoMessage'); // Pong Sender $ip_address = $_SERVER["REMOTE_ADDR"]; $continue = FALSE; foreach ($this->subnets as $subnet) { if ($this->_ip_in_range($ip_address, $subnet)) { throw HTTP_Exception::factory(403, 'IP Address not in allowed range'); break; } } $provider = DataProvider::factory('nexmo'); $options = $provider->options(); if (!isset($options['api_key'])) { throw HTTP_Exception::factory(403, 'Missing API key'); } if (!isset($options['api_secret'])) { throw HTTP_Exception::factory(403, 'Missing API secret'); } $sms = new NexmoMessage($options['api_key'], $options['api_secret']); if (!$sms->inboundText()) { throw HTTP_Exception::factory(400, "Invalid message"); } // Remove Non-Numeric characters because that's what the DB has $to = preg_replace("/[^0-9,.]/", "", $sms->to); $from = preg_replace("/[^0-9,.]/", "", $sms->from); $provider->receive(Message_Type::SMS, $from, $sms->text, $to, NULL, $sms->message_id); }
/** * Handle SMS from Nexmo */ public function action_reply() { include_once Kohana::find_file('vendor', 'nexmo/NexmoMessage'); //Check if data provider is available $providers_available = Kohana::$config->load('features.data-providers'); if (!$providers_available['nexmo']) { throw HTTP_Exception::factory(403, 'The Nexmo data source is not currently available. It can be accessed by upgrading to a higher Ushahidi tier.'); } // Pong Sender $ip_address = $_SERVER["REMOTE_ADDR"]; $continue = FALSE; foreach ($this->subnets as $subnet) { if ($this->_ip_in_range($ip_address, $subnet)) { throw HTTP_Exception::factory(403, 'IP Address not in allowed range'); break; } } $provider = DataProvider::factory('nexmo'); $options = $provider->options(); if (!isset($options['api_key'])) { throw HTTP_Exception::factory(403, 'Missing API key'); } if (!isset($options['api_secret'])) { throw HTTP_Exception::factory(403, 'Missing API secret'); } $sms = new NexmoMessage($options['api_key'], $options['api_secret']); if (!$sms->inboundText()) { throw HTTP_Exception::factory(400, "Invalid message"); } // Remove Non-Numeric characters because that's what the DB has $to = preg_replace("/[^0-9,.]/", "", $sms->to); $from = preg_replace("/[^0-9,.]/", "", $sms->from); $provider->receive(Message_Type::SMS, $from, $sms->text, $to, NULL, $sms->message_id); }