From e9eb83b9e2d6e73ddcb7fb59bf33c353381f3287 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Tue, 17 Nov 2009 12:47:39 +0000 Subject: [PATCH 001/438] "fixed not transmitted install-type" --- admin/inc/class.admin_statistics.inc.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/admin/inc/class.admin_statistics.inc.php b/admin/inc/class.admin_statistics.inc.php index ac21cab43d..47c03052cf 100644 --- a/admin/inc/class.admin_statistics.inc.php +++ b/admin/inc/class.admin_statistics.inc.php @@ -101,10 +101,9 @@ class admin_statistics $content['submit_id'] = $config['statistics_submit_id'] == '***none***' ? '' : $config['statistics_submit_id']; } // check if we detected svn or rpm/deb packages --> readonly - if ($content['install_type']) + if ($content['install_type'] && isset($sel_options['install_type'][$content['install_type']])) { - $readonlys['install_type'] = true; - $preserv['install_type'] = $content['install_type']; + $sel_options['install_type'] = array($content['install_type'] => $sel_options['install_type'][$content['install_type']]); } // else default to previous type elseif($config[self::CONFIG_INSTALL_TYPE]) From e40d0caaa321df60cdf089af393d880ea72ecd87 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Tue, 17 Nov 2009 14:55:38 +0000 Subject: [PATCH 002/438] "get usage statistic working with output_buffering = off" --- admin/index.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/admin/index.php b/admin/index.php index 24bcd7c52f..157810a22e 100755 --- a/admin/index.php +++ b/admin/index.php @@ -17,10 +17,14 @@ $GLOBALS['egw_info'] = array( 'flags' => array( 'currentapp' => 'admin', + 'nonheader' => true, ), ); include('../header.inc.php'); + admin_statistics::check(); + common::egw_header(); + $GLOBALS['admin_tpl'] =& CreateObject('phpgwapi.Template',EGW_APP_TPL); $GLOBALS['admin_tpl']->set_file( Array( From 4181ddaecfca80b8ee4d3bcfe0813565898ee380 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Tue, 17 Nov 2009 14:56:57 +0000 Subject: [PATCH 003/438] "throw assertion failed exception (with trace), if redirect fails because output already started" --- phpgwapi/inc/class.egw.inc.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/phpgwapi/inc/class.egw.inc.php b/phpgwapi/inc/class.egw.inc.php index 19da278ee2..57674b60e7 100644 --- a/phpgwapi/inc/class.egw.inc.php +++ b/phpgwapi/inc/class.egw.inc.php @@ -441,6 +441,10 @@ class egw extends egw_minimal } else { + if (headers_sent($file,$line)) + { + throw new egw_exception_assertion_failed(__METHOD__."('".htmlspecialchars($url)."') can NOT redirect, output already started at $file line $line!"); + } Header("Location: $url"); print("\n\n"); } From 118a2e087447f0ccddfcf8eaa71ddaf681b7a63d Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Tue, 17 Nov 2009 20:31:48 +0000 Subject: [PATCH 004/438] "remembering admins previous selection for: - country - usage_type" --- admin/inc/class.admin_statistics.inc.php | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/admin/inc/class.admin_statistics.inc.php b/admin/inc/class.admin_statistics.inc.php index 47c03052cf..e7f1f2fc22 100644 --- a/admin/inc/class.admin_statistics.inc.php +++ b/admin/inc/class.admin_statistics.inc.php @@ -19,6 +19,8 @@ class admin_statistics const CONFIG_LAST_SUBMIT = 'last_statistics_submit'; const CONFIG_POSTPONE_SUBMIT = 'postpone_statistics_submit'; const CONFIG_SUBMIT_ID = 'statistics_submit_id'; + const CONFIG_COUNTRY = 'country_submit'; + const CONFIG_USAGE_TYPE = 'usage_type_submit'; const CONFIG_INSTALL_TYPE = 'install_type_submit'; const SUBMIT_URL = 'http://www.egroupware-server.org/usage-statistic'; @@ -54,6 +56,8 @@ class admin_statistics { config::save_value(self::CONFIG_LAST_SUBMIT,time(),self::CONFIG_APP); config::save_value(self::CONFIG_SUBMIT_ID,empty($content['submit_id']) ? '***none***' : $content['submit_id'],self::CONFIG_APP); + config::save_value(self::CONFIG_COUNTRY,empty($content['country']) ? '***multinational***' : $content['country'],self::CONFIG_APP); + config::save_value(self::CONFIG_USAGE_TYPE,$content['usage_type'],self::CONFIG_APP); config::save_value(self::CONFIG_INSTALL_TYPE,$content['install_type'],self::CONFIG_APP); config::save_value(self::CONFIG_POSTPONE_SUBMIT,null,self::CONFIG_APP); // remove evtl. postpone time $what = 'submited'; @@ -95,11 +99,21 @@ class admin_statistics )); //_debug_array($content); - // use previous submit ID + // show previous submit ID if ($config['statistics_submit_id']) { $content['submit_id'] = $config['statistics_submit_id'] == '***none***' ? '' : $config['statistics_submit_id']; } + // show previous country + if ($config[self::CONFIG_COUNTRY]) + { + $content['country'] = $config[self::CONFIG_COUNTRY] == '***multinational***' ? '' : $config[self::CONFIG_COUNTRY]; + } + // show previous usage_type + if ($config[self::CONFIG_USAGE_TYPE]) + { + $content['usage_type'] = $config[self::CONFIG_USAGE_TYPE]; + } // check if we detected svn or rpm/deb packages --> readonly if ($content['install_type'] && isset($sel_options['install_type'][$content['install_type']])) { From 14770c3689953aaccec4cb44bcd86e1d9883d8cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Tue, 17 Nov 2009 21:20:32 +0000 Subject: [PATCH 005/438] Fix for 'Enforce Server' during SlowSync --- .../inc/horde/Horde/SyncML/Sync/SlowSync.php | 46 ++++++++++++++++--- .../horde/Horde/SyncML/Sync/TwoWaySync.php | 18 ++++---- 2 files changed, 48 insertions(+), 16 deletions(-) diff --git a/phpgwapi/inc/horde/Horde/SyncML/Sync/SlowSync.php b/phpgwapi/inc/horde/Horde/SyncML/Sync/SlowSync.php index f07d7de703..3866f50937 100644 --- a/phpgwapi/inc/horde/Horde/SyncML/Sync/SlowSync.php +++ b/phpgwapi/inc/horde/Horde/SyncML/Sync/SlowSync.php @@ -59,14 +59,14 @@ class Horde_SyncML_Sync_SlowSync extends Horde_SyncML_Sync_TwoWaySync { $state->incNumberOfElements(); } - $adds = &$state->getAddedItems($syncType); - Horde::logMessage("SyncML: ".count($adds). ' added items found for '.$syncType, __FILE__, __LINE__, PEAR_LOG_DEBUG); - - if(is_array($adds)) { - while($guid = array_shift($adds)) { + $adds =& $state->getAddedItems($syncType); + $conflicts =& $state->getConflictItems($syncType); + Horde::logMessage('SyncML: ' .count($adds). ' added items found for ' .$syncType, __FILE__, __LINE__, PEAR_LOG_DEBUG); + Horde::logMessage('SyncML: ' . count($conflicts) . ' items to delete on client found for ' . $syncType, __FILE__, __LINE__, PEAR_LOG_DEBUG); + if (is_array($adds)) { + while ($guid = array_shift($adds)) { $currentSize = $output->getOutputSize(); - // return if we have to much data if (($maxEntries && ($state->getNumberOfElements() >= $maxEntries) && isset($contentType['mayFragment']) @@ -134,7 +134,39 @@ class Horde_SyncML_Sync_SlowSync extends Horde_SyncML_Sync_TwoWaySync { $state->incNumberOfElements(); } } + // handle remote deletes due to conflicts + if (count($conflicts) > 0) { + while ($locid = array_shift($conflicts)) { + $currentSize = $output->getOutputSize(); + // return if we have to much data + if (($maxEntries && ($state->getNumberOfElements() >= $maxEntries) + && isset ($contentType['mayFragment']) + && $contentType['mayFragment']) + || ($maxMsgSize + && (($currentSize +MIN_MSG_LEFT * 2) > $maxMsgSize))) { + // put the item back in the queue + $conflicts[] = $locid; + $state->maxNumberOfElements(); + $state->setSyncStatus(SERVER_SYNC_DATA_PENDING); + return $currentCmdID; + } + Horde :: logMessage("SyncML: delete client locid: $locid", __FILE__, __LINE__, PEAR_LOG_DEBUG); + // Create a Delete request for client. + $cmd = new Horde_SyncML_Command_Sync_ContentSyncElement(); + $cmd->setLocURI($locid); + $currentCmdID = $cmd->outputCommand($currentCmdID, $output, 'Delete'); + $state->log('Server-DeletedConflicts'); + $state->removeUID($syncType, $locid); + // moreData split; save in session state and end current message + if ($cmd->hasMoreData()) { + $state->curSyncItem = & $cmd; + $state->setSyncStatus(SERVER_SYNC_DATA_PENDING); + return $currentCmdID; + } + $state->incNumberOfElements(); + } + } Horde::logMessage("SyncML: All items handled for sync $syncType", __FILE__, __LINE__, PEAR_LOG_DEBUG); $state->removeExpiredUID($syncType, $serverAnchorNext); @@ -277,6 +309,6 @@ class Horde_SyncML_Sync_SlowSync extends Horde_SyncML_Sync_TwoWaySync { $state->mergeAddedItems($syncType, $registry->call($hordeType. '/list', array('filter' => $this->_filterExpression))); $this->_syncDataLoaded = TRUE; - return count($state->getAddedItems($syncType)) - $delta_add; + return count($state->getAddedItems($syncType)) - $delta_add + count($state->getConflictItems($syncType)); } } diff --git a/phpgwapi/inc/horde/Horde/SyncML/Sync/TwoWaySync.php b/phpgwapi/inc/horde/Horde/SyncML/Sync/TwoWaySync.php index f2d5e29ee3..536c14b0f4 100644 --- a/phpgwapi/inc/horde/Horde/SyncML/Sync/TwoWaySync.php +++ b/phpgwapi/inc/horde/Horde/SyncML/Sync/TwoWaySync.php @@ -77,15 +77,15 @@ class Horde_SyncML_Sync_TwoWaySync extends Horde_SyncML_Sync { $state->incNumberOfElements(); } - $changes = & $state->getChangedItems($syncType); - $deletes = & $state->getDeletedItems($syncType); - $adds = & $state->getAddedItems($syncType); - $conflicts = & $state->getConflictItems($syncType); + $changes =& $state->getChangedItems($syncType); + $deletes =& $state->getDeletedItems($syncType); + $adds =& $state->getAddedItems($syncType); + $conflicts =& $state->getConflictItems($syncType); - Horde :: logMessage('SyncML: ' . count($changes) . ' changed items found for ' . $syncType, __FILE__, __LINE__, PEAR_LOG_DEBUG); - Horde :: logMessage('SyncML: ' . count($deletes) . ' deleted items found for ' . $syncType, __FILE__, __LINE__, PEAR_LOG_DEBUG); - Horde :: logMessage('SyncML: ' . count($conflicts) . ' items to delete on client found for ' . $syncType, __FILE__, __LINE__, PEAR_LOG_DEBUG); - Horde :: logMessage('SyncML: ' . count($adds) . ' added items found for ' . $syncType, __FILE__, __LINE__, PEAR_LOG_DEBUG); + Horde::logMessage('SyncML: ' . count($changes) . ' changed items found for ' . $syncType, __FILE__, __LINE__, PEAR_LOG_DEBUG); + Horde::logMessage('SyncML: ' . count($deletes) . ' deleted items found for ' . $syncType, __FILE__, __LINE__, PEAR_LOG_DEBUG); + Horde::logMessage('SyncML: ' . count($conflicts) . ' items to delete on client found for ' . $syncType, __FILE__, __LINE__, PEAR_LOG_DEBUG); + Horde::logMessage('SyncML: ' . count($adds) . ' added items found for ' . $syncType, __FILE__, __LINE__, PEAR_LOG_DEBUG); // handle changes if (is_array($changes)) { @@ -441,6 +441,6 @@ class Horde_SyncML_Sync_TwoWaySync extends Horde_SyncML_Sync { $this->_syncDataLoaded = TRUE; - return count($state->getChangedItems($syncType)) - $delta_mod + count($state->getDeletedItems($syncType)) + count($state->getAddedItems($syncType)) - $delta_add +count($state->getConflictItems($syncType)); + return count($state->getChangedItems($syncType)) - $delta_mod + count($state->getDeletedItems($syncType)) + count($state->getAddedItems($syncType)) - $delta_add + count($state->getConflictItems($syncType)); } } \ No newline at end of file From cdd50f6b55dfe70fc1b08061f6acae1d48636843 Mon Sep 17 00:00:00 2001 From: Christian Binder Date: Wed, 18 Nov 2009 07:42:14 +0000 Subject: [PATCH 006/438] new method check_perms for categories class --- phpgwapi/inc/class.categories.inc.php | 70 ++++++++++++++++++++++----- 1 file changed, 58 insertions(+), 12 deletions(-) diff --git a/phpgwapi/inc/class.categories.inc.php b/phpgwapi/inc/class.categories.inc.php index 7b6dcbcbd4..b3087ff8ec 100644 --- a/phpgwapi/inc/class.categories.inc.php +++ b/phpgwapi/inc/class.categories.inc.php @@ -133,7 +133,7 @@ class categories * @param string $query='' query-pattern * @param string $sort='ASC' sort order, defaults to 'ASC' * @param string $order='' order by, default cat_main, cat_level, cat_name ASC - * @param boolean $globals includes the global egroupware categories or not + * @param boolean $globals include the global egroupware categories or not * @param array|int $parent_id=null return only subcats of $parent_id(s) * @param int $lastmod = -1 if > 0 return only cats modified since then * @param string $column='' if column-name given only that column is returned, not the full array with all cat-data @@ -143,12 +143,6 @@ class categories function return_array($type='all', $start=0, $limit=true, $query='', $sort='ASC',$order='',$globals=false, $parent_id=null, $lastmod=-1, $column='', $filter=null) { //error_log(__METHOD__."($type,$start,$limit,$query,$sort,$order,globals=$globals,parent=".array2string($parent_id).",$lastmod,$column) account_id=$this->account_id, appname=$this->app_name: ".function_backtrace()); - - // load the grants - if ($this->account_id != -1 && is_null($this->grants)) - { - $this->grants = $GLOBALS['egw']->acl->get_grants($this->app_name); - } $cats = array(); foreach(self::$cache as $cat_id => $cat) { @@ -194,13 +188,18 @@ class categories // check if certain parent required if ($parent_id && !in_array($cat['parent'],(array)$parent_id)) continue; - // apply standard acl / grants: return only application global cats (if $globals) or - if (!($globals && $cat['appname'] == 'phpgw' || - $cat['appname'] == $this->app_name && ($cat['owner'] == -1 || $cat['owner'] == $this->account_id || - $this->account_id != -1 && $cat['access'] == 'public' && $this->grants && isset($this->grants[$cat['owner']])))) + // return global categories just if $globals is set + if (!$globals && $cat['appname'] == 'phpgw') { continue; } + + // check for read permission + if(!$this->check_perms(EGW_ACL_READ, $cat)) + { + continue; + } + // check if we have the correct type switch ($type) { @@ -491,6 +490,53 @@ class categories return $id; } + + /** + * Checks if the current user has the necessary ACL rights + * + * If the access of a category is set to private, one needs a private grant for the application + * + * @param int $needed necessary ACL right: EGW_ACL_{READ|EDIT|DELETE} + * @param mixed $category category as array or the category_id + * @return boolean true permission granted, false for permission denied, null for category does not exist + */ + public function check_perms($needed,$category) + { + if (!is_array($category) && !($category = self::$cache[$category])) + { + return null; + } + + // The user for the global cats has id -1, this one has full access to all global cats + if ($this->account_id == -1 && ($category['appname'] == 'phpgw' + || $category['appname'] == $this->app_name && $category['owner'] == -1)) + { + return true; + } + + // Read access to global categories + if ($needed == EGW_ACL_READ && ($category['appname'] == 'phpgw' + || $category['appname'] == $this->app_name && $category['owner'] == -1)) + { + return true; + } + + // Full access to own categories + if ($category['appname'] == $this->app_name && $category['owner'] == $this->account_id) + { + return true; + } + + // Load the application grants + if ($category['appname'] == $this->app_name && is_null($this->grants)) + { + $this->grants = $GLOBALS['egw']->acl->get_grants($this->app_name); + } + + // Check for ACL granted access, the -1 user must not get access by ACL to keep old behaviour + return ($this->account_id != -1 && $category['appname'] == $this->app_name && ($this->grants[$category['owner']] & $needed) && + ($category['access'] == 'public' || ($this->grants[$category['owner']] & EGW_ACL_PRIVATE))); + } /** * delete a category @@ -664,7 +710,7 @@ class categories * We use a shared cache together with return_single * * @param int $cat_id=0 cat-id - * @param string $item='name requested information, 'path' = / delimited path of category names (incl. parents) + * @param string $item='name' requested information, 'path' = / delimited path of category names (incl. parents) * @return string information or '--' if not found or !$cat_id */ static function id2name($cat_id=0, $item='name') From 0b4313adba5eeb9ea46f619901c7b5f092b03599 Mon Sep 17 00:00:00 2001 From: Christian Binder Date: Wed, 18 Nov 2009 07:46:01 +0000 Subject: [PATCH 007/438] using new categories check_perms() method on vcard export (prevent exposing private categories) and merge given categories with existing ones on vcard import --- addressbook/inc/class.addressbook_bo.inc.php | 38 ++++++++++++++++++- .../inc/class.addressbook_vcal.inc.php | 6 +-- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/addressbook/inc/class.addressbook_bo.inc.php b/addressbook/inc/class.addressbook_bo.inc.php index 5f7c8cee66..3bd2fe23a9 100755 --- a/addressbook/inc/class.addressbook_bo.inc.php +++ b/addressbook/inc/class.addressbook_bo.inc.php @@ -1505,12 +1505,39 @@ class addressbook_bo extends addressbook_so var $categories; - function find_or_add_categories($catname_list) + /** + * Find existing categories in database by name or add categories that do not exist yet + * currently used for vcard import + * + * @param array $catname_list names of the categories which should be found or added + * @param int $contact_id=null match against existing contact and expand the returned category ids + * by the ones the user normally does not see due to category permissions - used to preserve categories + * @return array category ids (found, added and preserved categories) + */ + function find_or_add_categories($catname_list, $contact_id=null) { if (!is_object($this->categories)) { $this->categories = new categories($this->owner,'addressbook'); } + + if($contact_id) + { + // preserve categories without users read access + $old_contact = $this->read($contact_id); + $old_categories = explode(',',$old_contact['cat_id']); + $old_cats_preserve = array(); + if(is_array($old_categories) && count($old_categories) > 0) + { + foreach($old_categories as $cat_id) + { + if(!$this->categories->check_perms(EGW_ACL_READ, $cat_id)) + { + $old_cats_preserve[] = $cat_id; + } + } + } + } $cat_id_list = array(); foreach($catname_list as $cat_name) @@ -1533,12 +1560,18 @@ class addressbook_bo extends addressbook_so $cat_id_list[] = $cat_id; } } + + if(is_array($old_cats_preserve) && count($old_cats_preserve) > 0) + { + $cat_id_list = array_merge($cat_id_list, $old_cats_preserve); + } if (count($cat_id_list) > 1) { $cat_id_list = array_unique($cat_id_list); sort($cat_id_list, SORT_NUMERIC); } + return $cat_id_list; } @@ -1556,7 +1589,8 @@ class addressbook_bo extends addressbook_so $cat_list = array(); foreach($cat_id_list as $cat_id) { - if ($cat_id && ($cat_name = $this->categories->id2name($cat_id)) && $cat_name != '--') + if ($cat_id && $this->categories->check_perms(EGW_ACL_READ, $cat_id) && + ($cat_name = $this->categories->id2name($cat_id)) && $cat_name != '--') { $cat_list[] = $cat_name; } diff --git a/addressbook/inc/class.addressbook_vcal.inc.php b/addressbook/inc/class.addressbook_vcal.inc.php index 987ecf865d..46dbb3ace6 100644 --- a/addressbook/inc/class.addressbook_vcal.inc.php +++ b/addressbook/inc/class.addressbook_vcal.inc.php @@ -119,7 +119,7 @@ class addressbook_vcal extends addressbook_bo */ function addVCard($_vcard, $_abID=null, $merge=false) { - if(!$contact = $this->vcardtoegw($_vcard)) + if(!$contact = $this->vcardtoegw($_vcard, $_abID)) { return false; } @@ -415,7 +415,7 @@ class addressbook_vcal extends addressbook_bo if (is_array($_supportedFields)) $this->supportedFields = $_supportedFields; } - function vcardtoegw($_vcard) + function vcardtoegw($_vcard, $_abID) { // the horde class does the charset conversion. DO NOT CONVERT HERE. // be as flexible as possible @@ -825,7 +825,7 @@ class addressbook_vcal extends addressbook_bo break; case 'cat_id': - $contact[$fieldName] = implode(',',$this->find_or_add_categories($vcardValues[$vcardKey]['values'])); + $contact[$fieldName] = implode(',',$this->find_or_add_categories($vcardValues[$vcardKey]['values'], $_abID)); break; case 'jpegphoto': From cf59c9f60698ca54dd1c225c5928603bf2004de9 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 18 Nov 2009 08:28:54 +0000 Subject: [PATCH 008/438] "fixed typo, still causing statistics call to fail under jerryr" --- admin/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/index.php b/admin/index.php index 157810a22e..57cbefff03 100755 --- a/admin/index.php +++ b/admin/index.php @@ -17,7 +17,7 @@ $GLOBALS['egw_info'] = array( 'flags' => array( 'currentapp' => 'admin', - 'nonheader' => true, + 'noheader' => true, ), ); include('../header.inc.php'); From dee4177242446a912048ef41c9d7b41d94a12b25 Mon Sep 17 00:00:00 2001 From: Christian Binder Date: Wed, 18 Nov 2009 09:55:31 +0000 Subject: [PATCH 009/438] changed owner to user, this was an old error which probably never produced any impacts --- addressbook/inc/class.addressbook_bo.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addressbook/inc/class.addressbook_bo.inc.php b/addressbook/inc/class.addressbook_bo.inc.php index 3bd2fe23a9..c25ae6db1e 100755 --- a/addressbook/inc/class.addressbook_bo.inc.php +++ b/addressbook/inc/class.addressbook_bo.inc.php @@ -1579,7 +1579,7 @@ class addressbook_bo extends addressbook_so { if (!is_object($this->categories)) { - $this->categories = new categories($this->owner,'addressbook'); + $this->categories = new categories($this->user,'addressbook'); } if (!is_array($cat_id_list)) From d4b0e572a17f333d9b645b4db68e63edd3130c86 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Wed, 18 Nov 2009 10:38:15 +0000 Subject: [PATCH 010/438] some more documentation, some improvement in convertHTMLToText and replaceEmailAdresses --- phpgwapi/inc/class.translation.inc.php | 86 ++++++++++++++++---------- 1 file changed, 55 insertions(+), 31 deletions(-) diff --git a/phpgwapi/inc/class.translation.inc.php b/phpgwapi/inc/class.translation.inc.php index 681cb881a0..05f8f001d9 100644 --- a/phpgwapi/inc/class.translation.inc.php +++ b/phpgwapi/inc/class.translation.inc.php @@ -1000,22 +1000,28 @@ class translation } /** - * replace emailaddresses enclosed in <> (eg.: ) with the emailaddress only (e.g: me@you.de) - * always returns 1 - */ + * replace emailaddresses enclosed in <> (eg.: ) with the emailaddress only (e.g: me@you.de) + * as well as those emailadresses in links, and within broken links + * @param string the text to process + * @return 1 + */ static function replaceEmailAdresses(&$text) { // replace emailaddresses eclosed in <> (eg.: ) with the emailaddress only (e.g: me@you.de) - $text = preg_replace("/(<|<)(([\w\.,-.,_.,0-9.]+)(@)([\w\.,-.,_.,0-9.]+))(>|>)/ie","'$2'", $text); + $text = preg_replace("/(<|<)*(([\w\.,-.,_.,0-9.]+)(@)([\w\.,-.,_.,0-9.]+))(>|>)*/ie","'$2 '", $text); + $text = preg_replace("/(<|<a href=\")*(mailto:([\w\.,-.,_.,0-9.]+)(@)([\w\.,-.,_.,0-9.]+))(>|>)*/ie","'$2 '", $text); + $text = preg_replace('~]+href=\"(mailto:)+([^"]+)\"[^>]*>~si','$2 ',$text); + $text = preg_replace("/(([\w\.,-.,_.,0-9.]+)(@)([\w\.,-.,_.,0-9.]+))( |\s)*(<\/a>)*( |\s)*(>|>)*/ie","'$1 '", $text); return 1; } - /* + /** * strip tags out of the message completely with their content - * param $_body is the text to be processed - * param $tag is the tagname which is to be removed. Note, that only the name of the tag is to be passed to the function + * @param string $_body is the text to be processed + * @param string $tag is the tagname which is to be removed. Note, that only the name of the tag is to be passed to the function * without the enclosing brackets - * param $endtag can be different from tag but should be used only, if begin and endtag are known to be different e.g.: + * @param string $endtag can be different from tag but should be used only, if begin and endtag are known to be different e.g.: + * @return void the modified text is passed via reference */ static function replaceTagsCompletley(&$_body,$tag,$endtag='') { @@ -1036,10 +1042,18 @@ class translation } } - static function convertHTMLToText($_html,$displayCharset=false,$stripcrl=false) + /** + * convertHTMLToText + * @param string $_html : Text to be stripped down + * @param string $displayCharset : charset to use; should be a valid charset + * @param bool $stripcrl : flag to indicate for the removal of all crlf \r\n + * @param bool $stripalltags : flag to indicate wether or not to strip $_html from all remaining tags + * @return text $_html : the modified text. + */ + static function convertHTMLToText($_html,$displayCharset=false,$stripcrl=false,$stripalltags=true) { if ($displayCharset === false) $displayCharset = self::$system_charset; - #error_log($_html); + //error_log(__METHOD__.$_html); #print '
'; #print "
"; print htmlspecialchars($_html);
 		#print "
"; @@ -1070,6 +1084,7 @@ class translation chr(174), ); $_html = preg_replace($Rules, $Replace, $_html); + // removing carriage return linefeeds if ($stripcrl === true ) $_html = preg_replace('@(\r\n)@i',' ',$_html); $tags = array ( @@ -1101,10 +1116,15 @@ class translation $_html = preg_replace($tags,$Replace,$_html); $_html = preg_replace('~\s*]*>~si',' - ',$_html); $_html = preg_replace('~]+>~s','',$_html); + // replace emailaddresses eclosed in <> (eg.: ) with the emailaddress only (e.g: me@you.de) + self::replaceEmailAdresses($_html); //convert hrefs to description -> URL $_html = preg_replace('~]+href=\"([^"]+)\"[^>]*>(.*)~si','[$2 -> $1]',$_html); - $_html = preg_replace('~<[^>^@]+>~s','',$_html); - #$_html = strip_tags($_html); + //this is supposed to strip out all remaining stuff in tags, this is sometimes taking out whole sections off content + if ( $stripalltags ) { + $_html = preg_replace('~<[^>^@]+>~s','',$_html); + //$_html = strip_tags($_html, ''); + } // reducing spaces $_html = preg_replace('~ +~s',' ',$_html); // we dont reduce whitespace at the start or the end of the line, since its used for structuring the document @@ -1115,8 +1135,7 @@ class translation $_html = html_entity_decode($_html, ENT_COMPAT, $displayCharset); - // replace emailaddresses eclosed in <> (eg.: ) with the emailaddress only (e.g: me@you.de) - self::replaceEmailAdresses($_html); + //self::replaceEmailAdresses($_html); #error_log($text); $pos = strpos($_html, 'blockquote'); #error_log("convert HTML2Text"); @@ -1145,24 +1164,29 @@ class translation foreach($quoteParts3 as $quotePart3) { $allowedLength = 76-strlen("\r\n$indentString"); - if (strlen($quotePart3) > $allowedLength) { - $s=explode(" ", $quotePart3); - $quotePart3 = ""; - $linecnt = 0; - foreach ($s as $k=>$v) { - $cnt = strlen($v); - // only break long words within the wordboundaries, - if($cnt > $allowedLength) { - $v=wordwrap($v, $allowedLength, "\r\n$indentString", true); + // only break lines, if not already indented + if ($quotePart3[0] != $indentString) + { + if (strlen($quotePart3) > $allowedLength) { + $s=explode(" ", $quotePart3); + $quotePart3 = ""; + $linecnt = 0; + foreach ($s as $k=>$v) { + $cnt = strlen($v); + // only break long words within the wordboundaries, + // but it may destroy links, so we check for href and dont do it if we find it + if($cnt > $allowedLength && stripos($v,'href=')===false) { + $v=wordwrap($v, $allowedLength, "\r\n$indentString", true); + } + // the rest should be broken at the start of the new word that exceeds the limit + if ($linecnt+$cnt > $allowedLength) { + $v="\r\n$indentString$v"; + $linecnt = 0; + } else { + $linecnt += $cnt; + } + if (strlen($v)) $quotePart3 .= (strlen($quotePart3) ? " " : "").$v; } - // the rest should be broken at the start of the new word that exceeds the limit - if ($linecnt+$cnt > $allowedLength) { - $v="\r\n$indentString$v"; - $linecnt = 0; - } else { - $linecnt += $cnt; - } - if (strlen($v)) $quotePart3 .= (strlen($quotePart3) ? " " : "").$v; } } $asciiTextBuff[] = $indentString . $quotePart3 ; From bde63a01f9e7c555c37a78768e5ef9143d5ee34d Mon Sep 17 00:00:00 2001 From: Christian Binder Date: Wed, 18 Nov 2009 11:10:36 +0000 Subject: [PATCH 011/438] fixed missing argument error on search (e.g. slowsync), sorry - my fault --- addressbook/inc/class.addressbook_vcal.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addressbook/inc/class.addressbook_vcal.inc.php b/addressbook/inc/class.addressbook_vcal.inc.php index 46dbb3ace6..126023978a 100644 --- a/addressbook/inc/class.addressbook_vcal.inc.php +++ b/addressbook/inc/class.addressbook_vcal.inc.php @@ -395,7 +395,7 @@ class addressbook_vcal extends addressbook_bo { $result = false; - if (($contact = $this->vcardtoegw($_vcard))) + if (($contact = $this->vcardtoegw($_vcard, $contentID))) { if ($contentID) { @@ -415,7 +415,7 @@ class addressbook_vcal extends addressbook_bo if (is_array($_supportedFields)) $this->supportedFields = $_supportedFields; } - function vcardtoegw($_vcard, $_abID) + function vcardtoegw($_vcard, $_abID=null) { // the horde class does the charset conversion. DO NOT CONVERT HERE. // be as flexible as possible From 43649aa268755ad2c869a8dc4564899d2028d008 Mon Sep 17 00:00:00 2001 From: Christian Binder Date: Wed, 18 Nov 2009 11:11:16 +0000 Subject: [PATCH 012/438] fixed typo --- addressbook/inc/class.addressbook_bo.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addressbook/inc/class.addressbook_bo.inc.php b/addressbook/inc/class.addressbook_bo.inc.php index c25ae6db1e..1c50aeba1c 100755 --- a/addressbook/inc/class.addressbook_bo.inc.php +++ b/addressbook/inc/class.addressbook_bo.inc.php @@ -1547,7 +1547,7 @@ class addressbook_bo extends addressbook_so if (!$cat_id) { - // some SyncML clients (mostly phones add an X- to the category names + // some SyncML clients (mostly phones) add an X- to the category names if (strncmp($cat_name, 'X-', 2) == 0) { $cat_name = substr($cat_name, 2); From 91e694e79de5dbe131ddb1f59db2f58df40775b8 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 18 Nov 2009 13:58:01 +0000 Subject: [PATCH 013/438] Calendar UI improvments: - show status of participants in border style of event + solid: all participants accepted + dotted: all participants answered, but not all accepted + dashed: not all participants answered - mark invitations (of current user, not calendar selected) + white background color (not category based color) + show blue questionmark icon in event header --- calendar/inc/class.calendar_ui.inc.php | 4 +++ calendar/inc/class.calendar_uiviews.inc.php | 33 +++++++++++++++--- calendar/templates/default/app.css | 27 ++++++++++++-- calendar/templates/default/event_widget.tpl | 2 +- .../templates/default/images/cnr-pending.png | Bin 632 -> 555 bytes 5 files changed, 57 insertions(+), 9 deletions(-) diff --git a/calendar/inc/class.calendar_ui.inc.php b/calendar/inc/class.calendar_ui.inc.php index f146332d76..10183541b6 100644 --- a/calendar/inc/class.calendar_ui.inc.php +++ b/calendar/inc/class.calendar_ui.inc.php @@ -447,6 +447,10 @@ class calendar_ui { $icons[] = html::image('calendar','alarm',lang('alarm')); } + if($event['participants'][$this->user][0] == 'U') + { + $icons[] = html::image('calendar','cnr-pending',lang('Needs action')); + } return $icons; } diff --git a/calendar/inc/class.calendar_uiviews.inc.php b/calendar/inc/class.calendar_uiviews.inc.php index f24209807a..4a496892ae 100644 --- a/calendar/inc/class.calendar_uiviews.inc.php +++ b/calendar/inc/class.calendar_uiviews.inc.php @@ -1175,6 +1175,30 @@ class calendar_uiviews extends calendar_ui $bodybgcolor1 = $this->brighter($headerbgcolor,$headerbgcolor == '#808080' ? 100 : 170); $bodybgcolor2 = $this->brighter($headerbgcolor,220); + // mark event as invitation, by NOT using category based backgrond color, but plain white + if ($event['participants'][$this->user][0] == 'U') + { + $bodybgcolor1 = $bodybgcolor2 = 'white'; + } + + // get status class of event: calEventAllAccepted, calEventAllAnswered or calEventSomeUnknown + $status_class = 'calEventAllAccepted'; + foreach($event['participants'] as $id => $status) + { + calendar_so::split_status($status,$quantity,$role); + + switch ($status) + { + case 'A': + break; + case 'U': + $status_class = 'calEventSomeUnknown'; + break 2; // break foreach + default: + $status_class = 'calEventAllAnswered'; + break; + } + } // seperate each participant types $part_array = array(); if ($this->allowEdit) @@ -1238,6 +1262,7 @@ class calendar_uiviews extends calendar_ui '&width='.$width.') repeat-y '.$bodybgcolor2), 'Small' => $small ? 'Small' : '', // to use in css class-names 'indent' => $indent."\t", + 'status_class' => $status_class, )); /* not used at the moment foreach(array( @@ -1260,7 +1285,7 @@ class calendar_uiviews extends calendar_ui $view_link = $GLOBALS['egw']->link('/index.php',array('menuaction'=>'calendar.calendar_uiforms.edit','cal_id'=>$event['id'],'date'=>$this->bo->date2string($event['start']))); - if ($event['recur_type']!= MCAL_RECUR_NONE) + if ($event['recur_type'] != MCAL_RECUR_NONE) { $view_link_confirm_abort = $GLOBALS['egw']->link('/index.php',array('menuaction'=>'calendar.calendar_uiforms.edit','cal_id'=>$event['id'],'date'=>$this->bo->date2string($event['start']),'exception'=>1)); $view_link_confirm_text=lang('do you want to edit serialevent als exception? - Ok = Edit Exception, Abort = Edit Serial'); @@ -1271,8 +1296,6 @@ class calendar_uiviews extends calendar_ui $popup = ($is_private || ! $this->allowEdit) ? '' : ' onclick="'.$this->popup($view_link).'; return false;"'; } //_debug_array($event); - //echo $event['id']."?
"; - if ($return_array) { @@ -1310,14 +1333,14 @@ class calendar_uiviews extends calendar_ui $draggableID = 'drag_'.$event['id'].'_O'.$event['owner'].'_C'.$owner; - $html = $indent.'
0,'Padding'=>0)). '>'."\n".$ie_fix.$html."\n". $indent."
"."\n"; // ATM we do not support whole day events or recurring events for dragdrop - if ( is_object($this->dragdrop) && + if (is_object($this->dragdrop) && $this->use_time_grid && $this->bo->check_perms(EGW_ACL_EDIT,$event) && !$event['whole_day_on_top'] && diff --git a/calendar/templates/default/app.css b/calendar/templates/default/app.css index db6c9c8ecb..6e882be6d4 100644 --- a/calendar/templates/default/app.css +++ b/calendar/templates/default/app.css @@ -199,7 +199,6 @@ e.g. the div with class calTimeGrid is generated by the timeGridWidget method of overflow: hidden; z-index: 20; border-width: 1px; - border-style: solid; border-radius: 6px; -moz-border-radius: 6px; /* set via inline style on runtime: @@ -213,9 +212,31 @@ e.g. the div with class calTimeGrid is generated by the timeGridWidget method of cursor: pointer; } -.calEventTooltip{ - border-width: 1px; +/** + * All participants accepted the invitation + */ +.calEventAllAccepted { border-style: solid; + border-width: 1px; +} + +/** + * All participants answered the invitation, but not all accepted + */ +.calEventAllAnswered { + border-style: dotted; + border-width: 2px; +} + +/** + * Some participants did NOT answer the invitation + */ +.calEventSomeUnknown { + border-style: dashed; + border-width: 1px; +} + +.calEventTooltip{ border-radius: 6px; -moz-border-radius: 6px; max-height: 400px; diff --git a/calendar/templates/default/event_widget.tpl b/calendar/templates/default/event_widget.tpl index 44e1ed19c7..a49f54ded9 100644 --- a/calendar/templates/default/event_widget.tpl +++ b/calendar/templates/default/event_widget.tpl @@ -13,7 +13,7 @@ -
+
{timespan}
{icons}
diff --git a/calendar/templates/default/images/cnr-pending.png b/calendar/templates/default/images/cnr-pending.png index b151e9681b44c5506ef975f15382782ed2f9dd64..dffe0115e3d2df8e6d8714f801e2b51230bb6202 100755 GIT binary patch delta 530 zcmV+t0`2|y1giv)B!2;OQb$4nuFf3k00006VoOIv00000008+zyMF)x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru*$Wa4DIf#YWikK&0jo(wK~yMHrH(ylQ(+W_pL4&& zG@3+Pg%D5*MX@eAxQYmZ3R;S&brI{RxCx?@h>K&zE+VbyAb(Vp4%rkDRH}$jP%A=H ze;N~PY$Z)@linov`;J4b4!ZeFFP!&1Jn-KP=B8>57cTg=RS!bPslw#Hi-*R}%*^Z3 zwMTwwzG_>ls^yvuhaUQ+>AB`IePcs^%6)gu=nKt1ejilz7ZpFSD|v9FJbP!Nw!p!A zUIYM@a4KIdUVnYlDE@vT@Zrjatq~(K@v&8ZmTT5AVhsQX9_(6Ntj3*!8b#I!uP?0M z5|4_PIWby@WqO-pp{zXx4*(m+LWinRBq98WI=e3Jnat^%#pLe(C0(mXQh?C3l{{l- zO14EOq&vk7?C3}Vr1l;5{lMwmvW5ge!nn3ldfRPM-GARn2(=D$vJnQivg57Kn|f+X zstzZtvWR{6e0y6-M39KZ07f~wIhLHgd~zdQ3UPsmVxyiTd+bPikUb9Hp6rZz5qEu0 zDt&)CsLHt;U#OtNy~%Xf>KOKX_a$JQzt}tcma{Lv4m_=V;^M13`$uv>|H}C%?bpr4 UTO>4%01E&B07*qoM6N<$f({kybpQYW delta 581 zcmV-L0=oUH1o#AyBo78+OGiWi{{a60|De66laW9kf7T2J5CQ?QKNc$h00IR`L_t(2 z&rQ)iXcKV&K=F4Uxx3`{^qwmiGMt8cbLTOGCFmC^32)O zkN3N#y&FNb(WO{zBFhp(oYM;m5t?(>y3JO`)~6bAhySk T;5I2K00000NkvXXu0mjf7!efV From 16538f4f9dbb3836aa599fa77f910284cd2ae092 Mon Sep 17 00:00:00 2001 From: Christian Binder Date: Wed, 18 Nov 2009 14:46:25 +0000 Subject: [PATCH 014/438] use check_perms() on ical export and merge categories on import --- calendar/inc/class.calendar_boupdate.inc.php | 49 +++++++++++++++++--- calendar/inc/class.calendar_ical.inc.php | 9 ++-- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/calendar/inc/class.calendar_boupdate.inc.php b/calendar/inc/class.calendar_boupdate.inc.php index b1369247ef..6718b68561 100644 --- a/calendar/inc/class.calendar_boupdate.inc.php +++ b/calendar/inc/class.calendar_boupdate.inc.php @@ -1065,11 +1065,38 @@ class calendar_boupdate extends calendar_bo var $categories; - function find_or_add_categories($catname_list) + /** + * Find existing categories in database by name or add categories that do not exist yet + * currently used for ical/sif import + * + * @param array $catname_list names of the categories which should be found or added + * @param int $cal_id=-1 match against existing event and expand the returned category ids + * by the ones the user normally does not see due to category permissions - used to preserve categories + * @return array category ids (found, added and preserved categories) + */ + function find_or_add_categories($catname_list, $cal_id=-1) { if (!is_object($this->categories)) { - $this->categories = CreateObject('phpgwapi.categories',$GLOBALS['egw_info']['user']['account_id'],'calendar'); + $this->categories = new categories($this->user,'calendar'); + } + + if($cal_id && $cal_id > 0) + { + // preserve categories without users read access + $old_event = $this->read($cal_id); + $old_categories = explode(',',$old_event['category']); + $old_cats_preserve = array(); + if(is_array($old_categories) && count($old_categories) > 0) + { + foreach($old_categories as $cat_id) + { + if(!$this->categories->check_perms(EGW_ACL_READ, $cat_id)) + { + $old_cats_preserve[] = $cat_id; + } + } + } } $cat_id_list = array(); @@ -1077,9 +1104,11 @@ class calendar_boupdate extends calendar_bo { $cat_name = trim($cat_name); $cat_id = $this->categories->name2id($cat_name, 'X-'); + if (!$cat_id) { - if (strncmp($cat_name, "X-", 2) == 0) + // some SyncML clients (mostly phones) add an X- to the category names + if (strncmp($cat_name, 'X-', 2) == 0) { $cat_name = substr($cat_name, 2); } @@ -1091,12 +1120,18 @@ class calendar_boupdate extends calendar_bo $cat_id_list[] = $cat_id; } } + + if(is_array($old_cats_preserve) && count($old_cats_preserve) > 0) + { + $cat_id_list = array_merge($cat_id_list, $old_cats_preserve); + } if (count($cat_id_list) > 1) { $cat_id_list = array_unique($cat_id_list); sort($cat_id_list, SORT_NUMERIC); } + return $cat_id_list; } @@ -1104,20 +1139,20 @@ class calendar_boupdate extends calendar_bo { if (!is_object($this->categories)) { - $this->categories = CreateObject('phpgwapi.categories',$GLOBALS['egw_info']['user']['account_id'],'calendar'); + $this->categories = new categories($this->user,'calendar'); } if (!is_array($cat_id_list)) { $cat_id_list = explode(',',$cat_id_list); } - $cat_list = array(); foreach($cat_id_list as $cat_id) { - if ($cat_data = $this->categories->return_single($cat_id)) + if ($cat_id && $this->categories->check_perms(EGW_ACL_READ, $cat_id) && + ($cat_name = $this->categories->id2name($cat_id)) && $cat_name != '--') { - $cat_list[] = $cat_data[0]['name']; + $cat_list[] = $cat_name; } } diff --git a/calendar/inc/class.calendar_ical.inc.php b/calendar/inc/class.calendar_ical.inc.php index d8d1937fca..0c7df96a3d 100644 --- a/calendar/inc/class.calendar_ical.inc.php +++ b/calendar/inc/class.calendar_ical.inc.php @@ -1363,7 +1363,7 @@ class calendar_ical extends calendar_boupdate { if (is_a($component, 'Horde_iCalendar_vevent')) { - if ($event = $this->vevent2egw($component, $version, $this->supportedFields)) + if ($event = $this->vevent2egw($component, $version, $this->supportedFields, $cal_id)) { //common adjustments if ($this->productManufacturer == '' && $this->productName == '' @@ -1424,10 +1424,11 @@ class calendar_ical extends calendar_boupdate * @param array $component VEVENT * @param string $version vCal version (1.0/2.0) * @param array $supportedFields supported fields of the device + * @param int $cal_id id of existing event in the content (only used to merge categories) * * @return array|boolean event on success, false on failure */ - function vevent2egw(&$component, $version, $supportedFields) + function vevent2egw(&$component, $version, $supportedFields, $cal_id=-1) { if (!is_a($component, 'Horde_iCalendar_vevent')) return false; @@ -1790,11 +1791,11 @@ class calendar_ical extends calendar_boupdate { if($version == '1.0') { - $vcardData['category'] = $this->find_or_add_categories(explode(';',$attributes['value'])); + $vcardData['category'] = $this->find_or_add_categories(explode(';',$attributes['value']), $cal_id); } else { - $vcardData['category'] = $this->find_or_add_categories(explode(',',$attributes['value'])); + $vcardData['category'] = $this->find_or_add_categories(explode(',',$attributes['value']), $cal_id); } } else From 73e2f3721e9631e5c861a6797c95bde5c52c7f9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Wed, 18 Nov 2009 17:41:54 +0000 Subject: [PATCH 015/438] fix typos --- infolog/inc/class.infolog_bo.inc.php | 2 +- infolog/inc/class.infolog_so.inc.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/infolog/inc/class.infolog_bo.inc.php b/infolog/inc/class.infolog_bo.inc.php index 2bf60b37b7..95b402225c 100644 --- a/infolog/inc/class.infolog_bo.inc.php +++ b/infolog/inc/class.infolog_bo.inc.php @@ -320,7 +320,7 @@ class infolog_bo } /** - * Check if use is responsible for an entry: he or one of his memberships is in responsible + * Check if user is responsible for an entry: he or one of his memberships is in responsible * * @param array $info infolog entry as array * @return boolean diff --git a/infolog/inc/class.infolog_so.inc.php b/infolog/inc/class.infolog_so.inc.php index b69bea5c03..f8d28ac416 100644 --- a/infolog/inc/class.infolog_so.inc.php +++ b/infolog/inc/class.infolog_so.inc.php @@ -78,7 +78,7 @@ class infolog_so } /** - * Check if use is responsible for an entry: he or one of his memberships is in responsible + * Check if user is responsible for an entry: he or one of his memberships is in responsible * * @param array $info infolog entry as array * @return boolean From d1b10adf4a52565ef9f5a82394d8975c45511585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Wed, 18 Nov 2009 18:57:00 +0000 Subject: [PATCH 016/438] Fix Domain Issue (Bug #2367) for SyncML --- phpgwapi/inc/horde/Horde/SyncML/State_egw.php | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/phpgwapi/inc/horde/Horde/SyncML/State_egw.php b/phpgwapi/inc/horde/Horde/SyncML/State_egw.php index e57a0f7298..59a745a809 100644 --- a/phpgwapi/inc/horde/Horde/SyncML/State_egw.php +++ b/phpgwapi/inc/horde/Horde/SyncML/State_egw.php @@ -27,6 +27,11 @@ class EGW_SyncML_State extends Horde_SyncML_State */ var $uidMappings = array(); + /* + * the domain of the current user + */ + var $_account_domain = 'default'; + /** * get the local content id from a syncid * @@ -294,21 +299,22 @@ class EGW_SyncML_State extends Horde_SyncML_State return FALSE; } - if(!isset($this->_password)) { + if (!isset($this->_password)) { Horde::logMessage('SyncML: Authentication not yet possible currently. Password not available' , __FILE__, __LINE__, PEAR_LOG_DEBUG); return FALSE; } - if(strpos($this->_locName,'@') === False) { - $this->_locName .= '@'.$GLOBALS['egw_info']['server']['default_domain']; + if (strpos($this->_locName,'@') === False) { + $this->_account_domain = $GLOBALS['egw_info']['server']['default_domain']; + $this->_locName .= '@'. $this->_account_domain; } else { $parts = explode('@',$this->_locName); - $GLOBALS['egw_info']['user']['domain'] = array_pop($parts); + $this->_account_domain = array_pop($parts); } - + $GLOBALS['egw_info']['user']['domain'] = $this->_account_domain; #Horde::logMessage('SyncML: authenticate with username: ' . $this->_locName . ' and password: ' . $this->_password, __FILE__, __LINE__, PEAR_LOG_DEBUG); - if($GLOBALS['sessionid'] = $GLOBALS['egw']->session->create($this->_locName,$this->_password,'text')) { + if ($GLOBALS['sessionid'] = $GLOBALS['egw']->session->create($this->_locName,$this->_password,'text')) { if ($GLOBALS['egw_info']['user']['apps']['syncml']) { $this->_isAuthorized = true; @@ -324,7 +330,8 @@ class EGW_SyncML_State extends Horde_SyncML_State } else { // store sessionID in a variable, because ->verify maybe resets that value $sessionID = session_id(); - if(!$GLOBALS['egw']->session->verify($sessionID, 'staticsyncmlkp3')) { + $GLOBALS['egw_info']['user']['domain'] = $this->_account_domain; + if (!$GLOBALS['egw']->session->verify($sessionID, 'staticsyncmlkp3')) { Horde::logMessage('SyncML_EGW: egw session(' .$sessionID. ') not verified ' , __FILE__, __LINE__, PEAR_LOG_DEBUG); } } From 31bc2ff5123dc72738368f159027b7b45d046e09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oscar=20Manuel=20G=C3=B3mez=20Senovilla?= Date: Wed, 18 Nov 2009 19:40:17 +0000 Subject: [PATCH 017/438] tracker #2349 --- addressbook/setup/egw_cs.lang | 30 ++++++++++++++++-- admin/setup/egw_cs.lang | 51 +++++++++++++++++++++--------- calendar/setup/egw_cs.lang | 24 +++++++++++--- etemplate/setup/egw_cs.lang | 12 +++++-- filemanager/setup/egw_cs.lang | 25 +++++++++++++-- infolog/setup/egw_cs.lang | 28 ++++++++++++----- notifications/setup/egw_cs.lang | 2 ++ phpgwapi/setup/egw_cs.lang | 16 +++++++--- preferences/setup/egw_cs.lang | 38 ++++++++++------------- setup/lang/egw_cs.lang | 10 +++++- timesheet/setup/egw_cs.lang | 55 +++++++++++++++++++++++++++++++++ 11 files changed, 232 insertions(+), 59 deletions(-) diff --git a/addressbook/setup/egw_cs.lang b/addressbook/setup/egw_cs.lang index 6c178e2a55..8dfbf54140 100644 --- a/addressbook/setup/egw_cs.lang +++ b/addressbook/setup/egw_cs.lang @@ -1,7 +1,9 @@ %1 added addressbook cs %1 přidáno %1 contact(s) %2 addressbook cs %1 kontakt(ů) %2 %1 contact(s) %2, %3 failed because of insufficent rights !!! addressbook cs %1 kontakt(ů) %2, %3 selhal(o) z důvodu nedostatečných oprávnění !!! -%1 fields in %2 other organisation member(s) changed addressbook cs %1 polí u %2 ostatních členů organizace změněno +%1 contacts updated (%2 errors). addressbook cs %1 kontaktů zaktualizováno (chyb: %2). +%1 fields in %2 other organisation member(s) changed addressbook cs %1 položek u %2 ostatních členů organizace změněno +%1 not implemented for %2! addressbook cs %1 není implementováno pro %2! %1 records imported addressbook cs %1 záznamů importováno %1 records read (not yet imported, you may go %2back%3 and uncheck test import) addressbook cs %1 záznamů načteno (zatím nebyly importovány, můžete se vrátit %2zpět%3 a odškrtnout Testovat Import) %1 starts with '%2' addressbook cs %1 začíná s '%2' @@ -35,6 +37,7 @@ address line 2 addressbook cs Adresa - řádek 2 address type addressbook cs Typ adresy addressbook common cs Adresář addressbook csv export addressbook cs Export adresáře do CSV +addressbook field addressbook cs Položka adresáře addressbook menu addressbook cs Menu adresáře addressbook preferences addressbook cs Předvolby adresáře addressbook the contact should be saved to addressbook cs Kontakty adresáře by měly být uloženy do @@ -95,6 +98,7 @@ contact deleted addressbook cs Kontakt smazán contact fields to show addressbook cs Zobrazovat položky kontaktu contact fields: addressbook cs Položky kontaktu: contact id addressbook cs ID kontaktu +contact maintenance admin cs Údržba kontaktu contact modified by %1 at %2 addressbook cs Kontakt změněnil(a) %1v %2 contact not found! addressbook cs Kontakt nebyl nalezen! contact repository admin cs Databáze kontaktů @@ -113,6 +117,7 @@ country common cs Země create new links addressbook cs Vytvořit nové odkazy created addressbook cs Vytvořeno credit addressbook cs Platební lhůta +csv field addressbook cs CSV pole csv-fieldname addressbook cs Název CSV pole csv-filename addressbook cs Jméno CSV souboru custom addressbook cs Uživatelsky definované @@ -140,6 +145,7 @@ display contact addressbook cs Zobrazit kontakt displays a remider for birthdays on the startpage (page you get when you enter egroupware or click on the homepage icon). addressbook cs Zobrazuje připomínku narozenin na úvodní straně (stránka, na kterou se dostanete když se přihlásíte do eGroupWare a kliknete na ikonu Hlavní strana). distribution list deleted addressbook cs Distribuční seznam smazán distribution lists addressbook cs Distribuční seznamy +distribution lists, ... addressbook cs Distribuční seznamy, ... do you want a private addressbook, which can not be viewed by users, you grant access to your personal addressbook? addressbook cs Chcete vytvořit soukromý adresář, kam nebudou mít přístup ani uživatelé, kterým dáte přístup do Vašeho osobního adresáře? do your really want to delete this contact? addressbook cs Opravdu chcete smazat tento kontakt? document '%1' does not exist or is not readable for you! addressbook cs Dokument '%1' neexistuje nebo nemáte oprávnění k jeho čtení! @@ -157,8 +163,10 @@ edit phonenumbers - addressbook cs Editovat telefonní čísla - either the configured email addesses are wrong or the mail configuration. addressbook cs Nastavené e-mailové adresy nebo konfigurace e-mailu jsou chybné. email & internet addressbook cs E-mail & Internet email addresses (comma separated) to send the contact data addressbook cs E-mailové adresy (oddělené čárkou) na které mají být odeslána data kontaktu +empty admin cs Prázdné empty for all addressbook cs prázdné znamená vše enable an extra private addressbook addressbook cs Povolit dodatečný privátní adresář +enclosure addressbook cs Uzavření end addressbook cs Konec enter the path to the exported file here addressbook cs Zde vyplňte cestu pro exportovaný soubor error deleting the contact !!! addressbook cs Chyba při mazání kontaktu @@ -176,6 +184,7 @@ export selection addressbook cs Výběr exportu exported addressbook cs exportován exports contacts from your addressbook into a csv file. csv means 'comma seperated values'. however in the options tab you can also choose other seperators. addressbook cs Exportuje kontakty z Vašeho adresáře do CSV souboru. CSV znamená 'hodnoty oddělené čárkou'. Nicméně v záložce voleb si můžete zvolit jiné oddělovače. extra addressbook cs Extra +extra private addressbook cs Extra soukromé failed to change %1 organisation member(s) (insufficent rights) !!! addressbook cs nepodařilo se změnit %1 členů organizace (nedostatečná práva) !!! fax addressbook cs Fax fax number common cs Faxové číslo @@ -186,6 +195,7 @@ fields for the csv export addressbook cs Položky k exportu do CSV fields the user is allowed to edit himself admin cs Položky, které si smí editovat sami uživatelé fields to show in address list addressbook cs Položky, které se zobrazují v seznamu adres fieldseparator addressbook cs Oddělovač položek +fieldseperator addressbook cs Oddělovač položek for more then one contact in a document use the tag pagerepeat! addressbook cs pro více než jeden kontakt v dokumentu použijte štítek pagerepeat! for read only ldap admin cs LDAP jen pro čtení for serial letter use this tag. put the content, you want to repeat between two tags. addressbook cs Pro hromadný dopis použijte tento štítek. Obsah, který chcete opakovat vložte mezi dva štítky. @@ -215,6 +225,7 @@ icon addressbook cs Ikona if accounts are already in ldap admin cs pokud jsou účty již v LDAP if you specify a directory (full vfs path) here, addressbook displays an action for each document. that action allows to download the specified document with the contact data inserted. addressbook cs Pokud zde uvedete adresář (celou cestu ve virtuálním systému souborů), aplikace zobrazí akci pro každý dokument. Tato akce pak umožní stáhnout vybraný dokument s vloženými údaji kontaktu. if you specify a document (full vfs path) here, addressbook displays an extra document icon for each address. that icon allows to download the specified document with the contact data inserted. addressbook cs Pokud zde uvedete dokument (celou cestu ve virtuálním systému souborů), aplikace zobrazí extra ikonu dokumentu pro každou adresu. Tato ikona pak umožní stáhnout vybraný dokument s vloženými údaji kontaktu. +ignore first line addressbook cs Ignorovat první řádek import addressbook cs Importovat import contacts addressbook cs Importovat kontakty import csv-file into addressbook addressbook cs Importovat soubor CSV do adresáře @@ -228,16 +239,18 @@ import_instructions addressbook cs V prohlížeči Netscape otevřete Adresář imports contacts into your addressbook from a csv file. csv means 'comma seperated values'. however in the options tab you can also choose other seperators. addressbook cs Importuje kontakty z CSV souboru do Vašeho adresáře. CSV znamená 'hodnoty oddělené čárkou'. Nicméně v záložce voleb si můžete zvolit jiné oddělovače. in %1 days (%2) is %3's birthday. addressbook cs Za %1 dní (%2) má %3 narozeniny. income addressbook cs Hospodářský výsledek +infolog addressbook cs InfoLog insert in document addressbook cs Vložit do dokumentu insufficent rights to delete this list! addressbook cs Nemáte dostatečná oprávnění ke smazání seznamu! international addressbook cs Mezinárodní +internet addressbook cs Internet label addressbook cs Jmenovka last date addressbook cs Poslední datum last modified addressbook cs naposledy změněno last modified by addressbook cs naposledy změnil(a) ldap context for contacts admin cs LDAP kontext pro kontakty ldap host for contacts admin cs LDAP server pro kontakty -ldap settings for contacts admin cs nastavení LDAP pro kontakty +ldap settings for contacts admin cs Nastavení LDAP pro kontakty ldif addressbook cs LDIF line 2 addressbook cs Řádek 2 link title for contacts show addressbook cs Odkazovat nadpis pro zobrazení kontaktů @@ -274,6 +287,7 @@ new contact submitted by %1 at %2 addressbook cs Nový kontakt odeslal(a) %1 v % new window opened to edit infolog for your selection addressbook cs Otevřeno nové okno pro editaci Infologu na základě vašeho výběru next date addressbook cs Následující datum no categories selected addressbook cs nebyly vybrány žádné kategorie +no fallback addressbook cs Žádné nouzové řešení no vcard addressbook cs Žádná VCard number addressbook cs Čislo number of records to read (%1) addressbook cs Počet záznamů k načtení (%1) @@ -301,6 +315,7 @@ preferred email address to use in distribution lists addressbook cs Preferovaná preferred phone addressbook cs preferovaný telefon preferred type of email address to add for distribution lists addressbook cs preferovaný typ e-mailové adresy pro přidávání do distribučních seznamů prefix addressbook cs Titul/Oslovení +private custom fields addressbook cs Soukromá uživatelsky definovaná pole public key addressbook cs Veřejný klíč publish into groups: addressbook cs Zveřejnit ve skupinách: read a list / search for entries. addressbook cs Načíst seznam / vyhledat záznamy. @@ -309,6 +324,7 @@ read a single entry by passing the id and fieldlist. addressbook cs Načíst zá read only addressbook cs jen ke čtení record access addressbook cs Přístup k záznamu record owner addressbook cs Vlastník záznamu +region addressbook cs Region remove selected contacts from distribution list addressbook cs Odstranit vybrané kontakty z distribučního seznamu removed from distribution list addressbook cs odstraněno z distribučního seznamu repetition addressbook cs Opakování @@ -322,6 +338,7 @@ select a view addressbook cs Vybrat pohled select addressbook type addressbook cs Vybrat typ adresáře select all addressbook cs Vybrat vše select an action or addressbook to move to addressbook cs Vybrat akci nebo adresář kam se přesunout +select an action or addressbook to move to... addressbook cs Vybrat akci nebo adresář kam se přesunout... select migration type admin cs Vybrat typ migrace select multiple contacts for a further action addressbook cs Vybrat více kontaktů pro další akci select phone number as prefered way of contact addressbook cs vybrat telefonní číslo jako preferovaný způsob kontaktu @@ -329,12 +346,16 @@ select the type of conversion addressbook cs Vybrat typ konverze select the type of conversion: addressbook cs Vybrat typ konverze: select where you want to store / retrieve contacts admin cs Vybrat úložiště kontaktů selected contacts addressbook cs vybrané kontakty +seperator addressbook cs Oddělovač +set full name and file as field in contacts of all users (either all or only empty values) admin cs Nastavit celé jméno a evidovat jako pole v kontaktech všech uživatelů (buď všechny nebo jen prázdné hodnoty) +set only full name addressbook cs Nastavit jen celé jméno should the columns photo and home address always be displayed, even if they are empty. addressbook cs Mají být sloupce fotografie a domovská adresa vždy zobrazeny i když jsou prázdné show addressbook cs Zobrazit show birthday reminders on main screen addressbook cs Zobrazit upomínky na narozeniny na hlavní obrazovce show infolog entries for this organisation addressbook cs Zobrazit záznamy InfoLogu pro tuto organizaci show the contacts of this organisation addressbook cs Zobrazit kontakty této organizace size of popup (wxh, eg.400x300, if a popup should be used) admin cs Velikost překryvného okna (ŠxV, např. 400x300, pokud má být překryvné okno používáno) +stadt addressbook cs Město start admin cs Start startrecord addressbook cs První záznam state common cs Stát @@ -342,6 +363,7 @@ street common cs Ulice subject for email addressbook cs Předmět e-mailu successfully imported %1 records into your addressbook. addressbook cs Úspěšně importováno %1 záznamů do Vašeho adresáře. suffix addressbook cs Za příjmením +tag to mark positions for address labels addressbook cs Značka pro vyznačení pozic v adresních štítcích tel home addressbook cs telefon domů telephony integration admin cs Integrace telefonie test import (show importable records only in browser) addressbook cs Testovat import (zobrazit importovatelné záznamy jen v prohlížeči) @@ -361,7 +383,10 @@ to many might exceed your execution-time-limit addressbook cs příliš mnoho m today is %1's birthday! common cs Dnes má narozeniny %1! tomorrow is %1's birthday. common cs Zítra má narozeniny %1! translation addressbook cs Překlad +two of: %1 addressbook cs dva z: %1 type addressbook cs Typ +unique id (uid) addressbook cs Unikátní ID (UID) +unique id
(to update existing records) addressbook cs Unikátní ID
(pro aktualizaci stávajících záznamů) update a single entry by passing the fields. addressbook cs Aktualizovat záznam vyplněním položek. update fields by edited organisations? admin cs Aktualizovat položky editovanými organizacemi? updated addressbook cs Aktualizováno @@ -371,6 +396,7 @@ use an extra category tab? addressbook cs Použít extra založku pro kategorii? use an extra tab for private custom fields? admin cs Použít extra založku pro soukromé uživatelsky definované položky? use country list addressbook cs Použít seznam zemí use setup for a full account-migration admin cs pro kompletní migraci účtů použijte setup +use this tag for addresslabels. put the content, you want to repeat, between two tags. addressbook cs Použijte tuto značku pro adresní štítky. Obsah, který chcete opakovat, vložte mezi dvě značky. used for links and for the own sorting of the list addressbook cs použito pro odkazy a vlastní třídění seznamu vcard common cs VCard vcards require a first name entry. addressbook cs VCard vyžaduje křestní jméno v záznamu diff --git a/admin/setup/egw_cs.lang b/admin/setup/egw_cs.lang index ed3ff8f6f9..9f567f188c 100644 --- a/admin/setup/egw_cs.lang +++ b/admin/setup/egw_cs.lang @@ -4,6 +4,7 @@ %1 class not instanciated admin cs Nebyl vytvořen objekt třídy %1 %1 group %2 admin cs %1 skupina %2 %1 is no command! admin cs %1 není příkaz! +%1 log entries deleted. admin cs %1 záznamů logu smazáno. %1 not found or not executable !!! admin cs %1 nebyl nalezen nebo není spustitelný !!! %1 rights for %2 and applications %3 admin cs %1 práva pro %2 a aplikace %3 %1 user %2 admin cs %1 uživatel %2 @@ -29,6 +30,7 @@ activate wysiwyg-editor admin cs aktivovat WYSIWYG editor add a category admin cs přidat kategorii add a group admin cs přidat skupinu add a new account. admin cs Přidat nový účet +add a new remote instance admin cs Přidat novou vzdálenou instanci add a subcategory admin cs přidat podkategorii add a user admin cs přidat uživatele add account admin cs Přidat účet @@ -69,22 +71,23 @@ applications admin cs Aplikace applications list admin cs Seznam aplikací applications run rights updated. admin cs Oprávnění pro běh aplikace byla zaktualizována. applies the changes admin cs použije změny +apply the changes admin cs Použít změny are you sure you want to delete the application %1 ? admin cs Určitě chcete smazat aplikaci %1 ? -are you sure you want to delete this account ? admin cs Určitě chcete smazat tento účet ? -are you sure you want to delete this application ? admin cs Určitě chcete smazat tuto aplikaci ? -are you sure you want to delete this category ? common cs Určitě chcete smazat tuto kategorii ? +are you sure you want to delete this account ? admin cs Určitě chcete smazat tento účet? +are you sure you want to delete this application ? admin cs Určitě chcete smazat tuto aplikaci? +are you sure you want to delete this category ? common cs Určitě chcete smazat tuto kategorii? are you sure you want to delete this global category ? admin cs Určitě chcete smazat tuto globální kategorii ? -are you sure you want to delete this group ? admin cs Určitě chcete smazat tuto skupinu ? +are you sure you want to delete this group ? admin cs Určitě chcete smazat tuto skupinu? are you sure you want to delete this server? admin cs Určitě chcete smazat tento server? -are you sure you want to kill this session ? admin cs Určitě chcete ukončit tuto relaci ? +are you sure you want to kill this session ? admin cs Určitě chcete ukončit tuto relaci? async services last executed admin cs Asynchronní služby naposledy spuštěny asynchronous timed services admin cs Asynchornně časované služby asyncservices not yet installed or other error (%1) !!! admin cs asynchronní služby nebyly dosud nainstalovány nebo jiná chyba (%1) !!! attempt to use correct mimetype for ftp instead of default 'application/octet-stream' admin cs Pokuste se použít správný MIME typ pro FTP místo výchozího 'application/octet-stream' -attribute accountstatus explained admin cs Toto pracuje s atributem -accountStatus- z QMAIL schematu. -attribute mail explained admin cs Toto pracuje s atributem -mail- z QMAIL schematu a nikdy by nemělo být prázdné. Je také interním e-mailovým polem eGroupWaru. -attribute mailalternateaddress explained admin cs Toto pracuje s atributem -mailAlternateAddress- z QMAIL schematu a může být použito jako virtuální mapování nebo aliasy. -attribute mailforwardingaddress explained admin cs Toto pracuje s atributem -mailForwardingAddress- z QMAIL schematu a pokud je nastavené, nesmí být prázdné. +attribute accountstatus explained admin cs Toto pracuje s atributem -accountStatus- z QMAIL schématu. +attribute mail explained admin cs Toto pracuje s atributem -mail- z QMAIL schématu a nikdy by nemělo být prázdné. Je také interním e-mailovým polem eGroupWaru. +attribute mailalternateaddress explained admin cs Toto pracuje s atributem -mailAlternateAddress- z QMAIL schématu a může být použito jako virtuální mapování nebo aliasy. +attribute mailforwardingaddress explained admin cs Toto pracuje s atributem -mailForwardingAddress- z QMAIL schématu a pokud je nastavené, nesmí být prázdné. authentication / accounts admin cs Autentikace / Účty auto create account records for authenticated users admin cs Automaticky vytvořit záznamy pro autentikované uživatele back to the list admin cs zpět na seznam @@ -94,8 +97,9 @@ bottom admin cs Dolní okraj calculate next run admin cs Vypočítat další spuštění can change password admin cs Může změnit heslo cancel testjob! admin cs Ukočit testovací úlohu +cancel this scheduled command admin cs Ukončit tento naplánovaný příkaz categories list admin cs Seznam kategorií -category %1 has been saved ! admin cs Kategorie %1 byla uložena ! +category %1 has been saved ! admin cs Kategorie %1 byla uložena! category list admin cs Seznam kategorie change account_id admin cs Změnit ID účtu change acl rights admin cs změnit ACL práva @@ -135,10 +139,12 @@ delete application admin cs Smazat aplikaci delete category admin cs Smazat kategorii delete group admin cs Smazat skupinu delete peer server admin cs Smazat peer server +delete selected entries admin cs Smazat vybrané záznamy delete the category admin cs smazat kategorii delete the group admin cs smszat skupinu delete this category admin cs smazat tuto kategorii delete this group admin cs smazat tuto skupinu +delete this log entry admin cs Smazat tento záznam v logu delete this user admin cs smazat tohoto uživatele deletes this field admin cs smaže tuto položku deliver extern admin cs doručit extern @@ -165,7 +171,7 @@ disabled (not recomended) admin cs zakázáno (nedoporučuje se) display admin cs Zobrazit do not delete the category and return back to the list admin cs NEmazat kategorii a vrátit se zpět na seznam do you also want to delete all global subcategories ? admin cs Chcete také smazat všechny globální kategorie ? -do you want to delete all global subcategories ? admin cs Chcete smazat všechny globální podkategorie ? +do you want to delete all global subcategories ? admin cs Chcete smazat všechny globální podkategorie? do you want to move all global subcategories one level down ? admin cs Chcete přesunout všechny globální podkategorie o jednu úroveň níže ? document root (default) admin cs Kořenový adresář dokumentů (výchozí) each value is a line like [=
http://localhost/egroupware/calendar/freebusy.php?user=stivi. calendar cs Mají mít nepřihlášení uživatelé možnost vidět Váš stav volný/zaneprázdněn? Můžete nastavit zvláštní heslo, které se neshoduje s Vaším přihlašovacím heslem a chránit jím tuto informaci. Informace o stavu volný/zaneprázdněn je ve formátu iCal a obsahuje jen časy, kdy jste zaneprázdněn(a). Nezahrnuje názvy událostí, jejich popisy ani umístění. Adresa URL pro informace o Vašem volném a obsazeném času je http://localhost/egroupware/calendar/freebusy.php?user=stivi. should the planner display an empty row for users or categories without any appointment. calendar cs Má plánovač zobrazovat prázdný řádek pro uživatele nebo kategorie bez události. should the status of the event-participants (accept, reject, ...) be shown in brakets after each participants name ? calendar cs Má být informace o stavu účasti jednotlivých účastníků (přijal, odmítnul) zobrazena v závorkách vedle jejich jména? show birthdays from addressbook admin cs Zobrazit narozeniny z adresáře show default view on main screen calendar cs Zobrazit výchozí pohled na hlavní obrazovce show empty rows in planner calendar cs Zobrazit prázdné řádky v Plánovači -show invitations you rejected calendar cs Zobrazit Vámi zamítnutá pozvání show list of upcoming events calendar cs zobrazit seznam nadcházejících událostí show only the date, not the year admin cs Zobrazit jen datum, ne rok show this month calendar cs zobrazit tento měsíc @@ -293,6 +306,7 @@ submit to repository calendar cs Uložit do databáze sun calendar cs Ne tentative calendar cs Předběžný test import (show importable records only in browser) calendar cs Testovat import (zobrazit importovatelné záznamy jen v prohlížeči) +the resource you selected is already overbooked: calendar cs Vybraný zdroj je již příliš obsazen. this day is shown as first day in the week or month view. calendar cs Tento den se zobrazí jako první v týdenním nebo měsíčním pohledu. this defines the end of your dayview. events after this time, are shown below the dayview. calendar cs Tento čas ukončí Váš denní pohled. Následující události se zobrazí pod Vaším denním pohledem. this defines the start of your dayview. events before this time, are shown above the dayview.
this time is also used as a default starttime for new events. calendar cs Tímto časem začne Váš denní pohled. Předcházející události se zobrazí nad Vaším denním pohledem.
Tento čas je také brán jako výchozí počáteční čas pro nové události. @@ -341,6 +355,7 @@ work day ends on calendar cs Pracovní den končí v work day starts on calendar cs Pracovní den začíná v yearly calendar cs Ročně yearview calendar cs Roční pohled +you are not allowed to book the resource selected: calendar cs Nemáte oprávnění si rezervovat vybraný zdroj: you can either set a year or a occurence, not both !!! calendar cs Můžete nastavit rok nebo výskyt, ne obojí !!! you can only set a year or a occurence !!! calendar cs Můžete nastavit jen rok nebo výskyt !!! you do not have permission to read this record! calendar cs Nemáte oprávnění ke čtení tohoto záznamu! @@ -349,5 +364,6 @@ you have been disinvited from the meeting at %1 calendar cs Byla Vám zrušena p you need to select an account, contact or resource first! calendar cs Musíte nejprve vybrat účet, kontakt nebo zdroj! you need to select an ical file first calendar cs Nejprve musíte vybrat iCal soubor you need to set either a day or a occurence !!! calendar cs Musíte nastavit buď den nebo výskyt !!! +you requested more than available for the selected resource: calendar cs Požadujete víc než je možné pro vybraný zdroj: your meeting scheduled for %1 has been canceled calendar cs Vaše setkání plánované na %1 bylo zrušeno your meeting that had been scheduled for %1 has been rescheduled to %2 calendar cs Vaše setkání plánované na %1 bylo přesunuto na %2 diff --git a/etemplate/setup/egw_cs.lang b/etemplate/setup/egw_cs.lang index 9b6144629c..4bd572657c 100644 --- a/etemplate/setup/egw_cs.lang +++ b/etemplate/setup/egw_cs.lang @@ -1,4 +1,5 @@ %1 (%2 new) messages writen for application '%3' and languages '%4' etemplate cs %1 (%2 nových) zpráv zapsaných pro aplikaci '%3' a jazyky '%4' +%1 entries found, select one ... etemplate cs Nalezeno %1 záznamů, vyberte jeden ... %1 etemplates deleted etemplate cs %1 eŠablon smazáno %1 etemplates for application '%2' dumped to '%3' etemplate cs %1 eŠablon pro aplikaci '%2' vytvořilo výpis do '%3' %1 etemplates found etemplate cs %1 eŠablon nalezeno @@ -33,6 +34,7 @@ alignment of label and input-field in table-cell etemplate cs zarovnání popisk alignment of the v/hbox containing table-cell etemplate cs Zarovnání V/HBoxu obsahujícího buňku tabulky all days etemplate cs všechny dny all operations save the template! etemplate cs všechny operace ukládají šablonu ! +allowed file type: %1 etemplate cs Povolený typ souboru: %1 am etemplate cs am an indexed column speeds up querys using that column (cost space on the disk !!!) etemplate cs indexy vytvořené pro sloupec zrychlují vyhledávání v daném sloupci (ale také zabírají místo na disku !!!) application etemplate cs Aplikace @@ -77,7 +79,7 @@ column... etemplate cs Sloupec... columnname etemplate cs Jméno sloupce comment etemplate cs Komentář confirm etemplate cs potvrdit -confirmation message or custom javascript (returning true or false) etemplate cs Potvrzující zpráva nebo uživatelsky definovaný javaskript (vracející true nebo false) +confirmation message or custom javascript (returning true or false) etemplate cs Potvrzující zpráva nebo uživatelsky definovaný javascript (vracející true nebo false) confirmation necesary or custom java-script etemplate cs vyžadováno potvrzení nebo uživatelský javaskript contact etemplate cs Kontakt contact field to show etemplate cs Zobrazit položku kontaktu @@ -146,6 +148,9 @@ enter filename to upload and attach, use [browse...] to search for it etemplate enter the new version number here (> old_version), empty for no update-file etemplate cs sem zadejte číslo nové verze (> stará_verze), ponechte prázdné pokud nechcete aktualizovat soubor enter the new version number here (has to be > old_version) etemplate cs sem zadejte číslo nové verze (musí být > stará_verze) entry saved etemplate cs Záznam uložen +error copying uploaded file to vfs! etemplate cs Chyba při kopírování uploadovaného souboru do vfs! +error create parent directory %1! etemplate cs Chyba při vytváření nadřazeného adresáře %1! +error deleting %1! etemplate cs Chyba při mazání %1! error: template not found !!! etemplate cs Chyba: Šablona nebyla nalezena !!! error: webserver is not allowed to write into '%1' !!! etemplate cs Chyba: webový server nemá oprávnění k zápisu do '%1' !!! error: while saving !!! etemplate cs Chyba při ukládání !!! @@ -164,7 +169,9 @@ extensions loaded: etemplate cs Načtená rozšíření: field etemplate cs Položka field must not be empty !!! etemplate cs Položka nesmí být prázdná !!! file etemplate cs Soubor +file '%1' not found! etemplate cs Soubor '%1' nebyl nalezen! file contains more than one etemplate, last one is shown !!! etemplate cs Soubor obsahuje více jak jednu eŠablonu, zobrazena je poslední !!! +file is of wrong type (%1 != %2)! etemplate cs Soubor je špatného typu (%1 != %2)! file writen etemplate cs Soubor zapsán fileupload etemplate cs Upload souboru first etemplate cs První @@ -337,9 +344,10 @@ select which values to show etemplate cs vybrat hodnoty ke zobrazení select year etemplate cs Vybrat rok selectbox etemplate cs Rozbalovací nabídka sets today as date etemplate cs nastaví dnešek jako datum -should the form be submitted or any custom javascript be executed etemplate cs Má být odeslán formulář nebo spuštěn libovolný uživatelský javaskript +should the form be submitted or any custom javascript be executed etemplate cs Má být odeslán formulář nebo spuštěn libovolný uživatelský javascript show etemplate cs Zobrazit show (no save) etemplate cs Zobrazit (neukládat) +show all / cancel filter etemplate cs Zobrazit vše / zrušit filtr show values etemplate cs Zobrazit hodnoty showing etemplate cs zobrazuji shows / allows you to enter values into the etemplate for testing etemplate cs zobrazí / umožní Vám zadat hodnoty do eŠablony pro testování diff --git a/filemanager/setup/egw_cs.lang b/filemanager/setup/egw_cs.lang index ad6a2b7042..af484b6128 100644 --- a/filemanager/setup/egw_cs.lang +++ b/filemanager/setup/egw_cs.lang @@ -1,10 +1,13 @@ %1 already exists as a file filemanager cs %1 již existuje jako soubor %1 directories and %2 files copied. filemanager cs Zkopírováno %1 adresářů a %2 souborů %1 directories and %2 files deleted. filemanager cs Smazáno %1 adresářů a %2 souborů +%1 elements linked. filemanager cs Odkazy na %1 položek vytvořeny. %1 errors copying (%2 diretories and %3 files copied)! filemanager cs Během kopírování došlo k %1 chybám (zkopírováno %2 adresářů a %3 souborů)! %1 errors deleteting (%2 directories and %3 files deleted)! filemanager cs Během mazání došlo k %1 chybám (smazáno %2 adresářů a %3 souborů)! +%1 errors linking (%2)! filemanager cs %1 chyb při vytváření odkazu na (%2)! %1 errors moving (%2 files moved)! filemanager cs Během přesouvání došlo k %1 chybám (přesunuto %2 souborů)! %1 failed, %2 succeded filemanager cs %1 se nezdařilo, %2 bylo úspěšné +%1 files common cs %1 souborů %1 files copied. filemanager cs Zkopírováno %1 souborů. %1 files deleted. filemanager cs Smazáno %1 souborů. %1 files moved. filemanager cs Přesunuto %1 souborů. @@ -16,9 +19,12 @@ accessrights filemanager cs Přístupová práva acl added. filemanager cs ACL byly přidány. acl deleted. filemanager cs ACL byly smazány. actions filemanager cs Akce +all files common cs Všechny soubory allow a maximum of the above configured folderlinks to be configured in settings admin cs povolit konfiguraci maxima z výše konfigurovaných odkazů na složky v nastaveních and all it's childeren filemanager cs a všechny jeho potomky +applications common cs Aplikace basedirectory filemanager cs Kořenový adresář +can't open directory %1! filemanager cs Nelze otevřít adresář %1! cancel editing %1 without saving filemanager cs Ukončit editaci %1 bez uložení cannot create directory because it begins or ends in a space filemanager cs Nemohu vytvořit adresář, protože začíná nebo končí mezerou check all filemanager cs Označit vše @@ -27,6 +33,7 @@ comment filemanager cs Komentář comments cannot contain "%1" filemanager cs Komentáře nemohou obsahovat "%1" copied filemanager cs zkopírováno copied %1 to %2 filemanager cs %1 zkopírováno do %2 +copy filemanager cs Kopírovat copy to filemanager cs Kopírovat do copy to clipboard filemanager cs Kopírovat do clipboardu could not copy %1 to %2 filemanager cs Nepodařilo se zkopírovat %1 do %2 @@ -37,6 +44,7 @@ could not move %1 to %2 filemanager cs Nepodařilo se přesunout %1 do %2 could not move file because no destination directory is given filemanager cs Nepodařilo se přesunout soubor, protože nebyl zadán cílový adresář could not rename %1 to %2 filemanager cs Nepodařilo se přejmenovat %1 na %2 could not save %1 filemanager cs Nepodařilo se uložit %1 +create a link filemanager cs Vytvořit odkaz create directory filemanager cs Vytvořit adresář create file filemanager cs Vytvořit soubor create folder filemanager cs Vytvořit složku @@ -45,6 +53,7 @@ created %1,%2 filemanager cs Vytvořeno %1,%2 created between filemanager cs vytvořeno mezi created directory %1 filemanager cs Vytvořen adresář %1 current directory filemanager cs Aktuální adresář +custom fields filemanager cs Uživatelsky definované položky cut filemanager cs Vyjmout cut to clipboard filemanager cs Vyjmout do clipboardu default behavior is no. the link will not be shown, but you are still able to navigate to this location, or configure this paricular location as startfolder or folderlink. filemanager cs Výchozí chování je NE. Odkaz sice nebude zobrazen, ale do adresáře budete moci vstoupit nebo ho nakonfigurovat jako startovní složku či odkaz na složku. @@ -65,8 +74,10 @@ edit settings filemanager cs Editovat nastavení enter setup user and password filemanager cs Zadejte jméno a heslo administrátora hlaviček enter setup user and password to get root rights filemanager cs Zadejte jméno a heslo administrátora hlaviček pro získání práv roota enter the complete vfs path to specify a fast access link to a folder filemanager cs Zadejte kompletní VFS cestu k nastavení odkazu pro rychlý přístup ke složce +enter the complete vfs path to specify a fast access link to a folder (1). filemanager cs Zadejte kompletní VFS cestu pro specifikaci odkazu na rychlý přístup ke složce (1). enter the complete vfs path to specify your desired start folder. filemanager cs Zadejte kompletní VFS cestu k nastavení Vámi požadované počáteční složky. error adding the acl! filemanager cs Při přidávání ACL došlo k chybě! +error creating symlink to target %1! filemanager cs Chyba při vytváření symbolického odkazu na cíl %1! error deleting the acl entry! filemanager cs Při mazání ACL záznamu došlo k chybě! error uploading file! filemanager cs Chyba při uploadu souboru! executable filemanager cs Spustitelný @@ -74,6 +85,7 @@ extended access control list filemanager cs Rozšířený seznam přístupových extended acl filemanager cs Rozšířený ACL failed to change permissions of %1! filemanager cs Nepodařilo se změnit oprávnění %1! failed to create directory! filemanager cs Nepodařilo se vytvořit adresář! +favorites filemanager cs Oblíbené file filemanager cs Soubor file %1 already exists. please edit it or delete it first. filemanager cs Soubor %1 již existuje. Buď ho nejprve smažte nebo ho zeditujte. file %1 could not be created. filemanager cs Soubor %1 nemohl být vytvořen. @@ -94,7 +106,9 @@ go to your home directory filemanager cs Jít do domovského adresáře go up filemanager cs Jít výše id filemanager cs ID inherited filemanager cs Zděděné +link filemanager cs Odkaz link %1: %2 filemanager cs Odkaz %1: %2 +link target %1 not found! filemanager cs Odkaz na cíl %1 nebyl nalezen! location filemanager cs Umístění log out as superuser filemanager cs Odhlášení superuživatele max folderlinks admin cs maximálně odkazů na složky @@ -111,6 +125,7 @@ no files in this directory. filemanager cs V tomto adresáři nejsou soubory. no preview available filemanager cs Náhled není k dispozici no version history for this file/directory filemanager cs Pro tento soubor/adresář neexistuje historie verzí only owner can rename or delete the content filemanager cs Jen vlastník smí přejmenovávat nebo mazat obsah +open filemanager cs Otevřít operation filemanager cs Operace permission denied! filemanager cs Přístup zamítnut! permissions filemanager cs Oprávnění @@ -119,6 +134,7 @@ please select a file to delete. filemanager cs Vyberte prosím soubor ke smazán preview filemanager cs Náhled preview %1 filemanager cs Náhled %1 preview of %1 filemanager cs Náhled (čeho) %1 +projectmanager filemanager cs Správce projektů properties saved. filemanager cs Vlastnosti nastaveny quick jump to filemanager cs Rychlý skok na read & write access filemanager cs Přístup pro čtení i zápis @@ -130,8 +146,9 @@ renamed %1 to %2 filemanager cs %1 přejmenováno na %2 renamed %1 to %2. filemanager cs %1 přejmenováno na %2. replaced %1 filemanager cs %1nahrazeno rights filemanager cs Práva -root access granted. filemanager cs Oprávnění roota přidělena. -root access stoped. filemanager cs Oprávnění roota pozastavena. +root filemanager cs root +root access granted. filemanager cs Oprávnění roota přiděleno. +root access stopped. filemanager cs Oprávnění roota pozastaveno. save %1 filemanager cs Uložit %1 save %1, and go back to file listing filemanager cs Uložit %1 a vrátit se zpět na seznam souborů save changes filemanager cs Uložit změny @@ -142,10 +159,12 @@ searchstring filemanager cs hledaný řetězec select action... filemanager cs Vyberte akci... select file to upload in current directory filemanager cs Vyberte soubor k uploadu do aktuálního adresáře show filemanager cs Zobrazit +show hidden files filemanager cs Zobrazit skryté soubory show link to filemanagers basedirectory (/) in side box menu? filemanager cs Zobrazit odkaz na kořenový adresář správce souborů (/) v postranním panelu? size filemanager cs Velikost start search filemanager cs Zahájit hledání superuser filemanager cs Superuživatel +symlink to %1 created. filemanager cs Symbolický odkaz na %1 byl vytvořen. the default start folder is your personal folder. the default is used, if you leave this empty, the path does not exist or you lack the neccessary access permissions. filemanager cs Výchozí startovní složka je Vaše osobní. Je použita v případě, kdy položku nevyplníte, zadaná cesta neexistuje nebo pro ní nemáte přístupová oprávnění. the requested path %1 is not available. filemanager cs Požadovaná cesta %1 není k dispozici. there's already a directory with that name! filemanager cs Adresář s tímto názvem již existuje! @@ -158,6 +177,8 @@ updated comment for %1 filemanager cs Aktualizovat komentář pro %1 used space filemanager cs Využité místo users and groups filemanager cs Uživatelé a skupiny wrong username or password! filemanager cs Chybné uživatelské jméno nebo heslo +you are not allowed to upload a script! filemanager cs Nemáte oprávnění uploadovat skript! +you can only grant additional rights, you can not take rights away! filemanager cs Můžete pouze přidělit dodatečná oprávnění, ne odebrat ta stávající! you do not have access to %1 filemanager cs Nemáte přístup k %1 you need to select an owner! filemanager cs Musíte vybrat vlastníka! you need to select some files first! filemanager cs Nejprve musíte vybrat nějaké soubory! diff --git a/infolog/setup/egw_cs.lang b/infolog/setup/egw_cs.lang index ca51660631..a7c1ea05ce 100644 --- a/infolog/setup/egw_cs.lang +++ b/infolog/setup/egw_cs.lang @@ -40,10 +40,12 @@ add timesheet entry infolog cs Přidat pracovní výkaz add: infolog cs Přidat: all infolog cs Vše all links and attachments infolog cs všechny odkazy a přílohy +all projects infolog cs Všechny projekty allows to set the status of an entry, eg. set a todo to done if it's finished (values depend on entry-typ) infolog cs umožňuje nastavit stav záznamu, např. úkol jako dokončený, když je dořešen (hodnota závisí na typu záznamu) -applies the changes infolog cs provede změny +alternatives infolog cs Alternativy apply the changes infolog cs Použít změny archive infolog cs archiv +are you shure you want to close this entry ? infolog cs Určitě chcete uzavřít tento záznam? are you shure you want to delete this entry ? infolog cs Určitě chcete smazat tento záznam? attach a file infolog cs Připojit soubor attach file infolog cs Připojit soubor @@ -65,6 +67,8 @@ check to specify custom contact infolog cs Zaškrtněte pro zadání uživatelsk click here to create the link infolog cs klikněte sem pro vytvoření odkazu click here to start the search infolog cs klikněte sem pro zahájení hledání close infolog cs Zavřít +close all infolog cs Uzavřít vše +close this entry and all listed sub-entries infolog cs Uzavřít tento záznam a všechny zobrazené podzáznamy? comment infolog cs Komentář completed infolog cs Ukončeno configuration infolog cs Konfigurace @@ -87,13 +91,13 @@ custom fields, typ and status common cs Uživatelsky definované položky, typy custom from infolog cs Uživatelsky definované od custom regarding infolog cs Uživatelsky definovaný ohled custom status for typ infolog cs Uživatelsky definovaný stav pro typ -customfields infolog cs Uživatelsky definovaná pole +customfields infolog cs Uživatelsky definované položky date completed infolog cs Datum ukočení date completed (leave it empty to have it automatic set if status is done or billed) infolog cs Datum ukončení (ponechte prázdné, pokud chcete nastavit automaticky při dokončení nebo vyúčtování) datecreated infolog cs Datum vytvoření dates, status, access infolog cs Datumy, Stavy, Přístupy days infolog cs dnů -default category for new infolog entries infolog cs Výchozí kategorie pro nové záznamy v InfoLogu +default category for new infolog entries infolog cs Výchozí kategorie pro nové záznamy InfoLogu default filter for infolog infolog cs Výchozí filtr pro InfoLog default status for a new log entry infolog cs výchozí stav pro nový záznam delegated infolog cs delegované @@ -108,7 +112,7 @@ delete this entry infolog cs smazat záznam delete this entry and all listed sub-entries infolog cs Smazat tento záznam a všechny zobrazené podpoložky deleted infolog cs smazané deletes the selected typ infolog cs smaže vybraný typ -deletes this field infolog cs smaže toto pole +deletes this field infolog cs smaže tuto položku deletes this status infolog cs smaže tento stav description infolog cs Popis determines the order the fields are displayed infolog cs určuje pořadí zobrazování položek @@ -125,6 +129,7 @@ don't show infolog infolog cs NEzobrazovat InfoLog done infolog cs hotovo download infolog cs Stáhnout duration infolog cs Trvání +e-mail: infolog cs E-mail: each value is a line like [=