Projects
Kolab:3.4
roundcubemail-plugins-kolab
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 33
View file
roundcubemail-plugins-kolab.spec
Changed
@@ -23,7 +23,7 @@ %global roundcube_lib %{_var}/lib/roundcubemail Name: roundcubemail-plugins-kolab -Version: 3.1.8 +Version: 3.1.9 Release: 1%{?dist} Summary: Kolab Groupware plugins for Roundcube Webmail @@ -209,6 +209,9 @@ %attr(0770,root,%{httpd_group}) %{roundcube_lib}/plugins/odfviewer %changelog +* Thu Dec 26 2013 Jeroen van Meeuwen <vanmeeuwen@kolabsys.com> - 3.1.9-1 +- New upstream version + * Mon Nov 25 2013 Jeroen van Meeuwen <vanmeeuwen@kolabsys.com> - 3.1.8-1 - New upstream version
View file
debian.changelog
Changed
@@ -1,3 +1,9 @@ +roundcubemail-plugins-kolab (1:3.1.9-0~kolab1) unstable; urgency=low + + * New upstream release + + -- Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com> Thu, 26 Dec 2013 18:41:13 +0200 + roundcubemail-plugins-kolab (1:3.1.8-0~kolab1) unstable; urgency=low * New upstream release
View file
roundcubemail-plugins-kolab-3.1.8.tar.gz/plugins/calendar/calendar.php -> roundcubemail-plugins-kolab-3.1.9.tar.gz/plugins/calendar/calendar.php
Changed
@@ -1864,11 +1864,12 @@ $html = ''; foreach ($this->ics_parts as $mime_id) { - $part = $this->message->mime_parts[$mime_id]; + $part = $this->message->mime_parts[$mime_id]; $charset = $part->ctype_parameters['charset'] ? $part->ctype_parameters['charset'] : RCMAIL_CHARSET; - $events = $this->ical->import($this->message->get_part_content($mime_id), $charset); - $title = $this->gettext('title'); - + $events = $this->ical->import($this->message->get_part_content($mime_id), $charset); + $title = $this->gettext('title'); + $date = rcube_utils::anytodatetime($this->message->headers->date); + // successfully parsed events? if (empty($events)) continue; @@ -1913,13 +1914,21 @@ break; } } - - $dom_id = asciiwords($event['uid'], true); - $buttons = html::div(array('id' => 'rsvp-'.$dom_id, 'style' => 'display:none'), $rsvp_buttons); - $buttons .= html::div(array('id' => 'import-'.$dom_id, 'style' => 'display:none'), $import_button); + + $dom_id = asciiwords($event['uid'], true); + $buttons = html::div(array('id' => 'rsvp-'.$dom_id, 'style' => 'display:none'), $rsvp_buttons); + $buttons .= html::div(array('id' => 'import-'.$dom_id, 'style' => 'display:none'), $import_button); $buttons_pre = html::div(array('id' => 'loading-'.$dom_id, 'class' => 'rsvp-status loading'), $this->gettext('loading')); - - $this->rc->output->add_script('rcube_calendar.fetch_event_rsvp_status(' . json_serialize(array('uid' => $event['uid'], 'changed' => $event['changed']->format('U'), 'sequence' => intval($event['sequence']), 'fallback' => $status)) . ')', 'docready'); + $changed = is_object($event['changed']) ? $event['changed'] : $date; + + $script = json_serialize(array( + 'uid' => $event['uid'], + 'changed' => $changed ? $changed->format('U') : 0, + 'sequence' => intval($event['sequence']), + 'fallback' => $status, + )); + + $this->rc->output->add_script("rcube_calendar.fetch_event_rsvp_status($script)", 'docready'); } else if ($this->ical->method == 'CANCEL') { $title = $this->gettext('itipcancellation'); @@ -1937,13 +1946,21 @@ 'onclick' => "rcube_calendar.remove_event_from_mail('" . JQ($event['uid']) . "', '" . JQ($event['title']) . "')", 'value' => $this->gettext('removefromcalendar'), )); - - $dom_id = asciiwords($event['uid'], true); - $buttons = html::div(array('id' => 'rsvp-'.$dom_id, 'style' => 'display:none'), $button_remove); - $buttons .= html::div(array('id' => 'import-'.$dom_id, 'style' => 'display:none'), $button_import); + + $dom_id = asciiwords($event['uid'], true); + $buttons = html::div(array('id' => 'rsvp-'.$dom_id, 'style' => 'display:none'), $button_remove); + $buttons .= html::div(array('id' => 'import-'.$dom_id, 'style' => 'display:none'), $button_import); $buttons_pre = html::div(array('id' => 'loading-'.$dom_id, 'class' => 'rsvp-status loading'), $this->gettext('loading')); - - $this->rc->output->add_script('rcube_calendar.fetch_event_rsvp_status(' . json_serialize(array('uid' => $event['uid'], 'changed' => $event['changed']->format('U'), 'sequence' => intval($event['sequence']), 'fallback' => 'CANCELLED')) . ')', 'docready'); + $changed = is_object($event['changed']) ? $event['changed'] : $date; + + $script = json_serialize(array( + 'uid' => $event['uid'], + 'changed' => $changed ? $changed->format('U') : 0, + 'sequence' => intval($event['sequence']), + 'fallback' => 'CANCELLED', + )); + + $this->rc->output->add_script("rcube_calendar.fetch_event_rsvp_status($script)", 'docready'); } else { $buttons = html::tag('input', array(
View file
roundcubemail-plugins-kolab-3.1.8.tar.gz/plugins/calendar/drivers/kolab/kolab_calendar.php -> roundcubemail-plugins-kolab-3.1.9.tar.gz/plugins/calendar/drivers/kolab/kolab_calendar.php
Changed
@@ -267,9 +267,18 @@ $add = true; // skip the first instance of a recurring event if listed in exdate - if ($virtual && !empty($event['recurrence']['EXDATE'])) { + if ($virtual && (!empty($event['recurrence']['EXDATE']) || !empty($event['recurrence']['EXCEPTIONS']))) { $event_date = $event['start']->format('Ymd'); - foreach ($event['recurrence']['EXDATE'] as $exdate) { + $exdates = (array)$event['recurrence']['EXDATE']; + + // add dates from exceptions to list + if (is_array($event['recurrence']['EXCEPTIONS'])) { + foreach ($event['recurrence']['EXCEPTIONS'] as $exception) { + $exdates[] = clone $exception['start']; + } + } + + foreach ($exdates as $exdate) { if ($exdate->format('Ymd') == $event_date) { $add = false; break;
View file
roundcubemail-plugins-kolab-3.1.8.tar.gz/plugins/kolab_auth/kolab_auth.php -> roundcubemail-plugins-kolab-3.1.9.tar.gz/plugins/kolab_auth/kolab_auth.php
Changed
@@ -149,24 +149,27 @@ if (!empty($role_plugins)) { foreach ($role_plugins as $role_dn => $plugins) { - $role_plugins[self::parse_ldap_vars($role_dn)] = $plugins; + $role_dn = self::parse_ldap_vars($role_dn); + if (!empty($role_plugins[$role_dn])) { + $role_plugins[$role_dn] = array_unique(array_merge((array)$role_plugins[$role_dn], $plugins)); + } else { + $role_plugins[$role_dn] = $plugins; + } } } if (!empty($role_settings)) { foreach ($role_settings as $role_dn => $settings) { - $role_settings[self::parse_ldap_vars($role_dn)] = $settings; + if (!empty($role_settings[$role_dn])) { + $role_settings[$role_dn] = array_merge((array)$role_settings[$role_dn], $settings); + } else { + $role_settings[$role_dn] = $settings; + } } } foreach ($_SESSION['user_roledns'] as $role_dn) { - if (isset($role_plugins[$role_dn]) && is_array($role_plugins[$role_dn])) { - foreach ($role_plugins[$role_dn] as $plugin) { - $this->require_plugin($plugin); - } - } - - if (isset($role_settings[$role_dn]) && is_array($role_settings[$role_dn])) { + if (!empty($role_settings[$role_dn]) && is_array($role_settings[$role_dn])) { foreach ($role_settings[$role_dn] as $setting_name => $setting) { if (!isset($setting['mode'])) { $setting['mode'] = 'override'; @@ -188,7 +191,7 @@ $dont_override = (array) $rcmail->config->get('dont_override'); - if (!isset($setting['allow_override']) || !$setting['allow_override']) { + if (empty($setting['allow_override'])) { $rcmail->config->set('dont_override', array_merge($dont_override, array($setting_name))); } else { @@ -202,6 +205,19 @@ $rcmail->config->set('dont_override', $_dont_override); } } + + if ($setting_name == 'skin') { + if ($rcmail->output->type == 'html') { + $rcmail->output->set_skin($setting['value']); + $rcmail->output->set_env('skin', $setting['value']); + } + } + } + } + + if (!empty($role_plugins[$role_dn])) { + foreach ((array)$role_plugins[$role_dn] as $plugin) { + $this->require_plugin($plugin); } } }
View file
roundcubemail-plugins-kolab-3.1.8.tar.gz/plugins/kolab_auth/kolab_auth_ldap.php -> roundcubemail-plugins-kolab-3.1.9.tar.gz/plugins/kolab_auth/kolab_auth_ldap.php
Changed
@@ -207,7 +207,7 @@ /** * Search records (simplified version of rcube_ldap::search) * - * @param mixed $fields The field name of array of field names to search in + * @param mixed $fields The field name or array of field names to search in * @param mixed $value Search value (or array of values when $fields is array) * @param int $mode Matching mode: * 0 - partial (*abc*), @@ -221,6 +221,10 @@ */ function search($fields, $value, $mode=1, $required = array(), $limit = 0) { + if (empty($fields)) { + return array(); + } + $mode = intval($mode); // use AND operator for advanced searches @@ -236,8 +240,13 @@ } foreach ((array)$fields as $idx => $field) { - $val = is_array($value) ? $value[$idx] : $value; - if ($attrs = (array) $this->fieldmap[$field]) { + $val = is_array($value) ? $value[$idx] : $value; + $attrs = (array) $this->fieldmap[$field]; + + if (empty($attrs)) { + $filter .= "($field=$wp" . rcube_ldap_generic::quote_string($val) . "$ws)"; + } + else { if (count($attrs) > 1) $filter .= '(|'; foreach ($attrs as $f) @@ -254,7 +263,13 @@ foreach ((array)$required as $field) { if (in_array($field, (array)$fields)) // required field is already in search filter continue; - if ($attrs = (array) $this->fieldmap[$field]) { + + $attrs = (array) $this->fieldmap[$field]; + + if (empty($attrs)) { + $req_filter .= "($field=*)"; + } + else { if (count($attrs) > 1) $req_filter .= '(|'; foreach ($attrs as $f)
View file
roundcubemail-plugins-kolab-3.1.8.tar.gz/plugins/kolab_delegation/kolab_delegation_engine.php -> roundcubemail-plugins-kolab-3.1.9.tar.gz/plugins/kolab_delegation/kolab_delegation_engine.php
Changed
@@ -224,9 +224,9 @@ } // Default filter of LDAP queries - $this->ldap_filter = $this->rc->config->get('kolab_delegation_filter'); + $this->ldap_filter = $this->rc->config->get('kolab_delegation_filter', '(objectClass=kolabInetOrgPerson)'); // Name of the LDAP field for delegates list - $this->ldap_delegate_field = $this->rc->config->get('kolab_delegation_delegate_field'); + $this->ldap_delegate_field = $this->rc->config->get('kolab_delegation_delegate_field', 'kolabDelegate'); // Encoded LDAP DN of current user, set on login by kolab_auth plugin $this->ldap_dn = $_SESSION['kolab_dn'];
View file
roundcubemail-plugins-kolab-3.1.8.tar.gz/plugins/kolab_files/kolab_files.js -> roundcubemail-plugins-kolab-3.1.9.tar.gz/plugins/kolab_files/kolab_files.js
Changed
@@ -383,10 +383,15 @@ file = $('<input>'), offset = link.offset(); - file.attr({name: 'file[]', type: 'file', multiple: 'multiple', size: 5}) + function move_file_input(e) { + file.css({top: (e.pageY - offset.top - 10) + 'px', left: (e.pageX - offset.left - 10) + 'px'}); + } + + file.attr({name: 'file[]', type: 'file', multiple: 'multiple', size: 5, title: link.attr('title')}) .change(function() { rcmail.files_upload('#filesuploadform'); }) + .click(function() { setTimeout(function() { link.mouseleave(); }, 20); }) // opacity:0 does the trick, display/visibility doesn't work - .css({opacity: 0, cursor: 'pointer', outline: 'none', position: 'absolute', top: '10000px', left: '10000px'}); + .css({opacity: 0, cursor: 'pointer', outline: 'none', position: 'absolute'}); // In FF and IE we need to move the browser file-input's button under the cursor // Thanks to the size attribute above we know the length of the input field @@ -394,17 +399,31 @@ file.css({marginLeft: '-80px'}); // Note: now, I observe problem with cursor style on FF < 4 only - link.css({overflow: 'hidden', cursor: 'pointer'}) + // Need position: relative (Bug #2615) + link.css({overflow: 'hidden', cursor: 'pointer', position: 'relative'}) + .mouseenter(function() { this.__active = true; }) // place button under the cursor .mousemove(function(e) { - if (rcmail.commands['files-upload']) - file.css({top: (e.pageY - offset.top - 10) + 'px', left: (e.pageX - offset.left - 10) + 'px'}); + if (rcmail.commands['files-upload'] && this.__active) + move_file_input(e); // move the input away if button is disabled else $(this).mouseleave(); }) - .mouseleave(function() { file.css({top: '10000px', left: '10000px'}); }) + .mouseleave(function() { + file.css({top: '-10000px', left: '-10000px'}); + this.__active = false; + }) .attr('onclick', '') // remove default button action + .click(function(e) { + // forward click if mouse-enter event was missed + if (rcmail.commands['files-upload'] && !this.__active) { + this.__active = true; + move_file_input(e); + file.trigger(e); + } + }) + .mouseleave() // initially disable/hide input .append(file); };
View file
roundcubemail-plugins-kolab-3.1.8.tar.gz/plugins/kolab_files/lib/kolab_files_engine.php -> roundcubemail-plugins-kolab-3.1.9.tar.gz/plugins/kolab_files/lib/kolab_files_engine.php
Changed
@@ -610,6 +610,9 @@ $this->request->setUrl($url); } + // some HTTP server configurations require this header + $this->request->setHeader('accept', "application/json,text/javascript,*/*"); + return $this->request; }
View file
roundcubemail-plugins-kolab-3.1.8.tar.gz/plugins/kolab_files/skins/larry/style.css -> roundcubemail-plugins-kolab-3.1.9.tar.gz/plugins/kolab_files/skins/larry/style.css
Changed
@@ -86,7 +86,6 @@ } #filelistbox { - bottom: 28px; overflow: auto; top: 0; left: 0; @@ -107,13 +106,8 @@ #files-folder-list ul li span.name { background: url(../../../../skins/larry/images/listicons.png) 6px 3px no-repeat; - padding: 5px 8px 0 32px; - text-overflow: ellipsis; - white-space: nowrap; - display: inline-block; - height: 17px; - width: auto; - overflow: hidden; + padding: 6px 8px 6px 32px; + line-height: 25px; color: #376572; }
View file
roundcubemail-plugins-kolab-3.1.8.tar.gz/plugins/kolab_files/skins/larry/templates/filepreview.html -> roundcubemail-plugins-kolab-3.1.9.tar.gz/plugins/kolab_files/skins/larry/templates/filepreview.html
Changed
@@ -28,7 +28,6 @@ <div class="iframebox"> <roundcube:object name="filepreviewframe" id="fileframe" frameborder="0" /> </div> - <roundcube:object name="message" id="message" class="statusbar" /> </div> </div>
View file
roundcubemail-plugins-kolab-3.1.8.tar.gz/plugins/kolab_files/skins/larry/templates/files.html -> roundcubemail-plugins-kolab-3.1.9.tar.gz/plugins/kolab_files/skins/larry/templates/files.html
Changed
@@ -41,7 +41,6 @@ <div id="filelistbox" class="boxlistcontent"> <roundcube:object name="filelist" id="filelist" class="records-table filelist sortheader fixedheader" optionsmenuIcon="true" /> </div> - <roundcube:object name="message" id="message" class="statusbar" /> </div> </div>
View file
roundcubemail-plugins-kolab-3.1.8.tar.gz/plugins/libkolab/SQL/mysql.initial.sql -> roundcubemail-plugins-kolab-3.1.9.tar.gz/plugins/libkolab/SQL/mysql.initial.sql
Changed
@@ -30,7 +30,7 @@ `created` DATETIME DEFAULT NULL, `changed` DATETIME DEFAULT NULL, `data` TEXT NOT NULL, - `xml` LONGTEXT NOT NULL, + `xml` LONGBLOB NOT NULL, `tags` VARCHAR(255) NOT NULL, `words` TEXT NOT NULL, `type` VARCHAR(32) CHARACTER SET ascii NOT NULL, @@ -49,7 +49,7 @@ `created` DATETIME DEFAULT NULL, `changed` DATETIME DEFAULT NULL, `data` TEXT NOT NULL, - `xml` TEXT NOT NULL, + `xml` LONGBLOB NOT NULL, `tags` VARCHAR(255) NOT NULL, `words` TEXT NOT NULL, `dtstart` DATETIME, @@ -68,7 +68,7 @@ `created` DATETIME DEFAULT NULL, `changed` DATETIME DEFAULT NULL, `data` TEXT NOT NULL, - `xml` TEXT NOT NULL, + `xml` LONGBLOB NOT NULL, `tags` VARCHAR(255) NOT NULL, `words` TEXT NOT NULL, `dtstart` DATETIME, @@ -87,7 +87,7 @@ `created` DATETIME DEFAULT NULL, `changed` DATETIME DEFAULT NULL, `data` TEXT NOT NULL, - `xml` TEXT NOT NULL, + `xml` LONGBLOB NOT NULL, `tags` VARCHAR(255) NOT NULL, `words` TEXT NOT NULL, `dtstart` DATETIME, @@ -106,7 +106,7 @@ `created` DATETIME DEFAULT NULL, `changed` DATETIME DEFAULT NULL, `data` TEXT NOT NULL, - `xml` TEXT NOT NULL, + `xml` LONGBLOB NOT NULL, `tags` VARCHAR(255) NOT NULL, `words` TEXT NOT NULL, CONSTRAINT `fk_kolab_cache_note_folder` FOREIGN KEY (`folder_id`) @@ -123,7 +123,7 @@ `created` DATETIME DEFAULT NULL, `changed` DATETIME DEFAULT NULL, `data` TEXT NOT NULL, - `xml` TEXT NOT NULL, + `xml` LONGBLOB NOT NULL, `tags` VARCHAR(255) NOT NULL, `words` TEXT NOT NULL, `filename` varchar(255) DEFAULT NULL, @@ -142,7 +142,7 @@ `created` DATETIME DEFAULT NULL, `changed` DATETIME DEFAULT NULL, `data` TEXT NOT NULL, - `xml` TEXT NOT NULL, + `xml` LONGBLOB NOT NULL, `tags` VARCHAR(255) NOT NULL, `words` TEXT NOT NULL, `type` VARCHAR(32) CHARACTER SET ascii NOT NULL, @@ -161,7 +161,7 @@ `created` DATETIME DEFAULT NULL, `changed` DATETIME DEFAULT NULL, `data` TEXT NOT NULL, - `xml` TEXT NOT NULL, + `xml` LONGBLOB NOT NULL, `tags` VARCHAR(255) NOT NULL, `words` TEXT NOT NULL, `dtstart` DATETIME, @@ -172,4 +172,4 @@ ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; -INSERT INTO `system` (`name`, `value`) VALUES ('libkolab-version', '2013110400'); +INSERT INTO `system` (`name`, `value`) VALUES ('libkolab-version', '2013121100');
View file
roundcubemail-plugins-kolab-3.1.9.tar.gz/plugins/libkolab/SQL/mysql/2013121100.sql
Added
@@ -0,0 +1,13 @@ +-- well, these deletes are really optional +-- we can clear all caches or only contacts/events/tasks +-- the issue we're fixing here was about contacts (Bug #2662) +DELETE FROM `kolab_folders` WHERE `type` IN ('contact', 'event', 'task'); + +ALTER TABLE `kolab_cache_contact` CHANGE `xml` `xml` LONGBLOB NOT NULL; +ALTER TABLE `kolab_cache_event` CHANGE `xml` `xml` LONGBLOB NOT NULL; +ALTER TABLE `kolab_cache_task` CHANGE `xml` `xml` LONGBLOB NOT NULL; +ALTER TABLE `kolab_cache_journal` CHANGE `xml` `xml` LONGBLOB NOT NULL; +ALTER TABLE `kolab_cache_note` CHANGE `xml` `xml` LONGBLOB NOT NULL; +ALTER TABLE `kolab_cache_file` CHANGE `xml` `xml` LONGBLOB NOT NULL; +ALTER TABLE `kolab_cache_configuration` CHANGE `xml` `xml` LONGBLOB NOT NULL; +ALTER TABLE `kolab_cache_freebusy` CHANGE `xml` `xml` LONGBLOB NOT NULL;
View file
roundcubemail-plugins-kolab-3.1.8.tar.gz/plugins/libkolab/lib/kolab_storage_cache.php -> roundcubemail-plugins-kolab-3.1.9.tar.gz/plugins/libkolab/lib/kolab_storage_cache.php
Changed
@@ -653,7 +653,9 @@ } } - $sql_data['data'] = serialize($data); + // use base64 encoding (Bug #1912, #2662) + $sql_data['data'] = base64_encode(serialize($data)); + return $sql_data; } @@ -662,8 +664,23 @@ */ protected function _unserialize($sql_arr) { + // check if data is a base64-encoded string, for backward compat. + if (strpos(substr($sql_arr['data'], 0, 64), ':') === false) { + $sql_arr['data'] = base64_decode($sql_arr['data']); + } + $object = unserialize($sql_arr['data']); + // de-serialization failed + if ($object === false) { + rcube::raise_error(array( + 'code' => 900, 'type' => 'php', + 'message' => "Malformed data for {$this->resource_uri}/{$sql_arr['msguid']} object." + ), true); + + return null; + } + // decode binary properties foreach ($this->binary_items as $key => $regexp) { if (!empty($object[$key]) && preg_match($regexp, $sql_arr['xml'], $m)) { @@ -672,10 +689,10 @@ } // add meta data - $object['_type'] = $sql_arr['type'] ?: $this->folder->type; - $object['_msguid'] = $sql_arr['msguid']; - $object['_mailbox'] = $this->folder->name; - $object['_size'] = strlen($sql_arr['xml']); + $object['_type'] = $sql_arr['type'] ?: $this->folder->type; + $object['_msguid'] = $sql_arr['msguid']; + $object['_mailbox'] = $this->folder->name; + $object['_size'] = strlen($sql_arr['xml']); $object['_formatobj'] = kolab_format::factory($object['_type'], 3.0, $sql_arr['xml']); return $object;
View file
roundcubemail-plugins-kolab-3.1.8.tar.gz/plugins/tasklist/tasklist.js -> roundcubemail-plugins-kolab-3.1.9.tar.gz/plugins/tasklist/tasklist.js
Changed
@@ -1823,7 +1823,7 @@ $('.popupmenu:visible').each(function(i, elem){ var menu = $(elem), id = elem.id; - if (target.id != id+'link' && (!menu.data('sticky') || !target_overlaps(e.target, elem))) { + if (id && target.id != id+'link' && (!menu.data('sticky') || !target_overlaps(e.target, elem))) { menu.hide(); count++; }
View file
roundcubemail-plugins-kolab.dsc
Changed
@@ -2,7 +2,7 @@ Source: roundcubemail-plugins-kolab Binary: roundcubemail-plugins-kolab Architecture: all -Version: 1:3.1.8-0~kolab1 +Version: 1:3.1.9-0~kolab1 Maintainer: Christoph Wickert <wickert@kolabsys.com> Uploaders: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com>, Paul Klos <kolab@klos2day.nl> Standards-Version: 3.9.3 @@ -10,5 +10,5 @@ Package-List: roundcubemail-plugins-kolab deb web extra Files: - 00000000000000000000000000000000 0 roundcubemail-plugins-kolab-3.1.8.tar.gz + 00000000000000000000000000000000 0 roundcubemail-plugins-kolab-3.1.9.tar.gz 00000000000000000000000000000000 0 debian.tar.gz
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.