コード例 #1
0
ファイル: cleartokens.php プロジェクト: nemein/openpsa
 /**
  * Find all old send tokens and clear them.
  */
 public function _on_execute()
 {
     //Disable limits, TODO: think if this could be done in smaller chunks to save memory.
     midcom::get()->disable_limits();
     debug_add('_on_execute called');
     $days = $this->_config->get('send_token_max_age');
     if ($days == 0) {
         debug_add('send_token_max_age evaluates to zero, aborting');
         return;
     }
     $th = time() - $days * 3600 * 24;
     $qb = org_openpsa_directmarketing_campaign_messagereceipt_dba::new_query_builder();
     $qb->add_constraint('token', '<>', '');
     $qb->add_constraint('timestamp', '<', $th);
     $qb->add_constraint('orgOpenpsaObtype', '=', org_openpsa_directmarketing_campaign_messagereceipt_dba::SENT);
     $ret = $qb->execute_unchecked();
     if ($ret === false || !is_array($ret)) {
         //TODO: display some error ?
         return false;
     }
     if (empty($ret)) {
         debug_add('No results, returning early.');
         return;
     }
     foreach ($ret as $receipt) {
         debug_add("clearing token '{$receipt->token}' from receipt #{$receipt->id}");
         $receipt->token = '';
         $stat = $receipt->update();
         if (!$stat) {
             debug_add("FAILED to update receipt #{$receipt->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_WARN);
         }
     }
     debug_add('Done');
     return;
 }
コード例 #2
0
ファイル: report.php プロジェクト: nemein/openpsa
 /**
  * Builds the message report array
  */
 private function _analyze_message_report(&$data)
 {
     midcom::get('auth')->require_valid_user();
     $this->_request_data['report'] = array();
     $qb_receipts = org_openpsa_directmarketing_campaign_messagereceipt_dba::new_query_builder();
     $qb_receipts->add_constraint('message', '=', $this->_request_data['message']->id);
     $qb_receipts->add_constraint('orgOpenpsaObtype', '=', org_openpsa_directmarketing_campaign_messagereceipt_dba::SENT);
     $receipts = $qb_receipts->execute_unchecked();
     $this->_request_data['report']['receipt_data'] = array();
     $receipt_data =& $this->_request_data['report']['receipt_data'];
     $receipt_data['first_send'] = false;
     $receipt_data['last_send'] = false;
     $receipt_data['sent'] = count($receipts);
     $receipt_data['bounced'] = 0;
     foreach ($receipts as $receipt) {
         if ($receipt_data['first_send'] === false || $receipt->timestamp < $receipt_data['first_send']) {
             $receipt_data['first_send'] = $receipt->timestamp;
         }
         if ($receipt_data['last_send'] === false || $receipt->timestamp > $receipt_data['last_send']) {
             $receipt_data['last_send'] = $receipt->timestamp;
         }
         if ($receipt->bounced) {
             $receipt_data['bounced']++;
         }
     }
     $this->_get_campaign_data($receipt_data['first_send']);
     $segmentation_param = false;
     if (!empty($data['message_array']['report_segmentation'])) {
         $segmentation_param = $data['message_array']['report_segmentation'];
     }
     $this->_get_link_data($segmentation_param);
 }
コード例 #3
0
ファイル: cleanup.php プロジェクト: nemein/openpsa
 private function get_message_receipt_qb($kept = false)
 {
     $qb = org_openpsa_directmarketing_campaign_messagereceipt_dba::new_query_builder();
     if ($kept) {
         $qb->add_constraint('metadata.revised', '>=', $this->get_deletion_timestamp());
     } else {
         $qb->add_constraint('metadata.revised', '<', $this->get_deletion_timestamp());
     }
     return $qb;
 }
コード例 #4
0
ファイル: messagereceiptTest.php プロジェクト: nemein/openpsa
 public function testCRUD()
 {
     midcom::get('auth')->request_sudo('org.openpsa.directmarketing');
     $topic = $this->create_object('midcom_db_topic', array('component' => 'org.openpsa.directmarketing'));
     $campaign = $this->create_object('org_openpsa_directmarketing_campaign_dba', array('node' => $topic->id));
     $message = $this->create_object('org_openpsa_directmarketing_campaign_message_dba', array('campaign' => $campaign->id));
     $receipt = new org_openpsa_directmarketing_campaign_messagereceipt_dba();
     $stat = $receipt->create();
     $this->assertFalse($stat);
     $receipt = new org_openpsa_directmarketing_campaign_messagereceipt_dba();
     $receipt->message = $message->id;
     $stat = $receipt->create();
     $this->assertTrue($stat);
     $this->register_object($receipt);
     $receipt->token = 'TEST';
     $stat = $receipt->update();
     $this->assertTrue($stat);
     $receipt->refresh();
     $this->assertEquals('TEST', $receipt->token);
     $stat = $receipt->delete();
     $this->assertTrue($stat);
     midcom::get('auth')->drop_sudo();
 }
コード例 #5
0
ファイル: logger.php プロジェクト: nemein/openpsa
 private function _create_link_receipt(&$receipt, &$token, &$target)
 {
     if (!array_key_exists('create_status', $this->_request_data)) {
         $this->_request_data['create_status'] = array('receipts' => array(), 'links' => array());
     }
     //Store the click in database
     $link = new org_openpsa_directmarketing_link_log_dba();
     $link->person = $receipt->person;
     $link->message = $receipt->message;
     $link->target = $target;
     $link->token = $token;
     $this->_request_data['create_status']['links'][$target] = $link->create();
     //Create received and read receipts
     $read_receipt = new org_openpsa_directmarketing_campaign_messagereceipt_dba();
     $read_receipt->person = $receipt->person;
     $read_receipt->message = $receipt->message;
     $read_receipt->token = $token;
     $read_receipt->orgOpenpsaObtype = org_openpsa_directmarketing_campaign_messagereceipt_dba::RECEIVED;
     $this->_request_data['create_status']['receipts'][$token] = $read_receipt->create();
 }
コード例 #6
0
ファイル: interfaces.php プロジェクト: nemein/openpsa
 /**
  * Support for contacts person merge
  */
 function org_openpsa_contacts_duplicates_merge_person(&$person1, &$person2, $mode)
 {
     switch ($mode) {
         case 'all':
             break;
         case 'future':
             // DirMar does not have future references so we have nothing to transfer...
             return true;
             break;
         default:
             // Mode not implemented
             debug_add("mode {$mode} not implemented", MIDCOM_LOG_ERROR);
             return false;
             break;
     }
     // Transfer links from classes we drive
     // ** Members **
     $qb_member = org_openpsa_directmarketing_campaign_member_dba::new_query_builder();
     $qb_member->add_constraint('person', '=', $person2->id);
     $members = $qb_member->execute();
     if ($members === false) {
         // Some error with QB
         debug_add('QB Error', MIDCOM_LOG_ERROR);
         return false;
     }
     // Transfer memberships
     foreach ($members as $member) {
         $member->person = $person1->id;
         if (!$member->_check_duplicate_membership()) {
             // This is a duplicate membership, delete it
             debug_add("Person #{$person1->id} is already member in campaign #{$member->campaign}, removing membership #{$member->id}", MIDCOM_LOG_INFO);
             if (!$member->delete()) {
                 debug_add("Could not delete campaign member #{$member->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR);
                 return false;
             }
             continue;
         }
         debug_add("Transferred campaign membership #{$member->id} to person #{$person1->id} (from #{$member->person})", MIDCOM_LOG_INFO);
         if (!$member->update()) {
             debug_add("Failed to update campaign member #{$member->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR);
             return false;
         }
     }
     // ** Receipts **
     $qb_receipt = org_openpsa_directmarketing_campaign_messagereceipt_dba::new_query_builder();
     $qb_receipt->add_constraint('person', '=', $person2->id);
     $receipts = $qb_receipt->execute();
     if ($receipts === false) {
         // Some error with QB
         debug_add('QB Error / receipts', MIDCOM_LOG_ERROR);
         return false;
     }
     foreach ($receipts as $receipt) {
         debug_add("Transferred message_receipt #{$receipt->id} to person #{$person1->id} (from #{$receipt->person})", MIDCOM_LOG_INFO);
         $receipt->person = $person1->id;
         if (!$receipt->update()) {
             // Error updating
             debug_add("Failed to update receipt #{$receipt->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR);
             return false;
         }
     }
     // ** Logs **
     $qb_log = org_openpsa_directmarketing_link_log_dba::new_query_builder();
     $qb_log->add_constraint('person', '=', $person2->id);
     $logs = $qb_log->execute();
     if ($logs === false) {
         // Some error with QB
         debug_add('QB Error / links', MIDCOM_LOG_ERROR);
         return false;
     }
     foreach ($logs as $log) {
         debug_add("Transferred link_log #{$log->id} to person #{$person1->id} (from #{$log->person})", MIDCOM_LOG_INFO);
         $log->person = $person1->id;
         if (!$log->update()) {
             // Error updating
             debug_add("Failed to update link #{$log->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR);
             return false;
         }
     }
     // Transfer metadata dependencies from classes that we drive
     $classes = array('org_openpsa_directmarketing_campaign_dba', 'org_openpsa_directmarketing_campaign_member_dba', 'org_openpsa_directmarketing_campaign_message_dba', 'org_openpsa_directmarketing_campaign_messagereceipt_dba', 'org_openpsa_directmarketing_link_log_dba');
     foreach ($classes as $class) {
         // TODO: 1.8 metadata format support
         $ret = org_openpsa_contacts_duplicates_merge::person_metadata_dependencies_helper($class, $person1, $person2, $metadata_fields);
         if (!$ret) {
             // Failure updating metadata
             debug_add("Failed to update metadata dependencies in class {$class}, errsrtr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR);
             return false;
         }
     }
     // All done
     return true;
 }
コード例 #7
0
ファイル: message.php プロジェクト: nemein/openpsa
 /**
  * Creates a random token string that can be used to track a single
  * email delivery. The returned token string will only contain
  * lowercase alphanumeric characters and will start with a lowercase
  * letter to avoid problems with special processing being triggered
  * by special characters in the token string.
  *
  * @return random token string
  */
 private function _create_email_token()
 {
     //Testers need dummy token
     if ($this->test_mode) {
         return 'dummy';
     }
     //Use mt_rand if possible (faster, more random)
     if (function_exists('mt_rand')) {
         $rand = 'mt_rand';
     } else {
         $rand = 'rand';
     }
     $tokenchars = 'abcdefghijklmnopqrstuvwxyz0123456789';
     $token = $tokenchars[$rand(0, strlen($tokenchars) - 11)];
     for ($i = 1; $i < $this->token_size; $i++) {
         $token .= $tokenchars[$rand(0, strlen($tokenchars) - 1)];
     }
     //If token is not free or (very, very unlikely) matches our dummy token, recurse.
     if (!org_openpsa_directmarketing_campaign_messagereceipt_dba::token_is_free($token) || $token === 'dummy') {
         return $this->_create_email_token();
     }
     return $token;
 }
コード例 #8
0
ファイル: member.php プロジェクト: nemein/openpsa
 /**
  * Creates a message receipt of type.
  */
 function create_receipt($message_id, $type, $token = '', $parameters = false)
 {
     $receipt = new org_openpsa_directmarketing_campaign_messagereceipt_dba();
     $receipt->orgOpenpsaObtype = $type;
     $receipt->person = $this->person;
     $receipt->message = $message_id;
     $receipt->token = $token;
     $receipt->timestamp = time();
     midcom::get('auth')->request_sudo('org.openpsa.directmarketing');
     $stat = $receipt->create();
     if (!$stat) {
         debug_add('Failed to create, errstr: ' . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR);
         return $stat;
     }
     if (is_array($parameters) && !empty($parameters)) {
         foreach ($parameters as $param_data) {
             if (empty($param_data['domain']) || empty($param_data['name']) || empty($param_data['value'])) {
                 // TODO: Log warning
                 continue;
             }
             $receipt->set_parameter($param_data['domain'], $param_data['name'], $param_data['value']);
         }
     }
     midcom::get('auth')->drop_sudo();
 }