/** * Process posts */ public function post_check(array $args) { $auth = null; $ocs = new com_meego_ocs_OCSWriter(); if (!isset($_POST['login'])) { $ocs->writeError('The login argument is mandatory', 101); $ocs->endDocument(); self::output_xml($ocs); return; } $tokens = com_meego_ocs_utils::prepare_tokens(); switch (midgardmvc_core::get_instance()->configuration->ocs_authentication) { case 'LDAP': $info = com_meego_ocs_utils::ldap_check($tokens); $auth = com_meego_ocs_utils::authenticate(); break; case 'basic': default: $info = new midgardmvc_core_services_authentication_basic(); $e = new Exception("Requires HTTP Basic authentication"); $info->handle_exception($e); } if (!$info || !$auth) { $ocs->writeError('Invalid account', 102); $ocs->endDocument(); self::output_xml($ocs); return; } $ocs->writeMeta(null, null, 'Valid account', 'ok', 100); $ocs->writePersonCheck($info['username'], $info['email']); $ocs->endDocument(); self::output_xml($ocs); }
/** * Process an attribute setting POST * args['context'] might be: installed * args['key'] holds the package ID * @param args see above */ public function post_setattribute(array $args) { $summary = ''; $success = true; if (!$this->user) { // this operation requires authentication $auth = com_meego_ocs_utils::authenticate($args); if (!$auth) { com_meego_ocs_utils::end_with_error('This interface is available for authenticated users only', 199); } } if (!isset($args['context'])) { com_meego_ocs_utils::end_with_error('Mandatory context missing (e.g. installed)', 102); } if (!isset($args['key'])) { com_meego_ocs_utils::end_with_error('Mandatory package ID missing', 103); } // check if the context is supported switch ($args['context']) { case 'save': $summary = 'User succesfully installed an application.'; break; case 'unsave': $summary = 'User succesfully uninstalled an application.'; break; case 'savefail': $summary = 'Application installation failed.'; break; default: com_meego_ocs_utils::end_with_error('This context: ' . $args['context'] . ' is not supported', 104); } $package = new com_meego_package(); try { $package->get_by_id((int) $args['key']); } catch (Exception $e) { $success = false; com_meego_ocs_utils::end_with_error('Package with id: ' . $args['key'] . ' not found', 105); } if ($success) { $res = midgardmvc_account_controllers_activity::create_activity($this->user->person, $args['context'], $package->guid, $summary, 'Apps'); if (!$res) { com_meego_ocs_utils::end_with_error('Failed to create activity object.', 106); } } // everything went fine $ocs = new com_meego_ocs_OCSWriter(); $ocs->writeMeta(null, null, 'Attribute setting succeded.', 'ok', 100); $ocs->endDocument(); com_meego_ocs_utils::output_xml($ocs); }
/** * Dumps content elements */ public function writeContent($packages) { $this->startElement('data'); foreach ($packages as $package) { $mvc = midgardmvc_core::get_instance(); $this->startElement('content'); $this->writeAttribute('details', 'full'); $this->writeElement('id', $package->packageid); $this->writeElement('name', $package->packagetitle); $this->writeElement('version', $package->packageversion); $this->writeElement('description', $package->packagedescription); $this->writeElement('summary', $package->packagesummary); $this->writeElement('homepage', $package->packagehomepageurl); $this->writeElement('created', $package->packagecreated); $this->writeElement('changed', $package->packagerevised); $this->writeElement('score', 20 * $package->statscachedratingvalue); $this->writeElement('x-filename', $package->packagefilename); $this->writeElement('x-license', $package->packagelicense); $this->writeElement('x-arch', $package->repoarch); $this->writeElement('x-project', $package->repoprojectname); $this->writeElement('x-repository', $package->reponame); $this->writeElement('x-os', $package->repoos); $this->writeElement('x-osversion', $package->repoosversion); $this->writeElement('x-ux', $package->repoosux); $this->writeElement('x-licenseid', $package->packagelicenseid); $this->writeElement('x-distributionid', $package->repoosversionid); $this->writeElement('x-dependencyid', $package->repoosuxid); $this->writeElement('x-obsname', $package->packageparent); if (isset($package->roles)) { $this->writeElement('x-roles', $package->roles); } if (isset($package->history)) { $this->writeElement('x-history', $package->history); } $user = com_meego_ocs_utils::get_current_user(); if ($user) { if (com_meego_ocs_utils::user_has_voted($package->packageid, $user->person)) { $this->writeElement('x-rated', 'true'); } else { $this->writeElement('x-rated', 'false'); } } if (isset($package->testing) && $package->testing) { $this->writeElement('x-testing', true); $this->writeElement('x-qa-score', $package->packagescore); if (isset($package->qa)) { $this->writeElement('x-qa', $package->qa); } } $dispatcher = midgardmvc_core::get_instance()->dispatcher; $counter = 0; $_downloadurl = ''; //$package->packageinstallfileurl; foreach ($package->attachments as $attachment) { // check if attachment is YMP (ie. 1 click install file) if ($attachment->mimetype == "text/x-suse-ymp" && !strlen($_downloadurl)) { $_downloadurl = com_meego_ocs_controllers_providers::generate_url($dispatcher->generate_url('attachmentserver_variant', array('guid' => $attachment->guid, 'variant' => '', 'filename' => $attachment->name), '/')); } // check if attachment MIME type is image something if ($attachment->mimetype == "image/png") { $_icon_marker = 'icon.png'; $_screenshot_marker = 'screenshot.png'; // check if the name is *screenshot.png if (strrpos($attachment->name, $_screenshot_marker) !== false) { $counter++; $_screenshoturl = com_meego_ocs_controllers_providers::generate_url($dispatcher->generate_url('attachmentserver_variant', array('guid' => $attachment->guid, 'variant' => 'prop480x300', 'filename' => $attachment->name), '/')); $_smallscreenshoturl = com_meego_ocs_controllers_providers::generate_url($dispatcher->generate_url('attachmentserver_variant', array('guid' => $attachment->guid, 'variant' => 'thumbnail', 'filename' => $attachment->name), '/')); $this->writeElement('previewpic' . $counter, $_screenshoturl); $this->writeElement('smallpreviewpic' . $counter, $_smallscreenshoturl); #if ($counter == 3) #{ # break; #} } // check if the name is *icon.png and generate <icon> elements if (strrpos($attachment->name, $_icon_marker) !== false) { $_iconurl = com_meego_ocs_controllers_providers::generate_url($dispatcher->generate_url('attachmentserver_variant', array('guid' => $attachment->guid, 'variant' => 'icon', 'filename' => $attachment->name), '/')); $iconwidth = $mvc->configuration->attachmentserver_variants['icon']['croppedThumbnail']['width']; $iconheight = $mvc->configuration->attachmentserver_variants['icon']['croppedThumbnail']['height']; $this->startElement('icon'); $this->writeAttribute('width', $iconwidth); $this->writeAttribute('height', $iconheight); $this->text($_iconurl); $this->endElement(); } } } $this->writeElement('comments', $package->comments_count); if (isset($package->commentsurl)) { $this->writeElement('commentspage', $package->commentsurl); } $this->writeElement('downloadname1', $package->packagename); $this->writeElement('downloadlink1', $_downloadurl); $this->endElement(); //content } $this->endElement(); // data }
/** * Process a comment post */ public function post_add(array $args) { $success = true; if (!$this->user) { // Voting requires authentication $auth = com_meego_ocs_utils::authenticate($args); if (!$auth) { return null; } } $ocs = new com_meego_ocs_OCSWriter(); if (!isset($_POST['content'])) { $ocs->writeError('Content must not be empty', 101); $ocs->endDocument(); self::output_xml($ocs); return; } if (!(isset($_POST['message']) || isset($_POST['subject']))) { $ocs->writeError('Message or subject must not be empty', 102); $ocs->endDocument(); self::output_xml($ocs); return; } if ($_POST['type'] != '1' && $_POST['type'] != '8') { $ocs->writeError('Content type: ' . $_POST['type'] . ' is not supported.', 104); $ocs->endDocument(); self::output_xml($ocs); return; } $package = new com_meego_package(); $package->get_by_id((int) $_POST['content']); if (!$package->guid) { $success = false; $this->mvc->log(__CLASS__, 'Package with id: ' . $_POST['content'] . ' not found.', 'error'); } if ($success) { switch ($_POST['type']) { case 1: $message = 'Rating via OCS failed. Could not create rating object for package ' . $package->name . '(id: ' . $package->id . ').'; $comment = new com_meego_comments_comment(); if (isset($_POST['parent']) && !empty($_POST['parent'])) { $parent = new com_meego_comments_comment(); $parent->get_by_id((int) $_POST['parent']); if ($parent->to != $package->guid) { $success = false; $this->mvc->log(__CLASS__, $message . ' Parent comment is not related to the content item', 'error'); } $comment->up = $parent->id; } $comment->to = $package->guid; $comment->content = $_POST['message']; if (isset($_POST['subject']) && !empty($_POST['subject'])) { $comment->title = $_POST['subject']; } $comment->create(); if ($comment->guid) { $rating = new com_meego_ratings_rating(); $rating->to = $package->guid; // for comments we have no votes $rating->rating = 0; $rating->comment = $comment->id; $success = $rating->create(); if ($success) { $message = 'Rating via OCS finished. New rating object is: ' . $rating->guid . '.'; } } break; case 8: $name = substr($_POST['message'], 0, strpos($_POST['message'], ':')); $workflows = $this->mvc->configuration->workflows; if (array_key_exists($name, $workflows)) { if (is_object($package)) { $this->mvc->component->load_library('Workflow'); $workflow_definition = new $workflows[$name]['provider'](); $values = $workflow_definition->start($package); if (array_key_exists('execution', $values)) { // get the db form and fill in the fields $form = new midgardmvc_ui_forms_form($values['review_form']); $transaction = new midgard_transaction(); $transaction->begin(); $instance = new midgardmvc_ui_forms_form_instance(); $instance->form = $form->id; $instance->relatedobject = $package->guid; $instance->create(); if (isset($instance->guid)) { // give values to the db fields taken from the posted values and store each of them // use the form instance ID as "form" property of the fields $posted_values = explode(',', substr($_POST['message'], strpos($_POST['message'], ':') + 1)); $db_fields = midgardmvc_ui_forms_generator::list_fields($form); $i = 0; foreach ($db_fields as $dbfield) { if (!$success) { // if 1 field creation failed then end this loop as fast as possible continue; } switch ($dbfield->widget) { case 'checkbox': $holder = "booleanvalue"; $value = $posted_values[$i]; break; default: $options = explode(',', $dbfield->options); $value = $options[(int) $posted_values[$i]]; $holder = "stringvalue"; } $field_instance = new midgardmvc_ui_forms_form_instance_field(); $field_instance->form = $instance->id; $field_instance->field = $dbfield->guid; $field_instance->{$holder} = $value; if (!$field_instance->create()) { $success = false; } ++$i; } if ($success) { $message = 'QA via OCS by user ' . $this->user->login . ' for package: ' . $package->name . ' (id: ' . $package->id . ')'; try { $workflow = $workflow_definition->get(); $execution = new midgardmvc_helper_workflow_execution_interactive($workflow, $values['execution']); } catch (ezcWorkflowExecutionException $e) { $success = false; $this->mvc->log(__CLASS__, $message . ' failed. Workflow: ' . $values['workflow'] . ' not found. See error: ' . $e->getMessage(), 'error'); } if ($success) { $args = array('review' => $instance->guid); try { $values = $workflow_definition->resume($execution->guid, $args); } catch (ezcWorkflowInvalidInputException $e) { $success = false; $this->mvc->log(__CLASS__, $message . ' failed. Maybe a quick re-submit? See error: ' . $e->getMessage(), 'error'); } $transaction->commit(); $this->mvc->log(__CLASS__, 'New QA form guid: ' . $instance->guid, 'info'); } } } if (!$success) { $this->mvc->log(__CLASS__, $message . ' failed. Probably a form instance or a field creation failed.', 'info'); $transaction->rollback(); } } } } break; } if ($success) { // POST went fine $ocs->writeMeta(null, null, 'Posting succeded.', 'ok', 100); $this->mvc->log(__CLASS__, $message, 'info'); // create activity object $created = null; switch ($_POST['type']) { case 1: $verb = 'comment'; $summary = 'The user commented an application via OCS.'; $creator = $rating->metadata->creator; $created = $rating->metadata->created; $target = $rating->to; break; case 8: $verb = 'review'; $summary = 'The user reviewed an application via OCS.'; $creator = $instance->metadata->creator; $created = $instance->metadata->created; $target = $instance->relatedobject; break; } if ($created) { $res = midgardmvc_account_controllers_activity::create_activity($creator, $verb, $target, $summary, 'Apps', $created); } unset($created, $creator, $target); } } if (!$success) { $ocs->writeError('Comment posting (type: ' . $_POST['type'] . ') failed.'); $this->mvc->log(__CLASS__, $message . ' failed.', 'info'); } $ocs->endDocument(); self::output_xml($ocs); }
/** * Process vote posts */ public function post_vote(array $args) { $auth = false; $ocs = new com_meego_ocs_OCSWriter(); if ($this->user) { $auth = true; } else { // Voting requires authentication $auth = com_meego_ocs_utils::authenticate($args); } if ($auth) { $primary = new com_meego_package(); $primary->get_by_id((int) $args['contentid']); if (!$primary->guid) { $this->mvc->log(__CLASS__, 'Package with id: (with id:' . $args['contentid'] . ') can not be found', 'info'); $ocs->writeError('Content not found', 101); } else { $voted = false; // the multiple voting is configurable, pls check the config file if (!$this->mvc->configuration->allow_multiple_voting) { // if not allowed then check if the user has voted already if (com_meego_ocs_utils::user_has_voted($primary->id, $this->user->person)) { $this->mvc->log(__CLASS__, "{$this->user}->login has already voted for {$primary->name} (with id: {$primary->id}) and multiple votings are disabled", 'info'); $ocs->writeError('Multiple voting not allowed and user has already voted this object.', 103); } } if (!$ocs->error) { $rating = new com_meego_ratings_rating(); $rating->to = $primary->guid; $vote = $_POST['vote']; // incoming votes are ranging between 0 and 100 // our internal scale is different: 0 - 5 $vote = round($vote / 20); if ($vote > $this->mvc->configuration->maxrate) { $vote = $this->mvc->configuration->maxrate; } $rating->rating = $vote; // for votes only we have no comments $rating->comment = 0; if (!$rating->create()) { $this->mvc->log(__CLASS__, 'Failed to create rating object. User: '******', application: ' . $primary->name . ' (with id: ' . $primary->id . ')', 'info'); throw new midgardmvc_exception_notfound("Could not create rating object"); } $args = array('to' => $rating->to); com_meego_ratings_caching_controllers_rating::calculate_average($args); $ocs->writeMeta(0); $this->mvc->log(__CLASS__, 'Rating (' . $rating->rating . ') submitted by ' . $this->user->login . ' for ' . $primary->name . ' (with id: ' . $primary->id . ')', 'info'); // create activity object $verb = 'rate'; $summary = 'The user rated an application via OCS.'; $res = midgardmvc_account_controllers_activity::create_activity($rating->metadata->creator, $verb, $rating->to, $summary, 'Apps', $rating->metadata->created); } } } else { // extend the OCS spec with a custom status code $this->mvc->log(__CLASS__, 'Attempt to vote by anonymous. No luck.', 'info'); $ocs->writeError('Voting requires authentication. Please login first.', 102); } $ocs->endDocument(); self::output_xml($ocs); }