Exemple #1
0
 /**
  * Helper function to retrieve the object from the db
  *
  * @param string $guid GUID
  */
 private function _load_object($guid)
 {
     try {
         $this->_object = midcom::get('dbfactory')->get_object_by_guid($guid);
     } catch (midcom_error $e) {
         if (midcom_connection::get_error() == MGD_ERR_OBJECT_DELETED) {
             $relocate = midcom_core_context::get()->get_key(MIDCOM_CONTEXT_ANCHORPREFIX) . '__mfa/asgard/object/deleted/' . $guid;
             midcom::get()->relocate($relocate);
         }
         throw $e;
     }
 }
Exemple #2
0
 public function testCRUD()
 {
     $time = time();
     midcom::get('auth')->request_sudo('org.openpsa.products');
     $group = new org_openpsa_products_product_group_dba();
     $group->code = 'TEST-100' . $time;
     $stat = $group->create();
     $this->assertTrue($stat);
     $this->assertEquals($group->code, 'TEST-100' . $time);
     $group->code = 'TEST-101' . $time;
     $stat = $group->update();
     $this->assertTrue($stat);
     $this->register_object($group);
     $this->assertEquals($group->code, 'TEST-101' . $time);
     $group2 = new org_openpsa_products_product_group_dba();
     $group2->code = 'TEST-101' . $time;
     $stat = $group2->create();
     $this->assertFalse($stat);
     $this->assertEquals(midcom_connection::get_error(), MGD_ERR_OBJECT_NAME_EXISTS);
     $stat = $group->delete();
     $this->assertTrue($stat);
     midcom::get('auth')->drop_sudo();
 }
Exemple #3
0
 private static function _process_delete_queue($queue_name, $queue)
 {
     midcom::get('auth')->request_sudo('midcom.core');
     $limit = sizeof($queue) * 5;
     $iteration = 0;
     while (!empty($queue)) {
         $object = array_pop($queue);
         if (!$object->delete()) {
             if (midcom_connection::get_error() == MGD_ERR_HAS_DEPENDANTS || midcom_connection::get_error() == MGD_ERR_OK) {
                 array_unshift($queue, $object);
             } else {
                 if (midcom_connection::get_error() == MGD_ERR_NOT_EXISTS) {
                     continue;
                 } else {
                     throw new midcom_error('Cleanup ' . get_class($object) . ' ' . $object->guid . ' failed, reason: ' . midcom_connection::get_error_string());
                 }
             }
         } else {
             $object->purge();
         }
         if ($iteration++ > $limit) {
             $classnames = array();
             foreach ($queue as $obj) {
                 $obj_class = get_class($obj);
                 if ($obj->name) {
                     $obj_class .= " {$obj->name}";
                 }
                 if ($obj->component) {
                     $obj_class .= " [{$obj->component}]";
                 }
                 if (!in_array($obj_class, $classnames)) {
                     $classnames[] = $obj_class;
                 }
             }
             $classnames_string = implode(', ', $classnames);
             throw new midcom_error('Maximum retry count for ' . $queue_name . ' cleanup reached (' . sizeof($queue) . ' remaining entries with types ' . $classnames_string . '). Last Midgard error was: ' . midcom_connection::get_error_string());
         }
     }
     midcom::get('auth')->drop_sudo();
 }
Exemple #4
0
 function getUsersBlogs($message)
 {
     $args = $this->_params_to_args($message);
     if (count($args) != 3) {
         return new XML_RPC_Response(0, midcom_connection::get_error(), 'Invalid arguments.');
     }
     if (!midcom::get('auth')->login($args[1], $args[2])) {
         return new XML_RPC_Response(0, midcom_connection::get_error(), 'Authentication failed.');
     }
     midcom::get('auth')->initialize();
     $response = array();
     $topic = $this->_topic;
     if (!$topic->can_do('midgard:create')) {
         // Skip this blog, user cannot edit
         continue;
     }
     $nap = new midcom_helper_nav();
     $node = $nap->get_node($topic->id);
     if (!$node) {
         // This topic isn't on site
         continue;
     }
     $response_array = array('url' => new XML_RPC_Value($node[MIDCOM_NAV_FULLURL], 'string'), 'blogid' => new XML_RPC_Value($topic->guid, 'string'), 'blogName' => new XML_RPC_Value($node[MIDCOM_NAV_NAME], 'string'));
     $response[] = new XML_RPC_Value($response_array, 'struct');
     return new XML_RPC_Response(new XML_RPC_Value($response, 'array'));
 }
Exemple #5
0
 /**
  * This is an internal helper function, which may only be called statically.
  *
  * It is used by get_all_privileges in case that there is no cache hit. It will query the
  * database and construct all necessary objects out of it.
  *
  * @param string $guid The GUID of the object for which to query ACL data.
  * @param string $type SELF or CONTENT
  * @return Array A list of midcom_core_privilege instances.
  */
 protected static function _query_privileges($guid, $type)
 {
     $result = array();
     $mc = new midgard_collector('midcom_core_privilege_db', 'objectguid', $guid);
     $mc->add_constraint('value', '<>', MIDCOM_PRIVILEGE_INHERIT);
     if ($type == 'CONTENT') {
         $mc->add_constraint('assignee', '<>', 'SELF');
     } else {
         $mc->add_constraint('assignee', '=', 'SELF');
     }
     $mc->set_key_property('guid');
     $mc->add_value_property('id');
     $mc->add_value_property('privilegename');
     $mc->add_value_property('assignee');
     $mc->add_value_property('classname');
     $mc->add_value_property('value');
     midcom_connection::set_error(MGD_ERR_OK);
     $mc->execute();
     $privileges = $mc->list_keys();
     if (!$privileges) {
         if (midcom_connection::get_error() != MGD_ERR_OK) {
             debug_add("Failed to retrieve all {$type} privileges for the Object GUID {$guid}: " . midcom_connection::get_error_string(), MIDCOM_LOG_INFO);
             debug_print_r('Result was:', $result);
             if (isset($php_errormsg)) {
                 debug_add("Error message was: {$php_errormsg}", MIDCOM_LOG_ERROR);
             }
             throw new midcom_error('Privilege collector failed to execute: ' . midcom_connection::get_error_string());
         }
         return $result;
     }
     foreach ($privileges as $privilege_guid => $value) {
         $privilege = $mc->get($privilege_guid);
         $privilege['objectguid'] = $guid;
         $privilege['guid'] = $privilege_guid;
         $privilege_object = new midcom_core_privilege($privilege);
         if (!isset($privilege_object->assignee)) {
             // Invalid privilege, skip
             continue;
         }
         $privilege_object->scope = $privilege_object->_get_scope();
         $return[] = $privilege_object;
     }
     return $return;
 }
Exemple #6
0
 $results = $qb->execute();
 foreach ($results as $result) {
     if (in_array($result->target, $valid_targets)) {
         continue;
     }
     if (in_array($result->target, $invalid_targets)) {
         continue;
     }
     try {
         $object = midcom::get('dbfactory')->get_object_by_guid($result->target);
         $valid_targets[] = $object->guid;
     } catch (midcom_error $e) {
         if (midcom_connection::get_error() === MGD_ERR_OBJECT_DELETED) {
             $valid_targets[] = $result->target;
         } else {
             if (midcom_connection::get_error() === MGD_ERR_OBJECT_PURGED || midcom_connection::get_error() === MGD_ERR_NOT_EXISTS) {
                 $invalid_targets[] = $result->target;
                 $delete_qb = midcom_helper_activitystream_activity_dba::new_query_builder();
                 $delete_qb->add_constraint('target', '=', $result->target);
                 $to_delete = $delete_qb->execute();
                 if (sizeof($to_delete) == 0) {
                     continue;
                 }
                 echo "Deleting " . sizeof($to_delete) . " entries for purged target " . $result->target . " \n";
                 flush();
                 foreach ($to_delete as $entry) {
                     if (!$entry->delete()) {
                         echo 'ERROR: Deleting entry ' . $entry->guid . ' failed: ' . midcom_connection::get_error_string() . " \n";
                     } else {
                         $entry->purge();
                     }
Exemple #7
0
 private function _create_topic($prefix)
 {
     if (!empty($this->_new_topic->symlink)) {
         $name = $this->_new_topic->name;
         $topic = $this->_new_topic;
         while (!empty($topic->symlink)) {
             // Only direct symlinks are supported, but indirect symlinks are ok as we change them to direct ones here
             $this->_new_topic->symlink = $topic->symlink;
             try {
                 $topic = new midcom_db_topic($topic->symlink);
             } catch (midcom_error $e) {
                 debug_add("Could not get target for symlinked topic #{$this->_new_topic->id}: " . $e->getMessage(), MIDCOM_LOG_ERROR);
                 $topic = $this->_new_topic;
                 $this->_new_topic->purge();
                 throw new midcom_error("Refusing to create this symlink because its target folder was not found: " . $e->getMessage());
             }
             $name = $topic->name;
         }
         if ($this->_new_topic->up == $topic->up) {
             $this->_new_topic->purge();
             throw new midcom_error("Refusing to create this symlink because it is located in the same " . "folder as its target. You must have made a mistake. Sorry, but this " . "was for your own good.");
         }
         if ($this->_new_topic->up == $topic->id) {
             $this->_new_topic->purge();
             throw new midcom_error("Refusing to create this symlink because its parent folder is the same " . "folder as its target. You must have made a mistake because this would " . "have created an infinite loop situation. The whole site would have " . "been completely and irrevocably broken if this symlink would have been " . "allowed to exist. Infinite loops can not be allowed. Sorry, but this " . "was for your own good.");
         }
         $this->_new_topic->update();
         if (!midcom_admin_folder_management::is_child_listing_finite($topic)) {
             $this->_new_topic->purge();
             throw new midcom_error("Refusing to create this symlink because it would have created an " . "infinite loop situation. The whole site would have been completely " . "and irrevocably broken if this symlink would have been allowed to " . "exist. Please redesign your usage of symlinks. Infinite loops can " . "not be allowed. Sorry, but this was for your own good.");
         }
         $this->_new_topic->name = $name;
         while (!$this->_new_topic->update() && midcom_connection::get_error() == MGD_ERR_DUPLICATE) {
             $this->_new_topic->name .= "-link";
         }
     }
     midcom::get('uimessages')->add($this->_l10n->get('midcom.admin.folder'), $this->_l10n->get('folder created'));
     // Generate name if it is missing
     if (!$this->_new_topic->name) {
         $this->_new_topic->name = midcom_helper_misc::generate_urlname_from_string($this->_new_topic->extra);
         $this->_new_topic->update();
     }
     // Get the relocation url
     $url = "{$prefix}{$this->_new_topic->name}/";
     return $url;
 }
Exemple #8
0
 /**
  * Import midgard_blob unserialized with midgard_replicator::unserialize()
  *
  * This method does ACL checks and triggers watchers etc.
  *
  * @param midgard_blob $unserialized_object midgard_blob gotten from midgard_replicator::unserialize()
  * @param string $xml XML the midgard_blob was unserialized from
  * @param boolean $use_force set use of force for the midcom_helper_replicator_import_from_xml() call
  * @return boolean indicating success/failure
  */
 function import_blob(&$unserialized_object, &$xml, $use_force = false)
 {
     if (!is_a($unserialized_object, 'midgard_blob')) {
         debug_add("You should use the *import* method to import normal objects, passing control there", MIDCOM_LOG_WARNING);
         return $this->import($unserialized_object, $use_force);
     }
     // We need this helper (workaround Zend bug)
     if (!function_exists('midcom_helper_replicator_import_object')) {
         midcom::get('componentloader')->load('midcom.helper.replicator');
     }
     try {
         $acl_object = midcom::get('dbfactory')->get_object_by_guid($unserialized_object->parentguid);
     } catch (midcom_error $e) {
         debug_add("Could not get parent object (GUID: {$unserialized_object->parentguid}), aborting", MIDCOM_LOG_ERROR);
         return false;
     }
     // midgard_blob has no action, update is the best check for allowing import of blob data
     if (!midcom_baseclasses_core_dbobject::update_pre_checks($acl_object)) {
         $parent_class = get_class($acl_object);
         debug_add("parent ({$parent_class} {$acl_object->guid}) update pre-flight check returned false", MIDCOM_LOG_ERROR);
         return false;
     }
     // Actual import
     // NOTE: midgard_replicator::import_from_xml returns void, which evaluates to false, check midcom_connection::get_error instead
     midcom_helper_replicator_import_from_xml($xml, $use_force);
     if (midcom_connection::get_error() !== MGD_ERR_OK) {
         debug_add('midcom_helper_replicator_import_from_xml returned false, errstr: ' . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR);
         return false;
     }
     // Trigger parent updated
     midcom_baseclasses_core_dbobject::update_post_ops($acl_object);
     // And also imported
     midcom::get('componentloader')->trigger_watches(MIDCOM_OPERATION_DBA_IMPORT, $acl_object);
     return true;
 }
Exemple #9
0
 public function __construct(midgard_error_exception $e, $id = null)
 {
     //catch last error which might be from dbaobject
     $last_error = midcom_connection::get_error();
     if (!is_null($id)) {
         if ($last_error === MGD_ERR_NOT_EXISTS) {
             $code = MIDCOM_ERRNOTFOUND;
             $message = "The object with identifier {$id} was not found.";
         } else {
             if ($last_error == MGD_ERR_ACCESS_DENIED) {
                 $code = MIDCOM_ERRFORBIDDEN;
                 $message = midcom::get('i18n')->get_string('access denied', 'midcom');
             } else {
                 if ($last_error == MGD_ERR_OBJECT_DELETED) {
                     $code = MIDCOM_ERRNOTFOUND;
                     $message = "The object with identifier {$id} was deleted.";
                 }
             }
         }
     }
     //If other options fail, go for the server error
     if (!isset($code)) {
         $code = MIDCOM_ERRCRIT;
         $message = $e->getMessage();
     }
     parent::__construct($message, $code);
 }
        }
        echo "            <td class=\"revised\">" . strftime('%x %X', $object->metadata->revised) . "</td>\n";
        echo "            <td class=\"revisor\">{$revisor_name}</td>\n";
        echo "            <td class=\"approved\">{$approved_str}</td>\n";
        echo "            <td class=\"revision\">{$object->metadata->revision}</td>\n";
        echo "        </tr>\n";
    }
} else {
    $activities = midcom_helper_activitystream_activity_dba::get($data['config']->get('last_visited_size'));
    if (count($activities) > 0) {
        $reflectors = array();
        foreach ($activities as $activity) {
            try {
                $object = midcom::get('dbfactory')->get_object_by_guid($activity->target);
            } catch (midcom_error $e) {
                if (midcom_connection::get_error() == MGD_ERR_OBJECT_DELETED) {
                    // TODO: Visualize deleted objects somehow
                }
                continue;
            }
            if (!isset($actors)) {
                $actors = array();
            }
            if (!isset($actors[$activity->actor])) {
                try {
                    $actors[$activity->actor] = new midcom_db_person($activity->actor);
                } catch (midcom_error $e) {
                    $actors[$activity->actor] = new midcom_db_person();
                }
            }
            $class = get_class($object);
Exemple #11
0
 private function _update_account($fields)
 {
     $stat = false;
     $password = null;
     //new password?
     if (!empty($fields["new_password"]->value)) {
         $password = $fields["new_password"]->value;
     }
     $accounthelper = new org_openpsa_user_accounthelper($this->_person);
     // Update account
     $stat = $accounthelper->set_account($fields["username"]->value, $password);
     if (!$stat && midcom_connection::get_error() != MGD_ERR_OK) {
         // Failure, give a message
         midcom::get('uimessages')->add($this->_l10n->get('org.openpsa.user'), $this->_l10n->get("failed to update the user account, reason") . ': ' . midcom_connection::get_error_string(), 'error');
     }
     return $stat;
 }
Exemple #12
0
 /**
  * Process the request
  *
  * Basically this method will parse the URL and search for a component that can
  * handle the request. If one is found, it will process the request, if not, it
  * will report an error, depending on the situation.
  *
  * Details: The logic will traverse the node tree and for each node it will load
  * the component that is responsible for it. This component gets the chance to
  * accept the request (this is encapsulated in the _can_handle call), which is
  * basically a call to can_handle. If the component declares to be able to handle
  * the call, its handle function is executed. Depending if the handle was successful
  * or not, it will either display an HTTP error page or prepares the content handler
  * to display the content later on.
  *
  * If the parsing process doesn't find any component that declares to be able to
  * handle the request, an HTTP 404 - Not Found error is triggered.
  */
 private function _process(midcom_core_context $context)
 {
     $resolver = new midcom_core_resolver($context);
     $handler = $resolver->process();
     if (false === $handler) {
         /**
          * Simple: if current context is not '0' we were called from another context.
          * If so we should not break application now - just gracefully continue.
          */
         if ($context->id == 0) {
             // We couldn't fetch a node due to access restrictions
             if (midcom_connection::get_error() == MGD_ERR_ACCESS_DENIED) {
                 throw new midcom_error_forbidden(midcom::get('i18n')->get_string('access denied', 'midcom'));
             } else {
                 throw new midcom_error_notfound("This page is not available on this server.");
             }
         }
         $this->_status = MIDCOM_STATUS_ABORT;
         return false;
     }
     $context->run($handler);
     if ($context->id == 0 && $this->skip_page_style == true) {
         $this->_status = MIDCOM_STATUS_CONTENT;
         // Enter Context
         $oldcontext = $context;
         midcom_core_context::get(0)->set_current();
         midcom::get('style')->enter_context(0);
         $this->_output();
         // Leave Context
         midcom::get('style')->leave_context();
         $oldcontext->set_current();
         $this->finish();
         _midcom_stop_request();
     } else {
         $this->_status = MIDCOM_STATUS_CONTENT;
     }
 }