/**
  * Send an email notification to a user
  * 
  * @static
  * @since 1.1.0
  * @param string $user_id User object_id
  * @param string $subject Email subject line
  * @param string $message Email body
  */
 public static function notify_user($user_id, $subject, $message, $short_text = null)
 {
     $error = new argent_error();
     if (!class_exists('PHPMailer')) {
         $error->add('1042', 'PHPMailer is not available', NULL, 'argent_notification');
     }
     if ($error->has_errors()) {
         return $error;
     }
     $mail = new PHPMailer();
     $mail->AddReplyTo(NOTIFICATION_FROM_MAIL, NOTIFICATION_FROM_NAME);
     $mail->SetFrom(NOTIFICATION_FROM_MAIL, NOTIFICATION_FROM_NAME);
     $user_data = argent_uauth::user_get_data($user_id);
     if (argent_error::check($user_data)) {
         return $user_data;
     }
     $mail->AddAddress($user_data['email'], $user_data['display_name']);
     $mail->Subject = $subject;
     $mail->AltBody = "To view the message, please use an HTML compatible email viewer!";
     // optional, comment out and test
     $merge_fields = array('user_name' => $user_data['display_name'], 'email' => $user_data['email'], 'body' => $message, 'subject' => $subject, 'intro' => $short_text);
     $message_body = self::merge_template(ABSOLUTE_PATH . 'argent/html_email_templates/basic.html', $merge_fields);
     if (argent_error::check($message_body)) {
         return $message_body;
     }
     $mail->MsgHTML($message_body);
     if (!$mail->Send()) {
         $error->add('1040', 'Error sending mail', $mail->ErrorInfo, 'argent_notification');
         return $error;
     } else {
         return 'Mail sent to ' . $user_data['email'];
     }
 }
 /**
  * Create a new user on an account
  * 
  * @static
  * @since 1.0.1
  * 
  * @param string $account ObjectID of the account to create user against
  * @param string $email Valid email address
  * @param string $secret Plaintext secret/password
  * @param string $display_name Display name for the user
  * @param array $custom_fields Array of custom fields to save for this user
  * @return \argent_error 
  */
 public static function user_create($account = NULL, $email = NULL, $secret = NULL, $display_name = NULL, $custom_fields = NULL)
 {
     if (is_array($account)) {
         $db =& $account['db'];
         $account = $account['object_id'];
         $end_transaction = false;
     } else {
         /* Create a new database connection */
         $db = new argent_database();
         $end_transaction = true;
         $db->start_transaction();
     }
     /* Create a new error object to store errors in */
     $error = new argent_error();
     /**
      * Validate Inputs 
      */
     // Email is valid
     if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
         $error->add('1001', 'Invalid email address', $email, 'argent_uauth');
     }
     // Password matches complexity requirements
     if (!preg_match(UA_PASSWORD_COMPLEXITY, $secret)) {
         $error->add('1002', UA_PASSWORD_COMPLEXITY_ERROR, $secret, 'argent_uauth');
     }
     // Display name is not empty
     if (empty($display_name)) {
         $error->add('1003', 'A display name must be specified', 'argent_uauth');
     }
     // Email is not already registered to this account
     if (self::email_exists($email, NULL)) {
         $error->add('1004', 'Email address is already registered', $email, 'argent_uauth');
     }
     // Account Exists
     if (!self::object_exists($account)) {
         $error->add('1005', 'Account does not exist', $account, 'argent_uauth');
     }
     /**
      * Check that validation is successful 
      */
     if (!$error->has_errors()) {
         /* Successful Validation */
         // Generate an object_id and meta_guid
         $meta_guid = argent_identifier::meta_guid();
         $object_id = argent_identifier::object_id('USR');
         // Encrypt secret
         $secret = self::encrypt_secret($secret);
         // Insert User Data
         $sql = "\r\n                        INSERT INTO\r\n                            `ua_users`\r\n                        VALUES(\r\n                            '{$db->escape_value($meta_guid)}',\r\n                            '{$db->escape_value($object_id)}',\r\n                            '{$db->escape_value($email)}',\r\n                            '{$db->escape_value($secret)}',\r\n                            '{$db->escape_value($display_name)}',\r\n                            '{$db->escape_value($account)}',\r\n                            NOW(),\r\n                            'USR-TEST',\r\n                            '{$db->escape_value($_SERVER['REMOTE_ADDR'])}'\r\n                        )\r\n                        ";
         $db->query($sql);
         $permissions = array('create' => 1, 'read' => 1, 'update' => 1, 'delete' => 1);
         argent_uauth::set_permissions($permissions, $account, $object_id);
         if (is_array($custom_fields) && count($custom_fields > 0)) {
             foreach ($custom_fields as $key => $value) {
                 $record = array();
                 $record['object_id'] = argent_identifier::object_id('CFL');
                 $record['field_name'] = $db->escape_value($key);
                 $record['field_data'] = $db->escape_value($value);
                 $record['ua_parent_object'] = $object_id;
                 $record = argent_meta::add_meta($record);
                 argent_meta::save_record($record, 'ua_custom_fields');
             }
         }
         if ($end_transaction) {
             $db->end_transaction();
         }
     } else {
         /* Failed Validation */
         return $error;
     }
 }
 /**
  * Purges a record from the database
  * 
  * @param string $revision_id
  * @param string $table
  * @return boolean
  */
 public static function purge_revision($object_id, $revision_id, $table)
 {
     $revision = self::get_revision($object_id, $table, $revision_id);
     if (argent_error::check($revision)) {
         return $revision;
     }
     $error = new argent_error();
     if (!argent_meta::object_registered($object_id)) {
         $error->add('1038', 'Object does not exist', $object_id, 'argent_uauth');
     }
     if (!self::object_exists($user_id)) {
         $error->add('1013', 'Invalid user account', $user_id, 'argent_uauth');
     }
     if (!argent_uauth::has_permission(AG_PERMISSION_DELETE, $object_id)) {
         $error->add('1024', 'Access denied', $object_id, 'argent_meta');
     }
     if ($error->has_errors()) {
         return $error;
     }
     $db = new argent_database();
     $sql = "\r\n                    DELETE FROM\r\n                        `{$table}`\r\n                    WHERE\r\n                        `meta_guid` = '{$db->escape_value($revision_id)}'\r\n                    ";
     return $db->query($sql);
 }